1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Basic/DiagnosticParse.h"
32 #include "clang/Basic/OpenMPKinds.h"
33 #include "clang/Sema/Designator.h"
34 #include "clang/Sema/Lookup.h"
35 #include "clang/Sema/Ownership.h"
36 #include "clang/Sema/ParsedTemplate.h"
37 #include "clang/Sema/ScopeInfo.h"
38 #include "clang/Sema/SemaDiagnostic.h"
39 #include "clang/Sema/SemaInternal.h"
40 #include "llvm/ADT/ArrayRef.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include <algorithm>
43 
44 using namespace llvm::omp;
45 
46 namespace clang {
47 using namespace sema;
48 
49 /// A semantic tree transformation that allows one to transform one
50 /// abstract syntax tree into another.
51 ///
52 /// A new tree transformation is defined by creating a new subclass \c X of
53 /// \c TreeTransform<X> and then overriding certain operations to provide
54 /// behavior specific to that transformation. For example, template
55 /// instantiation is implemented as a tree transformation where the
56 /// transformation of TemplateTypeParmType nodes involves substituting the
57 /// template arguments for their corresponding template parameters; a similar
58 /// transformation is performed for non-type template parameters and
59 /// template template parameters.
60 ///
61 /// This tree-transformation template uses static polymorphism to allow
62 /// subclasses to customize any of its operations. Thus, a subclass can
63 /// override any of the transformation or rebuild operators by providing an
64 /// operation with the same signature as the default implementation. The
65 /// overriding function should not be virtual.
66 ///
67 /// Semantic tree transformations are split into two stages, either of which
68 /// can be replaced by a subclass. The "transform" step transforms an AST node
69 /// or the parts of an AST node using the various transformation functions,
70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
71 /// node of the appropriate kind from the pieces. The default transformation
72 /// routines recursively transform the operands to composite AST nodes (e.g.,
73 /// the pointee type of a PointerType node) and, if any of those operand nodes
74 /// were changed by the transformation, invokes the rebuild operation to create
75 /// a new AST node.
76 ///
77 /// Subclasses can customize the transformation at various levels. The
78 /// most coarse-grained transformations involve replacing TransformType(),
79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
81 /// new implementations.
82 ///
83 /// For more fine-grained transformations, subclasses can replace any of the
84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
86 /// replacing TransformTemplateTypeParmType() allows template instantiation
87 /// to substitute template arguments for their corresponding template
88 /// parameters. Additionally, subclasses can override the \c RebuildXXX
89 /// functions to control how AST nodes are rebuilt when their operands change.
90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
92 /// be able to use more efficient rebuild steps.
93 ///
94 /// There are a handful of other functions that can be overridden, allowing one
95 /// to avoid traversing nodes that don't need any transformation
96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
97 /// operands have not changed (\c AlwaysRebuild()), and customize the
98 /// default locations and entity names used for type-checking
99 /// (\c getBaseLocation(), \c getBaseEntity()).
100 template<typename Derived>
101 class TreeTransform {
102   /// Private RAII object that helps us forget and then re-remember
103   /// the template argument corresponding to a partially-substituted parameter
104   /// pack.
105   class ForgetPartiallySubstitutedPackRAII {
106     Derived &Self;
107     TemplateArgument Old;
108 
109   public:
110     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
111       Old = Self.ForgetPartiallySubstitutedPack();
112     }
113 
114     ~ForgetPartiallySubstitutedPackRAII() {
115       Self.RememberPartiallySubstitutedPack(Old);
116     }
117   };
118 
119 protected:
120   Sema &SemaRef;
121 
122   /// The set of local declarations that have been transformed, for
123   /// cases where we are forced to build new declarations within the transformer
124   /// rather than in the subclass (e.g., lambda closure types).
125   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
126 
127 public:
128   /// Initializes a new tree transformer.
129   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
130 
131   /// Retrieves a reference to the derived class.
132   Derived &getDerived() { return static_cast<Derived&>(*this); }
133 
134   /// Retrieves a reference to the derived class.
135   const Derived &getDerived() const {
136     return static_cast<const Derived&>(*this);
137   }
138 
139   static inline ExprResult Owned(Expr *E) { return E; }
140   static inline StmtResult Owned(Stmt *S) { return S; }
141 
142   /// Retrieves a reference to the semantic analysis object used for
143   /// this tree transform.
144   Sema &getSema() const { return SemaRef; }
145 
146   /// Whether the transformation should always rebuild AST nodes, even
147   /// if none of the children have changed.
148   ///
149   /// Subclasses may override this function to specify when the transformation
150   /// should rebuild all AST nodes.
151   ///
152   /// We must always rebuild all AST nodes when performing variadic template
153   /// pack expansion, in order to avoid violating the AST invariant that each
154   /// statement node appears at most once in its containing declaration.
155   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
156 
157   /// Whether the transformation is forming an expression or statement that
158   /// replaces the original. In this case, we'll reuse mangling numbers from
159   /// existing lambdas.
160   bool ReplacingOriginal() { return false; }
161 
162   /// Wether CXXConstructExpr can be skipped when they are implicit.
163   /// They will be reconstructed when used if needed.
164   /// This is usefull when the user that cause rebuilding of the
165   /// CXXConstructExpr is outside of the expression at which the TreeTransform
166   /// started.
167   bool AllowSkippingCXXConstructExpr() { return true; }
168 
169   /// Returns the location of the entity being transformed, if that
170   /// information was not available elsewhere in the AST.
171   ///
172   /// By default, returns no source-location information. Subclasses can
173   /// provide an alternative implementation that provides better location
174   /// information.
175   SourceLocation getBaseLocation() { return SourceLocation(); }
176 
177   /// Returns the name of the entity being transformed, if that
178   /// information was not available elsewhere in the AST.
179   ///
180   /// By default, returns an empty name. Subclasses can provide an alternative
181   /// implementation with a more precise name.
182   DeclarationName getBaseEntity() { return DeclarationName(); }
183 
184   /// Sets the "base" location and entity when that
185   /// information is known based on another transformation.
186   ///
187   /// By default, the source location and entity are ignored. Subclasses can
188   /// override this function to provide a customized implementation.
189   void setBase(SourceLocation Loc, DeclarationName Entity) { }
190 
191   /// RAII object that temporarily sets the base location and entity
192   /// used for reporting diagnostics in types.
193   class TemporaryBase {
194     TreeTransform &Self;
195     SourceLocation OldLocation;
196     DeclarationName OldEntity;
197 
198   public:
199     TemporaryBase(TreeTransform &Self, SourceLocation Location,
200                   DeclarationName Entity) : Self(Self) {
201       OldLocation = Self.getDerived().getBaseLocation();
202       OldEntity = Self.getDerived().getBaseEntity();
203 
204       if (Location.isValid())
205         Self.getDerived().setBase(Location, Entity);
206     }
207 
208     ~TemporaryBase() {
209       Self.getDerived().setBase(OldLocation, OldEntity);
210     }
211   };
212 
213   /// Determine whether the given type \p T has already been
214   /// transformed.
215   ///
216   /// Subclasses can provide an alternative implementation of this routine
217   /// to short-circuit evaluation when it is known that a given type will
218   /// not change. For example, template instantiation need not traverse
219   /// non-dependent types.
220   bool AlreadyTransformed(QualType T) {
221     return T.isNull();
222   }
223 
224   /// Transform a template parameter depth level.
225   ///
226   /// During a transformation that transforms template parameters, this maps
227   /// an old template parameter depth to a new depth.
228   unsigned TransformTemplateDepth(unsigned Depth) {
229     return Depth;
230   }
231 
232   /// Determine whether the given call argument should be dropped, e.g.,
233   /// because it is a default argument.
234   ///
235   /// Subclasses can provide an alternative implementation of this routine to
236   /// determine which kinds of call arguments get dropped. By default,
237   /// CXXDefaultArgument nodes are dropped (prior to transformation).
238   bool DropCallArgument(Expr *E) {
239     return E->isDefaultArgument();
240   }
241 
242   /// Determine whether we should expand a pack expansion with the
243   /// given set of parameter packs into separate arguments by repeatedly
244   /// transforming the pattern.
245   ///
246   /// By default, the transformer never tries to expand pack expansions.
247   /// Subclasses can override this routine to provide different behavior.
248   ///
249   /// \param EllipsisLoc The location of the ellipsis that identifies the
250   /// pack expansion.
251   ///
252   /// \param PatternRange The source range that covers the entire pattern of
253   /// the pack expansion.
254   ///
255   /// \param Unexpanded The set of unexpanded parameter packs within the
256   /// pattern.
257   ///
258   /// \param ShouldExpand Will be set to \c true if the transformer should
259   /// expand the corresponding pack expansions into separate arguments. When
260   /// set, \c NumExpansions must also be set.
261   ///
262   /// \param RetainExpansion Whether the caller should add an unexpanded
263   /// pack expansion after all of the expanded arguments. This is used
264   /// when extending explicitly-specified template argument packs per
265   /// C++0x [temp.arg.explicit]p9.
266   ///
267   /// \param NumExpansions The number of separate arguments that will be in
268   /// the expanded form of the corresponding pack expansion. This is both an
269   /// input and an output parameter, which can be set by the caller if the
270   /// number of expansions is known a priori (e.g., due to a prior substitution)
271   /// and will be set by the callee when the number of expansions is known.
272   /// The callee must set this value when \c ShouldExpand is \c true; it may
273   /// set this value in other cases.
274   ///
275   /// \returns true if an error occurred (e.g., because the parameter packs
276   /// are to be instantiated with arguments of different lengths), false
277   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
278   /// must be set.
279   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
280                                SourceRange PatternRange,
281                                ArrayRef<UnexpandedParameterPack> Unexpanded,
282                                bool &ShouldExpand,
283                                bool &RetainExpansion,
284                                Optional<unsigned> &NumExpansions) {
285     ShouldExpand = false;
286     return false;
287   }
288 
289   /// "Forget" about the partially-substituted pack template argument,
290   /// when performing an instantiation that must preserve the parameter pack
291   /// use.
292   ///
293   /// This routine is meant to be overridden by the template instantiator.
294   TemplateArgument ForgetPartiallySubstitutedPack() {
295     return TemplateArgument();
296   }
297 
298   /// "Remember" the partially-substituted pack template argument
299   /// after performing an instantiation that must preserve the parameter pack
300   /// use.
301   ///
302   /// This routine is meant to be overridden by the template instantiator.
303   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
304 
305   /// Note to the derived class when a function parameter pack is
306   /// being expanded.
307   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
308 
309   /// Transforms the given type into another type.
310   ///
311   /// By default, this routine transforms a type by creating a
312   /// TypeSourceInfo for it and delegating to the appropriate
313   /// function.  This is expensive, but we don't mind, because
314   /// this method is deprecated anyway;  all users should be
315   /// switched to storing TypeSourceInfos.
316   ///
317   /// \returns the transformed type.
318   QualType TransformType(QualType T);
319 
320   /// Transforms the given type-with-location into a new
321   /// type-with-location.
322   ///
323   /// By default, this routine transforms a type by delegating to the
324   /// appropriate TransformXXXType to build a new type.  Subclasses
325   /// may override this function (to take over all type
326   /// transformations) or some set of the TransformXXXType functions
327   /// to alter the transformation.
328   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
329 
330   /// Transform the given type-with-location into a new
331   /// type, collecting location information in the given builder
332   /// as necessary.
333   ///
334   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
335 
336   /// Transform a type that is permitted to produce a
337   /// DeducedTemplateSpecializationType.
338   ///
339   /// This is used in the (relatively rare) contexts where it is acceptable
340   /// for transformation to produce a class template type with deduced
341   /// template arguments.
342   /// @{
343   QualType TransformTypeWithDeducedTST(QualType T);
344   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
345   /// @}
346 
347   /// The reason why the value of a statement is not discarded, if any.
348   enum StmtDiscardKind {
349     SDK_Discarded,
350     SDK_NotDiscarded,
351     SDK_StmtExprResult,
352   };
353 
354   /// Transform the given statement.
355   ///
356   /// By default, this routine transforms a statement by delegating to the
357   /// appropriate TransformXXXStmt function to transform a specific kind of
358   /// statement or the TransformExpr() function to transform an expression.
359   /// Subclasses may override this function to transform statements using some
360   /// other mechanism.
361   ///
362   /// \returns the transformed statement.
363   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
364 
365   /// Transform the given statement.
366   ///
367   /// By default, this routine transforms a statement by delegating to the
368   /// appropriate TransformOMPXXXClause function to transform a specific kind
369   /// of clause. Subclasses may override this function to transform statements
370   /// using some other mechanism.
371   ///
372   /// \returns the transformed OpenMP clause.
373   OMPClause *TransformOMPClause(OMPClause *S);
374 
375   /// Transform the given attribute.
376   ///
377   /// By default, this routine transforms a statement by delegating to the
378   /// appropriate TransformXXXAttr function to transform a specific kind
379   /// of attribute. Subclasses may override this function to transform
380   /// attributed statements using some other mechanism.
381   ///
382   /// \returns the transformed attribute
383   const Attr *TransformAttr(const Attr *S);
384 
385 /// Transform the specified attribute.
386 ///
387 /// Subclasses should override the transformation of attributes with a pragma
388 /// spelling to transform expressions stored within the attribute.
389 ///
390 /// \returns the transformed attribute.
391 #define ATTR(X)
392 #define PRAGMA_SPELLING_ATTR(X)                                                \
393   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
394 #include "clang/Basic/AttrList.inc"
395 
396   /// Transform the given expression.
397   ///
398   /// By default, this routine transforms an expression by delegating to the
399   /// appropriate TransformXXXExpr function to build a new expression.
400   /// Subclasses may override this function to transform expressions using some
401   /// other mechanism.
402   ///
403   /// \returns the transformed expression.
404   ExprResult TransformExpr(Expr *E);
405 
406   /// Transform the given initializer.
407   ///
408   /// By default, this routine transforms an initializer by stripping off the
409   /// semantic nodes added by initialization, then passing the result to
410   /// TransformExpr or TransformExprs.
411   ///
412   /// \returns the transformed initializer.
413   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
414 
415   /// Transform the given list of expressions.
416   ///
417   /// This routine transforms a list of expressions by invoking
418   /// \c TransformExpr() for each subexpression. However, it also provides
419   /// support for variadic templates by expanding any pack expansions (if the
420   /// derived class permits such expansion) along the way. When pack expansions
421   /// are present, the number of outputs may not equal the number of inputs.
422   ///
423   /// \param Inputs The set of expressions to be transformed.
424   ///
425   /// \param NumInputs The number of expressions in \c Inputs.
426   ///
427   /// \param IsCall If \c true, then this transform is being performed on
428   /// function-call arguments, and any arguments that should be dropped, will
429   /// be.
430   ///
431   /// \param Outputs The transformed input expressions will be added to this
432   /// vector.
433   ///
434   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
435   /// due to transformation.
436   ///
437   /// \returns true if an error occurred, false otherwise.
438   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
439                       SmallVectorImpl<Expr *> &Outputs,
440                       bool *ArgChanged = nullptr);
441 
442   /// Transform the given declaration, which is referenced from a type
443   /// or expression.
444   ///
445   /// By default, acts as the identity function on declarations, unless the
446   /// transformer has had to transform the declaration itself. Subclasses
447   /// may override this function to provide alternate behavior.
448   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
449     llvm::DenseMap<Decl *, Decl *>::iterator Known
450       = TransformedLocalDecls.find(D);
451     if (Known != TransformedLocalDecls.end())
452       return Known->second;
453 
454     return D;
455   }
456 
457   /// Transform the specified condition.
458   ///
459   /// By default, this transforms the variable and expression and rebuilds
460   /// the condition.
461   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
462                                            Expr *Expr,
463                                            Sema::ConditionKind Kind);
464 
465   /// Transform the attributes associated with the given declaration and
466   /// place them on the new declaration.
467   ///
468   /// By default, this operation does nothing. Subclasses may override this
469   /// behavior to transform attributes.
470   void transformAttrs(Decl *Old, Decl *New) { }
471 
472   /// Note that a local declaration has been transformed by this
473   /// transformer.
474   ///
475   /// Local declarations are typically transformed via a call to
476   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
477   /// the transformer itself has to transform the declarations. This routine
478   /// can be overridden by a subclass that keeps track of such mappings.
479   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
480     assert(New.size() == 1 &&
481            "must override transformedLocalDecl if performing pack expansion");
482     TransformedLocalDecls[Old] = New.front();
483   }
484 
485   /// Transform the definition of the given declaration.
486   ///
487   /// By default, invokes TransformDecl() to transform the declaration.
488   /// Subclasses may override this function to provide alternate behavior.
489   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
490     return getDerived().TransformDecl(Loc, D);
491   }
492 
493   /// Transform the given declaration, which was the first part of a
494   /// nested-name-specifier in a member access expression.
495   ///
496   /// This specific declaration transformation only applies to the first
497   /// identifier in a nested-name-specifier of a member access expression, e.g.,
498   /// the \c T in \c x->T::member
499   ///
500   /// By default, invokes TransformDecl() to transform the declaration.
501   /// Subclasses may override this function to provide alternate behavior.
502   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
503     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
504   }
505 
506   /// Transform the set of declarations in an OverloadExpr.
507   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
508                                   LookupResult &R);
509 
510   /// Transform the given nested-name-specifier with source-location
511   /// information.
512   ///
513   /// By default, transforms all of the types and declarations within the
514   /// nested-name-specifier. Subclasses may override this function to provide
515   /// alternate behavior.
516   NestedNameSpecifierLoc
517   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
518                                   QualType ObjectType = QualType(),
519                                   NamedDecl *FirstQualifierInScope = nullptr);
520 
521   /// Transform the given declaration name.
522   ///
523   /// By default, transforms the types of conversion function, constructor,
524   /// and destructor names and then (if needed) rebuilds the declaration name.
525   /// Identifiers and selectors are returned unmodified. Sublcasses may
526   /// override this function to provide alternate behavior.
527   DeclarationNameInfo
528   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
529 
530   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
531       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
532   concepts::TypeRequirement *
533   TransformTypeRequirement(concepts::TypeRequirement *Req);
534   concepts::ExprRequirement *
535   TransformExprRequirement(concepts::ExprRequirement *Req);
536   concepts::NestedRequirement *
537   TransformNestedRequirement(concepts::NestedRequirement *Req);
538 
539   /// Transform the given template name.
540   ///
541   /// \param SS The nested-name-specifier that qualifies the template
542   /// name. This nested-name-specifier must already have been transformed.
543   ///
544   /// \param Name The template name to transform.
545   ///
546   /// \param NameLoc The source location of the template name.
547   ///
548   /// \param ObjectType If we're translating a template name within a member
549   /// access expression, this is the type of the object whose member template
550   /// is being referenced.
551   ///
552   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
553   /// also refers to a name within the current (lexical) scope, this is the
554   /// declaration it refers to.
555   ///
556   /// By default, transforms the template name by transforming the declarations
557   /// and nested-name-specifiers that occur within the template name.
558   /// Subclasses may override this function to provide alternate behavior.
559   TemplateName
560   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
561                         SourceLocation NameLoc,
562                         QualType ObjectType = QualType(),
563                         NamedDecl *FirstQualifierInScope = nullptr,
564                         bool AllowInjectedClassName = false);
565 
566   /// Transform the given template argument.
567   ///
568   /// By default, this operation transforms the type, expression, or
569   /// declaration stored within the template argument and constructs a
570   /// new template argument from the transformed result. Subclasses may
571   /// override this function to provide alternate behavior.
572   ///
573   /// Returns true if there was an error.
574   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
575                                  TemplateArgumentLoc &Output,
576                                  bool Uneval = false);
577 
578   /// Transform the given set of template arguments.
579   ///
580   /// By default, this operation transforms all of the template arguments
581   /// in the input set using \c TransformTemplateArgument(), and appends
582   /// the transformed arguments to the output list.
583   ///
584   /// Note that this overload of \c TransformTemplateArguments() is merely
585   /// a convenience function. Subclasses that wish to override this behavior
586   /// should override the iterator-based member template version.
587   ///
588   /// \param Inputs The set of template arguments to be transformed.
589   ///
590   /// \param NumInputs The number of template arguments in \p Inputs.
591   ///
592   /// \param Outputs The set of transformed template arguments output by this
593   /// routine.
594   ///
595   /// Returns true if an error occurred.
596   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
597                                   unsigned NumInputs,
598                                   TemplateArgumentListInfo &Outputs,
599                                   bool Uneval = false) {
600     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
601                                       Uneval);
602   }
603 
604   /// Transform the given set of template arguments.
605   ///
606   /// By default, this operation transforms all of the template arguments
607   /// in the input set using \c TransformTemplateArgument(), and appends
608   /// the transformed arguments to the output list.
609   ///
610   /// \param First An iterator to the first template argument.
611   ///
612   /// \param Last An iterator one step past the last template argument.
613   ///
614   /// \param Outputs The set of transformed template arguments output by this
615   /// routine.
616   ///
617   /// Returns true if an error occurred.
618   template<typename InputIterator>
619   bool TransformTemplateArguments(InputIterator First,
620                                   InputIterator Last,
621                                   TemplateArgumentListInfo &Outputs,
622                                   bool Uneval = false);
623 
624   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
625   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
626                                  TemplateArgumentLoc &ArgLoc);
627 
628   /// Fakes up a TypeSourceInfo for a type.
629   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
630     return SemaRef.Context.getTrivialTypeSourceInfo(T,
631                        getDerived().getBaseLocation());
632   }
633 
634 #define ABSTRACT_TYPELOC(CLASS, PARENT)
635 #define TYPELOC(CLASS, PARENT)                                   \
636   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
637 #include "clang/AST/TypeLocNodes.def"
638 
639   template<typename Fn>
640   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
641                                       FunctionProtoTypeLoc TL,
642                                       CXXRecordDecl *ThisContext,
643                                       Qualifiers ThisTypeQuals,
644                                       Fn TransformExceptionSpec);
645 
646   bool TransformExceptionSpec(SourceLocation Loc,
647                               FunctionProtoType::ExceptionSpecInfo &ESI,
648                               SmallVectorImpl<QualType> &Exceptions,
649                               bool &Changed);
650 
651   StmtResult TransformSEHHandler(Stmt *Handler);
652 
653   QualType
654   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
655                                       TemplateSpecializationTypeLoc TL,
656                                       TemplateName Template);
657 
658   QualType
659   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
660                                       DependentTemplateSpecializationTypeLoc TL,
661                                                TemplateName Template,
662                                                CXXScopeSpec &SS);
663 
664   QualType TransformDependentTemplateSpecializationType(
665       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
666       NestedNameSpecifierLoc QualifierLoc);
667 
668   /// Transforms the parameters of a function type into the
669   /// given vectors.
670   ///
671   /// The result vectors should be kept in sync; null entries in the
672   /// variables vector are acceptable.
673   ///
674   /// Return true on error.
675   bool TransformFunctionTypeParams(
676       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
677       const QualType *ParamTypes,
678       const FunctionProtoType::ExtParameterInfo *ParamInfos,
679       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
680       Sema::ExtParameterInfoBuilder &PInfos);
681 
682   /// Transforms a single function-type parameter.  Return null
683   /// on error.
684   ///
685   /// \param indexAdjustment - A number to add to the parameter's
686   ///   scope index;  can be negative
687   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
688                                           int indexAdjustment,
689                                           Optional<unsigned> NumExpansions,
690                                           bool ExpectParameterPack);
691 
692   /// Transform the body of a lambda-expression.
693   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
694   /// Alternative implementation of TransformLambdaBody that skips transforming
695   /// the body.
696   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
697 
698   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
699 
700   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
701   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
702 
703   TemplateParameterList *TransformTemplateParameterList(
704         TemplateParameterList *TPL) {
705     return TPL;
706   }
707 
708   ExprResult TransformAddressOfOperand(Expr *E);
709 
710   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
711                                                 bool IsAddressOfOperand,
712                                                 TypeSourceInfo **RecoveryTSI);
713 
714   ExprResult TransformParenDependentScopeDeclRefExpr(
715       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
716       TypeSourceInfo **RecoveryTSI);
717 
718   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
719 
720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
721 // amount of stack usage with clang.
722 #define STMT(Node, Parent)                        \
723   LLVM_ATTRIBUTE_NOINLINE \
724   StmtResult Transform##Node(Node *S);
725 #define VALUESTMT(Node, Parent)                   \
726   LLVM_ATTRIBUTE_NOINLINE \
727   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
728 #define EXPR(Node, Parent)                        \
729   LLVM_ATTRIBUTE_NOINLINE \
730   ExprResult Transform##Node(Node *E);
731 #define ABSTRACT_STMT(Stmt)
732 #include "clang/AST/StmtNodes.inc"
733 
734 #define GEN_CLANG_CLAUSE_CLASS
735 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
736   LLVM_ATTRIBUTE_NOINLINE                                                      \
737   OMPClause *Transform##Class(Class *S);
738 #include "llvm/Frontend/OpenMP/OMP.inc"
739 
740   /// Build a new qualified type given its unqualified type and type location.
741   ///
742   /// By default, this routine adds type qualifiers only to types that can
743   /// have qualifiers, and silently suppresses those qualifiers that are not
744   /// permitted. Subclasses may override this routine to provide different
745   /// behavior.
746   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
747 
748   /// Build a new pointer type given its pointee type.
749   ///
750   /// By default, performs semantic analysis when building the pointer type.
751   /// Subclasses may override this routine to provide different behavior.
752   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
753 
754   /// Build a new block pointer type given its pointee type.
755   ///
756   /// By default, performs semantic analysis when building the block pointer
757   /// type. Subclasses may override this routine to provide different behavior.
758   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
759 
760   /// Build a new reference type given the type it references.
761   ///
762   /// By default, performs semantic analysis when building the
763   /// reference type. Subclasses may override this routine to provide
764   /// different behavior.
765   ///
766   /// \param LValue whether the type was written with an lvalue sigil
767   /// or an rvalue sigil.
768   QualType RebuildReferenceType(QualType ReferentType,
769                                 bool LValue,
770                                 SourceLocation Sigil);
771 
772   /// Build a new member pointer type given the pointee type and the
773   /// class type it refers into.
774   ///
775   /// By default, performs semantic analysis when building the member pointer
776   /// type. Subclasses may override this routine to provide different behavior.
777   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
778                                     SourceLocation Sigil);
779 
780   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
781                                     SourceLocation ProtocolLAngleLoc,
782                                     ArrayRef<ObjCProtocolDecl *> Protocols,
783                                     ArrayRef<SourceLocation> ProtocolLocs,
784                                     SourceLocation ProtocolRAngleLoc);
785 
786   /// Build an Objective-C object type.
787   ///
788   /// By default, performs semantic analysis when building the object type.
789   /// Subclasses may override this routine to provide different behavior.
790   QualType RebuildObjCObjectType(QualType BaseType,
791                                  SourceLocation Loc,
792                                  SourceLocation TypeArgsLAngleLoc,
793                                  ArrayRef<TypeSourceInfo *> TypeArgs,
794                                  SourceLocation TypeArgsRAngleLoc,
795                                  SourceLocation ProtocolLAngleLoc,
796                                  ArrayRef<ObjCProtocolDecl *> Protocols,
797                                  ArrayRef<SourceLocation> ProtocolLocs,
798                                  SourceLocation ProtocolRAngleLoc);
799 
800   /// Build a new Objective-C object pointer type given the pointee type.
801   ///
802   /// By default, directly builds the pointer type, with no additional semantic
803   /// analysis.
804   QualType RebuildObjCObjectPointerType(QualType PointeeType,
805                                         SourceLocation Star);
806 
807   /// Build a new array type given the element type, size
808   /// modifier, size of the array (if known), size expression, and index type
809   /// qualifiers.
810   ///
811   /// By default, performs semantic analysis when building the array type.
812   /// Subclasses may override this routine to provide different behavior.
813   /// Also by default, all of the other Rebuild*Array
814   QualType RebuildArrayType(QualType ElementType,
815                             ArrayType::ArraySizeModifier SizeMod,
816                             const llvm::APInt *Size,
817                             Expr *SizeExpr,
818                             unsigned IndexTypeQuals,
819                             SourceRange BracketsRange);
820 
821   /// Build a new constant array type given the element type, size
822   /// modifier, (known) size of the array, and index type qualifiers.
823   ///
824   /// By default, performs semantic analysis when building the array type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildConstantArrayType(QualType ElementType,
827                                     ArrayType::ArraySizeModifier SizeMod,
828                                     const llvm::APInt &Size,
829                                     Expr *SizeExpr,
830                                     unsigned IndexTypeQuals,
831                                     SourceRange BracketsRange);
832 
833   /// Build a new incomplete array type given the element type, size
834   /// modifier, and index type qualifiers.
835   ///
836   /// By default, performs semantic analysis when building the array type.
837   /// Subclasses may override this routine to provide different behavior.
838   QualType RebuildIncompleteArrayType(QualType ElementType,
839                                       ArrayType::ArraySizeModifier SizeMod,
840                                       unsigned IndexTypeQuals,
841                                       SourceRange BracketsRange);
842 
843   /// Build a new variable-length array type given the element type,
844   /// size modifier, size expression, and index type qualifiers.
845   ///
846   /// By default, performs semantic analysis when building the array type.
847   /// Subclasses may override this routine to provide different behavior.
848   QualType RebuildVariableArrayType(QualType ElementType,
849                                     ArrayType::ArraySizeModifier SizeMod,
850                                     Expr *SizeExpr,
851                                     unsigned IndexTypeQuals,
852                                     SourceRange BracketsRange);
853 
854   /// Build a new dependent-sized array type given the element type,
855   /// size modifier, size expression, and index type qualifiers.
856   ///
857   /// By default, performs semantic analysis when building the array type.
858   /// Subclasses may override this routine to provide different behavior.
859   QualType RebuildDependentSizedArrayType(QualType ElementType,
860                                           ArrayType::ArraySizeModifier SizeMod,
861                                           Expr *SizeExpr,
862                                           unsigned IndexTypeQuals,
863                                           SourceRange BracketsRange);
864 
865   /// Build a new vector type given the element type and
866   /// number of elements.
867   ///
868   /// By default, performs semantic analysis when building the vector type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
871                              VectorType::VectorKind VecKind);
872 
873   /// Build a new potentially dependently-sized extended vector type
874   /// given the element type and number of elements.
875   ///
876   /// By default, performs semantic analysis when building the vector type.
877   /// Subclasses may override this routine to provide different behavior.
878   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
879                                            SourceLocation AttributeLoc,
880                                            VectorType::VectorKind);
881 
882   /// Build a new extended vector type given the element type and
883   /// number of elements.
884   ///
885   /// By default, performs semantic analysis when building the vector type.
886   /// Subclasses may override this routine to provide different behavior.
887   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
888                                 SourceLocation AttributeLoc);
889 
890   /// Build a new potentially dependently-sized extended vector type
891   /// given the element type and number of elements.
892   ///
893   /// By default, performs semantic analysis when building the vector type.
894   /// Subclasses may override this routine to provide different behavior.
895   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
896                                               Expr *SizeExpr,
897                                               SourceLocation AttributeLoc);
898 
899   /// Build a new matrix type given the element type and dimensions.
900   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
901                                      unsigned NumColumns);
902 
903   /// Build a new matrix type given the type and dependently-defined
904   /// dimensions.
905   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
906                                            Expr *ColumnExpr,
907                                            SourceLocation AttributeLoc);
908 
909   /// Build a new DependentAddressSpaceType or return the pointee
910   /// type variable with the correct address space (retrieved from
911   /// AddrSpaceExpr) applied to it. The former will be returned in cases
912   /// where the address space remains dependent.
913   ///
914   /// By default, performs semantic analysis when building the type with address
915   /// space applied. Subclasses may override this routine to provide different
916   /// behavior.
917   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
918                                             Expr *AddrSpaceExpr,
919                                             SourceLocation AttributeLoc);
920 
921   /// Build a new function type.
922   ///
923   /// By default, performs semantic analysis when building the function type.
924   /// Subclasses may override this routine to provide different behavior.
925   QualType RebuildFunctionProtoType(QualType T,
926                                     MutableArrayRef<QualType> ParamTypes,
927                                     const FunctionProtoType::ExtProtoInfo &EPI);
928 
929   /// Build a new unprototyped function type.
930   QualType RebuildFunctionNoProtoType(QualType ResultType);
931 
932   /// Rebuild an unresolved typename type, given the decl that
933   /// the UnresolvedUsingTypenameDecl was transformed to.
934   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
935 
936   /// Build a new typedef type.
937   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
938     return SemaRef.Context.getTypeDeclType(Typedef);
939   }
940 
941   /// Build a new MacroDefined type.
942   QualType RebuildMacroQualifiedType(QualType T,
943                                      const IdentifierInfo *MacroII) {
944     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
945   }
946 
947   /// Build a new class/struct/union type.
948   QualType RebuildRecordType(RecordDecl *Record) {
949     return SemaRef.Context.getTypeDeclType(Record);
950   }
951 
952   /// Build a new Enum type.
953   QualType RebuildEnumType(EnumDecl *Enum) {
954     return SemaRef.Context.getTypeDeclType(Enum);
955   }
956 
957   /// Build a new typeof(expr) type.
958   ///
959   /// By default, performs semantic analysis when building the typeof type.
960   /// Subclasses may override this routine to provide different behavior.
961   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
962 
963   /// Build a new typeof(type) type.
964   ///
965   /// By default, builds a new TypeOfType with the given underlying type.
966   QualType RebuildTypeOfType(QualType Underlying);
967 
968   /// Build a new unary transform type.
969   QualType RebuildUnaryTransformType(QualType BaseType,
970                                      UnaryTransformType::UTTKind UKind,
971                                      SourceLocation Loc);
972 
973   /// Build a new C++11 decltype type.
974   ///
975   /// By default, performs semantic analysis when building the decltype type.
976   /// Subclasses may override this routine to provide different behavior.
977   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
978 
979   /// Build a new C++11 auto type.
980   ///
981   /// By default, builds a new AutoType with the given deduced type.
982   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
983                            ConceptDecl *TypeConstraintConcept,
984                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
985     // Note, IsDependent is always false here: we implicitly convert an 'auto'
986     // which has been deduced to a dependent type into an undeduced 'auto', so
987     // that we'll retry deduction after the transformation.
988     return SemaRef.Context.getAutoType(Deduced, Keyword,
989                                        /*IsDependent*/ false, /*IsPack=*/false,
990                                        TypeConstraintConcept,
991                                        TypeConstraintArgs);
992   }
993 
994   /// By default, builds a new DeducedTemplateSpecializationType with the given
995   /// deduced type.
996   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
997       QualType Deduced) {
998     return SemaRef.Context.getDeducedTemplateSpecializationType(
999         Template, Deduced, /*IsDependent*/ false);
1000   }
1001 
1002   /// Build a new template specialization type.
1003   ///
1004   /// By default, performs semantic analysis when building the template
1005   /// specialization type. Subclasses may override this routine to provide
1006   /// different behavior.
1007   QualType RebuildTemplateSpecializationType(TemplateName Template,
1008                                              SourceLocation TemplateLoc,
1009                                              TemplateArgumentListInfo &Args);
1010 
1011   /// Build a new parenthesized type.
1012   ///
1013   /// By default, builds a new ParenType type from the inner type.
1014   /// Subclasses may override this routine to provide different behavior.
1015   QualType RebuildParenType(QualType InnerType) {
1016     return SemaRef.BuildParenType(InnerType);
1017   }
1018 
1019   /// Build a new qualified name type.
1020   ///
1021   /// By default, builds a new ElaboratedType type from the keyword,
1022   /// the nested-name-specifier and the named type.
1023   /// Subclasses may override this routine to provide different behavior.
1024   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1025                                  ElaboratedTypeKeyword Keyword,
1026                                  NestedNameSpecifierLoc QualifierLoc,
1027                                  QualType Named) {
1028     return SemaRef.Context.getElaboratedType(Keyword,
1029                                          QualifierLoc.getNestedNameSpecifier(),
1030                                              Named);
1031   }
1032 
1033   /// Build a new typename type that refers to a template-id.
1034   ///
1035   /// By default, builds a new DependentNameType type from the
1036   /// nested-name-specifier and the given type. Subclasses may override
1037   /// this routine to provide different behavior.
1038   QualType RebuildDependentTemplateSpecializationType(
1039                                           ElaboratedTypeKeyword Keyword,
1040                                           NestedNameSpecifierLoc QualifierLoc,
1041                                           SourceLocation TemplateKWLoc,
1042                                           const IdentifierInfo *Name,
1043                                           SourceLocation NameLoc,
1044                                           TemplateArgumentListInfo &Args,
1045                                           bool AllowInjectedClassName) {
1046     // Rebuild the template name.
1047     // TODO: avoid TemplateName abstraction
1048     CXXScopeSpec SS;
1049     SS.Adopt(QualifierLoc);
1050     TemplateName InstName = getDerived().RebuildTemplateName(
1051         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1052         AllowInjectedClassName);
1053 
1054     if (InstName.isNull())
1055       return QualType();
1056 
1057     // If it's still dependent, make a dependent specialization.
1058     if (InstName.getAsDependentTemplateName())
1059       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1060                                           QualifierLoc.getNestedNameSpecifier(),
1061                                                                     Name,
1062                                                                     Args);
1063 
1064     // Otherwise, make an elaborated type wrapping a non-dependent
1065     // specialization.
1066     QualType T =
1067     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1068     if (T.isNull()) return QualType();
1069 
1070     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1071       return T;
1072 
1073     return SemaRef.Context.getElaboratedType(Keyword,
1074                                        QualifierLoc.getNestedNameSpecifier(),
1075                                              T);
1076   }
1077 
1078   /// Build a new typename type that refers to an identifier.
1079   ///
1080   /// By default, performs semantic analysis when building the typename type
1081   /// (or elaborated type). Subclasses may override this routine to provide
1082   /// different behavior.
1083   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1084                                     SourceLocation KeywordLoc,
1085                                     NestedNameSpecifierLoc QualifierLoc,
1086                                     const IdentifierInfo *Id,
1087                                     SourceLocation IdLoc,
1088                                     bool DeducedTSTContext) {
1089     CXXScopeSpec SS;
1090     SS.Adopt(QualifierLoc);
1091 
1092     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1093       // If the name is still dependent, just build a new dependent name type.
1094       if (!SemaRef.computeDeclContext(SS))
1095         return SemaRef.Context.getDependentNameType(Keyword,
1096                                           QualifierLoc.getNestedNameSpecifier(),
1097                                                     Id);
1098     }
1099 
1100     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1101       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1102                                        *Id, IdLoc, DeducedTSTContext);
1103     }
1104 
1105     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1106 
1107     // We had a dependent elaborated-type-specifier that has been transformed
1108     // into a non-dependent elaborated-type-specifier. Find the tag we're
1109     // referring to.
1110     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1111     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1112     if (!DC)
1113       return QualType();
1114 
1115     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1116       return QualType();
1117 
1118     TagDecl *Tag = nullptr;
1119     SemaRef.LookupQualifiedName(Result, DC);
1120     switch (Result.getResultKind()) {
1121       case LookupResult::NotFound:
1122       case LookupResult::NotFoundInCurrentInstantiation:
1123         break;
1124 
1125       case LookupResult::Found:
1126         Tag = Result.getAsSingle<TagDecl>();
1127         break;
1128 
1129       case LookupResult::FoundOverloaded:
1130       case LookupResult::FoundUnresolvedValue:
1131         llvm_unreachable("Tag lookup cannot find non-tags");
1132 
1133       case LookupResult::Ambiguous:
1134         // Let the LookupResult structure handle ambiguities.
1135         return QualType();
1136     }
1137 
1138     if (!Tag) {
1139       // Check where the name exists but isn't a tag type and use that to emit
1140       // better diagnostics.
1141       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1142       SemaRef.LookupQualifiedName(Result, DC);
1143       switch (Result.getResultKind()) {
1144         case LookupResult::Found:
1145         case LookupResult::FoundOverloaded:
1146         case LookupResult::FoundUnresolvedValue: {
1147           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1148           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1149           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1150                                                                << NTK << Kind;
1151           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1152           break;
1153         }
1154         default:
1155           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1156               << Kind << Id << DC << QualifierLoc.getSourceRange();
1157           break;
1158       }
1159       return QualType();
1160     }
1161 
1162     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1163                                               IdLoc, Id)) {
1164       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1165       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1166       return QualType();
1167     }
1168 
1169     // Build the elaborated-type-specifier type.
1170     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1171     return SemaRef.Context.getElaboratedType(Keyword,
1172                                          QualifierLoc.getNestedNameSpecifier(),
1173                                              T);
1174   }
1175 
1176   /// Build a new pack expansion type.
1177   ///
1178   /// By default, builds a new PackExpansionType type from the given pattern.
1179   /// Subclasses may override this routine to provide different behavior.
1180   QualType RebuildPackExpansionType(QualType Pattern,
1181                                     SourceRange PatternRange,
1182                                     SourceLocation EllipsisLoc,
1183                                     Optional<unsigned> NumExpansions) {
1184     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1185                                         NumExpansions);
1186   }
1187 
1188   /// Build a new atomic type given its value type.
1189   ///
1190   /// By default, performs semantic analysis when building the atomic type.
1191   /// Subclasses may override this routine to provide different behavior.
1192   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1193 
1194   /// Build a new pipe type given its value type.
1195   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1196                            bool isReadPipe);
1197 
1198    /// Build an extended int given its value type.
1199   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1200                              SourceLocation Loc);
1201 
1202   /// Build a dependent extended int given its value type.
1203   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1204                                       SourceLocation Loc);
1205 
1206   /// Build a new template name given a nested name specifier, a flag
1207   /// indicating whether the "template" keyword was provided, and the template
1208   /// that the template name refers to.
1209   ///
1210   /// By default, builds the new template name directly. Subclasses may override
1211   /// this routine to provide different behavior.
1212   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1213                                    bool TemplateKW,
1214                                    TemplateDecl *Template);
1215 
1216   /// Build a new template name given a nested name specifier and the
1217   /// name that is referred to as a template.
1218   ///
1219   /// By default, performs semantic analysis to determine whether the name can
1220   /// be resolved to a specific template, then builds the appropriate kind of
1221   /// template name. Subclasses may override this routine to provide different
1222   /// behavior.
1223   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1224                                    SourceLocation TemplateKWLoc,
1225                                    const IdentifierInfo &Name,
1226                                    SourceLocation NameLoc, QualType ObjectType,
1227                                    NamedDecl *FirstQualifierInScope,
1228                                    bool AllowInjectedClassName);
1229 
1230   /// Build a new template name given a nested name specifier and the
1231   /// overloaded operator name that is referred to as a template.
1232   ///
1233   /// By default, performs semantic analysis to determine whether the name can
1234   /// be resolved to a specific template, then builds the appropriate kind of
1235   /// template name. Subclasses may override this routine to provide different
1236   /// behavior.
1237   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1238                                    SourceLocation TemplateKWLoc,
1239                                    OverloadedOperatorKind Operator,
1240                                    SourceLocation NameLoc, QualType ObjectType,
1241                                    bool AllowInjectedClassName);
1242 
1243   /// Build a new template name given a template template parameter pack
1244   /// and the
1245   ///
1246   /// By default, performs semantic analysis to determine whether the name can
1247   /// be resolved to a specific template, then builds the appropriate kind of
1248   /// template name. Subclasses may override this routine to provide different
1249   /// behavior.
1250   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1251                                    const TemplateArgument &ArgPack) {
1252     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1253   }
1254 
1255   /// Build a new compound statement.
1256   ///
1257   /// By default, performs semantic analysis to build the new statement.
1258   /// Subclasses may override this routine to provide different behavior.
1259   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1260                                        MultiStmtArg Statements,
1261                                        SourceLocation RBraceLoc,
1262                                        bool IsStmtExpr) {
1263     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1264                                        IsStmtExpr);
1265   }
1266 
1267   /// Build a new case statement.
1268   ///
1269   /// By default, performs semantic analysis to build the new statement.
1270   /// Subclasses may override this routine to provide different behavior.
1271   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1272                                    Expr *LHS,
1273                                    SourceLocation EllipsisLoc,
1274                                    Expr *RHS,
1275                                    SourceLocation ColonLoc) {
1276     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1277                                    ColonLoc);
1278   }
1279 
1280   /// Attach the body to a new case statement.
1281   ///
1282   /// By default, performs semantic analysis to build the new statement.
1283   /// Subclasses may override this routine to provide different behavior.
1284   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1285     getSema().ActOnCaseStmtBody(S, Body);
1286     return S;
1287   }
1288 
1289   /// Build a new default statement.
1290   ///
1291   /// By default, performs semantic analysis to build the new statement.
1292   /// Subclasses may override this routine to provide different behavior.
1293   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1294                                       SourceLocation ColonLoc,
1295                                       Stmt *SubStmt) {
1296     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1297                                       /*CurScope=*/nullptr);
1298   }
1299 
1300   /// Build a new label statement.
1301   ///
1302   /// By default, performs semantic analysis to build the new statement.
1303   /// Subclasses may override this routine to provide different behavior.
1304   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1305                               SourceLocation ColonLoc, Stmt *SubStmt) {
1306     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1307   }
1308 
1309   /// Build a new attributed statement.
1310   ///
1311   /// By default, performs semantic analysis to build the new statement.
1312   /// Subclasses may override this routine to provide different behavior.
1313   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1314                                    ArrayRef<const Attr *> Attrs,
1315                                    Stmt *SubStmt) {
1316     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1317   }
1318 
1319   /// Build a new "if" statement.
1320   ///
1321   /// By default, performs semantic analysis to build the new statement.
1322   /// Subclasses may override this routine to provide different behavior.
1323   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1324                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1325                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1326                            SourceLocation ElseLoc, Stmt *Else) {
1327     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond,
1328                                  RParenLoc, Then, ElseLoc, Else);
1329   }
1330 
1331   /// Start building a new switch statement.
1332   ///
1333   /// By default, performs semantic analysis to build the new statement.
1334   /// Subclasses may override this routine to provide different behavior.
1335   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1336                                     SourceLocation LParenLoc, Stmt *Init,
1337                                     Sema::ConditionResult Cond,
1338                                     SourceLocation RParenLoc) {
1339     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1340                                             RParenLoc);
1341   }
1342 
1343   /// Attach the body to the switch statement.
1344   ///
1345   /// By default, performs semantic analysis to build the new statement.
1346   /// Subclasses may override this routine to provide different behavior.
1347   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1348                                    Stmt *Switch, Stmt *Body) {
1349     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1350   }
1351 
1352   /// Build a new while statement.
1353   ///
1354   /// By default, performs semantic analysis to build the new statement.
1355   /// Subclasses may override this routine to provide different behavior.
1356   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1357                               Sema::ConditionResult Cond,
1358                               SourceLocation RParenLoc, Stmt *Body) {
1359     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1360   }
1361 
1362   /// Build a new do-while statement.
1363   ///
1364   /// By default, performs semantic analysis to build the new statement.
1365   /// Subclasses may override this routine to provide different behavior.
1366   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1367                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1368                            Expr *Cond, SourceLocation RParenLoc) {
1369     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1370                                  Cond, RParenLoc);
1371   }
1372 
1373   /// Build a new for statement.
1374   ///
1375   /// By default, performs semantic analysis to build the new statement.
1376   /// Subclasses may override this routine to provide different behavior.
1377   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1378                             Stmt *Init, Sema::ConditionResult Cond,
1379                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1380                             Stmt *Body) {
1381     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1382                                   Inc, RParenLoc, Body);
1383   }
1384 
1385   /// Build a new goto statement.
1386   ///
1387   /// By default, performs semantic analysis to build the new statement.
1388   /// Subclasses may override this routine to provide different behavior.
1389   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1390                              LabelDecl *Label) {
1391     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1392   }
1393 
1394   /// Build a new indirect goto statement.
1395   ///
1396   /// By default, performs semantic analysis to build the new statement.
1397   /// Subclasses may override this routine to provide different behavior.
1398   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1399                                      SourceLocation StarLoc,
1400                                      Expr *Target) {
1401     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1402   }
1403 
1404   /// Build a new return statement.
1405   ///
1406   /// By default, performs semantic analysis to build the new statement.
1407   /// Subclasses may override this routine to provide different behavior.
1408   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1409     return getSema().BuildReturnStmt(ReturnLoc, Result);
1410   }
1411 
1412   /// Build a new declaration statement.
1413   ///
1414   /// By default, performs semantic analysis to build the new statement.
1415   /// Subclasses may override this routine to provide different behavior.
1416   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1417                              SourceLocation StartLoc, SourceLocation EndLoc) {
1418     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1419     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1420   }
1421 
1422   /// Build a new inline asm statement.
1423   ///
1424   /// By default, performs semantic analysis to build the new statement.
1425   /// Subclasses may override this routine to provide different behavior.
1426   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1427                                bool IsVolatile, unsigned NumOutputs,
1428                                unsigned NumInputs, IdentifierInfo **Names,
1429                                MultiExprArg Constraints, MultiExprArg Exprs,
1430                                Expr *AsmString, MultiExprArg Clobbers,
1431                                unsigned NumLabels,
1432                                SourceLocation RParenLoc) {
1433     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1434                                      NumInputs, Names, Constraints, Exprs,
1435                                      AsmString, Clobbers, NumLabels, RParenLoc);
1436   }
1437 
1438   /// Build a new MS style inline asm statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
1442   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1443                               ArrayRef<Token> AsmToks,
1444                               StringRef AsmString,
1445                               unsigned NumOutputs, unsigned NumInputs,
1446                               ArrayRef<StringRef> Constraints,
1447                               ArrayRef<StringRef> Clobbers,
1448                               ArrayRef<Expr*> Exprs,
1449                               SourceLocation EndLoc) {
1450     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1451                                     NumOutputs, NumInputs,
1452                                     Constraints, Clobbers, Exprs, EndLoc);
1453   }
1454 
1455   /// Build a new co_return statement.
1456   ///
1457   /// By default, performs semantic analysis to build the new statement.
1458   /// Subclasses may override this routine to provide different behavior.
1459   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1460                                  bool IsImplicit) {
1461     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1462   }
1463 
1464   /// Build a new co_await expression.
1465   ///
1466   /// By default, performs semantic analysis to build the new expression.
1467   /// Subclasses may override this routine to provide different behavior.
1468   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1469                                 bool IsImplicit) {
1470     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1471   }
1472 
1473   /// Build a new co_await expression.
1474   ///
1475   /// By default, performs semantic analysis to build the new expression.
1476   /// Subclasses may override this routine to provide different behavior.
1477   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1478                                          Expr *Result,
1479                                          UnresolvedLookupExpr *Lookup) {
1480     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1481   }
1482 
1483   /// Build a new co_yield expression.
1484   ///
1485   /// By default, performs semantic analysis to build the new expression.
1486   /// Subclasses may override this routine to provide different behavior.
1487   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1488     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1489   }
1490 
1491   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1492     return getSema().BuildCoroutineBodyStmt(Args);
1493   }
1494 
1495   /// Build a new Objective-C \@try statement.
1496   ///
1497   /// By default, performs semantic analysis to build the new statement.
1498   /// Subclasses may override this routine to provide different behavior.
1499   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1500                                         Stmt *TryBody,
1501                                         MultiStmtArg CatchStmts,
1502                                         Stmt *Finally) {
1503     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1504                                         Finally);
1505   }
1506 
1507   /// Rebuild an Objective-C exception declaration.
1508   ///
1509   /// By default, performs semantic analysis to build the new declaration.
1510   /// Subclasses may override this routine to provide different behavior.
1511   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1512                                     TypeSourceInfo *TInfo, QualType T) {
1513     return getSema().BuildObjCExceptionDecl(TInfo, T,
1514                                             ExceptionDecl->getInnerLocStart(),
1515                                             ExceptionDecl->getLocation(),
1516                                             ExceptionDecl->getIdentifier());
1517   }
1518 
1519   /// Build a new Objective-C \@catch statement.
1520   ///
1521   /// By default, performs semantic analysis to build the new statement.
1522   /// Subclasses may override this routine to provide different behavior.
1523   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1524                                           SourceLocation RParenLoc,
1525                                           VarDecl *Var,
1526                                           Stmt *Body) {
1527     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1528                                           Var, Body);
1529   }
1530 
1531   /// Build a new Objective-C \@finally statement.
1532   ///
1533   /// By default, performs semantic analysis to build the new statement.
1534   /// Subclasses may override this routine to provide different behavior.
1535   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1536                                             Stmt *Body) {
1537     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1538   }
1539 
1540   /// Build a new Objective-C \@throw statement.
1541   ///
1542   /// By default, performs semantic analysis to build the new statement.
1543   /// Subclasses may override this routine to provide different behavior.
1544   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1545                                           Expr *Operand) {
1546     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1547   }
1548 
1549   /// Build a new OpenMP Canonical loop.
1550   ///
1551   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1552   /// OMPCanonicalLoop.
1553   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1554     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1555   }
1556 
1557   /// Build a new OpenMP executable directive.
1558   ///
1559   /// By default, performs semantic analysis to build the new statement.
1560   /// Subclasses may override this routine to provide different behavior.
1561   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1562                                            DeclarationNameInfo DirName,
1563                                            OpenMPDirectiveKind CancelRegion,
1564                                            ArrayRef<OMPClause *> Clauses,
1565                                            Stmt *AStmt, SourceLocation StartLoc,
1566                                            SourceLocation EndLoc) {
1567     return getSema().ActOnOpenMPExecutableDirective(
1568         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1569   }
1570 
1571   /// Build a new OpenMP 'if' clause.
1572   ///
1573   /// By default, performs semantic analysis to build the new OpenMP clause.
1574   /// Subclasses may override this routine to provide different behavior.
1575   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1576                                 Expr *Condition, SourceLocation StartLoc,
1577                                 SourceLocation LParenLoc,
1578                                 SourceLocation NameModifierLoc,
1579                                 SourceLocation ColonLoc,
1580                                 SourceLocation EndLoc) {
1581     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1582                                          LParenLoc, NameModifierLoc, ColonLoc,
1583                                          EndLoc);
1584   }
1585 
1586   /// Build a new OpenMP 'final' clause.
1587   ///
1588   /// By default, performs semantic analysis to build the new OpenMP clause.
1589   /// Subclasses may override this routine to provide different behavior.
1590   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1591                                    SourceLocation LParenLoc,
1592                                    SourceLocation EndLoc) {
1593     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1594                                             EndLoc);
1595   }
1596 
1597   /// Build a new OpenMP 'num_threads' clause.
1598   ///
1599   /// By default, performs semantic analysis to build the new OpenMP clause.
1600   /// Subclasses may override this routine to provide different behavior.
1601   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1602                                         SourceLocation StartLoc,
1603                                         SourceLocation LParenLoc,
1604                                         SourceLocation EndLoc) {
1605     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1606                                                  LParenLoc, EndLoc);
1607   }
1608 
1609   /// Build a new OpenMP 'safelen' clause.
1610   ///
1611   /// By default, performs semantic analysis to build the new OpenMP clause.
1612   /// Subclasses may override this routine to provide different behavior.
1613   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1614                                      SourceLocation LParenLoc,
1615                                      SourceLocation EndLoc) {
1616     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1617   }
1618 
1619   /// Build a new OpenMP 'simdlen' clause.
1620   ///
1621   /// By default, performs semantic analysis to build the new OpenMP clause.
1622   /// Subclasses may override this routine to provide different behavior.
1623   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1624                                      SourceLocation LParenLoc,
1625                                      SourceLocation EndLoc) {
1626     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1627   }
1628 
1629   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1630                                    SourceLocation StartLoc,
1631                                    SourceLocation LParenLoc,
1632                                    SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1634   }
1635 
1636   /// Build a new OpenMP 'allocator' clause.
1637   ///
1638   /// By default, performs semantic analysis to build the new OpenMP clause.
1639   /// Subclasses may override this routine to provide different behavior.
1640   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1641                                        SourceLocation LParenLoc,
1642                                        SourceLocation EndLoc) {
1643     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1644   }
1645 
1646   /// Build a new OpenMP 'collapse' clause.
1647   ///
1648   /// By default, performs semantic analysis to build the new OpenMP clause.
1649   /// Subclasses may override this routine to provide different behavior.
1650   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1651                                       SourceLocation LParenLoc,
1652                                       SourceLocation EndLoc) {
1653     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1654                                                EndLoc);
1655   }
1656 
1657   /// Build a new OpenMP 'default' clause.
1658   ///
1659   /// By default, performs semantic analysis to build the new OpenMP clause.
1660   /// Subclasses may override this routine to provide different behavior.
1661   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1662                                      SourceLocation StartLoc,
1663                                      SourceLocation LParenLoc,
1664                                      SourceLocation EndLoc) {
1665     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1666                                               StartLoc, LParenLoc, EndLoc);
1667   }
1668 
1669   /// Build a new OpenMP 'proc_bind' clause.
1670   ///
1671   /// By default, performs semantic analysis to build the new OpenMP clause.
1672   /// Subclasses may override this routine to provide different behavior.
1673   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1674                                       SourceLocation KindKwLoc,
1675                                       SourceLocation StartLoc,
1676                                       SourceLocation LParenLoc,
1677                                       SourceLocation EndLoc) {
1678     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1679                                                StartLoc, LParenLoc, EndLoc);
1680   }
1681 
1682   /// Build a new OpenMP 'schedule' clause.
1683   ///
1684   /// By default, performs semantic analysis to build the new OpenMP clause.
1685   /// Subclasses may override this routine to provide different behavior.
1686   OMPClause *RebuildOMPScheduleClause(
1687       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1688       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1689       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1690       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1691     return getSema().ActOnOpenMPScheduleClause(
1692         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1693         CommaLoc, EndLoc);
1694   }
1695 
1696   /// Build a new OpenMP 'ordered' clause.
1697   ///
1698   /// By default, performs semantic analysis to build the new OpenMP clause.
1699   /// Subclasses may override this routine to provide different behavior.
1700   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1701                                      SourceLocation EndLoc,
1702                                      SourceLocation LParenLoc, Expr *Num) {
1703     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1704   }
1705 
1706   /// Build a new OpenMP 'private' clause.
1707   ///
1708   /// By default, performs semantic analysis to build the new OpenMP clause.
1709   /// Subclasses may override this routine to provide different behavior.
1710   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1711                                      SourceLocation StartLoc,
1712                                      SourceLocation LParenLoc,
1713                                      SourceLocation EndLoc) {
1714     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1715                                               EndLoc);
1716   }
1717 
1718   /// Build a new OpenMP 'firstprivate' clause.
1719   ///
1720   /// By default, performs semantic analysis to build the new OpenMP clause.
1721   /// Subclasses may override this routine to provide different behavior.
1722   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1723                                           SourceLocation StartLoc,
1724                                           SourceLocation LParenLoc,
1725                                           SourceLocation EndLoc) {
1726     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1727                                                    EndLoc);
1728   }
1729 
1730   /// Build a new OpenMP 'lastprivate' clause.
1731   ///
1732   /// By default, performs semantic analysis to build the new OpenMP clause.
1733   /// Subclasses may override this routine to provide different behavior.
1734   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1735                                          OpenMPLastprivateModifier LPKind,
1736                                          SourceLocation LPKindLoc,
1737                                          SourceLocation ColonLoc,
1738                                          SourceLocation StartLoc,
1739                                          SourceLocation LParenLoc,
1740                                          SourceLocation EndLoc) {
1741     return getSema().ActOnOpenMPLastprivateClause(
1742         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1743   }
1744 
1745   /// Build a new OpenMP 'shared' clause.
1746   ///
1747   /// By default, performs semantic analysis to build the new OpenMP clause.
1748   /// Subclasses may override this routine to provide different behavior.
1749   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1750                                     SourceLocation StartLoc,
1751                                     SourceLocation LParenLoc,
1752                                     SourceLocation EndLoc) {
1753     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1754                                              EndLoc);
1755   }
1756 
1757   /// Build a new OpenMP 'reduction' clause.
1758   ///
1759   /// By default, performs semantic analysis to build the new statement.
1760   /// Subclasses may override this routine to provide different behavior.
1761   OMPClause *RebuildOMPReductionClause(
1762       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1763       SourceLocation StartLoc, SourceLocation LParenLoc,
1764       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1765       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1766       const DeclarationNameInfo &ReductionId,
1767       ArrayRef<Expr *> UnresolvedReductions) {
1768     return getSema().ActOnOpenMPReductionClause(
1769         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1770         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1771   }
1772 
1773   /// Build a new OpenMP 'task_reduction' clause.
1774   ///
1775   /// By default, performs semantic analysis to build the new statement.
1776   /// Subclasses may override this routine to provide different behavior.
1777   OMPClause *RebuildOMPTaskReductionClause(
1778       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1779       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1780       CXXScopeSpec &ReductionIdScopeSpec,
1781       const DeclarationNameInfo &ReductionId,
1782       ArrayRef<Expr *> UnresolvedReductions) {
1783     return getSema().ActOnOpenMPTaskReductionClause(
1784         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1785         ReductionId, UnresolvedReductions);
1786   }
1787 
1788   /// Build a new OpenMP 'in_reduction' clause.
1789   ///
1790   /// By default, performs semantic analysis to build the new statement.
1791   /// Subclasses may override this routine to provide different behavior.
1792   OMPClause *
1793   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1794                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1795                               SourceLocation EndLoc,
1796                               CXXScopeSpec &ReductionIdScopeSpec,
1797                               const DeclarationNameInfo &ReductionId,
1798                               ArrayRef<Expr *> UnresolvedReductions) {
1799     return getSema().ActOnOpenMPInReductionClause(
1800         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1801         ReductionId, UnresolvedReductions);
1802   }
1803 
1804   /// Build a new OpenMP 'linear' clause.
1805   ///
1806   /// By default, performs semantic analysis to build the new OpenMP clause.
1807   /// Subclasses may override this routine to provide different behavior.
1808   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1809                                     SourceLocation StartLoc,
1810                                     SourceLocation LParenLoc,
1811                                     OpenMPLinearClauseKind Modifier,
1812                                     SourceLocation ModifierLoc,
1813                                     SourceLocation ColonLoc,
1814                                     SourceLocation EndLoc) {
1815     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1816                                              Modifier, ModifierLoc, ColonLoc,
1817                                              EndLoc);
1818   }
1819 
1820   /// Build a new OpenMP 'aligned' clause.
1821   ///
1822   /// By default, performs semantic analysis to build the new OpenMP clause.
1823   /// Subclasses may override this routine to provide different behavior.
1824   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1825                                      SourceLocation StartLoc,
1826                                      SourceLocation LParenLoc,
1827                                      SourceLocation ColonLoc,
1828                                      SourceLocation EndLoc) {
1829     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1830                                               LParenLoc, ColonLoc, EndLoc);
1831   }
1832 
1833   /// Build a new OpenMP 'copyin' clause.
1834   ///
1835   /// By default, performs semantic analysis to build the new OpenMP clause.
1836   /// Subclasses may override this routine to provide different behavior.
1837   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1838                                     SourceLocation StartLoc,
1839                                     SourceLocation LParenLoc,
1840                                     SourceLocation EndLoc) {
1841     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1842                                              EndLoc);
1843   }
1844 
1845   /// Build a new OpenMP 'copyprivate' clause.
1846   ///
1847   /// By default, performs semantic analysis to build the new OpenMP clause.
1848   /// Subclasses may override this routine to provide different behavior.
1849   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1850                                          SourceLocation StartLoc,
1851                                          SourceLocation LParenLoc,
1852                                          SourceLocation EndLoc) {
1853     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1854                                                   EndLoc);
1855   }
1856 
1857   /// Build a new OpenMP 'flush' pseudo clause.
1858   ///
1859   /// By default, performs semantic analysis to build the new OpenMP clause.
1860   /// Subclasses may override this routine to provide different behavior.
1861   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1862                                    SourceLocation StartLoc,
1863                                    SourceLocation LParenLoc,
1864                                    SourceLocation EndLoc) {
1865     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1866                                             EndLoc);
1867   }
1868 
1869   /// Build a new OpenMP 'depobj' pseudo clause.
1870   ///
1871   /// By default, performs semantic analysis to build the new OpenMP clause.
1872   /// Subclasses may override this routine to provide different behavior.
1873   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1874                                     SourceLocation LParenLoc,
1875                                     SourceLocation EndLoc) {
1876     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1877                                              EndLoc);
1878   }
1879 
1880   /// Build a new OpenMP 'depend' pseudo clause.
1881   ///
1882   /// By default, performs semantic analysis to build the new OpenMP clause.
1883   /// Subclasses may override this routine to provide different behavior.
1884   OMPClause *
1885   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1886                          SourceLocation DepLoc, SourceLocation ColonLoc,
1887                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1888                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1889     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1890                                              ColonLoc, VarList, StartLoc,
1891                                              LParenLoc, EndLoc);
1892   }
1893 
1894   /// Build a new OpenMP 'device' clause.
1895   ///
1896   /// By default, performs semantic analysis to build the new statement.
1897   /// Subclasses may override this routine to provide different behavior.
1898   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1899                                     Expr *Device, SourceLocation StartLoc,
1900                                     SourceLocation LParenLoc,
1901                                     SourceLocation ModifierLoc,
1902                                     SourceLocation EndLoc) {
1903     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1904                                              LParenLoc, ModifierLoc, EndLoc);
1905   }
1906 
1907   /// Build a new OpenMP 'map' clause.
1908   ///
1909   /// By default, performs semantic analysis to build the new OpenMP clause.
1910   /// Subclasses may override this routine to provide different behavior.
1911   OMPClause *RebuildOMPMapClause(
1912       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1913       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1914       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1915       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1916       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1917       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1918     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1919                                           MapperIdScopeSpec, MapperId, MapType,
1920                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1921                                           VarList, Locs, UnresolvedMappers);
1922   }
1923 
1924   /// Build a new OpenMP 'allocate' clause.
1925   ///
1926   /// By default, performs semantic analysis to build the new OpenMP clause.
1927   /// Subclasses may override this routine to provide different behavior.
1928   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1929                                       SourceLocation StartLoc,
1930                                       SourceLocation LParenLoc,
1931                                       SourceLocation ColonLoc,
1932                                       SourceLocation EndLoc) {
1933     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1934                                                LParenLoc, ColonLoc, EndLoc);
1935   }
1936 
1937   /// Build a new OpenMP 'num_teams' clause.
1938   ///
1939   /// By default, performs semantic analysis to build the new statement.
1940   /// Subclasses may override this routine to provide different behavior.
1941   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1942                                       SourceLocation LParenLoc,
1943                                       SourceLocation EndLoc) {
1944     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1945                                                EndLoc);
1946   }
1947 
1948   /// Build a new OpenMP 'thread_limit' clause.
1949   ///
1950   /// By default, performs semantic analysis to build the new statement.
1951   /// Subclasses may override this routine to provide different behavior.
1952   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1953                                          SourceLocation StartLoc,
1954                                          SourceLocation LParenLoc,
1955                                          SourceLocation EndLoc) {
1956     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1957                                                   LParenLoc, EndLoc);
1958   }
1959 
1960   /// Build a new OpenMP 'priority' clause.
1961   ///
1962   /// By default, performs semantic analysis to build the new statement.
1963   /// Subclasses may override this routine to provide different behavior.
1964   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1965                                       SourceLocation LParenLoc,
1966                                       SourceLocation EndLoc) {
1967     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1968                                                EndLoc);
1969   }
1970 
1971   /// Build a new OpenMP 'grainsize' clause.
1972   ///
1973   /// By default, performs semantic analysis to build the new statement.
1974   /// Subclasses may override this routine to provide different behavior.
1975   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1976                                        SourceLocation LParenLoc,
1977                                        SourceLocation EndLoc) {
1978     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1979                                                 EndLoc);
1980   }
1981 
1982   /// Build a new OpenMP 'num_tasks' clause.
1983   ///
1984   /// By default, performs semantic analysis to build the new statement.
1985   /// Subclasses may override this routine to provide different behavior.
1986   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1987                                       SourceLocation LParenLoc,
1988                                       SourceLocation EndLoc) {
1989     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1990                                                EndLoc);
1991   }
1992 
1993   /// Build a new OpenMP 'hint' clause.
1994   ///
1995   /// By default, performs semantic analysis to build the new statement.
1996   /// Subclasses may override this routine to provide different behavior.
1997   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1998                                   SourceLocation LParenLoc,
1999                                   SourceLocation EndLoc) {
2000     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2001   }
2002 
2003   /// Build a new OpenMP 'detach' clause.
2004   ///
2005   /// By default, performs semantic analysis to build the new statement.
2006   /// Subclasses may override this routine to provide different behavior.
2007   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2008                                     SourceLocation LParenLoc,
2009                                     SourceLocation EndLoc) {
2010     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2011   }
2012 
2013   /// Build a new OpenMP 'dist_schedule' clause.
2014   ///
2015   /// By default, performs semantic analysis to build the new OpenMP clause.
2016   /// Subclasses may override this routine to provide different behavior.
2017   OMPClause *
2018   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2019                                Expr *ChunkSize, SourceLocation StartLoc,
2020                                SourceLocation LParenLoc, SourceLocation KindLoc,
2021                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2022     return getSema().ActOnOpenMPDistScheduleClause(
2023         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2024   }
2025 
2026   /// Build a new OpenMP 'to' clause.
2027   ///
2028   /// By default, performs semantic analysis to build the new statement.
2029   /// Subclasses may override this routine to provide different behavior.
2030   OMPClause *
2031   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2032                      ArrayRef<SourceLocation> MotionModifiersLoc,
2033                      CXXScopeSpec &MapperIdScopeSpec,
2034                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2035                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2036                      ArrayRef<Expr *> UnresolvedMappers) {
2037     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2038                                          MapperIdScopeSpec, MapperId, ColonLoc,
2039                                          VarList, Locs, UnresolvedMappers);
2040   }
2041 
2042   /// Build a new OpenMP 'from' clause.
2043   ///
2044   /// By default, performs semantic analysis to build the new statement.
2045   /// Subclasses may override this routine to provide different behavior.
2046   OMPClause *
2047   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2048                        ArrayRef<SourceLocation> MotionModifiersLoc,
2049                        CXXScopeSpec &MapperIdScopeSpec,
2050                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2051                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2052                        ArrayRef<Expr *> UnresolvedMappers) {
2053     return getSema().ActOnOpenMPFromClause(
2054         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2055         ColonLoc, VarList, Locs, UnresolvedMappers);
2056   }
2057 
2058   /// Build a new OpenMP 'use_device_ptr' clause.
2059   ///
2060   /// By default, performs semantic analysis to build the new OpenMP clause.
2061   /// Subclasses may override this routine to provide different behavior.
2062   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2063                                           const OMPVarListLocTy &Locs) {
2064     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2065   }
2066 
2067   /// Build a new OpenMP 'use_device_addr' clause.
2068   ///
2069   /// By default, performs semantic analysis to build the new OpenMP clause.
2070   /// Subclasses may override this routine to provide different behavior.
2071   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2072                                            const OMPVarListLocTy &Locs) {
2073     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2074   }
2075 
2076   /// Build a new OpenMP 'is_device_ptr' clause.
2077   ///
2078   /// By default, performs semantic analysis to build the new OpenMP clause.
2079   /// Subclasses may override this routine to provide different behavior.
2080   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2081                                          const OMPVarListLocTy &Locs) {
2082     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2083   }
2084 
2085   /// Build a new OpenMP 'defaultmap' clause.
2086   ///
2087   /// By default, performs semantic analysis to build the new OpenMP clause.
2088   /// Subclasses may override this routine to provide different behavior.
2089   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2090                                         OpenMPDefaultmapClauseKind Kind,
2091                                         SourceLocation StartLoc,
2092                                         SourceLocation LParenLoc,
2093                                         SourceLocation MLoc,
2094                                         SourceLocation KindLoc,
2095                                         SourceLocation EndLoc) {
2096     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2097                                                  MLoc, KindLoc, EndLoc);
2098   }
2099 
2100   /// Build a new OpenMP 'nontemporal' clause.
2101   ///
2102   /// By default, performs semantic analysis to build the new OpenMP clause.
2103   /// Subclasses may override this routine to provide different behavior.
2104   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2105                                          SourceLocation StartLoc,
2106                                          SourceLocation LParenLoc,
2107                                          SourceLocation EndLoc) {
2108     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2109                                                   EndLoc);
2110   }
2111 
2112   /// Build a new OpenMP 'inclusive' clause.
2113   ///
2114   /// By default, performs semantic analysis to build the new OpenMP clause.
2115   /// Subclasses may override this routine to provide different behavior.
2116   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2117                                        SourceLocation StartLoc,
2118                                        SourceLocation LParenLoc,
2119                                        SourceLocation EndLoc) {
2120     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2121                                                 EndLoc);
2122   }
2123 
2124   /// Build a new OpenMP 'exclusive' clause.
2125   ///
2126   /// By default, performs semantic analysis to build the new OpenMP clause.
2127   /// Subclasses may override this routine to provide different behavior.
2128   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2129                                        SourceLocation StartLoc,
2130                                        SourceLocation LParenLoc,
2131                                        SourceLocation EndLoc) {
2132     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2133                                                 EndLoc);
2134   }
2135 
2136   /// Build a new OpenMP 'uses_allocators' clause.
2137   ///
2138   /// By default, performs semantic analysis to build the new OpenMP clause.
2139   /// Subclasses may override this routine to provide different behavior.
2140   OMPClause *RebuildOMPUsesAllocatorsClause(
2141       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2142       SourceLocation LParenLoc, SourceLocation EndLoc) {
2143     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2144                                                     Data);
2145   }
2146 
2147   /// Build a new OpenMP 'affinity' clause.
2148   ///
2149   /// By default, performs semantic analysis to build the new OpenMP clause.
2150   /// Subclasses may override this routine to provide different behavior.
2151   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2152                                       SourceLocation LParenLoc,
2153                                       SourceLocation ColonLoc,
2154                                       SourceLocation EndLoc, Expr *Modifier,
2155                                       ArrayRef<Expr *> Locators) {
2156     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2157                                                EndLoc, Modifier, Locators);
2158   }
2159 
2160   /// Build a new OpenMP 'order' clause.
2161   ///
2162   /// By default, performs semantic analysis to build the new OpenMP clause.
2163   /// Subclasses may override this routine to provide different behavior.
2164   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2165                                    SourceLocation KindKwLoc,
2166                                    SourceLocation StartLoc,
2167                                    SourceLocation LParenLoc,
2168                                    SourceLocation EndLoc) {
2169     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2170                                             LParenLoc, EndLoc);
2171   }
2172 
2173   /// Build a new OpenMP 'init' clause.
2174   ///
2175   /// By default, performs semantic analysis to build the new OpenMP clause.
2176   /// Subclasses may override this routine to provide different behavior.
2177   OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs,
2178                                   bool IsTarget, bool IsTargetSync,
2179                                   SourceLocation StartLoc,
2180                                   SourceLocation LParenLoc,
2181                                   SourceLocation VarLoc,
2182                                   SourceLocation EndLoc) {
2183     return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget,
2184                                            IsTargetSync, StartLoc, LParenLoc,
2185                                            VarLoc, EndLoc);
2186   }
2187 
2188   /// Build a new OpenMP 'use' clause.
2189   ///
2190   /// By default, performs semantic analysis to build the new OpenMP clause.
2191   /// Subclasses may override this routine to provide different behavior.
2192   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2193                                  SourceLocation LParenLoc,
2194                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2195     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2196                                           VarLoc, EndLoc);
2197   }
2198 
2199   /// Build a new OpenMP 'destroy' clause.
2200   ///
2201   /// By default, performs semantic analysis to build the new OpenMP clause.
2202   /// Subclasses may override this routine to provide different behavior.
2203   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2204                                      SourceLocation LParenLoc,
2205                                      SourceLocation VarLoc,
2206                                      SourceLocation EndLoc) {
2207     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2208                                               VarLoc, EndLoc);
2209   }
2210 
2211   /// Build a new OpenMP 'novariants' clause.
2212   ///
2213   /// By default, performs semantic analysis to build the new OpenMP clause.
2214   /// Subclasses may override this routine to provide different behavior.
2215   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2216                                         SourceLocation StartLoc,
2217                                         SourceLocation LParenLoc,
2218                                         SourceLocation EndLoc) {
2219     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2220                                                  EndLoc);
2221   }
2222 
2223   /// Build a new OpenMP 'nocontext' clause.
2224   ///
2225   /// By default, performs semantic analysis to build the new OpenMP clause.
2226   /// Subclasses may override this routine to provide different behavior.
2227   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2228                                        SourceLocation LParenLoc,
2229                                        SourceLocation EndLoc) {
2230     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2231                                                 EndLoc);
2232   }
2233 
2234   /// Build a new OpenMP 'filter' clause.
2235   ///
2236   /// By default, performs semantic analysis to build the new OpenMP clause.
2237   /// Subclasses may override this routine to provide different behavior.
2238   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2239                                     SourceLocation LParenLoc,
2240                                     SourceLocation EndLoc) {
2241     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2242                                              EndLoc);
2243   }
2244 
2245   /// Rebuild the operand to an Objective-C \@synchronized statement.
2246   ///
2247   /// By default, performs semantic analysis to build the new statement.
2248   /// Subclasses may override this routine to provide different behavior.
2249   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2250                                               Expr *object) {
2251     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2252   }
2253 
2254   /// Build a new Objective-C \@synchronized statement.
2255   ///
2256   /// By default, performs semantic analysis to build the new statement.
2257   /// Subclasses may override this routine to provide different behavior.
2258   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2259                                            Expr *Object, Stmt *Body) {
2260     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2261   }
2262 
2263   /// Build a new Objective-C \@autoreleasepool statement.
2264   ///
2265   /// By default, performs semantic analysis to build the new statement.
2266   /// Subclasses may override this routine to provide different behavior.
2267   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2268                                             Stmt *Body) {
2269     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2270   }
2271 
2272   /// Build a new Objective-C fast enumeration statement.
2273   ///
2274   /// By default, performs semantic analysis to build the new statement.
2275   /// Subclasses may override this routine to provide different behavior.
2276   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2277                                           Stmt *Element,
2278                                           Expr *Collection,
2279                                           SourceLocation RParenLoc,
2280                                           Stmt *Body) {
2281     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2282                                                 Element,
2283                                                 Collection,
2284                                                 RParenLoc);
2285     if (ForEachStmt.isInvalid())
2286       return StmtError();
2287 
2288     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2289   }
2290 
2291   /// Build a new C++ exception declaration.
2292   ///
2293   /// By default, performs semantic analysis to build the new decaration.
2294   /// Subclasses may override this routine to provide different behavior.
2295   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2296                                 TypeSourceInfo *Declarator,
2297                                 SourceLocation StartLoc,
2298                                 SourceLocation IdLoc,
2299                                 IdentifierInfo *Id) {
2300     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2301                                                        StartLoc, IdLoc, Id);
2302     if (Var)
2303       getSema().CurContext->addDecl(Var);
2304     return Var;
2305   }
2306 
2307   /// Build a new C++ catch statement.
2308   ///
2309   /// By default, performs semantic analysis to build the new statement.
2310   /// Subclasses may override this routine to provide different behavior.
2311   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2312                                  VarDecl *ExceptionDecl,
2313                                  Stmt *Handler) {
2314     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2315                                                       Handler));
2316   }
2317 
2318   /// Build a new C++ try statement.
2319   ///
2320   /// By default, performs semantic analysis to build the new statement.
2321   /// Subclasses may override this routine to provide different behavior.
2322   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2323                                ArrayRef<Stmt *> Handlers) {
2324     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2325   }
2326 
2327   /// Build a new C++0x range-based for statement.
2328   ///
2329   /// By default, performs semantic analysis to build the new statement.
2330   /// Subclasses may override this routine to provide different behavior.
2331   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2332                                     SourceLocation CoawaitLoc, Stmt *Init,
2333                                     SourceLocation ColonLoc, Stmt *Range,
2334                                     Stmt *Begin, Stmt *End, Expr *Cond,
2335                                     Expr *Inc, Stmt *LoopVar,
2336                                     SourceLocation RParenLoc) {
2337     // If we've just learned that the range is actually an Objective-C
2338     // collection, treat this as an Objective-C fast enumeration loop.
2339     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2340       if (RangeStmt->isSingleDecl()) {
2341         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2342           if (RangeVar->isInvalidDecl())
2343             return StmtError();
2344 
2345           Expr *RangeExpr = RangeVar->getInit();
2346           if (!RangeExpr->isTypeDependent() &&
2347               RangeExpr->getType()->isObjCObjectPointerType()) {
2348             // FIXME: Support init-statements in Objective-C++20 ranged for
2349             // statement.
2350             if (Init) {
2351               return SemaRef.Diag(Init->getBeginLoc(),
2352                                   diag::err_objc_for_range_init_stmt)
2353                          << Init->getSourceRange();
2354             }
2355             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2356                                                         RangeExpr, RParenLoc);
2357           }
2358         }
2359       }
2360     }
2361 
2362     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2363                                           Range, Begin, End, Cond, Inc, LoopVar,
2364                                           RParenLoc, Sema::BFRK_Rebuild);
2365   }
2366 
2367   /// Build a new C++0x range-based for statement.
2368   ///
2369   /// By default, performs semantic analysis to build the new statement.
2370   /// Subclasses may override this routine to provide different behavior.
2371   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2372                                           bool IsIfExists,
2373                                           NestedNameSpecifierLoc QualifierLoc,
2374                                           DeclarationNameInfo NameInfo,
2375                                           Stmt *Nested) {
2376     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2377                                                 QualifierLoc, NameInfo, Nested);
2378   }
2379 
2380   /// Attach body to a C++0x range-based for statement.
2381   ///
2382   /// By default, performs semantic analysis to finish the new statement.
2383   /// Subclasses may override this routine to provide different behavior.
2384   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2385     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2386   }
2387 
2388   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2389                                Stmt *TryBlock, Stmt *Handler) {
2390     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2391   }
2392 
2393   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2394                                   Stmt *Block) {
2395     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2396   }
2397 
2398   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2399     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2400   }
2401 
2402   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2403                                              SourceLocation LParen,
2404                                              SourceLocation RParen,
2405                                              TypeSourceInfo *TSI) {
2406     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2407   }
2408 
2409   /// Build a new predefined expression.
2410   ///
2411   /// By default, performs semantic analysis to build the new expression.
2412   /// Subclasses may override this routine to provide different behavior.
2413   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2414                                    PredefinedExpr::IdentKind IK) {
2415     return getSema().BuildPredefinedExpr(Loc, IK);
2416   }
2417 
2418   /// Build a new expression that references a declaration.
2419   ///
2420   /// By default, performs semantic analysis to build the new expression.
2421   /// Subclasses may override this routine to provide different behavior.
2422   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2423                                         LookupResult &R,
2424                                         bool RequiresADL) {
2425     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2426   }
2427 
2428 
2429   /// Build a new expression that references a declaration.
2430   ///
2431   /// By default, performs semantic analysis to build the new expression.
2432   /// Subclasses may override this routine to provide different behavior.
2433   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2434                                 ValueDecl *VD,
2435                                 const DeclarationNameInfo &NameInfo,
2436                                 NamedDecl *Found,
2437                                 TemplateArgumentListInfo *TemplateArgs) {
2438     CXXScopeSpec SS;
2439     SS.Adopt(QualifierLoc);
2440     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2441                                               TemplateArgs);
2442   }
2443 
2444   /// Build a new expression in parentheses.
2445   ///
2446   /// By default, performs semantic analysis to build the new expression.
2447   /// Subclasses may override this routine to provide different behavior.
2448   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2449                                     SourceLocation RParen) {
2450     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2451   }
2452 
2453   /// Build a new pseudo-destructor expression.
2454   ///
2455   /// By default, performs semantic analysis to build the new expression.
2456   /// Subclasses may override this routine to provide different behavior.
2457   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2458                                             SourceLocation OperatorLoc,
2459                                             bool isArrow,
2460                                             CXXScopeSpec &SS,
2461                                             TypeSourceInfo *ScopeType,
2462                                             SourceLocation CCLoc,
2463                                             SourceLocation TildeLoc,
2464                                         PseudoDestructorTypeStorage Destroyed);
2465 
2466   /// Build a new unary operator expression.
2467   ///
2468   /// By default, performs semantic analysis to build the new expression.
2469   /// Subclasses may override this routine to provide different behavior.
2470   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2471                                         UnaryOperatorKind Opc,
2472                                         Expr *SubExpr) {
2473     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2474   }
2475 
2476   /// Build a new builtin offsetof expression.
2477   ///
2478   /// By default, performs semantic analysis to build the new expression.
2479   /// Subclasses may override this routine to provide different behavior.
2480   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2481                                  TypeSourceInfo *Type,
2482                                  ArrayRef<Sema::OffsetOfComponent> Components,
2483                                  SourceLocation RParenLoc) {
2484     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2485                                           RParenLoc);
2486   }
2487 
2488   /// Build a new sizeof, alignof or vec_step expression with a
2489   /// type argument.
2490   ///
2491   /// By default, performs semantic analysis to build the new expression.
2492   /// Subclasses may override this routine to provide different behavior.
2493   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2494                                          SourceLocation OpLoc,
2495                                          UnaryExprOrTypeTrait ExprKind,
2496                                          SourceRange R) {
2497     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2498   }
2499 
2500   /// Build a new sizeof, alignof or vec step expression with an
2501   /// expression argument.
2502   ///
2503   /// By default, performs semantic analysis to build the new expression.
2504   /// Subclasses may override this routine to provide different behavior.
2505   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2506                                          UnaryExprOrTypeTrait ExprKind,
2507                                          SourceRange R) {
2508     ExprResult Result
2509       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2510     if (Result.isInvalid())
2511       return ExprError();
2512 
2513     return Result;
2514   }
2515 
2516   /// Build a new array subscript expression.
2517   ///
2518   /// By default, performs semantic analysis to build the new expression.
2519   /// Subclasses may override this routine to provide different behavior.
2520   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2521                                              SourceLocation LBracketLoc,
2522                                              Expr *RHS,
2523                                              SourceLocation RBracketLoc) {
2524     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2525                                              LBracketLoc, RHS,
2526                                              RBracketLoc);
2527   }
2528 
2529   /// Build a new matrix subscript expression.
2530   ///
2531   /// By default, performs semantic analysis to build the new expression.
2532   /// Subclasses may override this routine to provide different behavior.
2533   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2534                                         Expr *ColumnIdx,
2535                                         SourceLocation RBracketLoc) {
2536     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2537                                                       RBracketLoc);
2538   }
2539 
2540   /// Build a new array section 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 RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2545                                         Expr *LowerBound,
2546                                         SourceLocation ColonLocFirst,
2547                                         SourceLocation ColonLocSecond,
2548                                         Expr *Length, Expr *Stride,
2549                                         SourceLocation RBracketLoc) {
2550     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2551                                               ColonLocFirst, ColonLocSecond,
2552                                               Length, Stride, RBracketLoc);
2553   }
2554 
2555   /// Build a new array shaping expression.
2556   ///
2557   /// By default, performs semantic analysis to build the new expression.
2558   /// Subclasses may override this routine to provide different behavior.
2559   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2560                                         SourceLocation RParenLoc,
2561                                         ArrayRef<Expr *> Dims,
2562                                         ArrayRef<SourceRange> BracketsRanges) {
2563     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2564                                               BracketsRanges);
2565   }
2566 
2567   /// Build a new iterator expression.
2568   ///
2569   /// By default, performs semantic analysis to build the new expression.
2570   /// Subclasses may override this routine to provide different behavior.
2571   ExprResult RebuildOMPIteratorExpr(
2572       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2573       ArrayRef<Sema::OMPIteratorData> Data) {
2574     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2575                                           LLoc, RLoc, Data);
2576   }
2577 
2578   /// Build a new call expression.
2579   ///
2580   /// By default, performs semantic analysis to build the new expression.
2581   /// Subclasses may override this routine to provide different behavior.
2582   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2583                                    MultiExprArg Args,
2584                                    SourceLocation RParenLoc,
2585                                    Expr *ExecConfig = nullptr) {
2586     return getSema().ActOnCallExpr(
2587         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2588   }
2589 
2590   /// Build a new member access expression.
2591   ///
2592   /// By default, performs semantic analysis to build the new expression.
2593   /// Subclasses may override this routine to provide different behavior.
2594   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2595                                bool isArrow,
2596                                NestedNameSpecifierLoc QualifierLoc,
2597                                SourceLocation TemplateKWLoc,
2598                                const DeclarationNameInfo &MemberNameInfo,
2599                                ValueDecl *Member,
2600                                NamedDecl *FoundDecl,
2601                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2602                                NamedDecl *FirstQualifierInScope) {
2603     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2604                                                                       isArrow);
2605     if (!Member->getDeclName()) {
2606       // We have a reference to an unnamed field.  This is always the
2607       // base of an anonymous struct/union member access, i.e. the
2608       // field is always of record type.
2609       assert(Member->getType()->isRecordType() &&
2610              "unnamed member not of record type?");
2611 
2612       BaseResult =
2613         getSema().PerformObjectMemberConversion(BaseResult.get(),
2614                                                 QualifierLoc.getNestedNameSpecifier(),
2615                                                 FoundDecl, Member);
2616       if (BaseResult.isInvalid())
2617         return ExprError();
2618       Base = BaseResult.get();
2619 
2620       CXXScopeSpec EmptySS;
2621       return getSema().BuildFieldReferenceExpr(
2622           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2623           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2624     }
2625 
2626     CXXScopeSpec SS;
2627     SS.Adopt(QualifierLoc);
2628 
2629     Base = BaseResult.get();
2630     QualType BaseType = Base->getType();
2631 
2632     if (isArrow && !BaseType->isPointerType())
2633       return ExprError();
2634 
2635     // FIXME: this involves duplicating earlier analysis in a lot of
2636     // cases; we should avoid this when possible.
2637     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2638     R.addDecl(FoundDecl);
2639     R.resolveKind();
2640 
2641     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2642                                               SS, TemplateKWLoc,
2643                                               FirstQualifierInScope,
2644                                               R, ExplicitTemplateArgs,
2645                                               /*S*/nullptr);
2646   }
2647 
2648   /// Build a new binary operator expression.
2649   ///
2650   /// By default, performs semantic analysis to build the new expression.
2651   /// Subclasses may override this routine to provide different behavior.
2652   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2653                                          BinaryOperatorKind Opc,
2654                                          Expr *LHS, Expr *RHS) {
2655     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2656   }
2657 
2658   /// Build a new rewritten operator expression.
2659   ///
2660   /// By default, performs semantic analysis to build the new expression.
2661   /// Subclasses may override this routine to provide different behavior.
2662   ExprResult RebuildCXXRewrittenBinaryOperator(
2663       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2664       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2665     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2666                                            RHS, /*RequiresADL*/false);
2667   }
2668 
2669   /// Build a new conditional operator expression.
2670   ///
2671   /// By default, performs semantic analysis to build the new expression.
2672   /// Subclasses may override this routine to provide different behavior.
2673   ExprResult RebuildConditionalOperator(Expr *Cond,
2674                                         SourceLocation QuestionLoc,
2675                                         Expr *LHS,
2676                                         SourceLocation ColonLoc,
2677                                         Expr *RHS) {
2678     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2679                                         LHS, RHS);
2680   }
2681 
2682   /// Build a new C-style cast expression.
2683   ///
2684   /// By default, performs semantic analysis to build the new expression.
2685   /// Subclasses may override this routine to provide different behavior.
2686   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2687                                          TypeSourceInfo *TInfo,
2688                                          SourceLocation RParenLoc,
2689                                          Expr *SubExpr) {
2690     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2691                                          SubExpr);
2692   }
2693 
2694   /// Build a new compound literal expression.
2695   ///
2696   /// By default, performs semantic analysis to build the new expression.
2697   /// Subclasses may override this routine to provide different behavior.
2698   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2699                                               TypeSourceInfo *TInfo,
2700                                               SourceLocation RParenLoc,
2701                                               Expr *Init) {
2702     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2703                                               Init);
2704   }
2705 
2706   /// Build a new extended vector element access expression.
2707   ///
2708   /// By default, performs semantic analysis to build the new expression.
2709   /// Subclasses may override this routine to provide different behavior.
2710   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2711                                                SourceLocation OpLoc,
2712                                                SourceLocation AccessorLoc,
2713                                                IdentifierInfo &Accessor) {
2714 
2715     CXXScopeSpec SS;
2716     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2717     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2718                                               OpLoc, /*IsArrow*/ false,
2719                                               SS, SourceLocation(),
2720                                               /*FirstQualifierInScope*/ nullptr,
2721                                               NameInfo,
2722                                               /* TemplateArgs */ nullptr,
2723                                               /*S*/ nullptr);
2724   }
2725 
2726   /// Build a new initializer list expression.
2727   ///
2728   /// By default, performs semantic analysis to build the new expression.
2729   /// Subclasses may override this routine to provide different behavior.
2730   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2731                              MultiExprArg Inits,
2732                              SourceLocation RBraceLoc) {
2733     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2734   }
2735 
2736   /// Build a new designated initializer expression.
2737   ///
2738   /// By default, performs semantic analysis to build the new expression.
2739   /// Subclasses may override this routine to provide different behavior.
2740   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2741                                              MultiExprArg ArrayExprs,
2742                                              SourceLocation EqualOrColonLoc,
2743                                              bool GNUSyntax,
2744                                              Expr *Init) {
2745     ExprResult Result
2746       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2747                                            Init);
2748     if (Result.isInvalid())
2749       return ExprError();
2750 
2751     return Result;
2752   }
2753 
2754   /// Build a new value-initialized expression.
2755   ///
2756   /// By default, builds the implicit value initialization without performing
2757   /// any semantic analysis. Subclasses may override this routine to provide
2758   /// different behavior.
2759   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2760     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2761   }
2762 
2763   /// Build a new \c va_arg expression.
2764   ///
2765   /// By default, performs semantic analysis to build the new expression.
2766   /// Subclasses may override this routine to provide different behavior.
2767   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2768                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2769                                     SourceLocation RParenLoc) {
2770     return getSema().BuildVAArgExpr(BuiltinLoc,
2771                                     SubExpr, TInfo,
2772                                     RParenLoc);
2773   }
2774 
2775   /// Build a new expression list in parentheses.
2776   ///
2777   /// By default, performs semantic analysis to build the new expression.
2778   /// Subclasses may override this routine to provide different behavior.
2779   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2780                                   MultiExprArg SubExprs,
2781                                   SourceLocation RParenLoc) {
2782     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2783   }
2784 
2785   /// Build a new address-of-label expression.
2786   ///
2787   /// By default, performs semantic analysis, using the name of the label
2788   /// rather than attempting to map the label statement itself.
2789   /// Subclasses may override this routine to provide different behavior.
2790   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2791                                   SourceLocation LabelLoc, LabelDecl *Label) {
2792     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2793   }
2794 
2795   /// Build a new GNU statement expression.
2796   ///
2797   /// By default, performs semantic analysis to build the new expression.
2798   /// Subclasses may override this routine to provide different behavior.
2799   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2800                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2801     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2802                                    TemplateDepth);
2803   }
2804 
2805   /// Build a new __builtin_choose_expr expression.
2806   ///
2807   /// By default, performs semantic analysis to build the new expression.
2808   /// Subclasses may override this routine to provide different behavior.
2809   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2810                                      Expr *Cond, Expr *LHS, Expr *RHS,
2811                                      SourceLocation RParenLoc) {
2812     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2813                                    Cond, LHS, RHS,
2814                                    RParenLoc);
2815   }
2816 
2817   /// Build a new generic selection expression.
2818   ///
2819   /// By default, performs semantic analysis to build the new expression.
2820   /// Subclasses may override this routine to provide different behavior.
2821   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2822                                          SourceLocation DefaultLoc,
2823                                          SourceLocation RParenLoc,
2824                                          Expr *ControllingExpr,
2825                                          ArrayRef<TypeSourceInfo *> Types,
2826                                          ArrayRef<Expr *> Exprs) {
2827     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2828                                                 ControllingExpr, Types, Exprs);
2829   }
2830 
2831   /// Build a new overloaded operator call expression.
2832   ///
2833   /// By default, performs semantic analysis to build the new expression.
2834   /// The semantic analysis provides the behavior of template instantiation,
2835   /// copying with transformations that turn what looks like an overloaded
2836   /// operator call into a use of a builtin operator, performing
2837   /// argument-dependent lookup, etc. Subclasses may override this routine to
2838   /// provide different behavior.
2839   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2840                                               SourceLocation OpLoc,
2841                                               Expr *Callee,
2842                                               Expr *First,
2843                                               Expr *Second);
2844 
2845   /// Build a new C++ "named" cast expression, such as static_cast or
2846   /// reinterpret_cast.
2847   ///
2848   /// By default, this routine dispatches to one of the more-specific routines
2849   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2850   /// Subclasses may override this routine to provide different behavior.
2851   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2852                                            Stmt::StmtClass Class,
2853                                            SourceLocation LAngleLoc,
2854                                            TypeSourceInfo *TInfo,
2855                                            SourceLocation RAngleLoc,
2856                                            SourceLocation LParenLoc,
2857                                            Expr *SubExpr,
2858                                            SourceLocation RParenLoc) {
2859     switch (Class) {
2860     case Stmt::CXXStaticCastExprClass:
2861       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2862                                                    RAngleLoc, LParenLoc,
2863                                                    SubExpr, RParenLoc);
2864 
2865     case Stmt::CXXDynamicCastExprClass:
2866       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2867                                                     RAngleLoc, LParenLoc,
2868                                                     SubExpr, RParenLoc);
2869 
2870     case Stmt::CXXReinterpretCastExprClass:
2871       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2872                                                         RAngleLoc, LParenLoc,
2873                                                         SubExpr,
2874                                                         RParenLoc);
2875 
2876     case Stmt::CXXConstCastExprClass:
2877       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2878                                                    RAngleLoc, LParenLoc,
2879                                                    SubExpr, RParenLoc);
2880 
2881     case Stmt::CXXAddrspaceCastExprClass:
2882       return getDerived().RebuildCXXAddrspaceCastExpr(
2883           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2884 
2885     default:
2886       llvm_unreachable("Invalid C++ named cast");
2887     }
2888   }
2889 
2890   /// Build a new C++ static_cast expression.
2891   ///
2892   /// By default, performs semantic analysis to build the new expression.
2893   /// Subclasses may override this routine to provide different behavior.
2894   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2895                                             SourceLocation LAngleLoc,
2896                                             TypeSourceInfo *TInfo,
2897                                             SourceLocation RAngleLoc,
2898                                             SourceLocation LParenLoc,
2899                                             Expr *SubExpr,
2900                                             SourceLocation RParenLoc) {
2901     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2902                                        TInfo, SubExpr,
2903                                        SourceRange(LAngleLoc, RAngleLoc),
2904                                        SourceRange(LParenLoc, RParenLoc));
2905   }
2906 
2907   /// Build a new C++ dynamic_cast expression.
2908   ///
2909   /// By default, performs semantic analysis to build the new expression.
2910   /// Subclasses may override this routine to provide different behavior.
2911   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2912                                              SourceLocation LAngleLoc,
2913                                              TypeSourceInfo *TInfo,
2914                                              SourceLocation RAngleLoc,
2915                                              SourceLocation LParenLoc,
2916                                              Expr *SubExpr,
2917                                              SourceLocation RParenLoc) {
2918     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2919                                        TInfo, SubExpr,
2920                                        SourceRange(LAngleLoc, RAngleLoc),
2921                                        SourceRange(LParenLoc, RParenLoc));
2922   }
2923 
2924   /// Build a new C++ reinterpret_cast expression.
2925   ///
2926   /// By default, performs semantic analysis to build the new expression.
2927   /// Subclasses may override this routine to provide different behavior.
2928   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2929                                                  SourceLocation LAngleLoc,
2930                                                  TypeSourceInfo *TInfo,
2931                                                  SourceLocation RAngleLoc,
2932                                                  SourceLocation LParenLoc,
2933                                                  Expr *SubExpr,
2934                                                  SourceLocation RParenLoc) {
2935     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2936                                        TInfo, SubExpr,
2937                                        SourceRange(LAngleLoc, RAngleLoc),
2938                                        SourceRange(LParenLoc, RParenLoc));
2939   }
2940 
2941   /// Build a new C++ const_cast expression.
2942   ///
2943   /// By default, performs semantic analysis to build the new expression.
2944   /// Subclasses may override this routine to provide different behavior.
2945   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2946                                            SourceLocation LAngleLoc,
2947                                            TypeSourceInfo *TInfo,
2948                                            SourceLocation RAngleLoc,
2949                                            SourceLocation LParenLoc,
2950                                            Expr *SubExpr,
2951                                            SourceLocation RParenLoc) {
2952     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2953                                        TInfo, SubExpr,
2954                                        SourceRange(LAngleLoc, RAngleLoc),
2955                                        SourceRange(LParenLoc, RParenLoc));
2956   }
2957 
2958   ExprResult
2959   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2960                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2961                               SourceLocation LParenLoc, Expr *SubExpr,
2962                               SourceLocation RParenLoc) {
2963     return getSema().BuildCXXNamedCast(
2964         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2965         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2966   }
2967 
2968   /// Build a new C++ functional-style cast expression.
2969   ///
2970   /// By default, performs semantic analysis to build the new expression.
2971   /// Subclasses may override this routine to provide different behavior.
2972   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2973                                           SourceLocation LParenLoc,
2974                                           Expr *Sub,
2975                                           SourceLocation RParenLoc,
2976                                           bool ListInitialization) {
2977     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2978                                                MultiExprArg(&Sub, 1), RParenLoc,
2979                                                ListInitialization);
2980   }
2981 
2982   /// Build a new C++ __builtin_bit_cast expression.
2983   ///
2984   /// By default, performs semantic analysis to build the new expression.
2985   /// Subclasses may override this routine to provide different behavior.
2986   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2987                                        TypeSourceInfo *TSI, Expr *Sub,
2988                                        SourceLocation RParenLoc) {
2989     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2990   }
2991 
2992   /// Build a new C++ typeid(type) expression.
2993   ///
2994   /// By default, performs semantic analysis to build the new expression.
2995   /// Subclasses may override this routine to provide different behavior.
2996   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2997                                         SourceLocation TypeidLoc,
2998                                         TypeSourceInfo *Operand,
2999                                         SourceLocation RParenLoc) {
3000     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3001                                     RParenLoc);
3002   }
3003 
3004 
3005   /// Build a new C++ typeid(expr) expression.
3006   ///
3007   /// By default, performs semantic analysis to build the new expression.
3008   /// Subclasses may override this routine to provide different behavior.
3009   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3010                                         SourceLocation TypeidLoc,
3011                                         Expr *Operand,
3012                                         SourceLocation RParenLoc) {
3013     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3014                                     RParenLoc);
3015   }
3016 
3017   /// Build a new C++ __uuidof(type) expression.
3018   ///
3019   /// By default, performs semantic analysis to build the new expression.
3020   /// Subclasses may override this routine to provide different behavior.
3021   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3022                                   TypeSourceInfo *Operand,
3023                                   SourceLocation RParenLoc) {
3024     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3025   }
3026 
3027   /// Build a new C++ __uuidof(expr) expression.
3028   ///
3029   /// By default, performs semantic analysis to build the new expression.
3030   /// Subclasses may override this routine to provide different behavior.
3031   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3032                                   Expr *Operand, SourceLocation RParenLoc) {
3033     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3034   }
3035 
3036   /// Build a new C++ "this" expression.
3037   ///
3038   /// By default, builds a new "this" expression without performing any
3039   /// semantic analysis. Subclasses may override this routine to provide
3040   /// different behavior.
3041   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3042                                 QualType ThisType,
3043                                 bool isImplicit) {
3044     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3045   }
3046 
3047   /// Build a new C++ throw expression.
3048   ///
3049   /// By default, performs semantic analysis to build the new expression.
3050   /// Subclasses may override this routine to provide different behavior.
3051   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3052                                  bool IsThrownVariableInScope) {
3053     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3054   }
3055 
3056   /// Build a new C++ default-argument expression.
3057   ///
3058   /// By default, builds a new default-argument expression, which does not
3059   /// require any semantic analysis. Subclasses may override this routine to
3060   /// provide different behavior.
3061   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3062     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3063                                      getSema().CurContext);
3064   }
3065 
3066   /// Build a new C++11 default-initialization expression.
3067   ///
3068   /// By default, builds a new default field initialization expression, which
3069   /// does not require any semantic analysis. Subclasses may override this
3070   /// routine to provide different behavior.
3071   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3072                                        FieldDecl *Field) {
3073     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3074                                       getSema().CurContext);
3075   }
3076 
3077   /// Build a new C++ zero-initialization expression.
3078   ///
3079   /// By default, performs semantic analysis to build the new expression.
3080   /// Subclasses may override this routine to provide different behavior.
3081   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3082                                            SourceLocation LParenLoc,
3083                                            SourceLocation RParenLoc) {
3084     return getSema().BuildCXXTypeConstructExpr(
3085         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3086   }
3087 
3088   /// Build a new C++ "new" expression.
3089   ///
3090   /// By default, performs semantic analysis to build the new expression.
3091   /// Subclasses may override this routine to provide different behavior.
3092   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3093                                bool UseGlobal,
3094                                SourceLocation PlacementLParen,
3095                                MultiExprArg PlacementArgs,
3096                                SourceLocation PlacementRParen,
3097                                SourceRange TypeIdParens,
3098                                QualType AllocatedType,
3099                                TypeSourceInfo *AllocatedTypeInfo,
3100                                Optional<Expr *> ArraySize,
3101                                SourceRange DirectInitRange,
3102                                Expr *Initializer) {
3103     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3104                                  PlacementLParen,
3105                                  PlacementArgs,
3106                                  PlacementRParen,
3107                                  TypeIdParens,
3108                                  AllocatedType,
3109                                  AllocatedTypeInfo,
3110                                  ArraySize,
3111                                  DirectInitRange,
3112                                  Initializer);
3113   }
3114 
3115   /// Build a new C++ "delete" expression.
3116   ///
3117   /// By default, performs semantic analysis to build the new expression.
3118   /// Subclasses may override this routine to provide different behavior.
3119   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3120                                         bool IsGlobalDelete,
3121                                         bool IsArrayForm,
3122                                         Expr *Operand) {
3123     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3124                                     Operand);
3125   }
3126 
3127   /// Build a new type trait expression.
3128   ///
3129   /// By default, performs semantic analysis to build the new expression.
3130   /// Subclasses may override this routine to provide different behavior.
3131   ExprResult RebuildTypeTrait(TypeTrait Trait,
3132                               SourceLocation StartLoc,
3133                               ArrayRef<TypeSourceInfo *> Args,
3134                               SourceLocation RParenLoc) {
3135     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3136   }
3137 
3138   /// Build a new array type trait expression.
3139   ///
3140   /// By default, performs semantic analysis to build the new expression.
3141   /// Subclasses may override this routine to provide different behavior.
3142   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3143                                    SourceLocation StartLoc,
3144                                    TypeSourceInfo *TSInfo,
3145                                    Expr *DimExpr,
3146                                    SourceLocation RParenLoc) {
3147     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3148   }
3149 
3150   /// Build a new expression trait expression.
3151   ///
3152   /// By default, performs semantic analysis to build the new expression.
3153   /// Subclasses may override this routine to provide different behavior.
3154   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3155                                    SourceLocation StartLoc,
3156                                    Expr *Queried,
3157                                    SourceLocation RParenLoc) {
3158     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3159   }
3160 
3161   /// Build a new (previously unresolved) declaration reference
3162   /// expression.
3163   ///
3164   /// By default, performs semantic analysis to build the new expression.
3165   /// Subclasses may override this routine to provide different behavior.
3166   ExprResult RebuildDependentScopeDeclRefExpr(
3167                                           NestedNameSpecifierLoc QualifierLoc,
3168                                           SourceLocation TemplateKWLoc,
3169                                        const DeclarationNameInfo &NameInfo,
3170                               const TemplateArgumentListInfo *TemplateArgs,
3171                                           bool IsAddressOfOperand,
3172                                           TypeSourceInfo **RecoveryTSI) {
3173     CXXScopeSpec SS;
3174     SS.Adopt(QualifierLoc);
3175 
3176     if (TemplateArgs || TemplateKWLoc.isValid())
3177       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3178                                                     TemplateArgs);
3179 
3180     return getSema().BuildQualifiedDeclarationNameExpr(
3181         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3182   }
3183 
3184   /// Build a new template-id expression.
3185   ///
3186   /// By default, performs semantic analysis to build the new expression.
3187   /// Subclasses may override this routine to provide different behavior.
3188   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3189                                    SourceLocation TemplateKWLoc,
3190                                    LookupResult &R,
3191                                    bool RequiresADL,
3192                               const TemplateArgumentListInfo *TemplateArgs) {
3193     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3194                                          TemplateArgs);
3195   }
3196 
3197   /// Build a new object-construction expression.
3198   ///
3199   /// By default, performs semantic analysis to build the new expression.
3200   /// Subclasses may override this routine to provide different behavior.
3201   ExprResult RebuildCXXConstructExpr(QualType T,
3202                                      SourceLocation Loc,
3203                                      CXXConstructorDecl *Constructor,
3204                                      bool IsElidable,
3205                                      MultiExprArg Args,
3206                                      bool HadMultipleCandidates,
3207                                      bool ListInitialization,
3208                                      bool StdInitListInitialization,
3209                                      bool RequiresZeroInit,
3210                              CXXConstructExpr::ConstructionKind ConstructKind,
3211                                      SourceRange ParenRange) {
3212     // Reconstruct the constructor we originally found, which might be
3213     // different if this is a call to an inherited constructor.
3214     CXXConstructorDecl *FoundCtor = Constructor;
3215     if (Constructor->isInheritingConstructor())
3216       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3217 
3218     SmallVector<Expr *, 8> ConvertedArgs;
3219     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3220                                           ConvertedArgs))
3221       return ExprError();
3222 
3223     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3224                                            IsElidable,
3225                                            ConvertedArgs,
3226                                            HadMultipleCandidates,
3227                                            ListInitialization,
3228                                            StdInitListInitialization,
3229                                            RequiresZeroInit, ConstructKind,
3230                                            ParenRange);
3231   }
3232 
3233   /// Build a new implicit construction via inherited constructor
3234   /// expression.
3235   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3236                                              CXXConstructorDecl *Constructor,
3237                                              bool ConstructsVBase,
3238                                              bool InheritedFromVBase) {
3239     return new (getSema().Context) CXXInheritedCtorInitExpr(
3240         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3241   }
3242 
3243   /// Build a new object-construction expression.
3244   ///
3245   /// By default, performs semantic analysis to build the new expression.
3246   /// Subclasses may override this routine to provide different behavior.
3247   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3248                                            SourceLocation LParenOrBraceLoc,
3249                                            MultiExprArg Args,
3250                                            SourceLocation RParenOrBraceLoc,
3251                                            bool ListInitialization) {
3252     return getSema().BuildCXXTypeConstructExpr(
3253         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3254   }
3255 
3256   /// Build a new object-construction expression.
3257   ///
3258   /// By default, performs semantic analysis to build the new expression.
3259   /// Subclasses may override this routine to provide different behavior.
3260   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3261                                                SourceLocation LParenLoc,
3262                                                MultiExprArg Args,
3263                                                SourceLocation RParenLoc,
3264                                                bool ListInitialization) {
3265     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3266                                                RParenLoc, ListInitialization);
3267   }
3268 
3269   /// Build a new member reference expression.
3270   ///
3271   /// By default, performs semantic analysis to build the new expression.
3272   /// Subclasses may override this routine to provide different behavior.
3273   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3274                                                 QualType BaseType,
3275                                                 bool IsArrow,
3276                                                 SourceLocation OperatorLoc,
3277                                           NestedNameSpecifierLoc QualifierLoc,
3278                                                 SourceLocation TemplateKWLoc,
3279                                             NamedDecl *FirstQualifierInScope,
3280                                    const DeclarationNameInfo &MemberNameInfo,
3281                               const TemplateArgumentListInfo *TemplateArgs) {
3282     CXXScopeSpec SS;
3283     SS.Adopt(QualifierLoc);
3284 
3285     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3286                                             OperatorLoc, IsArrow,
3287                                             SS, TemplateKWLoc,
3288                                             FirstQualifierInScope,
3289                                             MemberNameInfo,
3290                                             TemplateArgs, /*S*/nullptr);
3291   }
3292 
3293   /// Build a new member reference expression.
3294   ///
3295   /// By default, performs semantic analysis to build the new expression.
3296   /// Subclasses may override this routine to provide different behavior.
3297   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3298                                          SourceLocation OperatorLoc,
3299                                          bool IsArrow,
3300                                          NestedNameSpecifierLoc QualifierLoc,
3301                                          SourceLocation TemplateKWLoc,
3302                                          NamedDecl *FirstQualifierInScope,
3303                                          LookupResult &R,
3304                                 const TemplateArgumentListInfo *TemplateArgs) {
3305     CXXScopeSpec SS;
3306     SS.Adopt(QualifierLoc);
3307 
3308     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3309                                             OperatorLoc, IsArrow,
3310                                             SS, TemplateKWLoc,
3311                                             FirstQualifierInScope,
3312                                             R, TemplateArgs, /*S*/nullptr);
3313   }
3314 
3315   /// Build a new noexcept expression.
3316   ///
3317   /// By default, performs semantic analysis to build the new expression.
3318   /// Subclasses may override this routine to provide different behavior.
3319   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3320     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3321   }
3322 
3323   /// Build a new expression to compute the length of a parameter pack.
3324   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3325                                    NamedDecl *Pack,
3326                                    SourceLocation PackLoc,
3327                                    SourceLocation RParenLoc,
3328                                    Optional<unsigned> Length,
3329                                    ArrayRef<TemplateArgument> PartialArgs) {
3330     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3331                                   RParenLoc, Length, PartialArgs);
3332   }
3333 
3334   /// Build a new expression representing a call to a source location
3335   ///  builtin.
3336   ///
3337   /// By default, performs semantic analysis to build the new expression.
3338   /// Subclasses may override this routine to provide different behavior.
3339   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3340                                   SourceLocation BuiltinLoc,
3341                                   SourceLocation RPLoc,
3342                                   DeclContext *ParentContext) {
3343     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3344   }
3345 
3346   /// Build a new Objective-C boxed expression.
3347   ///
3348   /// By default, performs semantic analysis to build the new expression.
3349   /// Subclasses may override this routine to provide different behavior.
3350   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3351       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3352       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3353       TemplateArgumentListInfo *TALI) {
3354     CXXScopeSpec SS;
3355     SS.Adopt(NNS);
3356     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3357                                                          ConceptNameInfo,
3358                                                          FoundDecl,
3359                                                          NamedConcept, TALI);
3360     if (Result.isInvalid())
3361       return ExprError();
3362     return Result;
3363   }
3364 
3365   /// \brief Build a new requires expression.
3366   ///
3367   /// By default, performs semantic analysis to build the new expression.
3368   /// Subclasses may override this routine to provide different behavior.
3369   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3370                                  RequiresExprBodyDecl *Body,
3371                                  ArrayRef<ParmVarDecl *> LocalParameters,
3372                                  ArrayRef<concepts::Requirement *> Requirements,
3373                                  SourceLocation ClosingBraceLoc) {
3374     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3375                                 LocalParameters, Requirements, ClosingBraceLoc);
3376   }
3377 
3378   concepts::TypeRequirement *
3379   RebuildTypeRequirement(
3380       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3381     return SemaRef.BuildTypeRequirement(SubstDiag);
3382   }
3383 
3384   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3385     return SemaRef.BuildTypeRequirement(T);
3386   }
3387 
3388   concepts::ExprRequirement *
3389   RebuildExprRequirement(
3390       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3391       SourceLocation NoexceptLoc,
3392       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3393     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3394                                         std::move(Ret));
3395   }
3396 
3397   concepts::ExprRequirement *
3398   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3399                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3400     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3401                                         std::move(Ret));
3402   }
3403 
3404   concepts::NestedRequirement *
3405   RebuildNestedRequirement(
3406       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3407     return SemaRef.BuildNestedRequirement(SubstDiag);
3408   }
3409 
3410   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3411     return SemaRef.BuildNestedRequirement(Constraint);
3412   }
3413 
3414   /// \brief Build a new Objective-C boxed expression.
3415   ///
3416   /// By default, performs semantic analysis to build the new expression.
3417   /// Subclasses may override this routine to provide different behavior.
3418   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3419     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3420   }
3421 
3422   /// Build a new Objective-C array literal.
3423   ///
3424   /// By default, performs semantic analysis to build the new expression.
3425   /// Subclasses may override this routine to provide different behavior.
3426   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3427                                      Expr **Elements, unsigned NumElements) {
3428     return getSema().BuildObjCArrayLiteral(Range,
3429                                            MultiExprArg(Elements, NumElements));
3430   }
3431 
3432   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3433                                          Expr *Base, Expr *Key,
3434                                          ObjCMethodDecl *getterMethod,
3435                                          ObjCMethodDecl *setterMethod) {
3436     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3437                                                    getterMethod, setterMethod);
3438   }
3439 
3440   /// Build a new Objective-C dictionary literal.
3441   ///
3442   /// By default, performs semantic analysis to build the new expression.
3443   /// Subclasses may override this routine to provide different behavior.
3444   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3445                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3446     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3447   }
3448 
3449   /// Build a new Objective-C \@encode expression.
3450   ///
3451   /// By default, performs semantic analysis to build the new expression.
3452   /// Subclasses may override this routine to provide different behavior.
3453   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3454                                          TypeSourceInfo *EncodeTypeInfo,
3455                                          SourceLocation RParenLoc) {
3456     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3457   }
3458 
3459   /// Build a new Objective-C class message.
3460   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3461                                           Selector Sel,
3462                                           ArrayRef<SourceLocation> SelectorLocs,
3463                                           ObjCMethodDecl *Method,
3464                                           SourceLocation LBracLoc,
3465                                           MultiExprArg Args,
3466                                           SourceLocation RBracLoc) {
3467     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3468                                      ReceiverTypeInfo->getType(),
3469                                      /*SuperLoc=*/SourceLocation(),
3470                                      Sel, Method, LBracLoc, SelectorLocs,
3471                                      RBracLoc, Args);
3472   }
3473 
3474   /// Build a new Objective-C instance message.
3475   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3476                                           Selector Sel,
3477                                           ArrayRef<SourceLocation> SelectorLocs,
3478                                           ObjCMethodDecl *Method,
3479                                           SourceLocation LBracLoc,
3480                                           MultiExprArg Args,
3481                                           SourceLocation RBracLoc) {
3482     return SemaRef.BuildInstanceMessage(Receiver,
3483                                         Receiver->getType(),
3484                                         /*SuperLoc=*/SourceLocation(),
3485                                         Sel, Method, LBracLoc, SelectorLocs,
3486                                         RBracLoc, Args);
3487   }
3488 
3489   /// Build a new Objective-C instance/class message to 'super'.
3490   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3491                                     Selector Sel,
3492                                     ArrayRef<SourceLocation> SelectorLocs,
3493                                     QualType SuperType,
3494                                     ObjCMethodDecl *Method,
3495                                     SourceLocation LBracLoc,
3496                                     MultiExprArg Args,
3497                                     SourceLocation RBracLoc) {
3498     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3499                                           SuperType,
3500                                           SuperLoc,
3501                                           Sel, Method, LBracLoc, SelectorLocs,
3502                                           RBracLoc, Args)
3503                                       : SemaRef.BuildClassMessage(nullptr,
3504                                           SuperType,
3505                                           SuperLoc,
3506                                           Sel, Method, LBracLoc, SelectorLocs,
3507                                           RBracLoc, Args);
3508 
3509 
3510   }
3511 
3512   /// Build a new Objective-C ivar reference expression.
3513   ///
3514   /// By default, performs semantic analysis to build the new expression.
3515   /// Subclasses may override this routine to provide different behavior.
3516   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3517                                           SourceLocation IvarLoc,
3518                                           bool IsArrow, bool IsFreeIvar) {
3519     CXXScopeSpec SS;
3520     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3521     ExprResult Result = getSema().BuildMemberReferenceExpr(
3522         BaseArg, BaseArg->getType(),
3523         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3524         /*FirstQualifierInScope=*/nullptr, NameInfo,
3525         /*TemplateArgs=*/nullptr,
3526         /*S=*/nullptr);
3527     if (IsFreeIvar && Result.isUsable())
3528       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3529     return Result;
3530   }
3531 
3532   /// Build a new Objective-C property reference expression.
3533   ///
3534   /// By default, performs semantic analysis to build the new expression.
3535   /// Subclasses may override this routine to provide different behavior.
3536   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3537                                         ObjCPropertyDecl *Property,
3538                                         SourceLocation PropertyLoc) {
3539     CXXScopeSpec SS;
3540     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3541     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3542                                               /*FIXME:*/PropertyLoc,
3543                                               /*IsArrow=*/false,
3544                                               SS, SourceLocation(),
3545                                               /*FirstQualifierInScope=*/nullptr,
3546                                               NameInfo,
3547                                               /*TemplateArgs=*/nullptr,
3548                                               /*S=*/nullptr);
3549   }
3550 
3551   /// Build a new Objective-C property reference expression.
3552   ///
3553   /// By default, performs semantic analysis to build the new expression.
3554   /// Subclasses may override this routine to provide different behavior.
3555   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3556                                         ObjCMethodDecl *Getter,
3557                                         ObjCMethodDecl *Setter,
3558                                         SourceLocation PropertyLoc) {
3559     // Since these expressions can only be value-dependent, we do not
3560     // need to perform semantic analysis again.
3561     return Owned(
3562       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3563                                                   VK_LValue, OK_ObjCProperty,
3564                                                   PropertyLoc, Base));
3565   }
3566 
3567   /// Build a new Objective-C "isa" expression.
3568   ///
3569   /// By default, performs semantic analysis to build the new expression.
3570   /// Subclasses may override this routine to provide different behavior.
3571   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3572                                 SourceLocation OpLoc, bool IsArrow) {
3573     CXXScopeSpec SS;
3574     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3575     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3576                                               OpLoc, IsArrow,
3577                                               SS, SourceLocation(),
3578                                               /*FirstQualifierInScope=*/nullptr,
3579                                               NameInfo,
3580                                               /*TemplateArgs=*/nullptr,
3581                                               /*S=*/nullptr);
3582   }
3583 
3584   /// Build a new shuffle vector expression.
3585   ///
3586   /// By default, performs semantic analysis to build the new expression.
3587   /// Subclasses may override this routine to provide different behavior.
3588   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3589                                       MultiExprArg SubExprs,
3590                                       SourceLocation RParenLoc) {
3591     // Find the declaration for __builtin_shufflevector
3592     const IdentifierInfo &Name
3593       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3594     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3595     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3596     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3597 
3598     // Build a reference to the __builtin_shufflevector builtin
3599     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3600     Expr *Callee = new (SemaRef.Context)
3601         DeclRefExpr(SemaRef.Context, Builtin, false,
3602                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3603     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3604     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3605                                        CK_BuiltinFnToFnPtr).get();
3606 
3607     // Build the CallExpr
3608     ExprResult TheCall = CallExpr::Create(
3609         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3610         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3611         FPOptionsOverride());
3612 
3613     // Type-check the __builtin_shufflevector expression.
3614     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3615   }
3616 
3617   /// Build a new convert vector expression.
3618   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3619                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3620                                       SourceLocation RParenLoc) {
3621     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3622                                          BuiltinLoc, RParenLoc);
3623   }
3624 
3625   /// Build a new template argument pack expansion.
3626   ///
3627   /// By default, performs semantic analysis to build a new pack expansion
3628   /// for a template argument. Subclasses may override this routine to provide
3629   /// different behavior.
3630   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3631                                            SourceLocation EllipsisLoc,
3632                                            Optional<unsigned> NumExpansions) {
3633     switch (Pattern.getArgument().getKind()) {
3634     case TemplateArgument::Expression: {
3635       ExprResult Result
3636         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3637                                        EllipsisLoc, NumExpansions);
3638       if (Result.isInvalid())
3639         return TemplateArgumentLoc();
3640 
3641       return TemplateArgumentLoc(Result.get(), Result.get());
3642     }
3643 
3644     case TemplateArgument::Template:
3645       return TemplateArgumentLoc(
3646           SemaRef.Context,
3647           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3648                            NumExpansions),
3649           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3650           EllipsisLoc);
3651 
3652     case TemplateArgument::Null:
3653     case TemplateArgument::Integral:
3654     case TemplateArgument::Declaration:
3655     case TemplateArgument::Pack:
3656     case TemplateArgument::TemplateExpansion:
3657     case TemplateArgument::NullPtr:
3658       llvm_unreachable("Pack expansion pattern has no parameter packs");
3659 
3660     case TemplateArgument::Type:
3661       if (TypeSourceInfo *Expansion
3662             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3663                                            EllipsisLoc,
3664                                            NumExpansions))
3665         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3666                                    Expansion);
3667       break;
3668     }
3669 
3670     return TemplateArgumentLoc();
3671   }
3672 
3673   /// Build a new expression pack expansion.
3674   ///
3675   /// By default, performs semantic analysis to build a new pack expansion
3676   /// for an expression. Subclasses may override this routine to provide
3677   /// different behavior.
3678   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3679                                   Optional<unsigned> NumExpansions) {
3680     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3681   }
3682 
3683   /// Build a new C++1z fold-expression.
3684   ///
3685   /// By default, performs semantic analysis in order to build a new fold
3686   /// expression.
3687   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3688                                 SourceLocation LParenLoc, Expr *LHS,
3689                                 BinaryOperatorKind Operator,
3690                                 SourceLocation EllipsisLoc, Expr *RHS,
3691                                 SourceLocation RParenLoc,
3692                                 Optional<unsigned> NumExpansions) {
3693     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3694                                       EllipsisLoc, RHS, RParenLoc,
3695                                       NumExpansions);
3696   }
3697 
3698   /// Build an empty C++1z fold-expression with the given operator.
3699   ///
3700   /// By default, produces the fallback value for the fold-expression, or
3701   /// produce an error if there is no fallback value.
3702   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3703                                      BinaryOperatorKind Operator) {
3704     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3705   }
3706 
3707   /// Build a new atomic operation expression.
3708   ///
3709   /// By default, performs semantic analysis to build the new expression.
3710   /// Subclasses may override this routine to provide different behavior.
3711   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3712                                AtomicExpr::AtomicOp Op,
3713                                SourceLocation RParenLoc) {
3714     // Use this for all of the locations, since we don't know the difference
3715     // between the call and the expr at this point.
3716     SourceRange Range{BuiltinLoc, RParenLoc};
3717     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3718                                      Sema::AtomicArgumentOrder::AST);
3719   }
3720 
3721   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3722                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3723     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3724   }
3725 
3726 private:
3727   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3728                                      QualType ObjectType,
3729                                      NamedDecl *FirstQualifierInScope,
3730                                      CXXScopeSpec &SS);
3731 
3732   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3733                                              QualType ObjectType,
3734                                              NamedDecl *FirstQualifierInScope,
3735                                              CXXScopeSpec &SS);
3736 
3737   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3738                                             NamedDecl *FirstQualifierInScope,
3739                                             CXXScopeSpec &SS);
3740 
3741   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3742                                       DependentNameTypeLoc TL,
3743                                       bool DeducibleTSTContext);
3744 };
3745 
3746 template <typename Derived>
3747 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3748   if (!S)
3749     return S;
3750 
3751   switch (S->getStmtClass()) {
3752   case Stmt::NoStmtClass: break;
3753 
3754   // Transform individual statement nodes
3755   // Pass SDK into statements that can produce a value
3756 #define STMT(Node, Parent)                                              \
3757   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3758 #define VALUESTMT(Node, Parent)                                         \
3759   case Stmt::Node##Class:                                               \
3760     return getDerived().Transform##Node(cast<Node>(S), SDK);
3761 #define ABSTRACT_STMT(Node)
3762 #define EXPR(Node, Parent)
3763 #include "clang/AST/StmtNodes.inc"
3764 
3765   // Transform expressions by calling TransformExpr.
3766 #define STMT(Node, Parent)
3767 #define ABSTRACT_STMT(Stmt)
3768 #define EXPR(Node, Parent) case Stmt::Node##Class:
3769 #include "clang/AST/StmtNodes.inc"
3770     {
3771       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3772 
3773       if (SDK == SDK_StmtExprResult)
3774         E = getSema().ActOnStmtExprResult(E);
3775       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3776     }
3777   }
3778 
3779   return S;
3780 }
3781 
3782 template<typename Derived>
3783 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3784   if (!S)
3785     return S;
3786 
3787   switch (S->getClauseKind()) {
3788   default: break;
3789   // Transform individual clause nodes
3790 #define GEN_CLANG_CLAUSE_CLASS
3791 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3792   case Enum:                                                                   \
3793     return getDerived().Transform##Class(cast<Class>(S));
3794 #include "llvm/Frontend/OpenMP/OMP.inc"
3795   }
3796 
3797   return S;
3798 }
3799 
3800 
3801 template<typename Derived>
3802 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3803   if (!E)
3804     return E;
3805 
3806   switch (E->getStmtClass()) {
3807     case Stmt::NoStmtClass: break;
3808 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3809 #define ABSTRACT_STMT(Stmt)
3810 #define EXPR(Node, Parent)                                              \
3811     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3812 #include "clang/AST/StmtNodes.inc"
3813   }
3814 
3815   return E;
3816 }
3817 
3818 template<typename Derived>
3819 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3820                                                         bool NotCopyInit) {
3821   // Initializers are instantiated like expressions, except that various outer
3822   // layers are stripped.
3823   if (!Init)
3824     return Init;
3825 
3826   if (auto *FE = dyn_cast<FullExpr>(Init))
3827     Init = FE->getSubExpr();
3828 
3829   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3830     Init = AIL->getCommonExpr();
3831 
3832   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3833     Init = MTE->getSubExpr();
3834 
3835   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3836     Init = Binder->getSubExpr();
3837 
3838   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3839     Init = ICE->getSubExprAsWritten();
3840 
3841   if (CXXStdInitializerListExpr *ILE =
3842           dyn_cast<CXXStdInitializerListExpr>(Init))
3843     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3844 
3845   // If this is copy-initialization, we only need to reconstruct
3846   // InitListExprs. Other forms of copy-initialization will be a no-op if
3847   // the initializer is already the right type.
3848   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3849   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3850     return getDerived().TransformExpr(Init);
3851 
3852   // Revert value-initialization back to empty parens.
3853   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3854     SourceRange Parens = VIE->getSourceRange();
3855     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3856                                              Parens.getEnd());
3857   }
3858 
3859   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3860   if (isa<ImplicitValueInitExpr>(Init))
3861     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3862                                              SourceLocation());
3863 
3864   // Revert initialization by constructor back to a parenthesized or braced list
3865   // of expressions. Any other form of initializer can just be reused directly.
3866   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3867     return getDerived().TransformExpr(Init);
3868 
3869   // If the initialization implicitly converted an initializer list to a
3870   // std::initializer_list object, unwrap the std::initializer_list too.
3871   if (Construct && Construct->isStdInitListInitialization())
3872     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3873 
3874   // Enter a list-init context if this was list initialization.
3875   EnterExpressionEvaluationContext Context(
3876       getSema(), EnterExpressionEvaluationContext::InitList,
3877       Construct->isListInitialization());
3878 
3879   SmallVector<Expr*, 8> NewArgs;
3880   bool ArgChanged = false;
3881   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3882                                   /*IsCall*/true, NewArgs, &ArgChanged))
3883     return ExprError();
3884 
3885   // If this was list initialization, revert to syntactic list form.
3886   if (Construct->isListInitialization())
3887     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3888                                         Construct->getEndLoc());
3889 
3890   // Build a ParenListExpr to represent anything else.
3891   SourceRange Parens = Construct->getParenOrBraceRange();
3892   if (Parens.isInvalid()) {
3893     // This was a variable declaration's initialization for which no initializer
3894     // was specified.
3895     assert(NewArgs.empty() &&
3896            "no parens or braces but have direct init with arguments?");
3897     return ExprEmpty();
3898   }
3899   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3900                                            Parens.getEnd());
3901 }
3902 
3903 template<typename Derived>
3904 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3905                                             unsigned NumInputs,
3906                                             bool IsCall,
3907                                       SmallVectorImpl<Expr *> &Outputs,
3908                                             bool *ArgChanged) {
3909   for (unsigned I = 0; I != NumInputs; ++I) {
3910     // If requested, drop call arguments that need to be dropped.
3911     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3912       if (ArgChanged)
3913         *ArgChanged = true;
3914 
3915       break;
3916     }
3917 
3918     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3919       Expr *Pattern = Expansion->getPattern();
3920 
3921       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3922       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3923       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3924 
3925       // Determine whether the set of unexpanded parameter packs can and should
3926       // be expanded.
3927       bool Expand = true;
3928       bool RetainExpansion = false;
3929       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3930       Optional<unsigned> NumExpansions = OrigNumExpansions;
3931       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3932                                                Pattern->getSourceRange(),
3933                                                Unexpanded,
3934                                                Expand, RetainExpansion,
3935                                                NumExpansions))
3936         return true;
3937 
3938       if (!Expand) {
3939         // The transform has determined that we should perform a simple
3940         // transformation on the pack expansion, producing another pack
3941         // expansion.
3942         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3943         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3944         if (OutPattern.isInvalid())
3945           return true;
3946 
3947         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3948                                                 Expansion->getEllipsisLoc(),
3949                                                            NumExpansions);
3950         if (Out.isInvalid())
3951           return true;
3952 
3953         if (ArgChanged)
3954           *ArgChanged = true;
3955         Outputs.push_back(Out.get());
3956         continue;
3957       }
3958 
3959       // Record right away that the argument was changed.  This needs
3960       // to happen even if the array expands to nothing.
3961       if (ArgChanged) *ArgChanged = true;
3962 
3963       // The transform has determined that we should perform an elementwise
3964       // expansion of the pattern. Do so.
3965       for (unsigned I = 0; I != *NumExpansions; ++I) {
3966         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3967         ExprResult Out = getDerived().TransformExpr(Pattern);
3968         if (Out.isInvalid())
3969           return true;
3970 
3971         if (Out.get()->containsUnexpandedParameterPack()) {
3972           Out = getDerived().RebuildPackExpansion(
3973               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3974           if (Out.isInvalid())
3975             return true;
3976         }
3977 
3978         Outputs.push_back(Out.get());
3979       }
3980 
3981       // If we're supposed to retain a pack expansion, do so by temporarily
3982       // forgetting the partially-substituted parameter pack.
3983       if (RetainExpansion) {
3984         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3985 
3986         ExprResult Out = getDerived().TransformExpr(Pattern);
3987         if (Out.isInvalid())
3988           return true;
3989 
3990         Out = getDerived().RebuildPackExpansion(
3991             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3992         if (Out.isInvalid())
3993           return true;
3994 
3995         Outputs.push_back(Out.get());
3996       }
3997 
3998       continue;
3999     }
4000 
4001     ExprResult Result =
4002       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4003              : getDerived().TransformExpr(Inputs[I]);
4004     if (Result.isInvalid())
4005       return true;
4006 
4007     if (Result.get() != Inputs[I] && ArgChanged)
4008       *ArgChanged = true;
4009 
4010     Outputs.push_back(Result.get());
4011   }
4012 
4013   return false;
4014 }
4015 
4016 template <typename Derived>
4017 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4018     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4019   if (Var) {
4020     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4021         getDerived().TransformDefinition(Var->getLocation(), Var));
4022 
4023     if (!ConditionVar)
4024       return Sema::ConditionError();
4025 
4026     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4027   }
4028 
4029   if (Expr) {
4030     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4031 
4032     if (CondExpr.isInvalid())
4033       return Sema::ConditionError();
4034 
4035     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
4036   }
4037 
4038   return Sema::ConditionResult();
4039 }
4040 
4041 template <typename Derived>
4042 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4043     NestedNameSpecifierLoc NNS, QualType ObjectType,
4044     NamedDecl *FirstQualifierInScope) {
4045   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4046   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4047        Qualifier = Qualifier.getPrefix())
4048     Qualifiers.push_back(Qualifier);
4049 
4050   CXXScopeSpec SS;
4051   while (!Qualifiers.empty()) {
4052     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4053     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4054 
4055     switch (QNNS->getKind()) {
4056     case NestedNameSpecifier::Identifier: {
4057       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4058                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4059                                       ObjectType);
4060       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4061                                               SS, FirstQualifierInScope, false))
4062         return NestedNameSpecifierLoc();
4063       break;
4064     }
4065 
4066     case NestedNameSpecifier::Namespace: {
4067       NamespaceDecl *NS =
4068           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4069               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4070       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4071       break;
4072     }
4073 
4074     case NestedNameSpecifier::NamespaceAlias: {
4075       NamespaceAliasDecl *Alias =
4076           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4077               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4078       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4079                 Q.getLocalEndLoc());
4080       break;
4081     }
4082 
4083     case NestedNameSpecifier::Global:
4084       // There is no meaningful transformation that one could perform on the
4085       // global scope.
4086       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4087       break;
4088 
4089     case NestedNameSpecifier::Super: {
4090       CXXRecordDecl *RD =
4091           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4092               SourceLocation(), QNNS->getAsRecordDecl()));
4093       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4094       break;
4095     }
4096 
4097     case NestedNameSpecifier::TypeSpecWithTemplate:
4098     case NestedNameSpecifier::TypeSpec: {
4099       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4100                                               FirstQualifierInScope, SS);
4101 
4102       if (!TL)
4103         return NestedNameSpecifierLoc();
4104 
4105       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4106           (SemaRef.getLangOpts().CPlusPlus11 &&
4107            TL.getType()->isEnumeralType())) {
4108         assert(!TL.getType().hasLocalQualifiers() &&
4109                "Can't get cv-qualifiers here");
4110         if (TL.getType()->isEnumeralType())
4111           SemaRef.Diag(TL.getBeginLoc(),
4112                        diag::warn_cxx98_compat_enum_nested_name_spec);
4113         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4114                   Q.getLocalEndLoc());
4115         break;
4116       }
4117       // If the nested-name-specifier is an invalid type def, don't emit an
4118       // error because a previous error should have already been emitted.
4119       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4120       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4121         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4122             << TL.getType() << SS.getRange();
4123       }
4124       return NestedNameSpecifierLoc();
4125     }
4126     }
4127 
4128     // The qualifier-in-scope and object type only apply to the leftmost entity.
4129     FirstQualifierInScope = nullptr;
4130     ObjectType = QualType();
4131   }
4132 
4133   // Don't rebuild the nested-name-specifier if we don't have to.
4134   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4135       !getDerived().AlwaysRebuild())
4136     return NNS;
4137 
4138   // If we can re-use the source-location data from the original
4139   // nested-name-specifier, do so.
4140   if (SS.location_size() == NNS.getDataLength() &&
4141       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4142     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4143 
4144   // Allocate new nested-name-specifier location information.
4145   return SS.getWithLocInContext(SemaRef.Context);
4146 }
4147 
4148 template<typename Derived>
4149 DeclarationNameInfo
4150 TreeTransform<Derived>
4151 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4152   DeclarationName Name = NameInfo.getName();
4153   if (!Name)
4154     return DeclarationNameInfo();
4155 
4156   switch (Name.getNameKind()) {
4157   case DeclarationName::Identifier:
4158   case DeclarationName::ObjCZeroArgSelector:
4159   case DeclarationName::ObjCOneArgSelector:
4160   case DeclarationName::ObjCMultiArgSelector:
4161   case DeclarationName::CXXOperatorName:
4162   case DeclarationName::CXXLiteralOperatorName:
4163   case DeclarationName::CXXUsingDirective:
4164     return NameInfo;
4165 
4166   case DeclarationName::CXXDeductionGuideName: {
4167     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4168     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4169         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4170     if (!NewTemplate)
4171       return DeclarationNameInfo();
4172 
4173     DeclarationNameInfo NewNameInfo(NameInfo);
4174     NewNameInfo.setName(
4175         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4176     return NewNameInfo;
4177   }
4178 
4179   case DeclarationName::CXXConstructorName:
4180   case DeclarationName::CXXDestructorName:
4181   case DeclarationName::CXXConversionFunctionName: {
4182     TypeSourceInfo *NewTInfo;
4183     CanQualType NewCanTy;
4184     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4185       NewTInfo = getDerived().TransformType(OldTInfo);
4186       if (!NewTInfo)
4187         return DeclarationNameInfo();
4188       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4189     }
4190     else {
4191       NewTInfo = nullptr;
4192       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4193       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4194       if (NewT.isNull())
4195         return DeclarationNameInfo();
4196       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4197     }
4198 
4199     DeclarationName NewName
4200       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4201                                                            NewCanTy);
4202     DeclarationNameInfo NewNameInfo(NameInfo);
4203     NewNameInfo.setName(NewName);
4204     NewNameInfo.setNamedTypeInfo(NewTInfo);
4205     return NewNameInfo;
4206   }
4207   }
4208 
4209   llvm_unreachable("Unknown name kind.");
4210 }
4211 
4212 template<typename Derived>
4213 TemplateName
4214 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4215                                               TemplateName Name,
4216                                               SourceLocation NameLoc,
4217                                               QualType ObjectType,
4218                                               NamedDecl *FirstQualifierInScope,
4219                                               bool AllowInjectedClassName) {
4220   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4221     TemplateDecl *Template = QTN->getTemplateDecl();
4222     assert(Template && "qualified template name must refer to a template");
4223 
4224     TemplateDecl *TransTemplate
4225       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4226                                                               Template));
4227     if (!TransTemplate)
4228       return TemplateName();
4229 
4230     if (!getDerived().AlwaysRebuild() &&
4231         SS.getScopeRep() == QTN->getQualifier() &&
4232         TransTemplate == Template)
4233       return Name;
4234 
4235     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4236                                             TransTemplate);
4237   }
4238 
4239   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4240     if (SS.getScopeRep()) {
4241       // These apply to the scope specifier, not the template.
4242       ObjectType = QualType();
4243       FirstQualifierInScope = nullptr;
4244     }
4245 
4246     if (!getDerived().AlwaysRebuild() &&
4247         SS.getScopeRep() == DTN->getQualifier() &&
4248         ObjectType.isNull())
4249       return Name;
4250 
4251     // FIXME: Preserve the location of the "template" keyword.
4252     SourceLocation TemplateKWLoc = NameLoc;
4253 
4254     if (DTN->isIdentifier()) {
4255       return getDerived().RebuildTemplateName(SS,
4256                                               TemplateKWLoc,
4257                                               *DTN->getIdentifier(),
4258                                               NameLoc,
4259                                               ObjectType,
4260                                               FirstQualifierInScope,
4261                                               AllowInjectedClassName);
4262     }
4263 
4264     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4265                                             DTN->getOperator(), NameLoc,
4266                                             ObjectType, AllowInjectedClassName);
4267   }
4268 
4269   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4270     TemplateDecl *TransTemplate
4271       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4272                                                               Template));
4273     if (!TransTemplate)
4274       return TemplateName();
4275 
4276     if (!getDerived().AlwaysRebuild() &&
4277         TransTemplate == Template)
4278       return Name;
4279 
4280     return TemplateName(TransTemplate);
4281   }
4282 
4283   if (SubstTemplateTemplateParmPackStorage *SubstPack
4284       = Name.getAsSubstTemplateTemplateParmPack()) {
4285     TemplateTemplateParmDecl *TransParam
4286     = cast_or_null<TemplateTemplateParmDecl>(
4287             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4288     if (!TransParam)
4289       return TemplateName();
4290 
4291     if (!getDerived().AlwaysRebuild() &&
4292         TransParam == SubstPack->getParameterPack())
4293       return Name;
4294 
4295     return getDerived().RebuildTemplateName(TransParam,
4296                                             SubstPack->getArgumentPack());
4297   }
4298 
4299   // These should be getting filtered out before they reach the AST.
4300   llvm_unreachable("overloaded function decl survived to here");
4301 }
4302 
4303 template<typename Derived>
4304 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4305                                          const TemplateArgument &Arg,
4306                                          TemplateArgumentLoc &Output) {
4307   Output = getSema().getTrivialTemplateArgumentLoc(
4308       Arg, QualType(), getDerived().getBaseLocation());
4309 }
4310 
4311 template<typename Derived>
4312 bool TreeTransform<Derived>::TransformTemplateArgument(
4313                                          const TemplateArgumentLoc &Input,
4314                                          TemplateArgumentLoc &Output, bool Uneval) {
4315   const TemplateArgument &Arg = Input.getArgument();
4316   switch (Arg.getKind()) {
4317   case TemplateArgument::Null:
4318   case TemplateArgument::Pack:
4319     llvm_unreachable("Unexpected TemplateArgument");
4320 
4321   case TemplateArgument::Integral:
4322   case TemplateArgument::NullPtr:
4323   case TemplateArgument::Declaration: {
4324     // Transform a resolved template argument straight to a resolved template
4325     // argument. We get here when substituting into an already-substituted
4326     // template type argument during concept satisfaction checking.
4327     QualType T = Arg.getNonTypeTemplateArgumentType();
4328     QualType NewT = getDerived().TransformType(T);
4329     if (NewT.isNull())
4330       return true;
4331 
4332     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4333                        ? Arg.getAsDecl()
4334                        : nullptr;
4335     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4336                               getDerived().getBaseLocation(), D))
4337                         : nullptr;
4338     if (D && !NewD)
4339       return true;
4340 
4341     if (NewT == T && D == NewD)
4342       Output = Input;
4343     else if (Arg.getKind() == TemplateArgument::Integral)
4344       Output = TemplateArgumentLoc(
4345           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4346           TemplateArgumentLocInfo());
4347     else if (Arg.getKind() == TemplateArgument::NullPtr)
4348       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4349                                    TemplateArgumentLocInfo());
4350     else
4351       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4352                                    TemplateArgumentLocInfo());
4353 
4354     return false;
4355   }
4356 
4357   case TemplateArgument::Type: {
4358     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4359     if (!DI)
4360       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4361 
4362     DI = getDerived().TransformType(DI);
4363     if (!DI) return true;
4364 
4365     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4366     return false;
4367   }
4368 
4369   case TemplateArgument::Template: {
4370     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4371     if (QualifierLoc) {
4372       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4373       if (!QualifierLoc)
4374         return true;
4375     }
4376 
4377     CXXScopeSpec SS;
4378     SS.Adopt(QualifierLoc);
4379     TemplateName Template
4380       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4381                                            Input.getTemplateNameLoc());
4382     if (Template.isNull())
4383       return true;
4384 
4385     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4386                                  QualifierLoc, Input.getTemplateNameLoc());
4387     return false;
4388   }
4389 
4390   case TemplateArgument::TemplateExpansion:
4391     llvm_unreachable("Caller should expand pack expansions");
4392 
4393   case TemplateArgument::Expression: {
4394     // Template argument expressions are constant expressions.
4395     EnterExpressionEvaluationContext Unevaluated(
4396         getSema(),
4397         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4398                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4399         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4400         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4401 
4402     Expr *InputExpr = Input.getSourceExpression();
4403     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4404 
4405     ExprResult E = getDerived().TransformExpr(InputExpr);
4406     E = SemaRef.ActOnConstantExpression(E);
4407     if (E.isInvalid()) return true;
4408     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4409     return false;
4410   }
4411   }
4412 
4413   // Work around bogus GCC warning
4414   return true;
4415 }
4416 
4417 /// Iterator adaptor that invents template argument location information
4418 /// for each of the template arguments in its underlying iterator.
4419 template<typename Derived, typename InputIterator>
4420 class TemplateArgumentLocInventIterator {
4421   TreeTransform<Derived> &Self;
4422   InputIterator Iter;
4423 
4424 public:
4425   typedef TemplateArgumentLoc value_type;
4426   typedef TemplateArgumentLoc reference;
4427   typedef typename std::iterator_traits<InputIterator>::difference_type
4428     difference_type;
4429   typedef std::input_iterator_tag iterator_category;
4430 
4431   class pointer {
4432     TemplateArgumentLoc Arg;
4433 
4434   public:
4435     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4436 
4437     const TemplateArgumentLoc *operator->() const { return &Arg; }
4438   };
4439 
4440   TemplateArgumentLocInventIterator() { }
4441 
4442   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4443                                              InputIterator Iter)
4444     : Self(Self), Iter(Iter) { }
4445 
4446   TemplateArgumentLocInventIterator &operator++() {
4447     ++Iter;
4448     return *this;
4449   }
4450 
4451   TemplateArgumentLocInventIterator operator++(int) {
4452     TemplateArgumentLocInventIterator Old(*this);
4453     ++(*this);
4454     return Old;
4455   }
4456 
4457   reference operator*() const {
4458     TemplateArgumentLoc Result;
4459     Self.InventTemplateArgumentLoc(*Iter, Result);
4460     return Result;
4461   }
4462 
4463   pointer operator->() const { return pointer(**this); }
4464 
4465   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4466                          const TemplateArgumentLocInventIterator &Y) {
4467     return X.Iter == Y.Iter;
4468   }
4469 
4470   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4471                          const TemplateArgumentLocInventIterator &Y) {
4472     return X.Iter != Y.Iter;
4473   }
4474 };
4475 
4476 template<typename Derived>
4477 template<typename InputIterator>
4478 bool TreeTransform<Derived>::TransformTemplateArguments(
4479     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4480     bool Uneval) {
4481   for (; First != Last; ++First) {
4482     TemplateArgumentLoc Out;
4483     TemplateArgumentLoc In = *First;
4484 
4485     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4486       // Unpack argument packs, which we translate them into separate
4487       // arguments.
4488       // FIXME: We could do much better if we could guarantee that the
4489       // TemplateArgumentLocInfo for the pack expansion would be usable for
4490       // all of the template arguments in the argument pack.
4491       typedef TemplateArgumentLocInventIterator<Derived,
4492                                                 TemplateArgument::pack_iterator>
4493         PackLocIterator;
4494       if (TransformTemplateArguments(PackLocIterator(*this,
4495                                                  In.getArgument().pack_begin()),
4496                                      PackLocIterator(*this,
4497                                                    In.getArgument().pack_end()),
4498                                      Outputs, Uneval))
4499         return true;
4500 
4501       continue;
4502     }
4503 
4504     if (In.getArgument().isPackExpansion()) {
4505       // We have a pack expansion, for which we will be substituting into
4506       // the pattern.
4507       SourceLocation Ellipsis;
4508       Optional<unsigned> OrigNumExpansions;
4509       TemplateArgumentLoc Pattern
4510         = getSema().getTemplateArgumentPackExpansionPattern(
4511               In, Ellipsis, OrigNumExpansions);
4512 
4513       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4514       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4515       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4516 
4517       // Determine whether the set of unexpanded parameter packs can and should
4518       // be expanded.
4519       bool Expand = true;
4520       bool RetainExpansion = false;
4521       Optional<unsigned> NumExpansions = OrigNumExpansions;
4522       if (getDerived().TryExpandParameterPacks(Ellipsis,
4523                                                Pattern.getSourceRange(),
4524                                                Unexpanded,
4525                                                Expand,
4526                                                RetainExpansion,
4527                                                NumExpansions))
4528         return true;
4529 
4530       if (!Expand) {
4531         // The transform has determined that we should perform a simple
4532         // transformation on the pack expansion, producing another pack
4533         // expansion.
4534         TemplateArgumentLoc OutPattern;
4535         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4536         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4537           return true;
4538 
4539         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4540                                                 NumExpansions);
4541         if (Out.getArgument().isNull())
4542           return true;
4543 
4544         Outputs.addArgument(Out);
4545         continue;
4546       }
4547 
4548       // The transform has determined that we should perform an elementwise
4549       // expansion of the pattern. Do so.
4550       for (unsigned I = 0; I != *NumExpansions; ++I) {
4551         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4552 
4553         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4554           return true;
4555 
4556         if (Out.getArgument().containsUnexpandedParameterPack()) {
4557           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4558                                                   OrigNumExpansions);
4559           if (Out.getArgument().isNull())
4560             return true;
4561         }
4562 
4563         Outputs.addArgument(Out);
4564       }
4565 
4566       // If we're supposed to retain a pack expansion, do so by temporarily
4567       // forgetting the partially-substituted parameter pack.
4568       if (RetainExpansion) {
4569         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4570 
4571         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4572           return true;
4573 
4574         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4575                                                 OrigNumExpansions);
4576         if (Out.getArgument().isNull())
4577           return true;
4578 
4579         Outputs.addArgument(Out);
4580       }
4581 
4582       continue;
4583     }
4584 
4585     // The simple case:
4586     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4587       return true;
4588 
4589     Outputs.addArgument(Out);
4590   }
4591 
4592   return false;
4593 
4594 }
4595 
4596 //===----------------------------------------------------------------------===//
4597 // Type transformation
4598 //===----------------------------------------------------------------------===//
4599 
4600 template<typename Derived>
4601 QualType TreeTransform<Derived>::TransformType(QualType T) {
4602   if (getDerived().AlreadyTransformed(T))
4603     return T;
4604 
4605   // Temporary workaround.  All of these transformations should
4606   // eventually turn into transformations on TypeLocs.
4607   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4608                                                 getDerived().getBaseLocation());
4609 
4610   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4611 
4612   if (!NewDI)
4613     return QualType();
4614 
4615   return NewDI->getType();
4616 }
4617 
4618 template<typename Derived>
4619 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4620   // Refine the base location to the type's location.
4621   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4622                        getDerived().getBaseEntity());
4623   if (getDerived().AlreadyTransformed(DI->getType()))
4624     return DI;
4625 
4626   TypeLocBuilder TLB;
4627 
4628   TypeLoc TL = DI->getTypeLoc();
4629   TLB.reserve(TL.getFullDataSize());
4630 
4631   QualType Result = getDerived().TransformType(TLB, TL);
4632   if (Result.isNull())
4633     return nullptr;
4634 
4635   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4636 }
4637 
4638 template<typename Derived>
4639 QualType
4640 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4641   switch (T.getTypeLocClass()) {
4642 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4643 #define TYPELOC(CLASS, PARENT)                                                 \
4644   case TypeLoc::CLASS:                                                         \
4645     return getDerived().Transform##CLASS##Type(TLB,                            \
4646                                                T.castAs<CLASS##TypeLoc>());
4647 #include "clang/AST/TypeLocNodes.def"
4648   }
4649 
4650   llvm_unreachable("unhandled type loc!");
4651 }
4652 
4653 template<typename Derived>
4654 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4655   if (!isa<DependentNameType>(T))
4656     return TransformType(T);
4657 
4658   if (getDerived().AlreadyTransformed(T))
4659     return T;
4660   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4661                                                 getDerived().getBaseLocation());
4662   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4663   return NewDI ? NewDI->getType() : QualType();
4664 }
4665 
4666 template<typename Derived>
4667 TypeSourceInfo *
4668 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4669   if (!isa<DependentNameType>(DI->getType()))
4670     return TransformType(DI);
4671 
4672   // Refine the base location to the type's location.
4673   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4674                        getDerived().getBaseEntity());
4675   if (getDerived().AlreadyTransformed(DI->getType()))
4676     return DI;
4677 
4678   TypeLocBuilder TLB;
4679 
4680   TypeLoc TL = DI->getTypeLoc();
4681   TLB.reserve(TL.getFullDataSize());
4682 
4683   auto QTL = TL.getAs<QualifiedTypeLoc>();
4684   if (QTL)
4685     TL = QTL.getUnqualifiedLoc();
4686 
4687   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4688 
4689   QualType Result = getDerived().TransformDependentNameType(
4690       TLB, DNTL, /*DeducedTSTContext*/true);
4691   if (Result.isNull())
4692     return nullptr;
4693 
4694   if (QTL) {
4695     Result = getDerived().RebuildQualifiedType(Result, QTL);
4696     if (Result.isNull())
4697       return nullptr;
4698     TLB.TypeWasModifiedSafely(Result);
4699   }
4700 
4701   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4702 }
4703 
4704 template<typename Derived>
4705 QualType
4706 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4707                                                QualifiedTypeLoc T) {
4708   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4709   if (Result.isNull())
4710     return QualType();
4711 
4712   Result = getDerived().RebuildQualifiedType(Result, T);
4713 
4714   if (Result.isNull())
4715     return QualType();
4716 
4717   // RebuildQualifiedType might have updated the type, but not in a way
4718   // that invalidates the TypeLoc. (There's no location information for
4719   // qualifiers.)
4720   TLB.TypeWasModifiedSafely(Result);
4721 
4722   return Result;
4723 }
4724 
4725 template <typename Derived>
4726 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4727                                                       QualifiedTypeLoc TL) {
4728 
4729   SourceLocation Loc = TL.getBeginLoc();
4730   Qualifiers Quals = TL.getType().getLocalQualifiers();
4731 
4732   if (((T.getAddressSpace() != LangAS::Default &&
4733         Quals.getAddressSpace() != LangAS::Default)) &&
4734       T.getAddressSpace() != Quals.getAddressSpace()) {
4735     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4736         << TL.getType() << T;
4737     return QualType();
4738   }
4739 
4740   // C++ [dcl.fct]p7:
4741   //   [When] adding cv-qualifications on top of the function type [...] the
4742   //   cv-qualifiers are ignored.
4743   if (T->isFunctionType()) {
4744     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4745                                                      Quals.getAddressSpace());
4746     return T;
4747   }
4748 
4749   // C++ [dcl.ref]p1:
4750   //   when the cv-qualifiers are introduced through the use of a typedef-name
4751   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4752   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4753   // applied to a reference type.
4754   if (T->isReferenceType()) {
4755     // The only qualifier that applies to a reference type is restrict.
4756     if (!Quals.hasRestrict())
4757       return T;
4758     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4759   }
4760 
4761   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4762   // resulting type.
4763   if (Quals.hasObjCLifetime()) {
4764     if (!T->isObjCLifetimeType() && !T->isDependentType())
4765       Quals.removeObjCLifetime();
4766     else if (T.getObjCLifetime()) {
4767       // Objective-C ARC:
4768       //   A lifetime qualifier applied to a substituted template parameter
4769       //   overrides the lifetime qualifier from the template argument.
4770       const AutoType *AutoTy;
4771       if (const SubstTemplateTypeParmType *SubstTypeParam
4772                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4773         QualType Replacement = SubstTypeParam->getReplacementType();
4774         Qualifiers Qs = Replacement.getQualifiers();
4775         Qs.removeObjCLifetime();
4776         Replacement = SemaRef.Context.getQualifiedType(
4777             Replacement.getUnqualifiedType(), Qs);
4778         T = SemaRef.Context.getSubstTemplateTypeParmType(
4779             SubstTypeParam->getReplacedParameter(), Replacement);
4780       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4781         // 'auto' types behave the same way as template parameters.
4782         QualType Deduced = AutoTy->getDeducedType();
4783         Qualifiers Qs = Deduced.getQualifiers();
4784         Qs.removeObjCLifetime();
4785         Deduced =
4786             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4787         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4788                                         AutoTy->isDependentType(),
4789                                         /*isPack=*/false,
4790                                         AutoTy->getTypeConstraintConcept(),
4791                                         AutoTy->getTypeConstraintArguments());
4792       } else {
4793         // Otherwise, complain about the addition of a qualifier to an
4794         // already-qualified type.
4795         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4796         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4797         Quals.removeObjCLifetime();
4798       }
4799     }
4800   }
4801 
4802   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4803 }
4804 
4805 template<typename Derived>
4806 TypeLoc
4807 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4808                                                    QualType ObjectType,
4809                                                    NamedDecl *UnqualLookup,
4810                                                    CXXScopeSpec &SS) {
4811   if (getDerived().AlreadyTransformed(TL.getType()))
4812     return TL;
4813 
4814   TypeSourceInfo *TSI =
4815       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4816   if (TSI)
4817     return TSI->getTypeLoc();
4818   return TypeLoc();
4819 }
4820 
4821 template<typename Derived>
4822 TypeSourceInfo *
4823 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4824                                                    QualType ObjectType,
4825                                                    NamedDecl *UnqualLookup,
4826                                                    CXXScopeSpec &SS) {
4827   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4828     return TSInfo;
4829 
4830   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4831                                    UnqualLookup, SS);
4832 }
4833 
4834 template <typename Derived>
4835 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4836     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4837     CXXScopeSpec &SS) {
4838   QualType T = TL.getType();
4839   assert(!getDerived().AlreadyTransformed(T));
4840 
4841   TypeLocBuilder TLB;
4842   QualType Result;
4843 
4844   if (isa<TemplateSpecializationType>(T)) {
4845     TemplateSpecializationTypeLoc SpecTL =
4846         TL.castAs<TemplateSpecializationTypeLoc>();
4847 
4848     TemplateName Template = getDerived().TransformTemplateName(
4849         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4850         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4851     if (Template.isNull())
4852       return nullptr;
4853 
4854     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4855                                                               Template);
4856   } else if (isa<DependentTemplateSpecializationType>(T)) {
4857     DependentTemplateSpecializationTypeLoc SpecTL =
4858         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4859 
4860     TemplateName Template
4861       = getDerived().RebuildTemplateName(SS,
4862                                          SpecTL.getTemplateKeywordLoc(),
4863                                          *SpecTL.getTypePtr()->getIdentifier(),
4864                                          SpecTL.getTemplateNameLoc(),
4865                                          ObjectType, UnqualLookup,
4866                                          /*AllowInjectedClassName*/true);
4867     if (Template.isNull())
4868       return nullptr;
4869 
4870     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4871                                                                        SpecTL,
4872                                                                        Template,
4873                                                                        SS);
4874   } else {
4875     // Nothing special needs to be done for these.
4876     Result = getDerived().TransformType(TLB, TL);
4877   }
4878 
4879   if (Result.isNull())
4880     return nullptr;
4881 
4882   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4883 }
4884 
4885 template <class TyLoc> static inline
4886 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4887   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4888   NewT.setNameLoc(T.getNameLoc());
4889   return T.getType();
4890 }
4891 
4892 template<typename Derived>
4893 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4894                                                       BuiltinTypeLoc T) {
4895   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4896   NewT.setBuiltinLoc(T.getBuiltinLoc());
4897   if (T.needsExtraLocalData())
4898     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4899   return T.getType();
4900 }
4901 
4902 template<typename Derived>
4903 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4904                                                       ComplexTypeLoc T) {
4905   // FIXME: recurse?
4906   return TransformTypeSpecType(TLB, T);
4907 }
4908 
4909 template <typename Derived>
4910 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4911                                                        AdjustedTypeLoc TL) {
4912   // Adjustments applied during transformation are handled elsewhere.
4913   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4914 }
4915 
4916 template<typename Derived>
4917 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4918                                                       DecayedTypeLoc TL) {
4919   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4920   if (OriginalType.isNull())
4921     return QualType();
4922 
4923   QualType Result = TL.getType();
4924   if (getDerived().AlwaysRebuild() ||
4925       OriginalType != TL.getOriginalLoc().getType())
4926     Result = SemaRef.Context.getDecayedType(OriginalType);
4927   TLB.push<DecayedTypeLoc>(Result);
4928   // Nothing to set for DecayedTypeLoc.
4929   return Result;
4930 }
4931 
4932 template<typename Derived>
4933 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4934                                                       PointerTypeLoc TL) {
4935   QualType PointeeType
4936     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4937   if (PointeeType.isNull())
4938     return QualType();
4939 
4940   QualType Result = TL.getType();
4941   if (PointeeType->getAs<ObjCObjectType>()) {
4942     // A dependent pointer type 'T *' has is being transformed such
4943     // that an Objective-C class type is being replaced for 'T'. The
4944     // resulting pointer type is an ObjCObjectPointerType, not a
4945     // PointerType.
4946     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4947 
4948     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4949     NewT.setStarLoc(TL.getStarLoc());
4950     return Result;
4951   }
4952 
4953   if (getDerived().AlwaysRebuild() ||
4954       PointeeType != TL.getPointeeLoc().getType()) {
4955     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4956     if (Result.isNull())
4957       return QualType();
4958   }
4959 
4960   // Objective-C ARC can add lifetime qualifiers to the type that we're
4961   // pointing to.
4962   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4963 
4964   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4965   NewT.setSigilLoc(TL.getSigilLoc());
4966   return Result;
4967 }
4968 
4969 template<typename Derived>
4970 QualType
4971 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4972                                                   BlockPointerTypeLoc TL) {
4973   QualType PointeeType
4974     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4975   if (PointeeType.isNull())
4976     return QualType();
4977 
4978   QualType Result = TL.getType();
4979   if (getDerived().AlwaysRebuild() ||
4980       PointeeType != TL.getPointeeLoc().getType()) {
4981     Result = getDerived().RebuildBlockPointerType(PointeeType,
4982                                                   TL.getSigilLoc());
4983     if (Result.isNull())
4984       return QualType();
4985   }
4986 
4987   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4988   NewT.setSigilLoc(TL.getSigilLoc());
4989   return Result;
4990 }
4991 
4992 /// Transforms a reference type.  Note that somewhat paradoxically we
4993 /// don't care whether the type itself is an l-value type or an r-value
4994 /// type;  we only care if the type was *written* as an l-value type
4995 /// or an r-value type.
4996 template<typename Derived>
4997 QualType
4998 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4999                                                ReferenceTypeLoc TL) {
5000   const ReferenceType *T = TL.getTypePtr();
5001 
5002   // Note that this works with the pointee-as-written.
5003   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5004   if (PointeeType.isNull())
5005     return QualType();
5006 
5007   QualType Result = TL.getType();
5008   if (getDerived().AlwaysRebuild() ||
5009       PointeeType != T->getPointeeTypeAsWritten()) {
5010     Result = getDerived().RebuildReferenceType(PointeeType,
5011                                                T->isSpelledAsLValue(),
5012                                                TL.getSigilLoc());
5013     if (Result.isNull())
5014       return QualType();
5015   }
5016 
5017   // Objective-C ARC can add lifetime qualifiers to the type that we're
5018   // referring to.
5019   TLB.TypeWasModifiedSafely(
5020       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5021 
5022   // r-value references can be rebuilt as l-value references.
5023   ReferenceTypeLoc NewTL;
5024   if (isa<LValueReferenceType>(Result))
5025     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5026   else
5027     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5028   NewTL.setSigilLoc(TL.getSigilLoc());
5029 
5030   return Result;
5031 }
5032 
5033 template<typename Derived>
5034 QualType
5035 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5036                                                  LValueReferenceTypeLoc TL) {
5037   return TransformReferenceType(TLB, TL);
5038 }
5039 
5040 template<typename Derived>
5041 QualType
5042 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5043                                                  RValueReferenceTypeLoc TL) {
5044   return TransformReferenceType(TLB, TL);
5045 }
5046 
5047 template<typename Derived>
5048 QualType
5049 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5050                                                    MemberPointerTypeLoc TL) {
5051   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5052   if (PointeeType.isNull())
5053     return QualType();
5054 
5055   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5056   TypeSourceInfo *NewClsTInfo = nullptr;
5057   if (OldClsTInfo) {
5058     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5059     if (!NewClsTInfo)
5060       return QualType();
5061   }
5062 
5063   const MemberPointerType *T = TL.getTypePtr();
5064   QualType OldClsType = QualType(T->getClass(), 0);
5065   QualType NewClsType;
5066   if (NewClsTInfo)
5067     NewClsType = NewClsTInfo->getType();
5068   else {
5069     NewClsType = getDerived().TransformType(OldClsType);
5070     if (NewClsType.isNull())
5071       return QualType();
5072   }
5073 
5074   QualType Result = TL.getType();
5075   if (getDerived().AlwaysRebuild() ||
5076       PointeeType != T->getPointeeType() ||
5077       NewClsType != OldClsType) {
5078     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5079                                                    TL.getStarLoc());
5080     if (Result.isNull())
5081       return QualType();
5082   }
5083 
5084   // If we had to adjust the pointee type when building a member pointer, make
5085   // sure to push TypeLoc info for it.
5086   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5087   if (MPT && PointeeType != MPT->getPointeeType()) {
5088     assert(isa<AdjustedType>(MPT->getPointeeType()));
5089     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5090   }
5091 
5092   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5093   NewTL.setSigilLoc(TL.getSigilLoc());
5094   NewTL.setClassTInfo(NewClsTInfo);
5095 
5096   return Result;
5097 }
5098 
5099 template<typename Derived>
5100 QualType
5101 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5102                                                    ConstantArrayTypeLoc TL) {
5103   const ConstantArrayType *T = TL.getTypePtr();
5104   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5105   if (ElementType.isNull())
5106     return QualType();
5107 
5108   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5109   Expr *OldSize = TL.getSizeExpr();
5110   if (!OldSize)
5111     OldSize = const_cast<Expr*>(T->getSizeExpr());
5112   Expr *NewSize = nullptr;
5113   if (OldSize) {
5114     EnterExpressionEvaluationContext Unevaluated(
5115         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5116     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5117     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5118   }
5119 
5120   QualType Result = TL.getType();
5121   if (getDerived().AlwaysRebuild() ||
5122       ElementType != T->getElementType() ||
5123       (T->getSizeExpr() && NewSize != OldSize)) {
5124     Result = getDerived().RebuildConstantArrayType(ElementType,
5125                                                    T->getSizeModifier(),
5126                                                    T->getSize(), NewSize,
5127                                              T->getIndexTypeCVRQualifiers(),
5128                                                    TL.getBracketsRange());
5129     if (Result.isNull())
5130       return QualType();
5131   }
5132 
5133   // We might have either a ConstantArrayType or a VariableArrayType now:
5134   // a ConstantArrayType is allowed to have an element type which is a
5135   // VariableArrayType if the type is dependent.  Fortunately, all array
5136   // types have the same location layout.
5137   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5138   NewTL.setLBracketLoc(TL.getLBracketLoc());
5139   NewTL.setRBracketLoc(TL.getRBracketLoc());
5140   NewTL.setSizeExpr(NewSize);
5141 
5142   return Result;
5143 }
5144 
5145 template<typename Derived>
5146 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5147                                               TypeLocBuilder &TLB,
5148                                               IncompleteArrayTypeLoc TL) {
5149   const IncompleteArrayType *T = TL.getTypePtr();
5150   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5151   if (ElementType.isNull())
5152     return QualType();
5153 
5154   QualType Result = TL.getType();
5155   if (getDerived().AlwaysRebuild() ||
5156       ElementType != T->getElementType()) {
5157     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5158                                                      T->getSizeModifier(),
5159                                            T->getIndexTypeCVRQualifiers(),
5160                                                      TL.getBracketsRange());
5161     if (Result.isNull())
5162       return QualType();
5163   }
5164 
5165   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5166   NewTL.setLBracketLoc(TL.getLBracketLoc());
5167   NewTL.setRBracketLoc(TL.getRBracketLoc());
5168   NewTL.setSizeExpr(nullptr);
5169 
5170   return Result;
5171 }
5172 
5173 template<typename Derived>
5174 QualType
5175 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5176                                                    VariableArrayTypeLoc TL) {
5177   const VariableArrayType *T = TL.getTypePtr();
5178   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5179   if (ElementType.isNull())
5180     return QualType();
5181 
5182   ExprResult SizeResult;
5183   {
5184     EnterExpressionEvaluationContext Context(
5185         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5186     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5187   }
5188   if (SizeResult.isInvalid())
5189     return QualType();
5190   SizeResult =
5191       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5192   if (SizeResult.isInvalid())
5193     return QualType();
5194 
5195   Expr *Size = SizeResult.get();
5196 
5197   QualType Result = TL.getType();
5198   if (getDerived().AlwaysRebuild() ||
5199       ElementType != T->getElementType() ||
5200       Size != T->getSizeExpr()) {
5201     Result = getDerived().RebuildVariableArrayType(ElementType,
5202                                                    T->getSizeModifier(),
5203                                                    Size,
5204                                              T->getIndexTypeCVRQualifiers(),
5205                                                    TL.getBracketsRange());
5206     if (Result.isNull())
5207       return QualType();
5208   }
5209 
5210   // We might have constant size array now, but fortunately it has the same
5211   // location layout.
5212   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5213   NewTL.setLBracketLoc(TL.getLBracketLoc());
5214   NewTL.setRBracketLoc(TL.getRBracketLoc());
5215   NewTL.setSizeExpr(Size);
5216 
5217   return Result;
5218 }
5219 
5220 template<typename Derived>
5221 QualType
5222 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5223                                              DependentSizedArrayTypeLoc TL) {
5224   const DependentSizedArrayType *T = TL.getTypePtr();
5225   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5226   if (ElementType.isNull())
5227     return QualType();
5228 
5229   // Array bounds are constant expressions.
5230   EnterExpressionEvaluationContext Unevaluated(
5231       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5232 
5233   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5234   Expr *origSize = TL.getSizeExpr();
5235   if (!origSize) origSize = T->getSizeExpr();
5236 
5237   ExprResult sizeResult
5238     = getDerived().TransformExpr(origSize);
5239   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5240   if (sizeResult.isInvalid())
5241     return QualType();
5242 
5243   Expr *size = sizeResult.get();
5244 
5245   QualType Result = TL.getType();
5246   if (getDerived().AlwaysRebuild() ||
5247       ElementType != T->getElementType() ||
5248       size != origSize) {
5249     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5250                                                          T->getSizeModifier(),
5251                                                          size,
5252                                                 T->getIndexTypeCVRQualifiers(),
5253                                                         TL.getBracketsRange());
5254     if (Result.isNull())
5255       return QualType();
5256   }
5257 
5258   // We might have any sort of array type now, but fortunately they
5259   // all have the same location layout.
5260   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5261   NewTL.setLBracketLoc(TL.getLBracketLoc());
5262   NewTL.setRBracketLoc(TL.getRBracketLoc());
5263   NewTL.setSizeExpr(size);
5264 
5265   return Result;
5266 }
5267 
5268 template <typename Derived>
5269 QualType TreeTransform<Derived>::TransformDependentVectorType(
5270     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5271   const DependentVectorType *T = TL.getTypePtr();
5272   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5273   if (ElementType.isNull())
5274     return QualType();
5275 
5276   EnterExpressionEvaluationContext Unevaluated(
5277       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5278 
5279   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5280   Size = SemaRef.ActOnConstantExpression(Size);
5281   if (Size.isInvalid())
5282     return QualType();
5283 
5284   QualType Result = TL.getType();
5285   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5286       Size.get() != T->getSizeExpr()) {
5287     Result = getDerived().RebuildDependentVectorType(
5288         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5289     if (Result.isNull())
5290       return QualType();
5291   }
5292 
5293   // Result might be dependent or not.
5294   if (isa<DependentVectorType>(Result)) {
5295     DependentVectorTypeLoc NewTL =
5296         TLB.push<DependentVectorTypeLoc>(Result);
5297     NewTL.setNameLoc(TL.getNameLoc());
5298   } else {
5299     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5300     NewTL.setNameLoc(TL.getNameLoc());
5301   }
5302 
5303   return Result;
5304 }
5305 
5306 template<typename Derived>
5307 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5308                                       TypeLocBuilder &TLB,
5309                                       DependentSizedExtVectorTypeLoc TL) {
5310   const DependentSizedExtVectorType *T = TL.getTypePtr();
5311 
5312   // FIXME: ext vector locs should be nested
5313   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5314   if (ElementType.isNull())
5315     return QualType();
5316 
5317   // Vector sizes are constant expressions.
5318   EnterExpressionEvaluationContext Unevaluated(
5319       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5320 
5321   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5322   Size = SemaRef.ActOnConstantExpression(Size);
5323   if (Size.isInvalid())
5324     return QualType();
5325 
5326   QualType Result = TL.getType();
5327   if (getDerived().AlwaysRebuild() ||
5328       ElementType != T->getElementType() ||
5329       Size.get() != T->getSizeExpr()) {
5330     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5331                                                              Size.get(),
5332                                                          T->getAttributeLoc());
5333     if (Result.isNull())
5334       return QualType();
5335   }
5336 
5337   // Result might be dependent or not.
5338   if (isa<DependentSizedExtVectorType>(Result)) {
5339     DependentSizedExtVectorTypeLoc NewTL
5340       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5341     NewTL.setNameLoc(TL.getNameLoc());
5342   } else {
5343     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5344     NewTL.setNameLoc(TL.getNameLoc());
5345   }
5346 
5347   return Result;
5348 }
5349 
5350 template <typename Derived>
5351 QualType
5352 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5353                                                     ConstantMatrixTypeLoc TL) {
5354   const ConstantMatrixType *T = TL.getTypePtr();
5355   QualType ElementType = getDerived().TransformType(T->getElementType());
5356   if (ElementType.isNull())
5357     return QualType();
5358 
5359   QualType Result = TL.getType();
5360   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5361     Result = getDerived().RebuildConstantMatrixType(
5362         ElementType, T->getNumRows(), T->getNumColumns());
5363     if (Result.isNull())
5364       return QualType();
5365   }
5366 
5367   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5368   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5369   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5370   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5371   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5372 
5373   return Result;
5374 }
5375 
5376 template <typename Derived>
5377 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5378     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5379   const DependentSizedMatrixType *T = TL.getTypePtr();
5380 
5381   QualType ElementType = getDerived().TransformType(T->getElementType());
5382   if (ElementType.isNull()) {
5383     return QualType();
5384   }
5385 
5386   // Matrix dimensions are constant expressions.
5387   EnterExpressionEvaluationContext Unevaluated(
5388       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5389 
5390   Expr *origRows = TL.getAttrRowOperand();
5391   if (!origRows)
5392     origRows = T->getRowExpr();
5393   Expr *origColumns = TL.getAttrColumnOperand();
5394   if (!origColumns)
5395     origColumns = T->getColumnExpr();
5396 
5397   ExprResult rowResult = getDerived().TransformExpr(origRows);
5398   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5399   if (rowResult.isInvalid())
5400     return QualType();
5401 
5402   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5403   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5404   if (columnResult.isInvalid())
5405     return QualType();
5406 
5407   Expr *rows = rowResult.get();
5408   Expr *columns = columnResult.get();
5409 
5410   QualType Result = TL.getType();
5411   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5412       rows != origRows || columns != origColumns) {
5413     Result = getDerived().RebuildDependentSizedMatrixType(
5414         ElementType, rows, columns, T->getAttributeLoc());
5415 
5416     if (Result.isNull())
5417       return QualType();
5418   }
5419 
5420   // We might have any sort of matrix type now, but fortunately they
5421   // all have the same location layout.
5422   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5423   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5424   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5425   NewTL.setAttrRowOperand(rows);
5426   NewTL.setAttrColumnOperand(columns);
5427   return Result;
5428 }
5429 
5430 template <typename Derived>
5431 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5432     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5433   const DependentAddressSpaceType *T = TL.getTypePtr();
5434 
5435   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5436 
5437   if (pointeeType.isNull())
5438     return QualType();
5439 
5440   // Address spaces are constant expressions.
5441   EnterExpressionEvaluationContext Unevaluated(
5442       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5443 
5444   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5445   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5446   if (AddrSpace.isInvalid())
5447     return QualType();
5448 
5449   QualType Result = TL.getType();
5450   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5451       AddrSpace.get() != T->getAddrSpaceExpr()) {
5452     Result = getDerived().RebuildDependentAddressSpaceType(
5453         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5454     if (Result.isNull())
5455       return QualType();
5456   }
5457 
5458   // Result might be dependent or not.
5459   if (isa<DependentAddressSpaceType>(Result)) {
5460     DependentAddressSpaceTypeLoc NewTL =
5461         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5462 
5463     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5464     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5465     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5466 
5467   } else {
5468     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5469         Result, getDerived().getBaseLocation());
5470     TransformType(TLB, DI->getTypeLoc());
5471   }
5472 
5473   return Result;
5474 }
5475 
5476 template <typename Derived>
5477 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5478                                                      VectorTypeLoc TL) {
5479   const VectorType *T = TL.getTypePtr();
5480   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5481   if (ElementType.isNull())
5482     return QualType();
5483 
5484   QualType Result = TL.getType();
5485   if (getDerived().AlwaysRebuild() ||
5486       ElementType != T->getElementType()) {
5487     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5488                                             T->getVectorKind());
5489     if (Result.isNull())
5490       return QualType();
5491   }
5492 
5493   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5494   NewTL.setNameLoc(TL.getNameLoc());
5495 
5496   return Result;
5497 }
5498 
5499 template<typename Derived>
5500 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5501                                                         ExtVectorTypeLoc TL) {
5502   const VectorType *T = TL.getTypePtr();
5503   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5504   if (ElementType.isNull())
5505     return QualType();
5506 
5507   QualType Result = TL.getType();
5508   if (getDerived().AlwaysRebuild() ||
5509       ElementType != T->getElementType()) {
5510     Result = getDerived().RebuildExtVectorType(ElementType,
5511                                                T->getNumElements(),
5512                                                /*FIXME*/ SourceLocation());
5513     if (Result.isNull())
5514       return QualType();
5515   }
5516 
5517   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5518   NewTL.setNameLoc(TL.getNameLoc());
5519 
5520   return Result;
5521 }
5522 
5523 template <typename Derived>
5524 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5525     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5526     bool ExpectParameterPack) {
5527   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5528   TypeSourceInfo *NewDI = nullptr;
5529 
5530   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5531     // If we're substituting into a pack expansion type and we know the
5532     // length we want to expand to, just substitute for the pattern.
5533     TypeLoc OldTL = OldDI->getTypeLoc();
5534     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5535 
5536     TypeLocBuilder TLB;
5537     TypeLoc NewTL = OldDI->getTypeLoc();
5538     TLB.reserve(NewTL.getFullDataSize());
5539 
5540     QualType Result = getDerived().TransformType(TLB,
5541                                                OldExpansionTL.getPatternLoc());
5542     if (Result.isNull())
5543       return nullptr;
5544 
5545     Result = RebuildPackExpansionType(Result,
5546                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5547                                       OldExpansionTL.getEllipsisLoc(),
5548                                       NumExpansions);
5549     if (Result.isNull())
5550       return nullptr;
5551 
5552     PackExpansionTypeLoc NewExpansionTL
5553       = TLB.push<PackExpansionTypeLoc>(Result);
5554     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5555     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5556   } else
5557     NewDI = getDerived().TransformType(OldDI);
5558   if (!NewDI)
5559     return nullptr;
5560 
5561   if (NewDI == OldDI && indexAdjustment == 0)
5562     return OldParm;
5563 
5564   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5565                                              OldParm->getDeclContext(),
5566                                              OldParm->getInnerLocStart(),
5567                                              OldParm->getLocation(),
5568                                              OldParm->getIdentifier(),
5569                                              NewDI->getType(),
5570                                              NewDI,
5571                                              OldParm->getStorageClass(),
5572                                              /* DefArg */ nullptr);
5573   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5574                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5575   transformedLocalDecl(OldParm, {newParm});
5576   return newParm;
5577 }
5578 
5579 template <typename Derived>
5580 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5581     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5582     const QualType *ParamTypes,
5583     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5584     SmallVectorImpl<QualType> &OutParamTypes,
5585     SmallVectorImpl<ParmVarDecl *> *PVars,
5586     Sema::ExtParameterInfoBuilder &PInfos) {
5587   int indexAdjustment = 0;
5588 
5589   unsigned NumParams = Params.size();
5590   for (unsigned i = 0; i != NumParams; ++i) {
5591     if (ParmVarDecl *OldParm = Params[i]) {
5592       assert(OldParm->getFunctionScopeIndex() == i);
5593 
5594       Optional<unsigned> NumExpansions;
5595       ParmVarDecl *NewParm = nullptr;
5596       if (OldParm->isParameterPack()) {
5597         // We have a function parameter pack that may need to be expanded.
5598         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5599 
5600         // Find the parameter packs that could be expanded.
5601         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5602         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5603         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5604         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5605 
5606         // Determine whether we should expand the parameter packs.
5607         bool ShouldExpand = false;
5608         bool RetainExpansion = false;
5609         Optional<unsigned> OrigNumExpansions;
5610         if (Unexpanded.size() > 0) {
5611           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5612           NumExpansions = OrigNumExpansions;
5613           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5614                                                    Pattern.getSourceRange(),
5615                                                    Unexpanded,
5616                                                    ShouldExpand,
5617                                                    RetainExpansion,
5618                                                    NumExpansions)) {
5619             return true;
5620           }
5621         } else {
5622 #ifndef NDEBUG
5623           const AutoType *AT =
5624               Pattern.getType().getTypePtr()->getContainedAutoType();
5625           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5626                  "Could not find parameter packs or undeduced auto type!");
5627 #endif
5628         }
5629 
5630         if (ShouldExpand) {
5631           // Expand the function parameter pack into multiple, separate
5632           // parameters.
5633           getDerived().ExpandingFunctionParameterPack(OldParm);
5634           for (unsigned I = 0; I != *NumExpansions; ++I) {
5635             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5636             ParmVarDecl *NewParm
5637               = getDerived().TransformFunctionTypeParam(OldParm,
5638                                                         indexAdjustment++,
5639                                                         OrigNumExpansions,
5640                                                 /*ExpectParameterPack=*/false);
5641             if (!NewParm)
5642               return true;
5643 
5644             if (ParamInfos)
5645               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5646             OutParamTypes.push_back(NewParm->getType());
5647             if (PVars)
5648               PVars->push_back(NewParm);
5649           }
5650 
5651           // If we're supposed to retain a pack expansion, do so by temporarily
5652           // forgetting the partially-substituted parameter pack.
5653           if (RetainExpansion) {
5654             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5655             ParmVarDecl *NewParm
5656               = getDerived().TransformFunctionTypeParam(OldParm,
5657                                                         indexAdjustment++,
5658                                                         OrigNumExpansions,
5659                                                 /*ExpectParameterPack=*/false);
5660             if (!NewParm)
5661               return true;
5662 
5663             if (ParamInfos)
5664               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5665             OutParamTypes.push_back(NewParm->getType());
5666             if (PVars)
5667               PVars->push_back(NewParm);
5668           }
5669 
5670           // The next parameter should have the same adjustment as the
5671           // last thing we pushed, but we post-incremented indexAdjustment
5672           // on every push.  Also, if we push nothing, the adjustment should
5673           // go down by one.
5674           indexAdjustment--;
5675 
5676           // We're done with the pack expansion.
5677           continue;
5678         }
5679 
5680         // We'll substitute the parameter now without expanding the pack
5681         // expansion.
5682         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5683         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5684                                                           indexAdjustment,
5685                                                           NumExpansions,
5686                                                   /*ExpectParameterPack=*/true);
5687         assert(NewParm->isParameterPack() &&
5688                "Parameter pack no longer a parameter pack after "
5689                "transformation.");
5690       } else {
5691         NewParm = getDerived().TransformFunctionTypeParam(
5692             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5693       }
5694 
5695       if (!NewParm)
5696         return true;
5697 
5698       if (ParamInfos)
5699         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5700       OutParamTypes.push_back(NewParm->getType());
5701       if (PVars)
5702         PVars->push_back(NewParm);
5703       continue;
5704     }
5705 
5706     // Deal with the possibility that we don't have a parameter
5707     // declaration for this parameter.
5708     QualType OldType = ParamTypes[i];
5709     bool IsPackExpansion = false;
5710     Optional<unsigned> NumExpansions;
5711     QualType NewType;
5712     if (const PackExpansionType *Expansion
5713                                        = dyn_cast<PackExpansionType>(OldType)) {
5714       // We have a function parameter pack that may need to be expanded.
5715       QualType Pattern = Expansion->getPattern();
5716       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5717       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5718 
5719       // Determine whether we should expand the parameter packs.
5720       bool ShouldExpand = false;
5721       bool RetainExpansion = false;
5722       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5723                                                Unexpanded,
5724                                                ShouldExpand,
5725                                                RetainExpansion,
5726                                                NumExpansions)) {
5727         return true;
5728       }
5729 
5730       if (ShouldExpand) {
5731         // Expand the function parameter pack into multiple, separate
5732         // parameters.
5733         for (unsigned I = 0; I != *NumExpansions; ++I) {
5734           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5735           QualType NewType = getDerived().TransformType(Pattern);
5736           if (NewType.isNull())
5737             return true;
5738 
5739           if (NewType->containsUnexpandedParameterPack()) {
5740             NewType =
5741                 getSema().getASTContext().getPackExpansionType(NewType, None);
5742 
5743             if (NewType.isNull())
5744               return true;
5745           }
5746 
5747           if (ParamInfos)
5748             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5749           OutParamTypes.push_back(NewType);
5750           if (PVars)
5751             PVars->push_back(nullptr);
5752         }
5753 
5754         // We're done with the pack expansion.
5755         continue;
5756       }
5757 
5758       // If we're supposed to retain a pack expansion, do so by temporarily
5759       // forgetting the partially-substituted parameter pack.
5760       if (RetainExpansion) {
5761         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5762         QualType NewType = getDerived().TransformType(Pattern);
5763         if (NewType.isNull())
5764           return true;
5765 
5766         if (ParamInfos)
5767           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5768         OutParamTypes.push_back(NewType);
5769         if (PVars)
5770           PVars->push_back(nullptr);
5771       }
5772 
5773       // We'll substitute the parameter now without expanding the pack
5774       // expansion.
5775       OldType = Expansion->getPattern();
5776       IsPackExpansion = true;
5777       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5778       NewType = getDerived().TransformType(OldType);
5779     } else {
5780       NewType = getDerived().TransformType(OldType);
5781     }
5782 
5783     if (NewType.isNull())
5784       return true;
5785 
5786     if (IsPackExpansion)
5787       NewType = getSema().Context.getPackExpansionType(NewType,
5788                                                        NumExpansions);
5789 
5790     if (ParamInfos)
5791       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5792     OutParamTypes.push_back(NewType);
5793     if (PVars)
5794       PVars->push_back(nullptr);
5795   }
5796 
5797 #ifndef NDEBUG
5798   if (PVars) {
5799     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5800       if (ParmVarDecl *parm = (*PVars)[i])
5801         assert(parm->getFunctionScopeIndex() == i);
5802   }
5803 #endif
5804 
5805   return false;
5806 }
5807 
5808 template<typename Derived>
5809 QualType
5810 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5811                                                    FunctionProtoTypeLoc TL) {
5812   SmallVector<QualType, 4> ExceptionStorage;
5813   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5814   return getDerived().TransformFunctionProtoType(
5815       TLB, TL, nullptr, Qualifiers(),
5816       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5817         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5818                                             ExceptionStorage, Changed);
5819       });
5820 }
5821 
5822 template<typename Derived> template<typename Fn>
5823 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5824     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5825     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5826 
5827   // Transform the parameters and return type.
5828   //
5829   // We are required to instantiate the params and return type in source order.
5830   // When the function has a trailing return type, we instantiate the
5831   // parameters before the return type,  since the return type can then refer
5832   // to the parameters themselves (via decltype, sizeof, etc.).
5833   //
5834   SmallVector<QualType, 4> ParamTypes;
5835   SmallVector<ParmVarDecl*, 4> ParamDecls;
5836   Sema::ExtParameterInfoBuilder ExtParamInfos;
5837   const FunctionProtoType *T = TL.getTypePtr();
5838 
5839   QualType ResultType;
5840 
5841   if (T->hasTrailingReturn()) {
5842     if (getDerived().TransformFunctionTypeParams(
5843             TL.getBeginLoc(), TL.getParams(),
5844             TL.getTypePtr()->param_type_begin(),
5845             T->getExtParameterInfosOrNull(),
5846             ParamTypes, &ParamDecls, ExtParamInfos))
5847       return QualType();
5848 
5849     {
5850       // C++11 [expr.prim.general]p3:
5851       //   If a declaration declares a member function or member function
5852       //   template of a class X, the expression this is a prvalue of type
5853       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5854       //   and the end of the function-definition, member-declarator, or
5855       //   declarator.
5856       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5857 
5858       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5859       if (ResultType.isNull())
5860         return QualType();
5861     }
5862   }
5863   else {
5864     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5865     if (ResultType.isNull())
5866       return QualType();
5867 
5868     if (getDerived().TransformFunctionTypeParams(
5869             TL.getBeginLoc(), TL.getParams(),
5870             TL.getTypePtr()->param_type_begin(),
5871             T->getExtParameterInfosOrNull(),
5872             ParamTypes, &ParamDecls, ExtParamInfos))
5873       return QualType();
5874   }
5875 
5876   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5877 
5878   bool EPIChanged = false;
5879   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5880     return QualType();
5881 
5882   // Handle extended parameter information.
5883   if (auto NewExtParamInfos =
5884         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5885     if (!EPI.ExtParameterInfos ||
5886         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5887           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5888       EPIChanged = true;
5889     }
5890     EPI.ExtParameterInfos = NewExtParamInfos;
5891   } else if (EPI.ExtParameterInfos) {
5892     EPIChanged = true;
5893     EPI.ExtParameterInfos = nullptr;
5894   }
5895 
5896   QualType Result = TL.getType();
5897   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5898       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5899     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5900     if (Result.isNull())
5901       return QualType();
5902   }
5903 
5904   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5905   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5906   NewTL.setLParenLoc(TL.getLParenLoc());
5907   NewTL.setRParenLoc(TL.getRParenLoc());
5908   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5909   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5910   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5911     NewTL.setParam(i, ParamDecls[i]);
5912 
5913   return Result;
5914 }
5915 
5916 template<typename Derived>
5917 bool TreeTransform<Derived>::TransformExceptionSpec(
5918     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5919     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5920   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5921 
5922   // Instantiate a dynamic noexcept expression, if any.
5923   if (isComputedNoexcept(ESI.Type)) {
5924     EnterExpressionEvaluationContext Unevaluated(
5925         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5926     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5927     if (NoexceptExpr.isInvalid())
5928       return true;
5929 
5930     ExceptionSpecificationType EST = ESI.Type;
5931     NoexceptExpr =
5932         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5933     if (NoexceptExpr.isInvalid())
5934       return true;
5935 
5936     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5937       Changed = true;
5938     ESI.NoexceptExpr = NoexceptExpr.get();
5939     ESI.Type = EST;
5940   }
5941 
5942   if (ESI.Type != EST_Dynamic)
5943     return false;
5944 
5945   // Instantiate a dynamic exception specification's type.
5946   for (QualType T : ESI.Exceptions) {
5947     if (const PackExpansionType *PackExpansion =
5948             T->getAs<PackExpansionType>()) {
5949       Changed = true;
5950 
5951       // We have a pack expansion. Instantiate it.
5952       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5953       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5954                                               Unexpanded);
5955       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5956 
5957       // Determine whether the set of unexpanded parameter packs can and
5958       // should
5959       // be expanded.
5960       bool Expand = false;
5961       bool RetainExpansion = false;
5962       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5963       // FIXME: Track the location of the ellipsis (and track source location
5964       // information for the types in the exception specification in general).
5965       if (getDerived().TryExpandParameterPacks(
5966               Loc, SourceRange(), Unexpanded, Expand,
5967               RetainExpansion, NumExpansions))
5968         return true;
5969 
5970       if (!Expand) {
5971         // We can't expand this pack expansion into separate arguments yet;
5972         // just substitute into the pattern and create a new pack expansion
5973         // type.
5974         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5975         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5976         if (U.isNull())
5977           return true;
5978 
5979         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5980         Exceptions.push_back(U);
5981         continue;
5982       }
5983 
5984       // Substitute into the pack expansion pattern for each slice of the
5985       // pack.
5986       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5987         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5988 
5989         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5990         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5991           return true;
5992 
5993         Exceptions.push_back(U);
5994       }
5995     } else {
5996       QualType U = getDerived().TransformType(T);
5997       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5998         return true;
5999       if (T != U)
6000         Changed = true;
6001 
6002       Exceptions.push_back(U);
6003     }
6004   }
6005 
6006   ESI.Exceptions = Exceptions;
6007   if (ESI.Exceptions.empty())
6008     ESI.Type = EST_DynamicNone;
6009   return false;
6010 }
6011 
6012 template<typename Derived>
6013 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6014                                                  TypeLocBuilder &TLB,
6015                                                  FunctionNoProtoTypeLoc TL) {
6016   const FunctionNoProtoType *T = TL.getTypePtr();
6017   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6018   if (ResultType.isNull())
6019     return QualType();
6020 
6021   QualType Result = TL.getType();
6022   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6023     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6024 
6025   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6026   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6027   NewTL.setLParenLoc(TL.getLParenLoc());
6028   NewTL.setRParenLoc(TL.getRParenLoc());
6029   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6030 
6031   return Result;
6032 }
6033 
6034 template<typename Derived> QualType
6035 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
6036                                                  UnresolvedUsingTypeLoc TL) {
6037   const UnresolvedUsingType *T = TL.getTypePtr();
6038   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6039   if (!D)
6040     return QualType();
6041 
6042   QualType Result = TL.getType();
6043   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6044     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6045     if (Result.isNull())
6046       return QualType();
6047   }
6048 
6049   // We might get an arbitrary type spec type back.  We should at
6050   // least always get a type spec type, though.
6051   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6052   NewTL.setNameLoc(TL.getNameLoc());
6053 
6054   return Result;
6055 }
6056 
6057 template<typename Derived>
6058 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6059                                                       TypedefTypeLoc TL) {
6060   const TypedefType *T = TL.getTypePtr();
6061   TypedefNameDecl *Typedef
6062     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6063                                                                T->getDecl()));
6064   if (!Typedef)
6065     return QualType();
6066 
6067   QualType Result = TL.getType();
6068   if (getDerived().AlwaysRebuild() ||
6069       Typedef != T->getDecl()) {
6070     Result = getDerived().RebuildTypedefType(Typedef);
6071     if (Result.isNull())
6072       return QualType();
6073   }
6074 
6075   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6076   NewTL.setNameLoc(TL.getNameLoc());
6077 
6078   return Result;
6079 }
6080 
6081 template<typename Derived>
6082 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6083                                                       TypeOfExprTypeLoc TL) {
6084   // typeof expressions are not potentially evaluated contexts
6085   EnterExpressionEvaluationContext Unevaluated(
6086       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6087       Sema::ReuseLambdaContextDecl);
6088 
6089   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6090   if (E.isInvalid())
6091     return QualType();
6092 
6093   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6094   if (E.isInvalid())
6095     return QualType();
6096 
6097   QualType Result = TL.getType();
6098   if (getDerived().AlwaysRebuild() ||
6099       E.get() != TL.getUnderlyingExpr()) {
6100     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6101     if (Result.isNull())
6102       return QualType();
6103   }
6104   else E.get();
6105 
6106   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6107   NewTL.setTypeofLoc(TL.getTypeofLoc());
6108   NewTL.setLParenLoc(TL.getLParenLoc());
6109   NewTL.setRParenLoc(TL.getRParenLoc());
6110 
6111   return Result;
6112 }
6113 
6114 template<typename Derived>
6115 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6116                                                      TypeOfTypeLoc TL) {
6117   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6118   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6119   if (!New_Under_TI)
6120     return QualType();
6121 
6122   QualType Result = TL.getType();
6123   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6124     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6125     if (Result.isNull())
6126       return QualType();
6127   }
6128 
6129   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6130   NewTL.setTypeofLoc(TL.getTypeofLoc());
6131   NewTL.setLParenLoc(TL.getLParenLoc());
6132   NewTL.setRParenLoc(TL.getRParenLoc());
6133   NewTL.setUnderlyingTInfo(New_Under_TI);
6134 
6135   return Result;
6136 }
6137 
6138 template<typename Derived>
6139 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6140                                                        DecltypeTypeLoc TL) {
6141   const DecltypeType *T = TL.getTypePtr();
6142 
6143   // decltype expressions are not potentially evaluated contexts
6144   EnterExpressionEvaluationContext Unevaluated(
6145       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6146       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6147 
6148   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6149   if (E.isInvalid())
6150     return QualType();
6151 
6152   E = getSema().ActOnDecltypeExpression(E.get());
6153   if (E.isInvalid())
6154     return QualType();
6155 
6156   QualType Result = TL.getType();
6157   if (getDerived().AlwaysRebuild() ||
6158       E.get() != T->getUnderlyingExpr()) {
6159     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6160     if (Result.isNull())
6161       return QualType();
6162   }
6163   else E.get();
6164 
6165   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6166   NewTL.setNameLoc(TL.getNameLoc());
6167 
6168   return Result;
6169 }
6170 
6171 template<typename Derived>
6172 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6173                                                             TypeLocBuilder &TLB,
6174                                                      UnaryTransformTypeLoc TL) {
6175   QualType Result = TL.getType();
6176   if (Result->isDependentType()) {
6177     const UnaryTransformType *T = TL.getTypePtr();
6178     QualType NewBase =
6179       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6180     Result = getDerived().RebuildUnaryTransformType(NewBase,
6181                                                     T->getUTTKind(),
6182                                                     TL.getKWLoc());
6183     if (Result.isNull())
6184       return QualType();
6185   }
6186 
6187   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6188   NewTL.setKWLoc(TL.getKWLoc());
6189   NewTL.setParensRange(TL.getParensRange());
6190   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6191   return Result;
6192 }
6193 
6194 template<typename Derived>
6195 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6196     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6197   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6198 
6199   CXXScopeSpec SS;
6200   TemplateName TemplateName = getDerived().TransformTemplateName(
6201       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6202   if (TemplateName.isNull())
6203     return QualType();
6204 
6205   QualType OldDeduced = T->getDeducedType();
6206   QualType NewDeduced;
6207   if (!OldDeduced.isNull()) {
6208     NewDeduced = getDerived().TransformType(OldDeduced);
6209     if (NewDeduced.isNull())
6210       return QualType();
6211   }
6212 
6213   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6214       TemplateName, NewDeduced);
6215   if (Result.isNull())
6216     return QualType();
6217 
6218   DeducedTemplateSpecializationTypeLoc NewTL =
6219       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6220   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6221 
6222   return Result;
6223 }
6224 
6225 template<typename Derived>
6226 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6227                                                      RecordTypeLoc TL) {
6228   const RecordType *T = TL.getTypePtr();
6229   RecordDecl *Record
6230     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6231                                                           T->getDecl()));
6232   if (!Record)
6233     return QualType();
6234 
6235   QualType Result = TL.getType();
6236   if (getDerived().AlwaysRebuild() ||
6237       Record != T->getDecl()) {
6238     Result = getDerived().RebuildRecordType(Record);
6239     if (Result.isNull())
6240       return QualType();
6241   }
6242 
6243   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6244   NewTL.setNameLoc(TL.getNameLoc());
6245 
6246   return Result;
6247 }
6248 
6249 template<typename Derived>
6250 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6251                                                    EnumTypeLoc TL) {
6252   const EnumType *T = TL.getTypePtr();
6253   EnumDecl *Enum
6254     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6255                                                         T->getDecl()));
6256   if (!Enum)
6257     return QualType();
6258 
6259   QualType Result = TL.getType();
6260   if (getDerived().AlwaysRebuild() ||
6261       Enum != T->getDecl()) {
6262     Result = getDerived().RebuildEnumType(Enum);
6263     if (Result.isNull())
6264       return QualType();
6265   }
6266 
6267   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6268   NewTL.setNameLoc(TL.getNameLoc());
6269 
6270   return Result;
6271 }
6272 
6273 template<typename Derived>
6274 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6275                                          TypeLocBuilder &TLB,
6276                                          InjectedClassNameTypeLoc TL) {
6277   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6278                                        TL.getTypePtr()->getDecl());
6279   if (!D) return QualType();
6280 
6281   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6282   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6283   return T;
6284 }
6285 
6286 template<typename Derived>
6287 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6288                                                 TypeLocBuilder &TLB,
6289                                                 TemplateTypeParmTypeLoc TL) {
6290   return TransformTypeSpecType(TLB, TL);
6291 }
6292 
6293 template<typename Derived>
6294 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6295                                          TypeLocBuilder &TLB,
6296                                          SubstTemplateTypeParmTypeLoc TL) {
6297   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6298 
6299   // Substitute into the replacement type, which itself might involve something
6300   // that needs to be transformed. This only tends to occur with default
6301   // template arguments of template template parameters.
6302   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6303   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6304   if (Replacement.isNull())
6305     return QualType();
6306 
6307   // Always canonicalize the replacement type.
6308   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6309   QualType Result
6310     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6311                                                    Replacement);
6312 
6313   // Propagate type-source information.
6314   SubstTemplateTypeParmTypeLoc NewTL
6315     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6316   NewTL.setNameLoc(TL.getNameLoc());
6317   return Result;
6318 
6319 }
6320 
6321 template<typename Derived>
6322 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6323                                           TypeLocBuilder &TLB,
6324                                           SubstTemplateTypeParmPackTypeLoc TL) {
6325   return TransformTypeSpecType(TLB, TL);
6326 }
6327 
6328 template<typename Derived>
6329 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6330                                                         TypeLocBuilder &TLB,
6331                                            TemplateSpecializationTypeLoc TL) {
6332   const TemplateSpecializationType *T = TL.getTypePtr();
6333 
6334   // The nested-name-specifier never matters in a TemplateSpecializationType,
6335   // because we can't have a dependent nested-name-specifier anyway.
6336   CXXScopeSpec SS;
6337   TemplateName Template
6338     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6339                                          TL.getTemplateNameLoc());
6340   if (Template.isNull())
6341     return QualType();
6342 
6343   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6344 }
6345 
6346 template<typename Derived>
6347 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6348                                                      AtomicTypeLoc TL) {
6349   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6350   if (ValueType.isNull())
6351     return QualType();
6352 
6353   QualType Result = TL.getType();
6354   if (getDerived().AlwaysRebuild() ||
6355       ValueType != TL.getValueLoc().getType()) {
6356     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6357     if (Result.isNull())
6358       return QualType();
6359   }
6360 
6361   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6362   NewTL.setKWLoc(TL.getKWLoc());
6363   NewTL.setLParenLoc(TL.getLParenLoc());
6364   NewTL.setRParenLoc(TL.getRParenLoc());
6365 
6366   return Result;
6367 }
6368 
6369 template <typename Derived>
6370 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6371                                                    PipeTypeLoc TL) {
6372   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6373   if (ValueType.isNull())
6374     return QualType();
6375 
6376   QualType Result = TL.getType();
6377   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6378     const PipeType *PT = Result->castAs<PipeType>();
6379     bool isReadPipe = PT->isReadOnly();
6380     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6381     if (Result.isNull())
6382       return QualType();
6383   }
6384 
6385   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6386   NewTL.setKWLoc(TL.getKWLoc());
6387 
6388   return Result;
6389 }
6390 
6391 template <typename Derived>
6392 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6393                                                      ExtIntTypeLoc TL) {
6394   const ExtIntType *EIT = TL.getTypePtr();
6395   QualType Result = TL.getType();
6396 
6397   if (getDerived().AlwaysRebuild()) {
6398     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6399                                             EIT->getNumBits(), TL.getNameLoc());
6400     if (Result.isNull())
6401       return QualType();
6402   }
6403 
6404   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6405   NewTL.setNameLoc(TL.getNameLoc());
6406   return Result;
6407 }
6408 
6409 template <typename Derived>
6410 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6411     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6412   const DependentExtIntType *EIT = TL.getTypePtr();
6413 
6414   EnterExpressionEvaluationContext Unevaluated(
6415       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6416   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6417   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6418 
6419   if (BitsExpr.isInvalid())
6420     return QualType();
6421 
6422   QualType Result = TL.getType();
6423 
6424   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6425     Result = getDerived().RebuildDependentExtIntType(
6426         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6427 
6428     if (Result.isNull())
6429       return QualType();
6430   }
6431 
6432   if (isa<DependentExtIntType>(Result)) {
6433     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6434     NewTL.setNameLoc(TL.getNameLoc());
6435   } else {
6436     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6437     NewTL.setNameLoc(TL.getNameLoc());
6438   }
6439   return Result;
6440 }
6441 
6442   /// Simple iterator that traverses the template arguments in a
6443   /// container that provides a \c getArgLoc() member function.
6444   ///
6445   /// This iterator is intended to be used with the iterator form of
6446   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6447   template<typename ArgLocContainer>
6448   class TemplateArgumentLocContainerIterator {
6449     ArgLocContainer *Container;
6450     unsigned Index;
6451 
6452   public:
6453     typedef TemplateArgumentLoc value_type;
6454     typedef TemplateArgumentLoc reference;
6455     typedef int difference_type;
6456     typedef std::input_iterator_tag iterator_category;
6457 
6458     class pointer {
6459       TemplateArgumentLoc Arg;
6460 
6461     public:
6462       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6463 
6464       const TemplateArgumentLoc *operator->() const {
6465         return &Arg;
6466       }
6467     };
6468 
6469 
6470     TemplateArgumentLocContainerIterator() {}
6471 
6472     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6473                                  unsigned Index)
6474       : Container(&Container), Index(Index) { }
6475 
6476     TemplateArgumentLocContainerIterator &operator++() {
6477       ++Index;
6478       return *this;
6479     }
6480 
6481     TemplateArgumentLocContainerIterator operator++(int) {
6482       TemplateArgumentLocContainerIterator Old(*this);
6483       ++(*this);
6484       return Old;
6485     }
6486 
6487     TemplateArgumentLoc operator*() const {
6488       return Container->getArgLoc(Index);
6489     }
6490 
6491     pointer operator->() const {
6492       return pointer(Container->getArgLoc(Index));
6493     }
6494 
6495     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6496                            const TemplateArgumentLocContainerIterator &Y) {
6497       return X.Container == Y.Container && X.Index == Y.Index;
6498     }
6499 
6500     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6501                            const TemplateArgumentLocContainerIterator &Y) {
6502       return !(X == Y);
6503     }
6504   };
6505 
6506 template<typename Derived>
6507 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6508                                                    AutoTypeLoc TL) {
6509   const AutoType *T = TL.getTypePtr();
6510   QualType OldDeduced = T->getDeducedType();
6511   QualType NewDeduced;
6512   if (!OldDeduced.isNull()) {
6513     NewDeduced = getDerived().TransformType(OldDeduced);
6514     if (NewDeduced.isNull())
6515       return QualType();
6516   }
6517 
6518   ConceptDecl *NewCD = nullptr;
6519   TemplateArgumentListInfo NewTemplateArgs;
6520   NestedNameSpecifierLoc NewNestedNameSpec;
6521   if (T->isConstrained()) {
6522     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6523         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6524 
6525     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6526     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6527     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6528     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6529                                                 ArgIterator(TL,
6530                                                             TL.getNumArgs()),
6531                                                 NewTemplateArgs))
6532       return QualType();
6533 
6534     if (TL.getNestedNameSpecifierLoc()) {
6535       NewNestedNameSpec
6536         = getDerived().TransformNestedNameSpecifierLoc(
6537             TL.getNestedNameSpecifierLoc());
6538       if (!NewNestedNameSpec)
6539         return QualType();
6540     }
6541   }
6542 
6543   QualType Result = TL.getType();
6544   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6545       T->isDependentType() || T->isConstrained()) {
6546     // FIXME: Maybe don't rebuild if all template arguments are the same.
6547     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6548     NewArgList.reserve(NewArgList.size());
6549     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6550       NewArgList.push_back(ArgLoc.getArgument());
6551     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6552                                           NewArgList);
6553     if (Result.isNull())
6554       return QualType();
6555   }
6556 
6557   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6558   NewTL.setNameLoc(TL.getNameLoc());
6559   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6560   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6561   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6562   NewTL.setFoundDecl(TL.getFoundDecl());
6563   NewTL.setLAngleLoc(TL.getLAngleLoc());
6564   NewTL.setRAngleLoc(TL.getRAngleLoc());
6565   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6566     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6567 
6568   return Result;
6569 }
6570 
6571 template <typename Derived>
6572 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6573                                                         TypeLocBuilder &TLB,
6574                                            TemplateSpecializationTypeLoc TL,
6575                                                       TemplateName Template) {
6576   TemplateArgumentListInfo NewTemplateArgs;
6577   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6578   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6579   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6580     ArgIterator;
6581   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6582                                               ArgIterator(TL, TL.getNumArgs()),
6583                                               NewTemplateArgs))
6584     return QualType();
6585 
6586   // FIXME: maybe don't rebuild if all the template arguments are the same.
6587 
6588   QualType Result =
6589     getDerived().RebuildTemplateSpecializationType(Template,
6590                                                    TL.getTemplateNameLoc(),
6591                                                    NewTemplateArgs);
6592 
6593   if (!Result.isNull()) {
6594     // Specializations of template template parameters are represented as
6595     // TemplateSpecializationTypes, and substitution of type alias templates
6596     // within a dependent context can transform them into
6597     // DependentTemplateSpecializationTypes.
6598     if (isa<DependentTemplateSpecializationType>(Result)) {
6599       DependentTemplateSpecializationTypeLoc NewTL
6600         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6601       NewTL.setElaboratedKeywordLoc(SourceLocation());
6602       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6603       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6604       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6605       NewTL.setLAngleLoc(TL.getLAngleLoc());
6606       NewTL.setRAngleLoc(TL.getRAngleLoc());
6607       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6608         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6609       return Result;
6610     }
6611 
6612     TemplateSpecializationTypeLoc NewTL
6613       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6614     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6615     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6616     NewTL.setLAngleLoc(TL.getLAngleLoc());
6617     NewTL.setRAngleLoc(TL.getRAngleLoc());
6618     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6619       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6620   }
6621 
6622   return Result;
6623 }
6624 
6625 template <typename Derived>
6626 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6627                                      TypeLocBuilder &TLB,
6628                                      DependentTemplateSpecializationTypeLoc TL,
6629                                      TemplateName Template,
6630                                      CXXScopeSpec &SS) {
6631   TemplateArgumentListInfo NewTemplateArgs;
6632   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6633   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6634   typedef TemplateArgumentLocContainerIterator<
6635             DependentTemplateSpecializationTypeLoc> ArgIterator;
6636   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6637                                               ArgIterator(TL, TL.getNumArgs()),
6638                                               NewTemplateArgs))
6639     return QualType();
6640 
6641   // FIXME: maybe don't rebuild if all the template arguments are the same.
6642 
6643   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6644     QualType Result
6645       = getSema().Context.getDependentTemplateSpecializationType(
6646                                                 TL.getTypePtr()->getKeyword(),
6647                                                          DTN->getQualifier(),
6648                                                          DTN->getIdentifier(),
6649                                                                NewTemplateArgs);
6650 
6651     DependentTemplateSpecializationTypeLoc NewTL
6652       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6653     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6654     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6655     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6656     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6657     NewTL.setLAngleLoc(TL.getLAngleLoc());
6658     NewTL.setRAngleLoc(TL.getRAngleLoc());
6659     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6660       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6661     return Result;
6662   }
6663 
6664   QualType Result
6665     = getDerived().RebuildTemplateSpecializationType(Template,
6666                                                      TL.getTemplateNameLoc(),
6667                                                      NewTemplateArgs);
6668 
6669   if (!Result.isNull()) {
6670     /// FIXME: Wrap this in an elaborated-type-specifier?
6671     TemplateSpecializationTypeLoc NewTL
6672       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6673     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6674     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6675     NewTL.setLAngleLoc(TL.getLAngleLoc());
6676     NewTL.setRAngleLoc(TL.getRAngleLoc());
6677     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6678       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6679   }
6680 
6681   return Result;
6682 }
6683 
6684 template<typename Derived>
6685 QualType
6686 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6687                                                 ElaboratedTypeLoc TL) {
6688   const ElaboratedType *T = TL.getTypePtr();
6689 
6690   NestedNameSpecifierLoc QualifierLoc;
6691   // NOTE: the qualifier in an ElaboratedType is optional.
6692   if (TL.getQualifierLoc()) {
6693     QualifierLoc
6694       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6695     if (!QualifierLoc)
6696       return QualType();
6697   }
6698 
6699   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6700   if (NamedT.isNull())
6701     return QualType();
6702 
6703   // C++0x [dcl.type.elab]p2:
6704   //   If the identifier resolves to a typedef-name or the simple-template-id
6705   //   resolves to an alias template specialization, the
6706   //   elaborated-type-specifier is ill-formed.
6707   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6708     if (const TemplateSpecializationType *TST =
6709           NamedT->getAs<TemplateSpecializationType>()) {
6710       TemplateName Template = TST->getTemplateName();
6711       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6712               Template.getAsTemplateDecl())) {
6713         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6714                      diag::err_tag_reference_non_tag)
6715             << TAT << Sema::NTK_TypeAliasTemplate
6716             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6717         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6718       }
6719     }
6720   }
6721 
6722   QualType Result = TL.getType();
6723   if (getDerived().AlwaysRebuild() ||
6724       QualifierLoc != TL.getQualifierLoc() ||
6725       NamedT != T->getNamedType()) {
6726     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6727                                                 T->getKeyword(),
6728                                                 QualifierLoc, NamedT);
6729     if (Result.isNull())
6730       return QualType();
6731   }
6732 
6733   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6734   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6735   NewTL.setQualifierLoc(QualifierLoc);
6736   return Result;
6737 }
6738 
6739 template<typename Derived>
6740 QualType TreeTransform<Derived>::TransformAttributedType(
6741                                                 TypeLocBuilder &TLB,
6742                                                 AttributedTypeLoc TL) {
6743   const AttributedType *oldType = TL.getTypePtr();
6744   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6745   if (modifiedType.isNull())
6746     return QualType();
6747 
6748   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6749   const Attr *oldAttr = TL.getAttr();
6750   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6751   if (oldAttr && !newAttr)
6752     return QualType();
6753 
6754   QualType result = TL.getType();
6755 
6756   // FIXME: dependent operand expressions?
6757   if (getDerived().AlwaysRebuild() ||
6758       modifiedType != oldType->getModifiedType()) {
6759     // TODO: this is really lame; we should really be rebuilding the
6760     // equivalent type from first principles.
6761     QualType equivalentType
6762       = getDerived().TransformType(oldType->getEquivalentType());
6763     if (equivalentType.isNull())
6764       return QualType();
6765 
6766     // Check whether we can add nullability; it is only represented as
6767     // type sugar, and therefore cannot be diagnosed in any other way.
6768     if (auto nullability = oldType->getImmediateNullability()) {
6769       if (!modifiedType->canHaveNullability()) {
6770         SemaRef.Diag(TL.getAttr()->getLocation(),
6771                      diag::err_nullability_nonpointer)
6772             << DiagNullabilityKind(*nullability, false) << modifiedType;
6773         return QualType();
6774       }
6775     }
6776 
6777     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6778                                                modifiedType,
6779                                                equivalentType);
6780   }
6781 
6782   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6783   newTL.setAttr(newAttr);
6784   return result;
6785 }
6786 
6787 template<typename Derived>
6788 QualType
6789 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6790                                            ParenTypeLoc TL) {
6791   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6792   if (Inner.isNull())
6793     return QualType();
6794 
6795   QualType Result = TL.getType();
6796   if (getDerived().AlwaysRebuild() ||
6797       Inner != TL.getInnerLoc().getType()) {
6798     Result = getDerived().RebuildParenType(Inner);
6799     if (Result.isNull())
6800       return QualType();
6801   }
6802 
6803   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6804   NewTL.setLParenLoc(TL.getLParenLoc());
6805   NewTL.setRParenLoc(TL.getRParenLoc());
6806   return Result;
6807 }
6808 
6809 template <typename Derived>
6810 QualType
6811 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6812                                                     MacroQualifiedTypeLoc TL) {
6813   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6814   if (Inner.isNull())
6815     return QualType();
6816 
6817   QualType Result = TL.getType();
6818   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6819     Result =
6820         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6821     if (Result.isNull())
6822       return QualType();
6823   }
6824 
6825   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6826   NewTL.setExpansionLoc(TL.getExpansionLoc());
6827   return Result;
6828 }
6829 
6830 template<typename Derived>
6831 QualType TreeTransform<Derived>::TransformDependentNameType(
6832     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6833   return TransformDependentNameType(TLB, TL, false);
6834 }
6835 
6836 template<typename Derived>
6837 QualType TreeTransform<Derived>::TransformDependentNameType(
6838     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6839   const DependentNameType *T = TL.getTypePtr();
6840 
6841   NestedNameSpecifierLoc QualifierLoc
6842     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6843   if (!QualifierLoc)
6844     return QualType();
6845 
6846   QualType Result
6847     = getDerived().RebuildDependentNameType(T->getKeyword(),
6848                                             TL.getElaboratedKeywordLoc(),
6849                                             QualifierLoc,
6850                                             T->getIdentifier(),
6851                                             TL.getNameLoc(),
6852                                             DeducedTSTContext);
6853   if (Result.isNull())
6854     return QualType();
6855 
6856   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6857     QualType NamedT = ElabT->getNamedType();
6858     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6859 
6860     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6861     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6862     NewTL.setQualifierLoc(QualifierLoc);
6863   } else {
6864     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6865     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6866     NewTL.setQualifierLoc(QualifierLoc);
6867     NewTL.setNameLoc(TL.getNameLoc());
6868   }
6869   return Result;
6870 }
6871 
6872 template<typename Derived>
6873 QualType TreeTransform<Derived>::
6874           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6875                                  DependentTemplateSpecializationTypeLoc TL) {
6876   NestedNameSpecifierLoc QualifierLoc;
6877   if (TL.getQualifierLoc()) {
6878     QualifierLoc
6879       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6880     if (!QualifierLoc)
6881       return QualType();
6882   }
6883 
6884   return getDerived()
6885            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6886 }
6887 
6888 template<typename Derived>
6889 QualType TreeTransform<Derived>::
6890 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6891                                    DependentTemplateSpecializationTypeLoc TL,
6892                                        NestedNameSpecifierLoc QualifierLoc) {
6893   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6894 
6895   TemplateArgumentListInfo NewTemplateArgs;
6896   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6897   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6898 
6899   typedef TemplateArgumentLocContainerIterator<
6900   DependentTemplateSpecializationTypeLoc> ArgIterator;
6901   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6902                                               ArgIterator(TL, TL.getNumArgs()),
6903                                               NewTemplateArgs))
6904     return QualType();
6905 
6906   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6907       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6908       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6909       /*AllowInjectedClassName*/ false);
6910   if (Result.isNull())
6911     return QualType();
6912 
6913   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6914     QualType NamedT = ElabT->getNamedType();
6915 
6916     // Copy information relevant to the template specialization.
6917     TemplateSpecializationTypeLoc NamedTL
6918       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6919     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6920     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6921     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6922     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6923     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6924       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6925 
6926     // Copy information relevant to the elaborated type.
6927     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6928     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6929     NewTL.setQualifierLoc(QualifierLoc);
6930   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6931     DependentTemplateSpecializationTypeLoc SpecTL
6932       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6933     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6934     SpecTL.setQualifierLoc(QualifierLoc);
6935     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6936     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6937     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6938     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6939     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6940       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6941   } else {
6942     TemplateSpecializationTypeLoc SpecTL
6943       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6944     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6945     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6946     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6947     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6948     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6949       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6950   }
6951   return Result;
6952 }
6953 
6954 template<typename Derived>
6955 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6956                                                       PackExpansionTypeLoc TL) {
6957   QualType Pattern
6958     = getDerived().TransformType(TLB, TL.getPatternLoc());
6959   if (Pattern.isNull())
6960     return QualType();
6961 
6962   QualType Result = TL.getType();
6963   if (getDerived().AlwaysRebuild() ||
6964       Pattern != TL.getPatternLoc().getType()) {
6965     Result = getDerived().RebuildPackExpansionType(Pattern,
6966                                            TL.getPatternLoc().getSourceRange(),
6967                                                    TL.getEllipsisLoc(),
6968                                            TL.getTypePtr()->getNumExpansions());
6969     if (Result.isNull())
6970       return QualType();
6971   }
6972 
6973   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6974   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6975   return Result;
6976 }
6977 
6978 template<typename Derived>
6979 QualType
6980 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6981                                                    ObjCInterfaceTypeLoc TL) {
6982   // ObjCInterfaceType is never dependent.
6983   TLB.pushFullCopy(TL);
6984   return TL.getType();
6985 }
6986 
6987 template<typename Derived>
6988 QualType
6989 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6990                                                    ObjCTypeParamTypeLoc TL) {
6991   const ObjCTypeParamType *T = TL.getTypePtr();
6992   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6993       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6994   if (!OTP)
6995     return QualType();
6996 
6997   QualType Result = TL.getType();
6998   if (getDerived().AlwaysRebuild() ||
6999       OTP != T->getDecl()) {
7000     Result = getDerived().RebuildObjCTypeParamType(OTP,
7001                  TL.getProtocolLAngleLoc(),
7002                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
7003                                     TL.getNumProtocols()),
7004                  TL.getProtocolLocs(),
7005                  TL.getProtocolRAngleLoc());
7006     if (Result.isNull())
7007       return QualType();
7008   }
7009 
7010   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7011   if (TL.getNumProtocols()) {
7012     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7013     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7014       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7015     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7016   }
7017   return Result;
7018 }
7019 
7020 template<typename Derived>
7021 QualType
7022 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7023                                                 ObjCObjectTypeLoc TL) {
7024   // Transform base type.
7025   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7026   if (BaseType.isNull())
7027     return QualType();
7028 
7029   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7030 
7031   // Transform type arguments.
7032   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7033   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7034     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7035     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7036     QualType TypeArg = TypeArgInfo->getType();
7037     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7038       AnyChanged = true;
7039 
7040       // We have a pack expansion. Instantiate it.
7041       const auto *PackExpansion = PackExpansionLoc.getType()
7042                                     ->castAs<PackExpansionType>();
7043       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7044       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7045                                               Unexpanded);
7046       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7047 
7048       // Determine whether the set of unexpanded parameter packs can
7049       // and should be expanded.
7050       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7051       bool Expand = false;
7052       bool RetainExpansion = false;
7053       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7054       if (getDerived().TryExpandParameterPacks(
7055             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7056             Unexpanded, Expand, RetainExpansion, NumExpansions))
7057         return QualType();
7058 
7059       if (!Expand) {
7060         // We can't expand this pack expansion into separate arguments yet;
7061         // just substitute into the pattern and create a new pack expansion
7062         // type.
7063         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7064 
7065         TypeLocBuilder TypeArgBuilder;
7066         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7067         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7068                                                              PatternLoc);
7069         if (NewPatternType.isNull())
7070           return QualType();
7071 
7072         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7073                                       NewPatternType, NumExpansions);
7074         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7075         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7076         NewTypeArgInfos.push_back(
7077           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7078         continue;
7079       }
7080 
7081       // Substitute into the pack expansion pattern for each slice of the
7082       // pack.
7083       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7084         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7085 
7086         TypeLocBuilder TypeArgBuilder;
7087         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7088 
7089         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7090                                                          PatternLoc);
7091         if (NewTypeArg.isNull())
7092           return QualType();
7093 
7094         NewTypeArgInfos.push_back(
7095           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7096       }
7097 
7098       continue;
7099     }
7100 
7101     TypeLocBuilder TypeArgBuilder;
7102     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7103     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7104     if (NewTypeArg.isNull())
7105       return QualType();
7106 
7107     // If nothing changed, just keep the old TypeSourceInfo.
7108     if (NewTypeArg == TypeArg) {
7109       NewTypeArgInfos.push_back(TypeArgInfo);
7110       continue;
7111     }
7112 
7113     NewTypeArgInfos.push_back(
7114       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7115     AnyChanged = true;
7116   }
7117 
7118   QualType Result = TL.getType();
7119   if (getDerived().AlwaysRebuild() || AnyChanged) {
7120     // Rebuild the type.
7121     Result = getDerived().RebuildObjCObjectType(
7122         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7123         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7124         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7125         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7126 
7127     if (Result.isNull())
7128       return QualType();
7129   }
7130 
7131   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7132   NewT.setHasBaseTypeAsWritten(true);
7133   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7134   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7135     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7136   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7137   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7138   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7139     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7140   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7141   return Result;
7142 }
7143 
7144 template<typename Derived>
7145 QualType
7146 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7147                                                ObjCObjectPointerTypeLoc TL) {
7148   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7149   if (PointeeType.isNull())
7150     return QualType();
7151 
7152   QualType Result = TL.getType();
7153   if (getDerived().AlwaysRebuild() ||
7154       PointeeType != TL.getPointeeLoc().getType()) {
7155     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7156                                                        TL.getStarLoc());
7157     if (Result.isNull())
7158       return QualType();
7159   }
7160 
7161   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7162   NewT.setStarLoc(TL.getStarLoc());
7163   return Result;
7164 }
7165 
7166 //===----------------------------------------------------------------------===//
7167 // Statement transformation
7168 //===----------------------------------------------------------------------===//
7169 template<typename Derived>
7170 StmtResult
7171 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7172   return S;
7173 }
7174 
7175 template<typename Derived>
7176 StmtResult
7177 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7178   return getDerived().TransformCompoundStmt(S, false);
7179 }
7180 
7181 template<typename Derived>
7182 StmtResult
7183 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7184                                               bool IsStmtExpr) {
7185   Sema::CompoundScopeRAII CompoundScope(getSema());
7186 
7187   const Stmt *ExprResult = S->getStmtExprResult();
7188   bool SubStmtInvalid = false;
7189   bool SubStmtChanged = false;
7190   SmallVector<Stmt*, 8> Statements;
7191   for (auto *B : S->body()) {
7192     StmtResult Result = getDerived().TransformStmt(
7193         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7194 
7195     if (Result.isInvalid()) {
7196       // Immediately fail if this was a DeclStmt, since it's very
7197       // likely that this will cause problems for future statements.
7198       if (isa<DeclStmt>(B))
7199         return StmtError();
7200 
7201       // Otherwise, just keep processing substatements and fail later.
7202       SubStmtInvalid = true;
7203       continue;
7204     }
7205 
7206     SubStmtChanged = SubStmtChanged || Result.get() != B;
7207     Statements.push_back(Result.getAs<Stmt>());
7208   }
7209 
7210   if (SubStmtInvalid)
7211     return StmtError();
7212 
7213   if (!getDerived().AlwaysRebuild() &&
7214       !SubStmtChanged)
7215     return S;
7216 
7217   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7218                                           Statements,
7219                                           S->getRBracLoc(),
7220                                           IsStmtExpr);
7221 }
7222 
7223 template<typename Derived>
7224 StmtResult
7225 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7226   ExprResult LHS, RHS;
7227   {
7228     EnterExpressionEvaluationContext Unevaluated(
7229         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7230 
7231     // Transform the left-hand case value.
7232     LHS = getDerived().TransformExpr(S->getLHS());
7233     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7234     if (LHS.isInvalid())
7235       return StmtError();
7236 
7237     // Transform the right-hand case value (for the GNU case-range extension).
7238     RHS = getDerived().TransformExpr(S->getRHS());
7239     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7240     if (RHS.isInvalid())
7241       return StmtError();
7242   }
7243 
7244   // Build the case statement.
7245   // Case statements are always rebuilt so that they will attached to their
7246   // transformed switch statement.
7247   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7248                                                        LHS.get(),
7249                                                        S->getEllipsisLoc(),
7250                                                        RHS.get(),
7251                                                        S->getColonLoc());
7252   if (Case.isInvalid())
7253     return StmtError();
7254 
7255   // Transform the statement following the case
7256   StmtResult SubStmt =
7257       getDerived().TransformStmt(S->getSubStmt());
7258   if (SubStmt.isInvalid())
7259     return StmtError();
7260 
7261   // Attach the body to the case statement
7262   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7263 }
7264 
7265 template <typename Derived>
7266 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7267   // Transform the statement following the default case
7268   StmtResult SubStmt =
7269       getDerived().TransformStmt(S->getSubStmt());
7270   if (SubStmt.isInvalid())
7271     return StmtError();
7272 
7273   // Default statements are always rebuilt
7274   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7275                                          SubStmt.get());
7276 }
7277 
7278 template<typename Derived>
7279 StmtResult
7280 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7281   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7282   if (SubStmt.isInvalid())
7283     return StmtError();
7284 
7285   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7286                                         S->getDecl());
7287   if (!LD)
7288     return StmtError();
7289 
7290   // If we're transforming "in-place" (we're not creating new local
7291   // declarations), assume we're replacing the old label statement
7292   // and clear out the reference to it.
7293   if (LD == S->getDecl())
7294     S->getDecl()->setStmt(nullptr);
7295 
7296   // FIXME: Pass the real colon location in.
7297   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7298                                        cast<LabelDecl>(LD), SourceLocation(),
7299                                        SubStmt.get());
7300 }
7301 
7302 template <typename Derived>
7303 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7304   if (!R)
7305     return R;
7306 
7307   switch (R->getKind()) {
7308 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7309 #define ATTR(X)
7310 #define PRAGMA_SPELLING_ATTR(X)                                                \
7311   case attr::X:                                                                \
7312     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7313 #include "clang/Basic/AttrList.inc"
7314   default:
7315     return R;
7316   }
7317 }
7318 
7319 template <typename Derived>
7320 StmtResult
7321 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7322                                                 StmtDiscardKind SDK) {
7323   bool AttrsChanged = false;
7324   SmallVector<const Attr *, 1> Attrs;
7325 
7326   // Visit attributes and keep track if any are transformed.
7327   for (const auto *I : S->getAttrs()) {
7328     const Attr *R = getDerived().TransformAttr(I);
7329     AttrsChanged |= (I != R);
7330     if (R)
7331       Attrs.push_back(R);
7332   }
7333 
7334   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7335   if (SubStmt.isInvalid())
7336     return StmtError();
7337 
7338   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7339     return S;
7340 
7341   // If transforming the attributes failed for all of the attributes in the
7342   // statement, don't make an AttributedStmt without attributes.
7343   if (Attrs.empty())
7344     return SubStmt;
7345 
7346   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7347                                             SubStmt.get());
7348 }
7349 
7350 template<typename Derived>
7351 StmtResult
7352 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7353   // Transform the initialization statement
7354   StmtResult Init = getDerived().TransformStmt(S->getInit());
7355   if (Init.isInvalid())
7356     return StmtError();
7357 
7358   // Transform the condition
7359   Sema::ConditionResult Cond = getDerived().TransformCondition(
7360       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7361       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7362                        : Sema::ConditionKind::Boolean);
7363   if (Cond.isInvalid())
7364     return StmtError();
7365 
7366   // If this is a constexpr if, determine which arm we should instantiate.
7367   llvm::Optional<bool> ConstexprConditionValue;
7368   if (S->isConstexpr())
7369     ConstexprConditionValue = Cond.getKnownValue();
7370 
7371   // Transform the "then" branch.
7372   StmtResult Then;
7373   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7374     Then = getDerived().TransformStmt(S->getThen());
7375     if (Then.isInvalid())
7376       return StmtError();
7377   } else {
7378     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7379   }
7380 
7381   // Transform the "else" branch.
7382   StmtResult Else;
7383   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7384     Else = getDerived().TransformStmt(S->getElse());
7385     if (Else.isInvalid())
7386       return StmtError();
7387   }
7388 
7389   if (!getDerived().AlwaysRebuild() &&
7390       Init.get() == S->getInit() &&
7391       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7392       Then.get() == S->getThen() &&
7393       Else.get() == S->getElse())
7394     return S;
7395 
7396   return getDerived().RebuildIfStmt(
7397       S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond,
7398       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7399 }
7400 
7401 template<typename Derived>
7402 StmtResult
7403 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7404   // Transform the initialization statement
7405   StmtResult Init = getDerived().TransformStmt(S->getInit());
7406   if (Init.isInvalid())
7407     return StmtError();
7408 
7409   // Transform the condition.
7410   Sema::ConditionResult Cond = getDerived().TransformCondition(
7411       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7412       Sema::ConditionKind::Switch);
7413   if (Cond.isInvalid())
7414     return StmtError();
7415 
7416   // Rebuild the switch statement.
7417   StmtResult Switch =
7418       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7419                                           Init.get(), Cond, S->getRParenLoc());
7420   if (Switch.isInvalid())
7421     return StmtError();
7422 
7423   // Transform the body of the switch statement.
7424   StmtResult Body = getDerived().TransformStmt(S->getBody());
7425   if (Body.isInvalid())
7426     return StmtError();
7427 
7428   // Complete the switch statement.
7429   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7430                                             Body.get());
7431 }
7432 
7433 template<typename Derived>
7434 StmtResult
7435 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7436   // Transform the condition
7437   Sema::ConditionResult Cond = getDerived().TransformCondition(
7438       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7439       Sema::ConditionKind::Boolean);
7440   if (Cond.isInvalid())
7441     return StmtError();
7442 
7443   // Transform the body
7444   StmtResult Body = getDerived().TransformStmt(S->getBody());
7445   if (Body.isInvalid())
7446     return StmtError();
7447 
7448   if (!getDerived().AlwaysRebuild() &&
7449       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7450       Body.get() == S->getBody())
7451     return Owned(S);
7452 
7453   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7454                                        Cond, S->getRParenLoc(), Body.get());
7455 }
7456 
7457 template<typename Derived>
7458 StmtResult
7459 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7460   // Transform the body
7461   StmtResult Body = getDerived().TransformStmt(S->getBody());
7462   if (Body.isInvalid())
7463     return StmtError();
7464 
7465   // Transform the condition
7466   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7467   if (Cond.isInvalid())
7468     return StmtError();
7469 
7470   if (!getDerived().AlwaysRebuild() &&
7471       Cond.get() == S->getCond() &&
7472       Body.get() == S->getBody())
7473     return S;
7474 
7475   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7476                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7477                                     S->getRParenLoc());
7478 }
7479 
7480 template<typename Derived>
7481 StmtResult
7482 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7483   if (getSema().getLangOpts().OpenMP)
7484     getSema().startOpenMPLoop();
7485 
7486   // Transform the initialization statement
7487   StmtResult Init = getDerived().TransformStmt(S->getInit());
7488   if (Init.isInvalid())
7489     return StmtError();
7490 
7491   // In OpenMP loop region loop control variable must be captured and be
7492   // private. Perform analysis of first part (if any).
7493   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7494     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7495 
7496   // Transform the condition
7497   Sema::ConditionResult Cond = getDerived().TransformCondition(
7498       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7499       Sema::ConditionKind::Boolean);
7500   if (Cond.isInvalid())
7501     return StmtError();
7502 
7503   // Transform the increment
7504   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7505   if (Inc.isInvalid())
7506     return StmtError();
7507 
7508   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7509   if (S->getInc() && !FullInc.get())
7510     return StmtError();
7511 
7512   // Transform the body
7513   StmtResult Body = getDerived().TransformStmt(S->getBody());
7514   if (Body.isInvalid())
7515     return StmtError();
7516 
7517   if (!getDerived().AlwaysRebuild() &&
7518       Init.get() == S->getInit() &&
7519       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7520       Inc.get() == S->getInc() &&
7521       Body.get() == S->getBody())
7522     return S;
7523 
7524   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7525                                      Init.get(), Cond, FullInc,
7526                                      S->getRParenLoc(), Body.get());
7527 }
7528 
7529 template<typename Derived>
7530 StmtResult
7531 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7532   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7533                                         S->getLabel());
7534   if (!LD)
7535     return StmtError();
7536 
7537   // Goto statements must always be rebuilt, to resolve the label.
7538   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7539                                       cast<LabelDecl>(LD));
7540 }
7541 
7542 template<typename Derived>
7543 StmtResult
7544 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7545   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7546   if (Target.isInvalid())
7547     return StmtError();
7548   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7549 
7550   if (!getDerived().AlwaysRebuild() &&
7551       Target.get() == S->getTarget())
7552     return S;
7553 
7554   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7555                                               Target.get());
7556 }
7557 
7558 template<typename Derived>
7559 StmtResult
7560 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7561   return S;
7562 }
7563 
7564 template<typename Derived>
7565 StmtResult
7566 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7567   return S;
7568 }
7569 
7570 template<typename Derived>
7571 StmtResult
7572 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7573   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7574                                                         /*NotCopyInit*/false);
7575   if (Result.isInvalid())
7576     return StmtError();
7577 
7578   // FIXME: We always rebuild the return statement because there is no way
7579   // to tell whether the return type of the function has changed.
7580   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7581 }
7582 
7583 template<typename Derived>
7584 StmtResult
7585 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7586   bool DeclChanged = false;
7587   SmallVector<Decl *, 4> Decls;
7588   for (auto *D : S->decls()) {
7589     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7590     if (!Transformed)
7591       return StmtError();
7592 
7593     if (Transformed != D)
7594       DeclChanged = true;
7595 
7596     Decls.push_back(Transformed);
7597   }
7598 
7599   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7600     return S;
7601 
7602   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7603 }
7604 
7605 template<typename Derived>
7606 StmtResult
7607 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7608 
7609   SmallVector<Expr*, 8> Constraints;
7610   SmallVector<Expr*, 8> Exprs;
7611   SmallVector<IdentifierInfo *, 4> Names;
7612 
7613   ExprResult AsmString;
7614   SmallVector<Expr*, 8> Clobbers;
7615 
7616   bool ExprsChanged = false;
7617 
7618   // Go through the outputs.
7619   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7620     Names.push_back(S->getOutputIdentifier(I));
7621 
7622     // No need to transform the constraint literal.
7623     Constraints.push_back(S->getOutputConstraintLiteral(I));
7624 
7625     // Transform the output expr.
7626     Expr *OutputExpr = S->getOutputExpr(I);
7627     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7628     if (Result.isInvalid())
7629       return StmtError();
7630 
7631     ExprsChanged |= Result.get() != OutputExpr;
7632 
7633     Exprs.push_back(Result.get());
7634   }
7635 
7636   // Go through the inputs.
7637   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7638     Names.push_back(S->getInputIdentifier(I));
7639 
7640     // No need to transform the constraint literal.
7641     Constraints.push_back(S->getInputConstraintLiteral(I));
7642 
7643     // Transform the input expr.
7644     Expr *InputExpr = S->getInputExpr(I);
7645     ExprResult Result = getDerived().TransformExpr(InputExpr);
7646     if (Result.isInvalid())
7647       return StmtError();
7648 
7649     ExprsChanged |= Result.get() != InputExpr;
7650 
7651     Exprs.push_back(Result.get());
7652   }
7653 
7654   // Go through the Labels.
7655   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7656     Names.push_back(S->getLabelIdentifier(I));
7657 
7658     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7659     if (Result.isInvalid())
7660       return StmtError();
7661     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7662     Exprs.push_back(Result.get());
7663   }
7664   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7665     return S;
7666 
7667   // Go through the clobbers.
7668   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7669     Clobbers.push_back(S->getClobberStringLiteral(I));
7670 
7671   // No need to transform the asm string literal.
7672   AsmString = S->getAsmString();
7673   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7674                                         S->isVolatile(), S->getNumOutputs(),
7675                                         S->getNumInputs(), Names.data(),
7676                                         Constraints, Exprs, AsmString.get(),
7677                                         Clobbers, S->getNumLabels(),
7678                                         S->getRParenLoc());
7679 }
7680 
7681 template<typename Derived>
7682 StmtResult
7683 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7684   ArrayRef<Token> AsmToks =
7685     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7686 
7687   bool HadError = false, HadChange = false;
7688 
7689   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7690   SmallVector<Expr*, 8> TransformedExprs;
7691   TransformedExprs.reserve(SrcExprs.size());
7692   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7693     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7694     if (!Result.isUsable()) {
7695       HadError = true;
7696     } else {
7697       HadChange |= (Result.get() != SrcExprs[i]);
7698       TransformedExprs.push_back(Result.get());
7699     }
7700   }
7701 
7702   if (HadError) return StmtError();
7703   if (!HadChange && !getDerived().AlwaysRebuild())
7704     return Owned(S);
7705 
7706   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7707                                        AsmToks, S->getAsmString(),
7708                                        S->getNumOutputs(), S->getNumInputs(),
7709                                        S->getAllConstraints(), S->getClobbers(),
7710                                        TransformedExprs, S->getEndLoc());
7711 }
7712 
7713 // C++ Coroutines TS
7714 
7715 template<typename Derived>
7716 StmtResult
7717 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7718   auto *ScopeInfo = SemaRef.getCurFunction();
7719   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7720   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7721          ScopeInfo->NeedsCoroutineSuspends &&
7722          ScopeInfo->CoroutineSuspends.first == nullptr &&
7723          ScopeInfo->CoroutineSuspends.second == nullptr &&
7724          "expected clean scope info");
7725 
7726   // Set that we have (possibly-invalid) suspend points before we do anything
7727   // that may fail.
7728   ScopeInfo->setNeedsCoroutineSuspends(false);
7729 
7730   // We re-build the coroutine promise object (and the coroutine parameters its
7731   // type and constructor depend on) based on the types used in our current
7732   // function. We must do so, and set it on the current FunctionScopeInfo,
7733   // before attempting to transform the other parts of the coroutine body
7734   // statement, such as the implicit suspend statements (because those
7735   // statements reference the FunctionScopeInfo::CoroutinePromise).
7736   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7737     return StmtError();
7738   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7739   if (!Promise)
7740     return StmtError();
7741   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7742   ScopeInfo->CoroutinePromise = Promise;
7743 
7744   // Transform the implicit coroutine statements constructed using dependent
7745   // types during the previous parse: initial and final suspensions, the return
7746   // object, and others. We also transform the coroutine function's body.
7747   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7748   if (InitSuspend.isInvalid())
7749     return StmtError();
7750   StmtResult FinalSuspend =
7751       getDerived().TransformStmt(S->getFinalSuspendStmt());
7752   if (FinalSuspend.isInvalid() ||
7753       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7754     return StmtError();
7755   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7756   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7757 
7758   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7759   if (BodyRes.isInvalid())
7760     return StmtError();
7761 
7762   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7763   if (Builder.isInvalid())
7764     return StmtError();
7765 
7766   Expr *ReturnObject = S->getReturnValueInit();
7767   assert(ReturnObject && "the return object is expected to be valid");
7768   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7769                                                      /*NoCopyInit*/ false);
7770   if (Res.isInvalid())
7771     return StmtError();
7772   Builder.ReturnValue = Res.get();
7773 
7774   // If during the previous parse the coroutine still had a dependent promise
7775   // statement, we may need to build some implicit coroutine statements
7776   // (such as exception and fallthrough handlers) for the first time.
7777   if (S->hasDependentPromiseType()) {
7778     // We can only build these statements, however, if the current promise type
7779     // is not dependent.
7780     if (!Promise->getType()->isDependentType()) {
7781       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7782              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7783              "these nodes should not have been built yet");
7784       if (!Builder.buildDependentStatements())
7785         return StmtError();
7786     }
7787   } else {
7788     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7789       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7790       if (Res.isInvalid())
7791         return StmtError();
7792       Builder.OnFallthrough = Res.get();
7793     }
7794 
7795     if (auto *OnException = S->getExceptionHandler()) {
7796       StmtResult Res = getDerived().TransformStmt(OnException);
7797       if (Res.isInvalid())
7798         return StmtError();
7799       Builder.OnException = Res.get();
7800     }
7801 
7802     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7803       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7804       if (Res.isInvalid())
7805         return StmtError();
7806       Builder.ReturnStmtOnAllocFailure = Res.get();
7807     }
7808 
7809     // Transform any additional statements we may have already built
7810     assert(S->getAllocate() && S->getDeallocate() &&
7811            "allocation and deallocation calls must already be built");
7812     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7813     if (AllocRes.isInvalid())
7814       return StmtError();
7815     Builder.Allocate = AllocRes.get();
7816 
7817     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7818     if (DeallocRes.isInvalid())
7819       return StmtError();
7820     Builder.Deallocate = DeallocRes.get();
7821 
7822     assert(S->getResultDecl() && "ResultDecl must already be built");
7823     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7824     if (ResultDecl.isInvalid())
7825       return StmtError();
7826     Builder.ResultDecl = ResultDecl.get();
7827 
7828     if (auto *ReturnStmt = S->getReturnStmt()) {
7829       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7830       if (Res.isInvalid())
7831         return StmtError();
7832       Builder.ReturnStmt = Res.get();
7833     }
7834   }
7835 
7836   return getDerived().RebuildCoroutineBodyStmt(Builder);
7837 }
7838 
7839 template<typename Derived>
7840 StmtResult
7841 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7842   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7843                                                         /*NotCopyInit*/false);
7844   if (Result.isInvalid())
7845     return StmtError();
7846 
7847   // Always rebuild; we don't know if this needs to be injected into a new
7848   // context or if the promise type has changed.
7849   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7850                                           S->isImplicit());
7851 }
7852 
7853 template<typename Derived>
7854 ExprResult
7855 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7856   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7857                                                         /*NotCopyInit*/false);
7858   if (Result.isInvalid())
7859     return ExprError();
7860 
7861   // Always rebuild; we don't know if this needs to be injected into a new
7862   // context or if the promise type has changed.
7863   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7864                                          E->isImplicit());
7865 }
7866 
7867 template <typename Derived>
7868 ExprResult
7869 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7870   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7871                                                         /*NotCopyInit*/ false);
7872   if (OperandResult.isInvalid())
7873     return ExprError();
7874 
7875   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7876           E->getOperatorCoawaitLookup());
7877 
7878   if (LookupResult.isInvalid())
7879     return ExprError();
7880 
7881   // Always rebuild; we don't know if this needs to be injected into a new
7882   // context or if the promise type has changed.
7883   return getDerived().RebuildDependentCoawaitExpr(
7884       E->getKeywordLoc(), OperandResult.get(),
7885       cast<UnresolvedLookupExpr>(LookupResult.get()));
7886 }
7887 
7888 template<typename Derived>
7889 ExprResult
7890 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7891   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7892                                                         /*NotCopyInit*/false);
7893   if (Result.isInvalid())
7894     return ExprError();
7895 
7896   // Always rebuild; we don't know if this needs to be injected into a new
7897   // context or if the promise type has changed.
7898   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7899 }
7900 
7901 // Objective-C Statements.
7902 
7903 template<typename Derived>
7904 StmtResult
7905 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7906   // Transform the body of the @try.
7907   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7908   if (TryBody.isInvalid())
7909     return StmtError();
7910 
7911   // Transform the @catch statements (if present).
7912   bool AnyCatchChanged = false;
7913   SmallVector<Stmt*, 8> CatchStmts;
7914   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7915     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7916     if (Catch.isInvalid())
7917       return StmtError();
7918     if (Catch.get() != S->getCatchStmt(I))
7919       AnyCatchChanged = true;
7920     CatchStmts.push_back(Catch.get());
7921   }
7922 
7923   // Transform the @finally statement (if present).
7924   StmtResult Finally;
7925   if (S->getFinallyStmt()) {
7926     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7927     if (Finally.isInvalid())
7928       return StmtError();
7929   }
7930 
7931   // If nothing changed, just retain this statement.
7932   if (!getDerived().AlwaysRebuild() &&
7933       TryBody.get() == S->getTryBody() &&
7934       !AnyCatchChanged &&
7935       Finally.get() == S->getFinallyStmt())
7936     return S;
7937 
7938   // Build a new statement.
7939   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7940                                            CatchStmts, Finally.get());
7941 }
7942 
7943 template<typename Derived>
7944 StmtResult
7945 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7946   // Transform the @catch parameter, if there is one.
7947   VarDecl *Var = nullptr;
7948   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7949     TypeSourceInfo *TSInfo = nullptr;
7950     if (FromVar->getTypeSourceInfo()) {
7951       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7952       if (!TSInfo)
7953         return StmtError();
7954     }
7955 
7956     QualType T;
7957     if (TSInfo)
7958       T = TSInfo->getType();
7959     else {
7960       T = getDerived().TransformType(FromVar->getType());
7961       if (T.isNull())
7962         return StmtError();
7963     }
7964 
7965     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7966     if (!Var)
7967       return StmtError();
7968   }
7969 
7970   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7971   if (Body.isInvalid())
7972     return StmtError();
7973 
7974   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7975                                              S->getRParenLoc(),
7976                                              Var, Body.get());
7977 }
7978 
7979 template<typename Derived>
7980 StmtResult
7981 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7982   // Transform the body.
7983   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7984   if (Body.isInvalid())
7985     return StmtError();
7986 
7987   // If nothing changed, just retain this statement.
7988   if (!getDerived().AlwaysRebuild() &&
7989       Body.get() == S->getFinallyBody())
7990     return S;
7991 
7992   // Build a new statement.
7993   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7994                                                Body.get());
7995 }
7996 
7997 template<typename Derived>
7998 StmtResult
7999 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8000   ExprResult Operand;
8001   if (S->getThrowExpr()) {
8002     Operand = getDerived().TransformExpr(S->getThrowExpr());
8003     if (Operand.isInvalid())
8004       return StmtError();
8005   }
8006 
8007   if (!getDerived().AlwaysRebuild() &&
8008       Operand.get() == S->getThrowExpr())
8009     return S;
8010 
8011   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8012 }
8013 
8014 template<typename Derived>
8015 StmtResult
8016 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8017                                                   ObjCAtSynchronizedStmt *S) {
8018   // Transform the object we are locking.
8019   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8020   if (Object.isInvalid())
8021     return StmtError();
8022   Object =
8023     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8024                                                   Object.get());
8025   if (Object.isInvalid())
8026     return StmtError();
8027 
8028   // Transform the body.
8029   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8030   if (Body.isInvalid())
8031     return StmtError();
8032 
8033   // If nothing change, just retain the current statement.
8034   if (!getDerived().AlwaysRebuild() &&
8035       Object.get() == S->getSynchExpr() &&
8036       Body.get() == S->getSynchBody())
8037     return S;
8038 
8039   // Build a new statement.
8040   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8041                                                     Object.get(), Body.get());
8042 }
8043 
8044 template<typename Derived>
8045 StmtResult
8046 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8047                                               ObjCAutoreleasePoolStmt *S) {
8048   // Transform the body.
8049   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8050   if (Body.isInvalid())
8051     return StmtError();
8052 
8053   // If nothing changed, just retain this statement.
8054   if (!getDerived().AlwaysRebuild() &&
8055       Body.get() == S->getSubStmt())
8056     return S;
8057 
8058   // Build a new statement.
8059   return getDerived().RebuildObjCAutoreleasePoolStmt(
8060                         S->getAtLoc(), Body.get());
8061 }
8062 
8063 template<typename Derived>
8064 StmtResult
8065 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8066                                                   ObjCForCollectionStmt *S) {
8067   // Transform the element statement.
8068   StmtResult Element =
8069       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8070   if (Element.isInvalid())
8071     return StmtError();
8072 
8073   // Transform the collection expression.
8074   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8075   if (Collection.isInvalid())
8076     return StmtError();
8077 
8078   // Transform the body.
8079   StmtResult Body = getDerived().TransformStmt(S->getBody());
8080   if (Body.isInvalid())
8081     return StmtError();
8082 
8083   // If nothing changed, just retain this statement.
8084   if (!getDerived().AlwaysRebuild() &&
8085       Element.get() == S->getElement() &&
8086       Collection.get() == S->getCollection() &&
8087       Body.get() == S->getBody())
8088     return S;
8089 
8090   // Build a new statement.
8091   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8092                                                    Element.get(),
8093                                                    Collection.get(),
8094                                                    S->getRParenLoc(),
8095                                                    Body.get());
8096 }
8097 
8098 template <typename Derived>
8099 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8100   // Transform the exception declaration, if any.
8101   VarDecl *Var = nullptr;
8102   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8103     TypeSourceInfo *T =
8104         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8105     if (!T)
8106       return StmtError();
8107 
8108     Var = getDerived().RebuildExceptionDecl(
8109         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8110         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8111     if (!Var || Var->isInvalidDecl())
8112       return StmtError();
8113   }
8114 
8115   // Transform the actual exception handler.
8116   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8117   if (Handler.isInvalid())
8118     return StmtError();
8119 
8120   if (!getDerived().AlwaysRebuild() && !Var &&
8121       Handler.get() == S->getHandlerBlock())
8122     return S;
8123 
8124   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8125 }
8126 
8127 template <typename Derived>
8128 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8129   // Transform the try block itself.
8130   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8131   if (TryBlock.isInvalid())
8132     return StmtError();
8133 
8134   // Transform the handlers.
8135   bool HandlerChanged = false;
8136   SmallVector<Stmt *, 8> Handlers;
8137   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8138     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8139     if (Handler.isInvalid())
8140       return StmtError();
8141 
8142     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8143     Handlers.push_back(Handler.getAs<Stmt>());
8144   }
8145 
8146   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8147       !HandlerChanged)
8148     return S;
8149 
8150   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8151                                         Handlers);
8152 }
8153 
8154 template<typename Derived>
8155 StmtResult
8156 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8157   StmtResult Init =
8158       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8159   if (Init.isInvalid())
8160     return StmtError();
8161 
8162   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8163   if (Range.isInvalid())
8164     return StmtError();
8165 
8166   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8167   if (Begin.isInvalid())
8168     return StmtError();
8169   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8170   if (End.isInvalid())
8171     return StmtError();
8172 
8173   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8174   if (Cond.isInvalid())
8175     return StmtError();
8176   if (Cond.get())
8177     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8178   if (Cond.isInvalid())
8179     return StmtError();
8180   if (Cond.get())
8181     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8182 
8183   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8184   if (Inc.isInvalid())
8185     return StmtError();
8186   if (Inc.get())
8187     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8188 
8189   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8190   if (LoopVar.isInvalid())
8191     return StmtError();
8192 
8193   StmtResult NewStmt = S;
8194   if (getDerived().AlwaysRebuild() ||
8195       Init.get() != S->getInit() ||
8196       Range.get() != S->getRangeStmt() ||
8197       Begin.get() != S->getBeginStmt() ||
8198       End.get() != S->getEndStmt() ||
8199       Cond.get() != S->getCond() ||
8200       Inc.get() != S->getInc() ||
8201       LoopVar.get() != S->getLoopVarStmt()) {
8202     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8203                                                   S->getCoawaitLoc(), Init.get(),
8204                                                   S->getColonLoc(), Range.get(),
8205                                                   Begin.get(), End.get(),
8206                                                   Cond.get(),
8207                                                   Inc.get(), LoopVar.get(),
8208                                                   S->getRParenLoc());
8209     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8210       // Might not have attached any initializer to the loop variable.
8211       getSema().ActOnInitializerError(
8212           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8213       return StmtError();
8214     }
8215   }
8216 
8217   StmtResult Body = getDerived().TransformStmt(S->getBody());
8218   if (Body.isInvalid())
8219     return StmtError();
8220 
8221   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8222   // it now so we have a new statement to attach the body to.
8223   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8224     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8225                                                   S->getCoawaitLoc(), Init.get(),
8226                                                   S->getColonLoc(), Range.get(),
8227                                                   Begin.get(), End.get(),
8228                                                   Cond.get(),
8229                                                   Inc.get(), LoopVar.get(),
8230                                                   S->getRParenLoc());
8231     if (NewStmt.isInvalid())
8232       return StmtError();
8233   }
8234 
8235   if (NewStmt.get() == S)
8236     return S;
8237 
8238   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8239 }
8240 
8241 template<typename Derived>
8242 StmtResult
8243 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8244                                                     MSDependentExistsStmt *S) {
8245   // Transform the nested-name-specifier, if any.
8246   NestedNameSpecifierLoc QualifierLoc;
8247   if (S->getQualifierLoc()) {
8248     QualifierLoc
8249       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8250     if (!QualifierLoc)
8251       return StmtError();
8252   }
8253 
8254   // Transform the declaration name.
8255   DeclarationNameInfo NameInfo = S->getNameInfo();
8256   if (NameInfo.getName()) {
8257     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8258     if (!NameInfo.getName())
8259       return StmtError();
8260   }
8261 
8262   // Check whether anything changed.
8263   if (!getDerived().AlwaysRebuild() &&
8264       QualifierLoc == S->getQualifierLoc() &&
8265       NameInfo.getName() == S->getNameInfo().getName())
8266     return S;
8267 
8268   // Determine whether this name exists, if we can.
8269   CXXScopeSpec SS;
8270   SS.Adopt(QualifierLoc);
8271   bool Dependent = false;
8272   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8273   case Sema::IER_Exists:
8274     if (S->isIfExists())
8275       break;
8276 
8277     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8278 
8279   case Sema::IER_DoesNotExist:
8280     if (S->isIfNotExists())
8281       break;
8282 
8283     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8284 
8285   case Sema::IER_Dependent:
8286     Dependent = true;
8287     break;
8288 
8289   case Sema::IER_Error:
8290     return StmtError();
8291   }
8292 
8293   // We need to continue with the instantiation, so do so now.
8294   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8295   if (SubStmt.isInvalid())
8296     return StmtError();
8297 
8298   // If we have resolved the name, just transform to the substatement.
8299   if (!Dependent)
8300     return SubStmt;
8301 
8302   // The name is still dependent, so build a dependent expression again.
8303   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8304                                                    S->isIfExists(),
8305                                                    QualifierLoc,
8306                                                    NameInfo,
8307                                                    SubStmt.get());
8308 }
8309 
8310 template<typename Derived>
8311 ExprResult
8312 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8313   NestedNameSpecifierLoc QualifierLoc;
8314   if (E->getQualifierLoc()) {
8315     QualifierLoc
8316     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8317     if (!QualifierLoc)
8318       return ExprError();
8319   }
8320 
8321   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8322     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8323   if (!PD)
8324     return ExprError();
8325 
8326   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8327   if (Base.isInvalid())
8328     return ExprError();
8329 
8330   return new (SemaRef.getASTContext())
8331       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8332                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8333                         QualifierLoc, E->getMemberLoc());
8334 }
8335 
8336 template <typename Derived>
8337 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8338     MSPropertySubscriptExpr *E) {
8339   auto BaseRes = getDerived().TransformExpr(E->getBase());
8340   if (BaseRes.isInvalid())
8341     return ExprError();
8342   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8343   if (IdxRes.isInvalid())
8344     return ExprError();
8345 
8346   if (!getDerived().AlwaysRebuild() &&
8347       BaseRes.get() == E->getBase() &&
8348       IdxRes.get() == E->getIdx())
8349     return E;
8350 
8351   return getDerived().RebuildArraySubscriptExpr(
8352       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8353 }
8354 
8355 template <typename Derived>
8356 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8357   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8358   if (TryBlock.isInvalid())
8359     return StmtError();
8360 
8361   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8362   if (Handler.isInvalid())
8363     return StmtError();
8364 
8365   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8366       Handler.get() == S->getHandler())
8367     return S;
8368 
8369   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8370                                         TryBlock.get(), Handler.get());
8371 }
8372 
8373 template <typename Derived>
8374 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8375   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8376   if (Block.isInvalid())
8377     return StmtError();
8378 
8379   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8380 }
8381 
8382 template <typename Derived>
8383 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8384   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8385   if (FilterExpr.isInvalid())
8386     return StmtError();
8387 
8388   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8389   if (Block.isInvalid())
8390     return StmtError();
8391 
8392   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8393                                            Block.get());
8394 }
8395 
8396 template <typename Derived>
8397 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8398   if (isa<SEHFinallyStmt>(Handler))
8399     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8400   else
8401     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8402 }
8403 
8404 template<typename Derived>
8405 StmtResult
8406 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8407   return S;
8408 }
8409 
8410 //===----------------------------------------------------------------------===//
8411 // OpenMP directive transformation
8412 //===----------------------------------------------------------------------===//
8413 
8414 template <typename Derived>
8415 StmtResult
8416 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8417   // OMPCanonicalLoops are eliminated during transformation, since they will be
8418   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8419   // after transformation.
8420   return getDerived().TransformStmt(L->getLoopStmt());
8421 }
8422 
8423 template <typename Derived>
8424 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8425     OMPExecutableDirective *D) {
8426 
8427   // Transform the clauses
8428   llvm::SmallVector<OMPClause *, 16> TClauses;
8429   ArrayRef<OMPClause *> Clauses = D->clauses();
8430   TClauses.reserve(Clauses.size());
8431   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8432        I != E; ++I) {
8433     if (*I) {
8434       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8435       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8436       getDerived().getSema().EndOpenMPClause();
8437       if (Clause)
8438         TClauses.push_back(Clause);
8439     } else {
8440       TClauses.push_back(nullptr);
8441     }
8442   }
8443   StmtResult AssociatedStmt;
8444   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8445     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8446                                                   /*CurScope=*/nullptr);
8447     StmtResult Body;
8448     {
8449       Sema::CompoundScopeRAII CompoundScope(getSema());
8450       Stmt *CS;
8451       if (D->getDirectiveKind() == OMPD_atomic ||
8452           D->getDirectiveKind() == OMPD_critical ||
8453           D->getDirectiveKind() == OMPD_section ||
8454           D->getDirectiveKind() == OMPD_master)
8455         CS = D->getAssociatedStmt();
8456       else
8457         CS = D->getRawStmt();
8458       Body = getDerived().TransformStmt(CS);
8459       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8460           getSema().getLangOpts().OpenMPIRBuilder)
8461         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8462     }
8463     AssociatedStmt =
8464         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8465     if (AssociatedStmt.isInvalid()) {
8466       return StmtError();
8467     }
8468   }
8469   if (TClauses.size() != Clauses.size()) {
8470     return StmtError();
8471   }
8472 
8473   // Transform directive name for 'omp critical' directive.
8474   DeclarationNameInfo DirName;
8475   if (D->getDirectiveKind() == OMPD_critical) {
8476     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8477     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8478   }
8479   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8480   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8481     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8482   } else if (D->getDirectiveKind() == OMPD_cancel) {
8483     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8484   }
8485 
8486   return getDerived().RebuildOMPExecutableDirective(
8487       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8488       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8489 }
8490 
8491 template <typename Derived>
8492 StmtResult
8493 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8494   DeclarationNameInfo DirName;
8495   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8496                                              D->getBeginLoc());
8497   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8498   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8499   return Res;
8500 }
8501 
8502 template <typename Derived>
8503 StmtResult
8504 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8505   DeclarationNameInfo DirName;
8506   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8507                                              D->getBeginLoc());
8508   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8509   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8510   return Res;
8511 }
8512 
8513 template <typename Derived>
8514 StmtResult
8515 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8516   DeclarationNameInfo DirName;
8517   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8518                                              nullptr, D->getBeginLoc());
8519   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8520   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8521   return Res;
8522 }
8523 
8524 template <typename Derived>
8525 StmtResult
8526 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8527   DeclarationNameInfo DirName;
8528   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8529                                              D->getBeginLoc());
8530   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8531   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8532   return Res;
8533 }
8534 
8535 template <typename Derived>
8536 StmtResult
8537 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8538   DeclarationNameInfo DirName;
8539   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8540                                              D->getBeginLoc());
8541   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8542   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8543   return Res;
8544 }
8545 
8546 template <typename Derived>
8547 StmtResult
8548 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8549   DeclarationNameInfo DirName;
8550   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8551                                              D->getBeginLoc());
8552   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8553   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8554   return Res;
8555 }
8556 
8557 template <typename Derived>
8558 StmtResult
8559 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8560   DeclarationNameInfo DirName;
8561   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8562                                              D->getBeginLoc());
8563   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8564   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8565   return Res;
8566 }
8567 
8568 template <typename Derived>
8569 StmtResult
8570 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8571   DeclarationNameInfo DirName;
8572   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8573                                              D->getBeginLoc());
8574   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8575   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8576   return Res;
8577 }
8578 
8579 template <typename Derived>
8580 StmtResult
8581 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8582   DeclarationNameInfo DirName;
8583   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8584                                              D->getBeginLoc());
8585   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8586   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8587   return Res;
8588 }
8589 
8590 template <typename Derived>
8591 StmtResult
8592 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8593   getDerived().getSema().StartOpenMPDSABlock(
8594       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8595   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8596   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8597   return Res;
8598 }
8599 
8600 template <typename Derived>
8601 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8602     OMPParallelForDirective *D) {
8603   DeclarationNameInfo DirName;
8604   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8605                                              nullptr, D->getBeginLoc());
8606   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8607   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8608   return Res;
8609 }
8610 
8611 template <typename Derived>
8612 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8613     OMPParallelForSimdDirective *D) {
8614   DeclarationNameInfo DirName;
8615   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8616                                              nullptr, D->getBeginLoc());
8617   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8618   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8619   return Res;
8620 }
8621 
8622 template <typename Derived>
8623 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8624     OMPParallelMasterDirective *D) {
8625   DeclarationNameInfo DirName;
8626   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8627                                              nullptr, D->getBeginLoc());
8628   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8629   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8630   return Res;
8631 }
8632 
8633 template <typename Derived>
8634 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8635     OMPParallelSectionsDirective *D) {
8636   DeclarationNameInfo DirName;
8637   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8638                                              nullptr, D->getBeginLoc());
8639   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8640   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8641   return Res;
8642 }
8643 
8644 template <typename Derived>
8645 StmtResult
8646 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8647   DeclarationNameInfo DirName;
8648   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8649                                              D->getBeginLoc());
8650   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8651   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8652   return Res;
8653 }
8654 
8655 template <typename Derived>
8656 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8657     OMPTaskyieldDirective *D) {
8658   DeclarationNameInfo DirName;
8659   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8660                                              D->getBeginLoc());
8661   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8662   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8663   return Res;
8664 }
8665 
8666 template <typename Derived>
8667 StmtResult
8668 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8669   DeclarationNameInfo DirName;
8670   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8671                                              D->getBeginLoc());
8672   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8673   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8674   return Res;
8675 }
8676 
8677 template <typename Derived>
8678 StmtResult
8679 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8680   DeclarationNameInfo DirName;
8681   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8682                                              D->getBeginLoc());
8683   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8684   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8685   return Res;
8686 }
8687 
8688 template <typename Derived>
8689 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8690     OMPTaskgroupDirective *D) {
8691   DeclarationNameInfo DirName;
8692   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8693                                              D->getBeginLoc());
8694   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8695   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8696   return Res;
8697 }
8698 
8699 template <typename Derived>
8700 StmtResult
8701 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8702   DeclarationNameInfo DirName;
8703   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8704                                              D->getBeginLoc());
8705   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8706   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8707   return Res;
8708 }
8709 
8710 template <typename Derived>
8711 StmtResult
8712 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8713   DeclarationNameInfo DirName;
8714   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8715                                              D->getBeginLoc());
8716   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8717   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8718   return Res;
8719 }
8720 
8721 template <typename Derived>
8722 StmtResult
8723 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8724   DeclarationNameInfo DirName;
8725   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8726                                              D->getBeginLoc());
8727   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8728   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8729   return Res;
8730 }
8731 
8732 template <typename Derived>
8733 StmtResult
8734 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8735   DeclarationNameInfo DirName;
8736   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8737                                              D->getBeginLoc());
8738   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8739   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8740   return Res;
8741 }
8742 
8743 template <typename Derived>
8744 StmtResult
8745 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8746   DeclarationNameInfo DirName;
8747   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8748                                              D->getBeginLoc());
8749   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8750   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8751   return Res;
8752 }
8753 
8754 template <typename Derived>
8755 StmtResult
8756 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8757   DeclarationNameInfo DirName;
8758   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8759                                              D->getBeginLoc());
8760   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8761   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8762   return Res;
8763 }
8764 
8765 template <typename Derived>
8766 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8767     OMPTargetDataDirective *D) {
8768   DeclarationNameInfo DirName;
8769   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8770                                              D->getBeginLoc());
8771   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8772   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8773   return Res;
8774 }
8775 
8776 template <typename Derived>
8777 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8778     OMPTargetEnterDataDirective *D) {
8779   DeclarationNameInfo DirName;
8780   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8781                                              nullptr, D->getBeginLoc());
8782   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8783   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8784   return Res;
8785 }
8786 
8787 template <typename Derived>
8788 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8789     OMPTargetExitDataDirective *D) {
8790   DeclarationNameInfo DirName;
8791   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8792                                              nullptr, D->getBeginLoc());
8793   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8794   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8795   return Res;
8796 }
8797 
8798 template <typename Derived>
8799 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8800     OMPTargetParallelDirective *D) {
8801   DeclarationNameInfo DirName;
8802   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8803                                              nullptr, D->getBeginLoc());
8804   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8805   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8806   return Res;
8807 }
8808 
8809 template <typename Derived>
8810 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8811     OMPTargetParallelForDirective *D) {
8812   DeclarationNameInfo DirName;
8813   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8814                                              nullptr, D->getBeginLoc());
8815   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8816   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8817   return Res;
8818 }
8819 
8820 template <typename Derived>
8821 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8822     OMPTargetUpdateDirective *D) {
8823   DeclarationNameInfo DirName;
8824   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8825                                              nullptr, D->getBeginLoc());
8826   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8827   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8828   return Res;
8829 }
8830 
8831 template <typename Derived>
8832 StmtResult
8833 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8834   DeclarationNameInfo DirName;
8835   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8836                                              D->getBeginLoc());
8837   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8838   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8839   return Res;
8840 }
8841 
8842 template <typename Derived>
8843 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8844     OMPCancellationPointDirective *D) {
8845   DeclarationNameInfo DirName;
8846   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8847                                              nullptr, D->getBeginLoc());
8848   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8849   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8850   return Res;
8851 }
8852 
8853 template <typename Derived>
8854 StmtResult
8855 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8856   DeclarationNameInfo DirName;
8857   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8858                                              D->getBeginLoc());
8859   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8860   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8861   return Res;
8862 }
8863 
8864 template <typename Derived>
8865 StmtResult
8866 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8867   DeclarationNameInfo DirName;
8868   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8869                                              D->getBeginLoc());
8870   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8871   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8872   return Res;
8873 }
8874 
8875 template <typename Derived>
8876 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8877     OMPTaskLoopSimdDirective *D) {
8878   DeclarationNameInfo DirName;
8879   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8880                                              nullptr, D->getBeginLoc());
8881   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8882   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8883   return Res;
8884 }
8885 
8886 template <typename Derived>
8887 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8888     OMPMasterTaskLoopDirective *D) {
8889   DeclarationNameInfo DirName;
8890   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8891                                              nullptr, D->getBeginLoc());
8892   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8893   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8894   return Res;
8895 }
8896 
8897 template <typename Derived>
8898 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8899     OMPMasterTaskLoopSimdDirective *D) {
8900   DeclarationNameInfo DirName;
8901   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8902                                              nullptr, D->getBeginLoc());
8903   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8904   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8905   return Res;
8906 }
8907 
8908 template <typename Derived>
8909 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8910     OMPParallelMasterTaskLoopDirective *D) {
8911   DeclarationNameInfo DirName;
8912   getDerived().getSema().StartOpenMPDSABlock(
8913       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8914   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8915   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8916   return Res;
8917 }
8918 
8919 template <typename Derived>
8920 StmtResult
8921 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8922     OMPParallelMasterTaskLoopSimdDirective *D) {
8923   DeclarationNameInfo DirName;
8924   getDerived().getSema().StartOpenMPDSABlock(
8925       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8926   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8927   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8928   return Res;
8929 }
8930 
8931 template <typename Derived>
8932 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8933     OMPDistributeDirective *D) {
8934   DeclarationNameInfo DirName;
8935   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8936                                              D->getBeginLoc());
8937   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8938   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8939   return Res;
8940 }
8941 
8942 template <typename Derived>
8943 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8944     OMPDistributeParallelForDirective *D) {
8945   DeclarationNameInfo DirName;
8946   getDerived().getSema().StartOpenMPDSABlock(
8947       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8948   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8949   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8950   return Res;
8951 }
8952 
8953 template <typename Derived>
8954 StmtResult
8955 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8956     OMPDistributeParallelForSimdDirective *D) {
8957   DeclarationNameInfo DirName;
8958   getDerived().getSema().StartOpenMPDSABlock(
8959       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8960   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8961   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8962   return Res;
8963 }
8964 
8965 template <typename Derived>
8966 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8967     OMPDistributeSimdDirective *D) {
8968   DeclarationNameInfo DirName;
8969   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8970                                              nullptr, D->getBeginLoc());
8971   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8972   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8973   return Res;
8974 }
8975 
8976 template <typename Derived>
8977 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8978     OMPTargetParallelForSimdDirective *D) {
8979   DeclarationNameInfo DirName;
8980   getDerived().getSema().StartOpenMPDSABlock(
8981       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8982   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8983   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8984   return Res;
8985 }
8986 
8987 template <typename Derived>
8988 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8989     OMPTargetSimdDirective *D) {
8990   DeclarationNameInfo DirName;
8991   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8992                                              D->getBeginLoc());
8993   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8994   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8995   return Res;
8996 }
8997 
8998 template <typename Derived>
8999 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9000     OMPTeamsDistributeDirective *D) {
9001   DeclarationNameInfo DirName;
9002   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9003                                              nullptr, D->getBeginLoc());
9004   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9005   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9006   return Res;
9007 }
9008 
9009 template <typename Derived>
9010 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9011     OMPTeamsDistributeSimdDirective *D) {
9012   DeclarationNameInfo DirName;
9013   getDerived().getSema().StartOpenMPDSABlock(
9014       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9015   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9016   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9017   return Res;
9018 }
9019 
9020 template <typename Derived>
9021 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9022     OMPTeamsDistributeParallelForSimdDirective *D) {
9023   DeclarationNameInfo DirName;
9024   getDerived().getSema().StartOpenMPDSABlock(
9025       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9026       D->getBeginLoc());
9027   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9028   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9029   return Res;
9030 }
9031 
9032 template <typename Derived>
9033 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9034     OMPTeamsDistributeParallelForDirective *D) {
9035   DeclarationNameInfo DirName;
9036   getDerived().getSema().StartOpenMPDSABlock(
9037       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9038   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9039   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9040   return Res;
9041 }
9042 
9043 template <typename Derived>
9044 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9045     OMPTargetTeamsDirective *D) {
9046   DeclarationNameInfo DirName;
9047   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9048                                              nullptr, D->getBeginLoc());
9049   auto Res = getDerived().TransformOMPExecutableDirective(D);
9050   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9051   return Res;
9052 }
9053 
9054 template <typename Derived>
9055 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9056     OMPTargetTeamsDistributeDirective *D) {
9057   DeclarationNameInfo DirName;
9058   getDerived().getSema().StartOpenMPDSABlock(
9059       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9060   auto Res = getDerived().TransformOMPExecutableDirective(D);
9061   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9062   return Res;
9063 }
9064 
9065 template <typename Derived>
9066 StmtResult
9067 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9068     OMPTargetTeamsDistributeParallelForDirective *D) {
9069   DeclarationNameInfo DirName;
9070   getDerived().getSema().StartOpenMPDSABlock(
9071       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9072       D->getBeginLoc());
9073   auto Res = getDerived().TransformOMPExecutableDirective(D);
9074   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9075   return Res;
9076 }
9077 
9078 template <typename Derived>
9079 StmtResult TreeTransform<Derived>::
9080     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9081         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9082   DeclarationNameInfo DirName;
9083   getDerived().getSema().StartOpenMPDSABlock(
9084       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9085       D->getBeginLoc());
9086   auto Res = getDerived().TransformOMPExecutableDirective(D);
9087   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9088   return Res;
9089 }
9090 
9091 template <typename Derived>
9092 StmtResult
9093 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9094     OMPTargetTeamsDistributeSimdDirective *D) {
9095   DeclarationNameInfo DirName;
9096   getDerived().getSema().StartOpenMPDSABlock(
9097       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9098   auto Res = getDerived().TransformOMPExecutableDirective(D);
9099   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9100   return Res;
9101 }
9102 
9103 template <typename Derived>
9104 StmtResult
9105 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9106   DeclarationNameInfo DirName;
9107   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9108                                              D->getBeginLoc());
9109   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9110   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9111   return Res;
9112 }
9113 
9114 template <typename Derived>
9115 StmtResult
9116 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9117   DeclarationNameInfo DirName;
9118   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9119                                              D->getBeginLoc());
9120   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9121   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9122   return Res;
9123 }
9124 
9125 template <typename Derived>
9126 StmtResult
9127 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9128   DeclarationNameInfo DirName;
9129   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9130                                              D->getBeginLoc());
9131   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9132   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9133   return Res;
9134 }
9135 
9136 //===----------------------------------------------------------------------===//
9137 // OpenMP clause transformation
9138 //===----------------------------------------------------------------------===//
9139 template <typename Derived>
9140 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9141   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9142   if (Cond.isInvalid())
9143     return nullptr;
9144   return getDerived().RebuildOMPIfClause(
9145       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9146       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9147 }
9148 
9149 template <typename Derived>
9150 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9151   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9152   if (Cond.isInvalid())
9153     return nullptr;
9154   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9155                                             C->getLParenLoc(), C->getEndLoc());
9156 }
9157 
9158 template <typename Derived>
9159 OMPClause *
9160 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9161   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9162   if (NumThreads.isInvalid())
9163     return nullptr;
9164   return getDerived().RebuildOMPNumThreadsClause(
9165       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9166 }
9167 
9168 template <typename Derived>
9169 OMPClause *
9170 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9171   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9172   if (E.isInvalid())
9173     return nullptr;
9174   return getDerived().RebuildOMPSafelenClause(
9175       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9176 }
9177 
9178 template <typename Derived>
9179 OMPClause *
9180 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9181   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9182   if (E.isInvalid())
9183     return nullptr;
9184   return getDerived().RebuildOMPAllocatorClause(
9185       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9186 }
9187 
9188 template <typename Derived>
9189 OMPClause *
9190 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9191   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9192   if (E.isInvalid())
9193     return nullptr;
9194   return getDerived().RebuildOMPSimdlenClause(
9195       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9196 }
9197 
9198 template <typename Derived>
9199 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9200   SmallVector<Expr *, 4> TransformedSizes;
9201   TransformedSizes.reserve(C->getNumSizes());
9202   bool Changed = false;
9203   for (Expr *E : C->getSizesRefs()) {
9204     if (!E) {
9205       TransformedSizes.push_back(nullptr);
9206       continue;
9207     }
9208 
9209     ExprResult T = getDerived().TransformExpr(E);
9210     if (T.isInvalid())
9211       return nullptr;
9212     if (E != T.get())
9213       Changed = true;
9214     TransformedSizes.push_back(T.get());
9215   }
9216 
9217   if (!Changed && !getDerived().AlwaysRebuild())
9218     return C;
9219   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9220                                C->getLParenLoc(), C->getEndLoc());
9221 }
9222 
9223 template <typename Derived>
9224 OMPClause *
9225 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9226   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9227   if (E.isInvalid())
9228     return nullptr;
9229   return getDerived().RebuildOMPCollapseClause(
9230       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9231 }
9232 
9233 template <typename Derived>
9234 OMPClause *
9235 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9236   return getDerived().RebuildOMPDefaultClause(
9237       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9238       C->getLParenLoc(), C->getEndLoc());
9239 }
9240 
9241 template <typename Derived>
9242 OMPClause *
9243 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9244   return getDerived().RebuildOMPProcBindClause(
9245       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9246       C->getLParenLoc(), C->getEndLoc());
9247 }
9248 
9249 template <typename Derived>
9250 OMPClause *
9251 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9252   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9253   if (E.isInvalid())
9254     return nullptr;
9255   return getDerived().RebuildOMPScheduleClause(
9256       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9257       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9258       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9259       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9260 }
9261 
9262 template <typename Derived>
9263 OMPClause *
9264 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9265   ExprResult E;
9266   if (auto *Num = C->getNumForLoops()) {
9267     E = getDerived().TransformExpr(Num);
9268     if (E.isInvalid())
9269       return nullptr;
9270   }
9271   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9272                                               C->getLParenLoc(), E.get());
9273 }
9274 
9275 template <typename Derived>
9276 OMPClause *
9277 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9278   ExprResult E;
9279   if (Expr *Evt = C->getEventHandler()) {
9280     E = getDerived().TransformExpr(Evt);
9281     if (E.isInvalid())
9282       return nullptr;
9283   }
9284   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9285                                              C->getLParenLoc(), C->getEndLoc());
9286 }
9287 
9288 template <typename Derived>
9289 OMPClause *
9290 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9291   // No need to rebuild this clause, no template-dependent parameters.
9292   return C;
9293 }
9294 
9295 template <typename Derived>
9296 OMPClause *
9297 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9298   // No need to rebuild this clause, no template-dependent parameters.
9299   return C;
9300 }
9301 
9302 template <typename Derived>
9303 OMPClause *
9304 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9305   // No need to rebuild this clause, no template-dependent parameters.
9306   return C;
9307 }
9308 
9309 template <typename Derived>
9310 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9311   // No need to rebuild this clause, no template-dependent parameters.
9312   return C;
9313 }
9314 
9315 template <typename Derived>
9316 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9317   // No need to rebuild this clause, no template-dependent parameters.
9318   return C;
9319 }
9320 
9321 template <typename Derived>
9322 OMPClause *
9323 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9324   // No need to rebuild this clause, no template-dependent parameters.
9325   return C;
9326 }
9327 
9328 template <typename Derived>
9329 OMPClause *
9330 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9331   // No need to rebuild this clause, no template-dependent parameters.
9332   return C;
9333 }
9334 
9335 template <typename Derived>
9336 OMPClause *
9337 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9338   // No need to rebuild this clause, no template-dependent parameters.
9339   return C;
9340 }
9341 
9342 template <typename Derived>
9343 OMPClause *
9344 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9345   // No need to rebuild this clause, no template-dependent parameters.
9346   return C;
9347 }
9348 
9349 template <typename Derived>
9350 OMPClause *
9351 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9352   // No need to rebuild this clause, no template-dependent parameters.
9353   return C;
9354 }
9355 
9356 template <typename Derived>
9357 OMPClause *
9358 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9359   // No need to rebuild this clause, no template-dependent parameters.
9360   return C;
9361 }
9362 
9363 template <typename Derived>
9364 OMPClause *
9365 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9366   // No need to rebuild this clause, no template-dependent parameters.
9367   return C;
9368 }
9369 
9370 template <typename Derived>
9371 OMPClause *
9372 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9373   // No need to rebuild this clause, no template-dependent parameters.
9374   return C;
9375 }
9376 
9377 template <typename Derived>
9378 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9379   // No need to rebuild this clause, no template-dependent parameters.
9380   return C;
9381 }
9382 
9383 template <typename Derived>
9384 OMPClause *
9385 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9386   // No need to rebuild this clause, no template-dependent parameters.
9387   return C;
9388 }
9389 
9390 template <typename Derived>
9391 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9392   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9393   if (IVR.isInvalid())
9394     return nullptr;
9395 
9396   llvm::SmallVector<Expr *, 8> PrefExprs;
9397   PrefExprs.reserve(C->varlist_size() - 1);
9398   for (Expr *E : llvm::drop_begin(C->varlists())) {
9399     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9400     if (ER.isInvalid())
9401       return nullptr;
9402     PrefExprs.push_back(ER.get());
9403   }
9404   return getDerived().RebuildOMPInitClause(
9405       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9406       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9407 }
9408 
9409 template <typename Derived>
9410 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9411   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9412   if (ER.isInvalid())
9413     return nullptr;
9414   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9415                                           C->getLParenLoc(), C->getVarLoc(),
9416                                           C->getEndLoc());
9417 }
9418 
9419 template <typename Derived>
9420 OMPClause *
9421 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9422   ExprResult ER;
9423   if (Expr *IV = C->getInteropVar()) {
9424     ER = getDerived().TransformExpr(IV);
9425     if (ER.isInvalid())
9426       return nullptr;
9427   }
9428   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9429                                               C->getLParenLoc(), C->getVarLoc(),
9430                                               C->getEndLoc());
9431 }
9432 
9433 template <typename Derived>
9434 OMPClause *
9435 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9436   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9437   if (Cond.isInvalid())
9438     return nullptr;
9439   return getDerived().RebuildOMPNovariantsClause(
9440       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9441 }
9442 
9443 template <typename Derived>
9444 OMPClause *
9445 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9446   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9447   if (Cond.isInvalid())
9448     return nullptr;
9449   return getDerived().RebuildOMPNocontextClause(
9450       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9451 }
9452 
9453 template <typename Derived>
9454 OMPClause *
9455 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9456   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9457   if (ThreadID.isInvalid())
9458     return nullptr;
9459   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9460                                              C->getLParenLoc(), C->getEndLoc());
9461 }
9462 
9463 template <typename Derived>
9464 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9465     OMPUnifiedAddressClause *C) {
9466   llvm_unreachable("unified_address clause cannot appear in dependent context");
9467 }
9468 
9469 template <typename Derived>
9470 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9471     OMPUnifiedSharedMemoryClause *C) {
9472   llvm_unreachable(
9473       "unified_shared_memory clause cannot appear in dependent context");
9474 }
9475 
9476 template <typename Derived>
9477 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9478     OMPReverseOffloadClause *C) {
9479   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9480 }
9481 
9482 template <typename Derived>
9483 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9484     OMPDynamicAllocatorsClause *C) {
9485   llvm_unreachable(
9486       "dynamic_allocators clause cannot appear in dependent context");
9487 }
9488 
9489 template <typename Derived>
9490 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9491     OMPAtomicDefaultMemOrderClause *C) {
9492   llvm_unreachable(
9493       "atomic_default_mem_order clause cannot appear in dependent context");
9494 }
9495 
9496 template <typename Derived>
9497 OMPClause *
9498 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9499   llvm::SmallVector<Expr *, 16> Vars;
9500   Vars.reserve(C->varlist_size());
9501   for (auto *VE : C->varlists()) {
9502     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9503     if (EVar.isInvalid())
9504       return nullptr;
9505     Vars.push_back(EVar.get());
9506   }
9507   return getDerived().RebuildOMPPrivateClause(
9508       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9509 }
9510 
9511 template <typename Derived>
9512 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9513     OMPFirstprivateClause *C) {
9514   llvm::SmallVector<Expr *, 16> Vars;
9515   Vars.reserve(C->varlist_size());
9516   for (auto *VE : C->varlists()) {
9517     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9518     if (EVar.isInvalid())
9519       return nullptr;
9520     Vars.push_back(EVar.get());
9521   }
9522   return getDerived().RebuildOMPFirstprivateClause(
9523       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9524 }
9525 
9526 template <typename Derived>
9527 OMPClause *
9528 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9529   llvm::SmallVector<Expr *, 16> Vars;
9530   Vars.reserve(C->varlist_size());
9531   for (auto *VE : C->varlists()) {
9532     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9533     if (EVar.isInvalid())
9534       return nullptr;
9535     Vars.push_back(EVar.get());
9536   }
9537   return getDerived().RebuildOMPLastprivateClause(
9538       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9539       C->getLParenLoc(), C->getEndLoc());
9540 }
9541 
9542 template <typename Derived>
9543 OMPClause *
9544 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9545   llvm::SmallVector<Expr *, 16> Vars;
9546   Vars.reserve(C->varlist_size());
9547   for (auto *VE : C->varlists()) {
9548     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9549     if (EVar.isInvalid())
9550       return nullptr;
9551     Vars.push_back(EVar.get());
9552   }
9553   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9554                                              C->getLParenLoc(), C->getEndLoc());
9555 }
9556 
9557 template <typename Derived>
9558 OMPClause *
9559 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9560   llvm::SmallVector<Expr *, 16> Vars;
9561   Vars.reserve(C->varlist_size());
9562   for (auto *VE : C->varlists()) {
9563     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9564     if (EVar.isInvalid())
9565       return nullptr;
9566     Vars.push_back(EVar.get());
9567   }
9568   CXXScopeSpec ReductionIdScopeSpec;
9569   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9570 
9571   DeclarationNameInfo NameInfo = C->getNameInfo();
9572   if (NameInfo.getName()) {
9573     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9574     if (!NameInfo.getName())
9575       return nullptr;
9576   }
9577   // Build a list of all UDR decls with the same names ranged by the Scopes.
9578   // The Scope boundary is a duplication of the previous decl.
9579   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9580   for (auto *E : C->reduction_ops()) {
9581     // Transform all the decls.
9582     if (E) {
9583       auto *ULE = cast<UnresolvedLookupExpr>(E);
9584       UnresolvedSet<8> Decls;
9585       for (auto *D : ULE->decls()) {
9586         NamedDecl *InstD =
9587             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9588         Decls.addDecl(InstD, InstD->getAccess());
9589       }
9590       UnresolvedReductions.push_back(
9591        UnresolvedLookupExpr::Create(
9592           SemaRef.Context, /*NamingClass=*/nullptr,
9593           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9594           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9595           Decls.begin(), Decls.end()));
9596     } else
9597       UnresolvedReductions.push_back(nullptr);
9598   }
9599   return getDerived().RebuildOMPReductionClause(
9600       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9601       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9602       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9603 }
9604 
9605 template <typename Derived>
9606 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9607     OMPTaskReductionClause *C) {
9608   llvm::SmallVector<Expr *, 16> Vars;
9609   Vars.reserve(C->varlist_size());
9610   for (auto *VE : C->varlists()) {
9611     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9612     if (EVar.isInvalid())
9613       return nullptr;
9614     Vars.push_back(EVar.get());
9615   }
9616   CXXScopeSpec ReductionIdScopeSpec;
9617   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9618 
9619   DeclarationNameInfo NameInfo = C->getNameInfo();
9620   if (NameInfo.getName()) {
9621     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9622     if (!NameInfo.getName())
9623       return nullptr;
9624   }
9625   // Build a list of all UDR decls with the same names ranged by the Scopes.
9626   // The Scope boundary is a duplication of the previous decl.
9627   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9628   for (auto *E : C->reduction_ops()) {
9629     // Transform all the decls.
9630     if (E) {
9631       auto *ULE = cast<UnresolvedLookupExpr>(E);
9632       UnresolvedSet<8> Decls;
9633       for (auto *D : ULE->decls()) {
9634         NamedDecl *InstD =
9635             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9636         Decls.addDecl(InstD, InstD->getAccess());
9637       }
9638       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9639           SemaRef.Context, /*NamingClass=*/nullptr,
9640           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9641           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9642     } else
9643       UnresolvedReductions.push_back(nullptr);
9644   }
9645   return getDerived().RebuildOMPTaskReductionClause(
9646       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9647       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9648 }
9649 
9650 template <typename Derived>
9651 OMPClause *
9652 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9653   llvm::SmallVector<Expr *, 16> Vars;
9654   Vars.reserve(C->varlist_size());
9655   for (auto *VE : C->varlists()) {
9656     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9657     if (EVar.isInvalid())
9658       return nullptr;
9659     Vars.push_back(EVar.get());
9660   }
9661   CXXScopeSpec ReductionIdScopeSpec;
9662   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9663 
9664   DeclarationNameInfo NameInfo = C->getNameInfo();
9665   if (NameInfo.getName()) {
9666     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9667     if (!NameInfo.getName())
9668       return nullptr;
9669   }
9670   // Build a list of all UDR decls with the same names ranged by the Scopes.
9671   // The Scope boundary is a duplication of the previous decl.
9672   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9673   for (auto *E : C->reduction_ops()) {
9674     // Transform all the decls.
9675     if (E) {
9676       auto *ULE = cast<UnresolvedLookupExpr>(E);
9677       UnresolvedSet<8> Decls;
9678       for (auto *D : ULE->decls()) {
9679         NamedDecl *InstD =
9680             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9681         Decls.addDecl(InstD, InstD->getAccess());
9682       }
9683       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9684           SemaRef.Context, /*NamingClass=*/nullptr,
9685           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9686           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9687     } else
9688       UnresolvedReductions.push_back(nullptr);
9689   }
9690   return getDerived().RebuildOMPInReductionClause(
9691       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9692       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9693 }
9694 
9695 template <typename Derived>
9696 OMPClause *
9697 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9698   llvm::SmallVector<Expr *, 16> Vars;
9699   Vars.reserve(C->varlist_size());
9700   for (auto *VE : C->varlists()) {
9701     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9702     if (EVar.isInvalid())
9703       return nullptr;
9704     Vars.push_back(EVar.get());
9705   }
9706   ExprResult Step = getDerived().TransformExpr(C->getStep());
9707   if (Step.isInvalid())
9708     return nullptr;
9709   return getDerived().RebuildOMPLinearClause(
9710       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9711       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9712 }
9713 
9714 template <typename Derived>
9715 OMPClause *
9716 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9717   llvm::SmallVector<Expr *, 16> Vars;
9718   Vars.reserve(C->varlist_size());
9719   for (auto *VE : C->varlists()) {
9720     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9721     if (EVar.isInvalid())
9722       return nullptr;
9723     Vars.push_back(EVar.get());
9724   }
9725   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9726   if (Alignment.isInvalid())
9727     return nullptr;
9728   return getDerived().RebuildOMPAlignedClause(
9729       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9730       C->getColonLoc(), C->getEndLoc());
9731 }
9732 
9733 template <typename Derived>
9734 OMPClause *
9735 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9736   llvm::SmallVector<Expr *, 16> Vars;
9737   Vars.reserve(C->varlist_size());
9738   for (auto *VE : C->varlists()) {
9739     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9740     if (EVar.isInvalid())
9741       return nullptr;
9742     Vars.push_back(EVar.get());
9743   }
9744   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9745                                              C->getLParenLoc(), C->getEndLoc());
9746 }
9747 
9748 template <typename Derived>
9749 OMPClause *
9750 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9751   llvm::SmallVector<Expr *, 16> Vars;
9752   Vars.reserve(C->varlist_size());
9753   for (auto *VE : C->varlists()) {
9754     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9755     if (EVar.isInvalid())
9756       return nullptr;
9757     Vars.push_back(EVar.get());
9758   }
9759   return getDerived().RebuildOMPCopyprivateClause(
9760       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9761 }
9762 
9763 template <typename Derived>
9764 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9765   llvm::SmallVector<Expr *, 16> Vars;
9766   Vars.reserve(C->varlist_size());
9767   for (auto *VE : C->varlists()) {
9768     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9769     if (EVar.isInvalid())
9770       return nullptr;
9771     Vars.push_back(EVar.get());
9772   }
9773   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9774                                             C->getLParenLoc(), C->getEndLoc());
9775 }
9776 
9777 template <typename Derived>
9778 OMPClause *
9779 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9780   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9781   if (E.isInvalid())
9782     return nullptr;
9783   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9784                                              C->getLParenLoc(), C->getEndLoc());
9785 }
9786 
9787 template <typename Derived>
9788 OMPClause *
9789 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9790   llvm::SmallVector<Expr *, 16> Vars;
9791   Expr *DepModifier = C->getModifier();
9792   if (DepModifier) {
9793     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9794     if (DepModRes.isInvalid())
9795       return nullptr;
9796     DepModifier = DepModRes.get();
9797   }
9798   Vars.reserve(C->varlist_size());
9799   for (auto *VE : C->varlists()) {
9800     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9801     if (EVar.isInvalid())
9802       return nullptr;
9803     Vars.push_back(EVar.get());
9804   }
9805   return getDerived().RebuildOMPDependClause(
9806       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9807       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9808       C->getEndLoc());
9809 }
9810 
9811 template <typename Derived>
9812 OMPClause *
9813 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9814   ExprResult E = getDerived().TransformExpr(C->getDevice());
9815   if (E.isInvalid())
9816     return nullptr;
9817   return getDerived().RebuildOMPDeviceClause(
9818       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9819       C->getModifierLoc(), C->getEndLoc());
9820 }
9821 
9822 template <typename Derived, class T>
9823 bool transformOMPMappableExprListClause(
9824     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9825     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9826     DeclarationNameInfo &MapperIdInfo,
9827     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9828   // Transform expressions in the list.
9829   Vars.reserve(C->varlist_size());
9830   for (auto *VE : C->varlists()) {
9831     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9832     if (EVar.isInvalid())
9833       return true;
9834     Vars.push_back(EVar.get());
9835   }
9836   // Transform mapper scope specifier and identifier.
9837   NestedNameSpecifierLoc QualifierLoc;
9838   if (C->getMapperQualifierLoc()) {
9839     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9840         C->getMapperQualifierLoc());
9841     if (!QualifierLoc)
9842       return true;
9843   }
9844   MapperIdScopeSpec.Adopt(QualifierLoc);
9845   MapperIdInfo = C->getMapperIdInfo();
9846   if (MapperIdInfo.getName()) {
9847     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9848     if (!MapperIdInfo.getName())
9849       return true;
9850   }
9851   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9852   // the previous user-defined mapper lookup in dependent environment.
9853   for (auto *E : C->mapperlists()) {
9854     // Transform all the decls.
9855     if (E) {
9856       auto *ULE = cast<UnresolvedLookupExpr>(E);
9857       UnresolvedSet<8> Decls;
9858       for (auto *D : ULE->decls()) {
9859         NamedDecl *InstD =
9860             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9861         Decls.addDecl(InstD, InstD->getAccess());
9862       }
9863       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9864           TT.getSema().Context, /*NamingClass=*/nullptr,
9865           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9866           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9867           Decls.end()));
9868     } else {
9869       UnresolvedMappers.push_back(nullptr);
9870     }
9871   }
9872   return false;
9873 }
9874 
9875 template <typename Derived>
9876 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9877   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9878   llvm::SmallVector<Expr *, 16> Vars;
9879   CXXScopeSpec MapperIdScopeSpec;
9880   DeclarationNameInfo MapperIdInfo;
9881   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9882   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9883           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9884     return nullptr;
9885   return getDerived().RebuildOMPMapClause(
9886       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9887       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9888       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9889 }
9890 
9891 template <typename Derived>
9892 OMPClause *
9893 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9894   Expr *Allocator = C->getAllocator();
9895   if (Allocator) {
9896     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9897     if (AllocatorRes.isInvalid())
9898       return nullptr;
9899     Allocator = AllocatorRes.get();
9900   }
9901   llvm::SmallVector<Expr *, 16> Vars;
9902   Vars.reserve(C->varlist_size());
9903   for (auto *VE : C->varlists()) {
9904     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9905     if (EVar.isInvalid())
9906       return nullptr;
9907     Vars.push_back(EVar.get());
9908   }
9909   return getDerived().RebuildOMPAllocateClause(
9910       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9911       C->getEndLoc());
9912 }
9913 
9914 template <typename Derived>
9915 OMPClause *
9916 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9917   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9918   if (E.isInvalid())
9919     return nullptr;
9920   return getDerived().RebuildOMPNumTeamsClause(
9921       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9922 }
9923 
9924 template <typename Derived>
9925 OMPClause *
9926 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9927   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9928   if (E.isInvalid())
9929     return nullptr;
9930   return getDerived().RebuildOMPThreadLimitClause(
9931       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9932 }
9933 
9934 template <typename Derived>
9935 OMPClause *
9936 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9937   ExprResult E = getDerived().TransformExpr(C->getPriority());
9938   if (E.isInvalid())
9939     return nullptr;
9940   return getDerived().RebuildOMPPriorityClause(
9941       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9942 }
9943 
9944 template <typename Derived>
9945 OMPClause *
9946 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9947   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9948   if (E.isInvalid())
9949     return nullptr;
9950   return getDerived().RebuildOMPGrainsizeClause(
9951       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9952 }
9953 
9954 template <typename Derived>
9955 OMPClause *
9956 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9957   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9958   if (E.isInvalid())
9959     return nullptr;
9960   return getDerived().RebuildOMPNumTasksClause(
9961       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9962 }
9963 
9964 template <typename Derived>
9965 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9966   ExprResult E = getDerived().TransformExpr(C->getHint());
9967   if (E.isInvalid())
9968     return nullptr;
9969   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9970                                            C->getLParenLoc(), C->getEndLoc());
9971 }
9972 
9973 template <typename Derived>
9974 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9975     OMPDistScheduleClause *C) {
9976   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9977   if (E.isInvalid())
9978     return nullptr;
9979   return getDerived().RebuildOMPDistScheduleClause(
9980       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9981       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9982 }
9983 
9984 template <typename Derived>
9985 OMPClause *
9986 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9987   // Rebuild Defaultmap Clause since we need to invoke the checking of
9988   // defaultmap(none:variable-category) after template initialization.
9989   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9990                                                  C->getDefaultmapKind(),
9991                                                  C->getBeginLoc(),
9992                                                  C->getLParenLoc(),
9993                                                  C->getDefaultmapModifierLoc(),
9994                                                  C->getDefaultmapKindLoc(),
9995                                                  C->getEndLoc());
9996 }
9997 
9998 template <typename Derived>
9999 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10000   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10001   llvm::SmallVector<Expr *, 16> Vars;
10002   CXXScopeSpec MapperIdScopeSpec;
10003   DeclarationNameInfo MapperIdInfo;
10004   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10005   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10006           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10007     return nullptr;
10008   return getDerived().RebuildOMPToClause(
10009       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10010       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10011 }
10012 
10013 template <typename Derived>
10014 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10015   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10016   llvm::SmallVector<Expr *, 16> Vars;
10017   CXXScopeSpec MapperIdScopeSpec;
10018   DeclarationNameInfo MapperIdInfo;
10019   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10020   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10021           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10022     return nullptr;
10023   return getDerived().RebuildOMPFromClause(
10024       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10025       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10026 }
10027 
10028 template <typename Derived>
10029 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10030     OMPUseDevicePtrClause *C) {
10031   llvm::SmallVector<Expr *, 16> Vars;
10032   Vars.reserve(C->varlist_size());
10033   for (auto *VE : C->varlists()) {
10034     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10035     if (EVar.isInvalid())
10036       return nullptr;
10037     Vars.push_back(EVar.get());
10038   }
10039   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10040   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10041 }
10042 
10043 template <typename Derived>
10044 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10045     OMPUseDeviceAddrClause *C) {
10046   llvm::SmallVector<Expr *, 16> Vars;
10047   Vars.reserve(C->varlist_size());
10048   for (auto *VE : C->varlists()) {
10049     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10050     if (EVar.isInvalid())
10051       return nullptr;
10052     Vars.push_back(EVar.get());
10053   }
10054   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10055   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10056 }
10057 
10058 template <typename Derived>
10059 OMPClause *
10060 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10061   llvm::SmallVector<Expr *, 16> Vars;
10062   Vars.reserve(C->varlist_size());
10063   for (auto *VE : C->varlists()) {
10064     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10065     if (EVar.isInvalid())
10066       return nullptr;
10067     Vars.push_back(EVar.get());
10068   }
10069   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10070   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10071 }
10072 
10073 template <typename Derived>
10074 OMPClause *
10075 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10076   llvm::SmallVector<Expr *, 16> Vars;
10077   Vars.reserve(C->varlist_size());
10078   for (auto *VE : C->varlists()) {
10079     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10080     if (EVar.isInvalid())
10081       return nullptr;
10082     Vars.push_back(EVar.get());
10083   }
10084   return getDerived().RebuildOMPNontemporalClause(
10085       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10086 }
10087 
10088 template <typename Derived>
10089 OMPClause *
10090 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10091   llvm::SmallVector<Expr *, 16> Vars;
10092   Vars.reserve(C->varlist_size());
10093   for (auto *VE : C->varlists()) {
10094     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10095     if (EVar.isInvalid())
10096       return nullptr;
10097     Vars.push_back(EVar.get());
10098   }
10099   return getDerived().RebuildOMPInclusiveClause(
10100       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10101 }
10102 
10103 template <typename Derived>
10104 OMPClause *
10105 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10106   llvm::SmallVector<Expr *, 16> Vars;
10107   Vars.reserve(C->varlist_size());
10108   for (auto *VE : C->varlists()) {
10109     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10110     if (EVar.isInvalid())
10111       return nullptr;
10112     Vars.push_back(EVar.get());
10113   }
10114   return getDerived().RebuildOMPExclusiveClause(
10115       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10116 }
10117 
10118 template <typename Derived>
10119 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10120     OMPUsesAllocatorsClause *C) {
10121   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10122   Data.reserve(C->getNumberOfAllocators());
10123   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10124     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10125     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10126     if (Allocator.isInvalid())
10127       continue;
10128     ExprResult AllocatorTraits;
10129     if (Expr *AT = D.AllocatorTraits) {
10130       AllocatorTraits = getDerived().TransformExpr(AT);
10131       if (AllocatorTraits.isInvalid())
10132         continue;
10133     }
10134     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10135     NewD.Allocator = Allocator.get();
10136     NewD.AllocatorTraits = AllocatorTraits.get();
10137     NewD.LParenLoc = D.LParenLoc;
10138     NewD.RParenLoc = D.RParenLoc;
10139   }
10140   return getDerived().RebuildOMPUsesAllocatorsClause(
10141       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10142 }
10143 
10144 template <typename Derived>
10145 OMPClause *
10146 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10147   SmallVector<Expr *, 4> Locators;
10148   Locators.reserve(C->varlist_size());
10149   ExprResult ModifierRes;
10150   if (Expr *Modifier = C->getModifier()) {
10151     ModifierRes = getDerived().TransformExpr(Modifier);
10152     if (ModifierRes.isInvalid())
10153       return nullptr;
10154   }
10155   for (Expr *E : C->varlists()) {
10156     ExprResult Locator = getDerived().TransformExpr(E);
10157     if (Locator.isInvalid())
10158       continue;
10159     Locators.push_back(Locator.get());
10160   }
10161   return getDerived().RebuildOMPAffinityClause(
10162       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10163       ModifierRes.get(), Locators);
10164 }
10165 
10166 template <typename Derived>
10167 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10168   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10169                                             C->getBeginLoc(), C->getLParenLoc(),
10170                                             C->getEndLoc());
10171 }
10172 
10173 //===----------------------------------------------------------------------===//
10174 // Expression transformation
10175 //===----------------------------------------------------------------------===//
10176 template<typename Derived>
10177 ExprResult
10178 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10179   return TransformExpr(E->getSubExpr());
10180 }
10181 
10182 template <typename Derived>
10183 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10184     SYCLUniqueStableNameExpr *E) {
10185   if (!E->isTypeDependent())
10186     return E;
10187 
10188   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10189 
10190   if (!NewT)
10191     return ExprError();
10192 
10193   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10194     return E;
10195 
10196   return getDerived().RebuildSYCLUniqueStableNameExpr(
10197       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10198 }
10199 
10200 template<typename Derived>
10201 ExprResult
10202 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10203   if (!E->isTypeDependent())
10204     return E;
10205 
10206   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10207                                             E->getIdentKind());
10208 }
10209 
10210 template<typename Derived>
10211 ExprResult
10212 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10213   NestedNameSpecifierLoc QualifierLoc;
10214   if (E->getQualifierLoc()) {
10215     QualifierLoc
10216       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10217     if (!QualifierLoc)
10218       return ExprError();
10219   }
10220 
10221   ValueDecl *ND
10222     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10223                                                          E->getDecl()));
10224   if (!ND)
10225     return ExprError();
10226 
10227   NamedDecl *Found = ND;
10228   if (E->getFoundDecl() != E->getDecl()) {
10229     Found = cast_or_null<NamedDecl>(
10230         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10231     if (!Found)
10232       return ExprError();
10233   }
10234 
10235   DeclarationNameInfo NameInfo = E->getNameInfo();
10236   if (NameInfo.getName()) {
10237     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10238     if (!NameInfo.getName())
10239       return ExprError();
10240   }
10241 
10242   if (!getDerived().AlwaysRebuild() &&
10243       QualifierLoc == E->getQualifierLoc() &&
10244       ND == E->getDecl() &&
10245       Found == E->getFoundDecl() &&
10246       NameInfo.getName() == E->getDecl()->getDeclName() &&
10247       !E->hasExplicitTemplateArgs()) {
10248 
10249     // Mark it referenced in the new context regardless.
10250     // FIXME: this is a bit instantiation-specific.
10251     SemaRef.MarkDeclRefReferenced(E);
10252 
10253     return E;
10254   }
10255 
10256   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10257   if (E->hasExplicitTemplateArgs()) {
10258     TemplateArgs = &TransArgs;
10259     TransArgs.setLAngleLoc(E->getLAngleLoc());
10260     TransArgs.setRAngleLoc(E->getRAngleLoc());
10261     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10262                                                 E->getNumTemplateArgs(),
10263                                                 TransArgs))
10264       return ExprError();
10265   }
10266 
10267   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10268                                          Found, TemplateArgs);
10269 }
10270 
10271 template<typename Derived>
10272 ExprResult
10273 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10274   return E;
10275 }
10276 
10277 template <typename Derived>
10278 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10279     FixedPointLiteral *E) {
10280   return E;
10281 }
10282 
10283 template<typename Derived>
10284 ExprResult
10285 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10286   return E;
10287 }
10288 
10289 template<typename Derived>
10290 ExprResult
10291 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10292   return E;
10293 }
10294 
10295 template<typename Derived>
10296 ExprResult
10297 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10298   return E;
10299 }
10300 
10301 template<typename Derived>
10302 ExprResult
10303 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10304   return E;
10305 }
10306 
10307 template<typename Derived>
10308 ExprResult
10309 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10310   if (FunctionDecl *FD = E->getDirectCallee())
10311     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10312   return SemaRef.MaybeBindToTemporary(E);
10313 }
10314 
10315 template<typename Derived>
10316 ExprResult
10317 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10318   ExprResult ControllingExpr =
10319     getDerived().TransformExpr(E->getControllingExpr());
10320   if (ControllingExpr.isInvalid())
10321     return ExprError();
10322 
10323   SmallVector<Expr *, 4> AssocExprs;
10324   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10325   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10326     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10327     if (TSI) {
10328       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10329       if (!AssocType)
10330         return ExprError();
10331       AssocTypes.push_back(AssocType);
10332     } else {
10333       AssocTypes.push_back(nullptr);
10334     }
10335 
10336     ExprResult AssocExpr =
10337         getDerived().TransformExpr(Assoc.getAssociationExpr());
10338     if (AssocExpr.isInvalid())
10339       return ExprError();
10340     AssocExprs.push_back(AssocExpr.get());
10341   }
10342 
10343   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10344                                                   E->getDefaultLoc(),
10345                                                   E->getRParenLoc(),
10346                                                   ControllingExpr.get(),
10347                                                   AssocTypes,
10348                                                   AssocExprs);
10349 }
10350 
10351 template<typename Derived>
10352 ExprResult
10353 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10354   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10355   if (SubExpr.isInvalid())
10356     return ExprError();
10357 
10358   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10359     return E;
10360 
10361   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10362                                        E->getRParen());
10363 }
10364 
10365 /// The operand of a unary address-of operator has special rules: it's
10366 /// allowed to refer to a non-static member of a class even if there's no 'this'
10367 /// object available.
10368 template<typename Derived>
10369 ExprResult
10370 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10371   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10372     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10373   else
10374     return getDerived().TransformExpr(E);
10375 }
10376 
10377 template<typename Derived>
10378 ExprResult
10379 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10380   ExprResult SubExpr;
10381   if (E->getOpcode() == UO_AddrOf)
10382     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10383   else
10384     SubExpr = TransformExpr(E->getSubExpr());
10385   if (SubExpr.isInvalid())
10386     return ExprError();
10387 
10388   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10389     return E;
10390 
10391   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10392                                            E->getOpcode(),
10393                                            SubExpr.get());
10394 }
10395 
10396 template<typename Derived>
10397 ExprResult
10398 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10399   // Transform the type.
10400   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10401   if (!Type)
10402     return ExprError();
10403 
10404   // Transform all of the components into components similar to what the
10405   // parser uses.
10406   // FIXME: It would be slightly more efficient in the non-dependent case to
10407   // just map FieldDecls, rather than requiring the rebuilder to look for
10408   // the fields again. However, __builtin_offsetof is rare enough in
10409   // template code that we don't care.
10410   bool ExprChanged = false;
10411   typedef Sema::OffsetOfComponent Component;
10412   SmallVector<Component, 4> Components;
10413   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10414     const OffsetOfNode &ON = E->getComponent(I);
10415     Component Comp;
10416     Comp.isBrackets = true;
10417     Comp.LocStart = ON.getSourceRange().getBegin();
10418     Comp.LocEnd = ON.getSourceRange().getEnd();
10419     switch (ON.getKind()) {
10420     case OffsetOfNode::Array: {
10421       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10422       ExprResult Index = getDerived().TransformExpr(FromIndex);
10423       if (Index.isInvalid())
10424         return ExprError();
10425 
10426       ExprChanged = ExprChanged || Index.get() != FromIndex;
10427       Comp.isBrackets = true;
10428       Comp.U.E = Index.get();
10429       break;
10430     }
10431 
10432     case OffsetOfNode::Field:
10433     case OffsetOfNode::Identifier:
10434       Comp.isBrackets = false;
10435       Comp.U.IdentInfo = ON.getFieldName();
10436       if (!Comp.U.IdentInfo)
10437         continue;
10438 
10439       break;
10440 
10441     case OffsetOfNode::Base:
10442       // Will be recomputed during the rebuild.
10443       continue;
10444     }
10445 
10446     Components.push_back(Comp);
10447   }
10448 
10449   // If nothing changed, retain the existing expression.
10450   if (!getDerived().AlwaysRebuild() &&
10451       Type == E->getTypeSourceInfo() &&
10452       !ExprChanged)
10453     return E;
10454 
10455   // Build a new offsetof expression.
10456   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10457                                           Components, E->getRParenLoc());
10458 }
10459 
10460 template<typename Derived>
10461 ExprResult
10462 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10463   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10464          "opaque value expression requires transformation");
10465   return E;
10466 }
10467 
10468 template<typename Derived>
10469 ExprResult
10470 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10471   return E;
10472 }
10473 
10474 template <typename Derived>
10475 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10476   llvm::SmallVector<Expr *, 8> Children;
10477   bool Changed = false;
10478   for (Expr *C : E->subExpressions()) {
10479     ExprResult NewC = getDerived().TransformExpr(C);
10480     if (NewC.isInvalid())
10481       return ExprError();
10482     Children.push_back(NewC.get());
10483 
10484     Changed |= NewC.get() != C;
10485   }
10486   if (!getDerived().AlwaysRebuild() && !Changed)
10487     return E;
10488   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10489                                           Children, E->getType());
10490 }
10491 
10492 template<typename Derived>
10493 ExprResult
10494 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10495   // Rebuild the syntactic form.  The original syntactic form has
10496   // opaque-value expressions in it, so strip those away and rebuild
10497   // the result.  This is a really awful way of doing this, but the
10498   // better solution (rebuilding the semantic expressions and
10499   // rebinding OVEs as necessary) doesn't work; we'd need
10500   // TreeTransform to not strip away implicit conversions.
10501   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10502   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10503   if (result.isInvalid()) return ExprError();
10504 
10505   // If that gives us a pseudo-object result back, the pseudo-object
10506   // expression must have been an lvalue-to-rvalue conversion which we
10507   // should reapply.
10508   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10509     result = SemaRef.checkPseudoObjectRValue(result.get());
10510 
10511   return result;
10512 }
10513 
10514 template<typename Derived>
10515 ExprResult
10516 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10517                                                 UnaryExprOrTypeTraitExpr *E) {
10518   if (E->isArgumentType()) {
10519     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10520 
10521     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10522     if (!NewT)
10523       return ExprError();
10524 
10525     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10526       return E;
10527 
10528     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10529                                                     E->getKind(),
10530                                                     E->getSourceRange());
10531   }
10532 
10533   // C++0x [expr.sizeof]p1:
10534   //   The operand is either an expression, which is an unevaluated operand
10535   //   [...]
10536   EnterExpressionEvaluationContext Unevaluated(
10537       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10538       Sema::ReuseLambdaContextDecl);
10539 
10540   // Try to recover if we have something like sizeof(T::X) where X is a type.
10541   // Notably, there must be *exactly* one set of parens if X is a type.
10542   TypeSourceInfo *RecoveryTSI = nullptr;
10543   ExprResult SubExpr;
10544   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10545   if (auto *DRE =
10546           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10547     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10548         PE, DRE, false, &RecoveryTSI);
10549   else
10550     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10551 
10552   if (RecoveryTSI) {
10553     return getDerived().RebuildUnaryExprOrTypeTrait(
10554         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10555   } else if (SubExpr.isInvalid())
10556     return ExprError();
10557 
10558   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10559     return E;
10560 
10561   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10562                                                   E->getOperatorLoc(),
10563                                                   E->getKind(),
10564                                                   E->getSourceRange());
10565 }
10566 
10567 template<typename Derived>
10568 ExprResult
10569 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10570   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10571   if (LHS.isInvalid())
10572     return ExprError();
10573 
10574   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10575   if (RHS.isInvalid())
10576     return ExprError();
10577 
10578 
10579   if (!getDerived().AlwaysRebuild() &&
10580       LHS.get() == E->getLHS() &&
10581       RHS.get() == E->getRHS())
10582     return E;
10583 
10584   return getDerived().RebuildArraySubscriptExpr(
10585       LHS.get(),
10586       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10587 }
10588 
10589 template <typename Derived>
10590 ExprResult
10591 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10592   ExprResult Base = getDerived().TransformExpr(E->getBase());
10593   if (Base.isInvalid())
10594     return ExprError();
10595 
10596   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10597   if (RowIdx.isInvalid())
10598     return ExprError();
10599 
10600   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10601   if (ColumnIdx.isInvalid())
10602     return ExprError();
10603 
10604   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10605       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10606     return E;
10607 
10608   return getDerived().RebuildMatrixSubscriptExpr(
10609       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10610 }
10611 
10612 template <typename Derived>
10613 ExprResult
10614 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10615   ExprResult Base = getDerived().TransformExpr(E->getBase());
10616   if (Base.isInvalid())
10617     return ExprError();
10618 
10619   ExprResult LowerBound;
10620   if (E->getLowerBound()) {
10621     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10622     if (LowerBound.isInvalid())
10623       return ExprError();
10624   }
10625 
10626   ExprResult Length;
10627   if (E->getLength()) {
10628     Length = getDerived().TransformExpr(E->getLength());
10629     if (Length.isInvalid())
10630       return ExprError();
10631   }
10632 
10633   ExprResult Stride;
10634   if (Expr *Str = E->getStride()) {
10635     Stride = getDerived().TransformExpr(Str);
10636     if (Stride.isInvalid())
10637       return ExprError();
10638   }
10639 
10640   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10641       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10642     return E;
10643 
10644   return getDerived().RebuildOMPArraySectionExpr(
10645       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10646       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10647       E->getRBracketLoc());
10648 }
10649 
10650 template <typename Derived>
10651 ExprResult
10652 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10653   ExprResult Base = getDerived().TransformExpr(E->getBase());
10654   if (Base.isInvalid())
10655     return ExprError();
10656 
10657   SmallVector<Expr *, 4> Dims;
10658   bool ErrorFound = false;
10659   for (Expr *Dim : E->getDimensions()) {
10660     ExprResult DimRes = getDerived().TransformExpr(Dim);
10661     if (DimRes.isInvalid()) {
10662       ErrorFound = true;
10663       continue;
10664     }
10665     Dims.push_back(DimRes.get());
10666   }
10667 
10668   if (ErrorFound)
10669     return ExprError();
10670   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10671                                                  E->getRParenLoc(), Dims,
10672                                                  E->getBracketsRanges());
10673 }
10674 
10675 template <typename Derived>
10676 ExprResult
10677 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10678   unsigned NumIterators = E->numOfIterators();
10679   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10680 
10681   bool ErrorFound = false;
10682   bool NeedToRebuild = getDerived().AlwaysRebuild();
10683   for (unsigned I = 0; I < NumIterators; ++I) {
10684     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10685     Data[I].DeclIdent = D->getIdentifier();
10686     Data[I].DeclIdentLoc = D->getLocation();
10687     if (D->getLocation() == D->getBeginLoc()) {
10688       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10689              "Implicit type must be int.");
10690     } else {
10691       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10692       QualType DeclTy = getDerived().TransformType(D->getType());
10693       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10694     }
10695     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10696     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10697     ExprResult End = getDerived().TransformExpr(Range.End);
10698     ExprResult Step = getDerived().TransformExpr(Range.Step);
10699     ErrorFound = ErrorFound ||
10700                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10701                                                !Data[I].Type.get().isNull())) ||
10702                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10703     if (ErrorFound)
10704       continue;
10705     Data[I].Range.Begin = Begin.get();
10706     Data[I].Range.End = End.get();
10707     Data[I].Range.Step = Step.get();
10708     Data[I].AssignLoc = E->getAssignLoc(I);
10709     Data[I].ColonLoc = E->getColonLoc(I);
10710     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10711     NeedToRebuild =
10712         NeedToRebuild ||
10713         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10714                                        D->getType().getTypePtrOrNull()) ||
10715         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10716         Range.Step != Data[I].Range.Step;
10717   }
10718   if (ErrorFound)
10719     return ExprError();
10720   if (!NeedToRebuild)
10721     return E;
10722 
10723   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10724       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10725   if (!Res.isUsable())
10726     return Res;
10727   auto *IE = cast<OMPIteratorExpr>(Res.get());
10728   for (unsigned I = 0; I < NumIterators; ++I)
10729     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10730                                       IE->getIteratorDecl(I));
10731   return Res;
10732 }
10733 
10734 template<typename Derived>
10735 ExprResult
10736 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10737   // Transform the callee.
10738   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10739   if (Callee.isInvalid())
10740     return ExprError();
10741 
10742   // Transform arguments.
10743   bool ArgChanged = false;
10744   SmallVector<Expr*, 8> Args;
10745   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10746                                   &ArgChanged))
10747     return ExprError();
10748 
10749   if (!getDerived().AlwaysRebuild() &&
10750       Callee.get() == E->getCallee() &&
10751       !ArgChanged)
10752     return SemaRef.MaybeBindToTemporary(E);
10753 
10754   // FIXME: Wrong source location information for the '('.
10755   SourceLocation FakeLParenLoc
10756     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10757 
10758   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10759   if (E->hasStoredFPFeatures()) {
10760     FPOptionsOverride NewOverrides = E->getFPFeatures();
10761     getSema().CurFPFeatures =
10762         NewOverrides.applyOverrides(getSema().getLangOpts());
10763     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10764   }
10765 
10766   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10767                                       Args,
10768                                       E->getRParenLoc());
10769 }
10770 
10771 template<typename Derived>
10772 ExprResult
10773 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10774   ExprResult Base = getDerived().TransformExpr(E->getBase());
10775   if (Base.isInvalid())
10776     return ExprError();
10777 
10778   NestedNameSpecifierLoc QualifierLoc;
10779   if (E->hasQualifier()) {
10780     QualifierLoc
10781       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10782 
10783     if (!QualifierLoc)
10784       return ExprError();
10785   }
10786   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10787 
10788   ValueDecl *Member
10789     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10790                                                          E->getMemberDecl()));
10791   if (!Member)
10792     return ExprError();
10793 
10794   NamedDecl *FoundDecl = E->getFoundDecl();
10795   if (FoundDecl == E->getMemberDecl()) {
10796     FoundDecl = Member;
10797   } else {
10798     FoundDecl = cast_or_null<NamedDecl>(
10799                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10800     if (!FoundDecl)
10801       return ExprError();
10802   }
10803 
10804   if (!getDerived().AlwaysRebuild() &&
10805       Base.get() == E->getBase() &&
10806       QualifierLoc == E->getQualifierLoc() &&
10807       Member == E->getMemberDecl() &&
10808       FoundDecl == E->getFoundDecl() &&
10809       !E->hasExplicitTemplateArgs()) {
10810 
10811     // Mark it referenced in the new context regardless.
10812     // FIXME: this is a bit instantiation-specific.
10813     SemaRef.MarkMemberReferenced(E);
10814 
10815     return E;
10816   }
10817 
10818   TemplateArgumentListInfo TransArgs;
10819   if (E->hasExplicitTemplateArgs()) {
10820     TransArgs.setLAngleLoc(E->getLAngleLoc());
10821     TransArgs.setRAngleLoc(E->getRAngleLoc());
10822     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10823                                                 E->getNumTemplateArgs(),
10824                                                 TransArgs))
10825       return ExprError();
10826   }
10827 
10828   // FIXME: Bogus source location for the operator
10829   SourceLocation FakeOperatorLoc =
10830       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10831 
10832   // FIXME: to do this check properly, we will need to preserve the
10833   // first-qualifier-in-scope here, just in case we had a dependent
10834   // base (and therefore couldn't do the check) and a
10835   // nested-name-qualifier (and therefore could do the lookup).
10836   NamedDecl *FirstQualifierInScope = nullptr;
10837   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10838   if (MemberNameInfo.getName()) {
10839     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10840     if (!MemberNameInfo.getName())
10841       return ExprError();
10842   }
10843 
10844   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10845                                         E->isArrow(),
10846                                         QualifierLoc,
10847                                         TemplateKWLoc,
10848                                         MemberNameInfo,
10849                                         Member,
10850                                         FoundDecl,
10851                                         (E->hasExplicitTemplateArgs()
10852                                            ? &TransArgs : nullptr),
10853                                         FirstQualifierInScope);
10854 }
10855 
10856 template<typename Derived>
10857 ExprResult
10858 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10859   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10860   if (LHS.isInvalid())
10861     return ExprError();
10862 
10863   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10864   if (RHS.isInvalid())
10865     return ExprError();
10866 
10867   if (!getDerived().AlwaysRebuild() &&
10868       LHS.get() == E->getLHS() &&
10869       RHS.get() == E->getRHS())
10870     return E;
10871 
10872   if (E->isCompoundAssignmentOp())
10873     // FPFeatures has already been established from trailing storage
10874     return getDerived().RebuildBinaryOperator(
10875         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10876   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10877   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10878   getSema().CurFPFeatures =
10879       NewOverrides.applyOverrides(getSema().getLangOpts());
10880   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10881   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10882                                             LHS.get(), RHS.get());
10883 }
10884 
10885 template <typename Derived>
10886 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10887     CXXRewrittenBinaryOperator *E) {
10888   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10889 
10890   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10891   if (LHS.isInvalid())
10892     return ExprError();
10893 
10894   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10895   if (RHS.isInvalid())
10896     return ExprError();
10897 
10898   if (!getDerived().AlwaysRebuild() &&
10899       LHS.get() == Decomp.LHS &&
10900       RHS.get() == Decomp.RHS)
10901     return E;
10902 
10903   // Extract the already-resolved callee declarations so that we can restrict
10904   // ourselves to using them as the unqualified lookup results when rebuilding.
10905   UnresolvedSet<2> UnqualLookups;
10906   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10907                             const_cast<Expr *>(Decomp.InnerBinOp)};
10908   for (Expr *PossibleBinOp : PossibleBinOps) {
10909     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10910     if (!Op)
10911       continue;
10912     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10913     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10914       continue;
10915 
10916     // Transform the callee in case we built a call to a local extern
10917     // declaration.
10918     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10919         E->getOperatorLoc(), Callee->getFoundDecl()));
10920     if (!Found)
10921       return ExprError();
10922     UnqualLookups.addDecl(Found);
10923   }
10924 
10925   return getDerived().RebuildCXXRewrittenBinaryOperator(
10926       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10927 }
10928 
10929 template<typename Derived>
10930 ExprResult
10931 TreeTransform<Derived>::TransformCompoundAssignOperator(
10932                                                       CompoundAssignOperator *E) {
10933   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10934   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10935   getSema().CurFPFeatures =
10936       NewOverrides.applyOverrides(getSema().getLangOpts());
10937   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10938   return getDerived().TransformBinaryOperator(E);
10939 }
10940 
10941 template<typename Derived>
10942 ExprResult TreeTransform<Derived>::
10943 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10944   // Just rebuild the common and RHS expressions and see whether we
10945   // get any changes.
10946 
10947   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10948   if (commonExpr.isInvalid())
10949     return ExprError();
10950 
10951   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10952   if (rhs.isInvalid())
10953     return ExprError();
10954 
10955   if (!getDerived().AlwaysRebuild() &&
10956       commonExpr.get() == e->getCommon() &&
10957       rhs.get() == e->getFalseExpr())
10958     return e;
10959 
10960   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10961                                                  e->getQuestionLoc(),
10962                                                  nullptr,
10963                                                  e->getColonLoc(),
10964                                                  rhs.get());
10965 }
10966 
10967 template<typename Derived>
10968 ExprResult
10969 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10970   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10971   if (Cond.isInvalid())
10972     return ExprError();
10973 
10974   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10975   if (LHS.isInvalid())
10976     return ExprError();
10977 
10978   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10979   if (RHS.isInvalid())
10980     return ExprError();
10981 
10982   if (!getDerived().AlwaysRebuild() &&
10983       Cond.get() == E->getCond() &&
10984       LHS.get() == E->getLHS() &&
10985       RHS.get() == E->getRHS())
10986     return E;
10987 
10988   return getDerived().RebuildConditionalOperator(Cond.get(),
10989                                                  E->getQuestionLoc(),
10990                                                  LHS.get(),
10991                                                  E->getColonLoc(),
10992                                                  RHS.get());
10993 }
10994 
10995 template<typename Derived>
10996 ExprResult
10997 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10998   // Implicit casts are eliminated during transformation, since they
10999   // will be recomputed by semantic analysis after transformation.
11000   return getDerived().TransformExpr(E->getSubExprAsWritten());
11001 }
11002 
11003 template<typename Derived>
11004 ExprResult
11005 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11006   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11007   if (!Type)
11008     return ExprError();
11009 
11010   ExprResult SubExpr
11011     = getDerived().TransformExpr(E->getSubExprAsWritten());
11012   if (SubExpr.isInvalid())
11013     return ExprError();
11014 
11015   if (!getDerived().AlwaysRebuild() &&
11016       Type == E->getTypeInfoAsWritten() &&
11017       SubExpr.get() == E->getSubExpr())
11018     return E;
11019 
11020   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11021                                             Type,
11022                                             E->getRParenLoc(),
11023                                             SubExpr.get());
11024 }
11025 
11026 template<typename Derived>
11027 ExprResult
11028 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11029   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11030   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11031   if (!NewT)
11032     return ExprError();
11033 
11034   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11035   if (Init.isInvalid())
11036     return ExprError();
11037 
11038   if (!getDerived().AlwaysRebuild() &&
11039       OldT == NewT &&
11040       Init.get() == E->getInitializer())
11041     return SemaRef.MaybeBindToTemporary(E);
11042 
11043   // Note: the expression type doesn't necessarily match the
11044   // type-as-written, but that's okay, because it should always be
11045   // derivable from the initializer.
11046 
11047   return getDerived().RebuildCompoundLiteralExpr(
11048       E->getLParenLoc(), NewT,
11049       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11050 }
11051 
11052 template<typename Derived>
11053 ExprResult
11054 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11055   ExprResult Base = getDerived().TransformExpr(E->getBase());
11056   if (Base.isInvalid())
11057     return ExprError();
11058 
11059   if (!getDerived().AlwaysRebuild() &&
11060       Base.get() == E->getBase())
11061     return E;
11062 
11063   // FIXME: Bad source location
11064   SourceLocation FakeOperatorLoc =
11065       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11066   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11067                                                   E->getAccessorLoc(),
11068                                                   E->getAccessor());
11069 }
11070 
11071 template<typename Derived>
11072 ExprResult
11073 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11074   if (InitListExpr *Syntactic = E->getSyntacticForm())
11075     E = Syntactic;
11076 
11077   bool InitChanged = false;
11078 
11079   EnterExpressionEvaluationContext Context(
11080       getSema(), EnterExpressionEvaluationContext::InitList);
11081 
11082   SmallVector<Expr*, 4> Inits;
11083   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11084                                   Inits, &InitChanged))
11085     return ExprError();
11086 
11087   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11088     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11089     // in some cases. We can't reuse it in general, because the syntactic and
11090     // semantic forms are linked, and we can't know that semantic form will
11091     // match even if the syntactic form does.
11092   }
11093 
11094   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11095                                       E->getRBraceLoc());
11096 }
11097 
11098 template<typename Derived>
11099 ExprResult
11100 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11101   Designation Desig;
11102 
11103   // transform the initializer value
11104   ExprResult Init = getDerived().TransformExpr(E->getInit());
11105   if (Init.isInvalid())
11106     return ExprError();
11107 
11108   // transform the designators.
11109   SmallVector<Expr*, 4> ArrayExprs;
11110   bool ExprChanged = false;
11111   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11112     if (D.isFieldDesignator()) {
11113       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11114                                                D.getDotLoc(),
11115                                                D.getFieldLoc()));
11116       if (D.getField()) {
11117         FieldDecl *Field = cast_or_null<FieldDecl>(
11118             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11119         if (Field != D.getField())
11120           // Rebuild the expression when the transformed FieldDecl is
11121           // different to the already assigned FieldDecl.
11122           ExprChanged = true;
11123       } else {
11124         // Ensure that the designator expression is rebuilt when there isn't
11125         // a resolved FieldDecl in the designator as we don't want to assign
11126         // a FieldDecl to a pattern designator that will be instantiated again.
11127         ExprChanged = true;
11128       }
11129       continue;
11130     }
11131 
11132     if (D.isArrayDesignator()) {
11133       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11134       if (Index.isInvalid())
11135         return ExprError();
11136 
11137       Desig.AddDesignator(
11138           Designator::getArray(Index.get(), D.getLBracketLoc()));
11139 
11140       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11141       ArrayExprs.push_back(Index.get());
11142       continue;
11143     }
11144 
11145     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11146     ExprResult Start
11147       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11148     if (Start.isInvalid())
11149       return ExprError();
11150 
11151     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11152     if (End.isInvalid())
11153       return ExprError();
11154 
11155     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11156                                                   End.get(),
11157                                                   D.getLBracketLoc(),
11158                                                   D.getEllipsisLoc()));
11159 
11160     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11161                   End.get() != E->getArrayRangeEnd(D);
11162 
11163     ArrayExprs.push_back(Start.get());
11164     ArrayExprs.push_back(End.get());
11165   }
11166 
11167   if (!getDerived().AlwaysRebuild() &&
11168       Init.get() == E->getInit() &&
11169       !ExprChanged)
11170     return E;
11171 
11172   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11173                                                 E->getEqualOrColonLoc(),
11174                                                 E->usesGNUSyntax(), Init.get());
11175 }
11176 
11177 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11178 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11179 template<typename Derived>
11180 ExprResult
11181 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11182     DesignatedInitUpdateExpr *E) {
11183   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11184                    "initializer");
11185   return ExprError();
11186 }
11187 
11188 template<typename Derived>
11189 ExprResult
11190 TreeTransform<Derived>::TransformNoInitExpr(
11191     NoInitExpr *E) {
11192   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11193   return ExprError();
11194 }
11195 
11196 template<typename Derived>
11197 ExprResult
11198 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11199   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11200   return ExprError();
11201 }
11202 
11203 template<typename Derived>
11204 ExprResult
11205 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11206   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11207   return ExprError();
11208 }
11209 
11210 template<typename Derived>
11211 ExprResult
11212 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11213                                                      ImplicitValueInitExpr *E) {
11214   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11215 
11216   // FIXME: Will we ever have proper type location here? Will we actually
11217   // need to transform the type?
11218   QualType T = getDerived().TransformType(E->getType());
11219   if (T.isNull())
11220     return ExprError();
11221 
11222   if (!getDerived().AlwaysRebuild() &&
11223       T == E->getType())
11224     return E;
11225 
11226   return getDerived().RebuildImplicitValueInitExpr(T);
11227 }
11228 
11229 template<typename Derived>
11230 ExprResult
11231 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11232   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11233   if (!TInfo)
11234     return ExprError();
11235 
11236   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11237   if (SubExpr.isInvalid())
11238     return ExprError();
11239 
11240   if (!getDerived().AlwaysRebuild() &&
11241       TInfo == E->getWrittenTypeInfo() &&
11242       SubExpr.get() == E->getSubExpr())
11243     return E;
11244 
11245   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11246                                        TInfo, E->getRParenLoc());
11247 }
11248 
11249 template<typename Derived>
11250 ExprResult
11251 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11252   bool ArgumentChanged = false;
11253   SmallVector<Expr*, 4> Inits;
11254   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11255                      &ArgumentChanged))
11256     return ExprError();
11257 
11258   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11259                                            Inits,
11260                                            E->getRParenLoc());
11261 }
11262 
11263 /// Transform an address-of-label expression.
11264 ///
11265 /// By default, the transformation of an address-of-label expression always
11266 /// rebuilds the expression, so that the label identifier can be resolved to
11267 /// the corresponding label statement by semantic analysis.
11268 template<typename Derived>
11269 ExprResult
11270 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11271   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11272                                         E->getLabel());
11273   if (!LD)
11274     return ExprError();
11275 
11276   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11277                                            cast<LabelDecl>(LD));
11278 }
11279 
11280 template<typename Derived>
11281 ExprResult
11282 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11283   SemaRef.ActOnStartStmtExpr();
11284   StmtResult SubStmt
11285     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11286   if (SubStmt.isInvalid()) {
11287     SemaRef.ActOnStmtExprError();
11288     return ExprError();
11289   }
11290 
11291   unsigned OldDepth = E->getTemplateDepth();
11292   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11293 
11294   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11295       SubStmt.get() == E->getSubStmt()) {
11296     // Calling this an 'error' is unintuitive, but it does the right thing.
11297     SemaRef.ActOnStmtExprError();
11298     return SemaRef.MaybeBindToTemporary(E);
11299   }
11300 
11301   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11302                                       E->getRParenLoc(), NewDepth);
11303 }
11304 
11305 template<typename Derived>
11306 ExprResult
11307 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11308   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11309   if (Cond.isInvalid())
11310     return ExprError();
11311 
11312   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11313   if (LHS.isInvalid())
11314     return ExprError();
11315 
11316   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11317   if (RHS.isInvalid())
11318     return ExprError();
11319 
11320   if (!getDerived().AlwaysRebuild() &&
11321       Cond.get() == E->getCond() &&
11322       LHS.get() == E->getLHS() &&
11323       RHS.get() == E->getRHS())
11324     return E;
11325 
11326   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11327                                         Cond.get(), LHS.get(), RHS.get(),
11328                                         E->getRParenLoc());
11329 }
11330 
11331 template<typename Derived>
11332 ExprResult
11333 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11334   return E;
11335 }
11336 
11337 template<typename Derived>
11338 ExprResult
11339 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11340   switch (E->getOperator()) {
11341   case OO_New:
11342   case OO_Delete:
11343   case OO_Array_New:
11344   case OO_Array_Delete:
11345     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11346 
11347   case OO_Call: {
11348     // This is a call to an object's operator().
11349     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11350 
11351     // Transform the object itself.
11352     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11353     if (Object.isInvalid())
11354       return ExprError();
11355 
11356     // FIXME: Poor location information
11357     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11358         static_cast<Expr *>(Object.get())->getEndLoc());
11359 
11360     // Transform the call arguments.
11361     SmallVector<Expr*, 8> Args;
11362     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11363                                     Args))
11364       return ExprError();
11365 
11366     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11367                                         E->getEndLoc());
11368   }
11369 
11370 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11371   case OO_##Name:
11372 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11373 #include "clang/Basic/OperatorKinds.def"
11374   case OO_Subscript:
11375     // Handled below.
11376     break;
11377 
11378   case OO_Conditional:
11379     llvm_unreachable("conditional operator is not actually overloadable");
11380 
11381   case OO_None:
11382   case NUM_OVERLOADED_OPERATORS:
11383     llvm_unreachable("not an overloaded operator?");
11384   }
11385 
11386   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11387   if (Callee.isInvalid())
11388     return ExprError();
11389 
11390   ExprResult First;
11391   if (E->getOperator() == OO_Amp)
11392     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11393   else
11394     First = getDerived().TransformExpr(E->getArg(0));
11395   if (First.isInvalid())
11396     return ExprError();
11397 
11398   ExprResult Second;
11399   if (E->getNumArgs() == 2) {
11400     Second = getDerived().TransformExpr(E->getArg(1));
11401     if (Second.isInvalid())
11402       return ExprError();
11403   }
11404 
11405   if (!getDerived().AlwaysRebuild() &&
11406       Callee.get() == E->getCallee() &&
11407       First.get() == E->getArg(0) &&
11408       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11409     return SemaRef.MaybeBindToTemporary(E);
11410 
11411   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11412   FPOptionsOverride NewOverrides(E->getFPFeatures());
11413   getSema().CurFPFeatures =
11414       NewOverrides.applyOverrides(getSema().getLangOpts());
11415   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11416 
11417   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11418                                                  E->getOperatorLoc(),
11419                                                  Callee.get(),
11420                                                  First.get(),
11421                                                  Second.get());
11422 }
11423 
11424 template<typename Derived>
11425 ExprResult
11426 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11427   return getDerived().TransformCallExpr(E);
11428 }
11429 
11430 template <typename Derived>
11431 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11432   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11433                          getSema().CurContext != E->getParentContext();
11434 
11435   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11436     return E;
11437 
11438   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11439                                            E->getEndLoc(),
11440                                            getSema().CurContext);
11441 }
11442 
11443 template<typename Derived>
11444 ExprResult
11445 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11446   // Transform the callee.
11447   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11448   if (Callee.isInvalid())
11449     return ExprError();
11450 
11451   // Transform exec config.
11452   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11453   if (EC.isInvalid())
11454     return ExprError();
11455 
11456   // Transform arguments.
11457   bool ArgChanged = false;
11458   SmallVector<Expr*, 8> Args;
11459   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11460                                   &ArgChanged))
11461     return ExprError();
11462 
11463   if (!getDerived().AlwaysRebuild() &&
11464       Callee.get() == E->getCallee() &&
11465       !ArgChanged)
11466     return SemaRef.MaybeBindToTemporary(E);
11467 
11468   // FIXME: Wrong source location information for the '('.
11469   SourceLocation FakeLParenLoc
11470     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11471   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11472                                       Args,
11473                                       E->getRParenLoc(), EC.get());
11474 }
11475 
11476 template<typename Derived>
11477 ExprResult
11478 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11479   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11480   if (!Type)
11481     return ExprError();
11482 
11483   ExprResult SubExpr
11484     = getDerived().TransformExpr(E->getSubExprAsWritten());
11485   if (SubExpr.isInvalid())
11486     return ExprError();
11487 
11488   if (!getDerived().AlwaysRebuild() &&
11489       Type == E->getTypeInfoAsWritten() &&
11490       SubExpr.get() == E->getSubExpr())
11491     return E;
11492   return getDerived().RebuildCXXNamedCastExpr(
11493       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11494       Type, E->getAngleBrackets().getEnd(),
11495       // FIXME. this should be '(' location
11496       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11497 }
11498 
11499 template<typename Derived>
11500 ExprResult
11501 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11502   TypeSourceInfo *TSI =
11503       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11504   if (!TSI)
11505     return ExprError();
11506 
11507   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11508   if (Sub.isInvalid())
11509     return ExprError();
11510 
11511   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11512                                                 Sub.get(), BCE->getEndLoc());
11513 }
11514 
11515 template<typename Derived>
11516 ExprResult
11517 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11518   return getDerived().TransformCXXNamedCastExpr(E);
11519 }
11520 
11521 template<typename Derived>
11522 ExprResult
11523 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11524   return getDerived().TransformCXXNamedCastExpr(E);
11525 }
11526 
11527 template<typename Derived>
11528 ExprResult
11529 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11530                                                       CXXReinterpretCastExpr *E) {
11531   return getDerived().TransformCXXNamedCastExpr(E);
11532 }
11533 
11534 template<typename Derived>
11535 ExprResult
11536 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11537   return getDerived().TransformCXXNamedCastExpr(E);
11538 }
11539 
11540 template<typename Derived>
11541 ExprResult
11542 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11543   return getDerived().TransformCXXNamedCastExpr(E);
11544 }
11545 
11546 template<typename Derived>
11547 ExprResult
11548 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11549                                                      CXXFunctionalCastExpr *E) {
11550   TypeSourceInfo *Type =
11551       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11552   if (!Type)
11553     return ExprError();
11554 
11555   ExprResult SubExpr
11556     = getDerived().TransformExpr(E->getSubExprAsWritten());
11557   if (SubExpr.isInvalid())
11558     return ExprError();
11559 
11560   if (!getDerived().AlwaysRebuild() &&
11561       Type == E->getTypeInfoAsWritten() &&
11562       SubExpr.get() == E->getSubExpr())
11563     return E;
11564 
11565   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11566                                                    E->getLParenLoc(),
11567                                                    SubExpr.get(),
11568                                                    E->getRParenLoc(),
11569                                                    E->isListInitialization());
11570 }
11571 
11572 template<typename Derived>
11573 ExprResult
11574 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11575   if (E->isTypeOperand()) {
11576     TypeSourceInfo *TInfo
11577       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11578     if (!TInfo)
11579       return ExprError();
11580 
11581     if (!getDerived().AlwaysRebuild() &&
11582         TInfo == E->getTypeOperandSourceInfo())
11583       return E;
11584 
11585     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11586                                              TInfo, E->getEndLoc());
11587   }
11588 
11589   // Typeid's operand is an unevaluated context, unless it's a polymorphic
11590   // type.  We must not unilaterally enter unevaluated context here, as then
11591   // semantic processing can re-transform an already transformed operand.
11592   Expr *Op = E->getExprOperand();
11593   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
11594   if (E->isGLValue())
11595     if (auto *RecordT = Op->getType()->getAs<RecordType>())
11596       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
11597         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
11598 
11599   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
11600                                                Sema::ReuseLambdaContextDecl);
11601 
11602   ExprResult SubExpr = getDerived().TransformExpr(Op);
11603   if (SubExpr.isInvalid())
11604     return ExprError();
11605 
11606   if (!getDerived().AlwaysRebuild() &&
11607       SubExpr.get() == E->getExprOperand())
11608     return E;
11609 
11610   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11611                                            SubExpr.get(), E->getEndLoc());
11612 }
11613 
11614 template<typename Derived>
11615 ExprResult
11616 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11617   if (E->isTypeOperand()) {
11618     TypeSourceInfo *TInfo
11619       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11620     if (!TInfo)
11621       return ExprError();
11622 
11623     if (!getDerived().AlwaysRebuild() &&
11624         TInfo == E->getTypeOperandSourceInfo())
11625       return E;
11626 
11627     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11628                                              TInfo, E->getEndLoc());
11629   }
11630 
11631   EnterExpressionEvaluationContext Unevaluated(
11632       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11633 
11634   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11635   if (SubExpr.isInvalid())
11636     return ExprError();
11637 
11638   if (!getDerived().AlwaysRebuild() &&
11639       SubExpr.get() == E->getExprOperand())
11640     return E;
11641 
11642   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11643                                            SubExpr.get(), E->getEndLoc());
11644 }
11645 
11646 template<typename Derived>
11647 ExprResult
11648 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11649   return E;
11650 }
11651 
11652 template<typename Derived>
11653 ExprResult
11654 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11655                                                      CXXNullPtrLiteralExpr *E) {
11656   return E;
11657 }
11658 
11659 template<typename Derived>
11660 ExprResult
11661 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11662   QualType T = getSema().getCurrentThisType();
11663 
11664   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11665     // Mark it referenced in the new context regardless.
11666     // FIXME: this is a bit instantiation-specific.
11667     getSema().MarkThisReferenced(E);
11668     return E;
11669   }
11670 
11671   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11672 }
11673 
11674 template<typename Derived>
11675 ExprResult
11676 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11677   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11678   if (SubExpr.isInvalid())
11679     return ExprError();
11680 
11681   if (!getDerived().AlwaysRebuild() &&
11682       SubExpr.get() == E->getSubExpr())
11683     return E;
11684 
11685   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11686                                           E->isThrownVariableInScope());
11687 }
11688 
11689 template<typename Derived>
11690 ExprResult
11691 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11692   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11693       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11694   if (!Param)
11695     return ExprError();
11696 
11697   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11698       E->getUsedContext() == SemaRef.CurContext)
11699     return E;
11700 
11701   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11702 }
11703 
11704 template<typename Derived>
11705 ExprResult
11706 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11707   FieldDecl *Field = cast_or_null<FieldDecl>(
11708       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11709   if (!Field)
11710     return ExprError();
11711 
11712   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11713       E->getUsedContext() == SemaRef.CurContext)
11714     return E;
11715 
11716   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11717 }
11718 
11719 template<typename Derived>
11720 ExprResult
11721 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11722                                                     CXXScalarValueInitExpr *E) {
11723   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11724   if (!T)
11725     return ExprError();
11726 
11727   if (!getDerived().AlwaysRebuild() &&
11728       T == E->getTypeSourceInfo())
11729     return E;
11730 
11731   return getDerived().RebuildCXXScalarValueInitExpr(T,
11732                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11733                                                     E->getRParenLoc());
11734 }
11735 
11736 template<typename Derived>
11737 ExprResult
11738 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11739   // Transform the type that we're allocating
11740   TypeSourceInfo *AllocTypeInfo =
11741       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11742   if (!AllocTypeInfo)
11743     return ExprError();
11744 
11745   // Transform the size of the array we're allocating (if any).
11746   Optional<Expr *> ArraySize;
11747   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11748     ExprResult NewArraySize;
11749     if (*OldArraySize) {
11750       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11751       if (NewArraySize.isInvalid())
11752         return ExprError();
11753     }
11754     ArraySize = NewArraySize.get();
11755   }
11756 
11757   // Transform the placement arguments (if any).
11758   bool ArgumentChanged = false;
11759   SmallVector<Expr*, 8> PlacementArgs;
11760   if (getDerived().TransformExprs(E->getPlacementArgs(),
11761                                   E->getNumPlacementArgs(), true,
11762                                   PlacementArgs, &ArgumentChanged))
11763     return ExprError();
11764 
11765   // Transform the initializer (if any).
11766   Expr *OldInit = E->getInitializer();
11767   ExprResult NewInit;
11768   if (OldInit)
11769     NewInit = getDerived().TransformInitializer(OldInit, true);
11770   if (NewInit.isInvalid())
11771     return ExprError();
11772 
11773   // Transform new operator and delete operator.
11774   FunctionDecl *OperatorNew = nullptr;
11775   if (E->getOperatorNew()) {
11776     OperatorNew = cast_or_null<FunctionDecl>(
11777         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11778     if (!OperatorNew)
11779       return ExprError();
11780   }
11781 
11782   FunctionDecl *OperatorDelete = nullptr;
11783   if (E->getOperatorDelete()) {
11784     OperatorDelete = cast_or_null<FunctionDecl>(
11785         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11786     if (!OperatorDelete)
11787       return ExprError();
11788   }
11789 
11790   if (!getDerived().AlwaysRebuild() &&
11791       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11792       ArraySize == E->getArraySize() &&
11793       NewInit.get() == OldInit &&
11794       OperatorNew == E->getOperatorNew() &&
11795       OperatorDelete == E->getOperatorDelete() &&
11796       !ArgumentChanged) {
11797     // Mark any declarations we need as referenced.
11798     // FIXME: instantiation-specific.
11799     if (OperatorNew)
11800       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11801     if (OperatorDelete)
11802       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11803 
11804     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11805       QualType ElementType
11806         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11807       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11808         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11809         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11810           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11811         }
11812       }
11813     }
11814 
11815     return E;
11816   }
11817 
11818   QualType AllocType = AllocTypeInfo->getType();
11819   if (!ArraySize) {
11820     // If no array size was specified, but the new expression was
11821     // instantiated with an array type (e.g., "new T" where T is
11822     // instantiated with "int[4]"), extract the outer bound from the
11823     // array type as our array size. We do this with constant and
11824     // dependently-sized array types.
11825     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11826     if (!ArrayT) {
11827       // Do nothing
11828     } else if (const ConstantArrayType *ConsArrayT
11829                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11830       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11831                                          SemaRef.Context.getSizeType(),
11832                                          /*FIXME:*/ E->getBeginLoc());
11833       AllocType = ConsArrayT->getElementType();
11834     } else if (const DependentSizedArrayType *DepArrayT
11835                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11836       if (DepArrayT->getSizeExpr()) {
11837         ArraySize = DepArrayT->getSizeExpr();
11838         AllocType = DepArrayT->getElementType();
11839       }
11840     }
11841   }
11842 
11843   return getDerived().RebuildCXXNewExpr(
11844       E->getBeginLoc(), E->isGlobalNew(),
11845       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11846       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11847       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11848 }
11849 
11850 template<typename Derived>
11851 ExprResult
11852 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11853   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11854   if (Operand.isInvalid())
11855     return ExprError();
11856 
11857   // Transform the delete operator, if known.
11858   FunctionDecl *OperatorDelete = nullptr;
11859   if (E->getOperatorDelete()) {
11860     OperatorDelete = cast_or_null<FunctionDecl>(
11861         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11862     if (!OperatorDelete)
11863       return ExprError();
11864   }
11865 
11866   if (!getDerived().AlwaysRebuild() &&
11867       Operand.get() == E->getArgument() &&
11868       OperatorDelete == E->getOperatorDelete()) {
11869     // Mark any declarations we need as referenced.
11870     // FIXME: instantiation-specific.
11871     if (OperatorDelete)
11872       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11873 
11874     if (!E->getArgument()->isTypeDependent()) {
11875       QualType Destroyed = SemaRef.Context.getBaseElementType(
11876                                                          E->getDestroyedType());
11877       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11878         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11879         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11880                                        SemaRef.LookupDestructor(Record));
11881       }
11882     }
11883 
11884     return E;
11885   }
11886 
11887   return getDerived().RebuildCXXDeleteExpr(
11888       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11889 }
11890 
11891 template<typename Derived>
11892 ExprResult
11893 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11894                                                      CXXPseudoDestructorExpr *E) {
11895   ExprResult Base = getDerived().TransformExpr(E->getBase());
11896   if (Base.isInvalid())
11897     return ExprError();
11898 
11899   ParsedType ObjectTypePtr;
11900   bool MayBePseudoDestructor = false;
11901   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11902                                               E->getOperatorLoc(),
11903                                         E->isArrow()? tok::arrow : tok::period,
11904                                               ObjectTypePtr,
11905                                               MayBePseudoDestructor);
11906   if (Base.isInvalid())
11907     return ExprError();
11908 
11909   QualType ObjectType = ObjectTypePtr.get();
11910   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11911   if (QualifierLoc) {
11912     QualifierLoc
11913       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11914     if (!QualifierLoc)
11915       return ExprError();
11916   }
11917   CXXScopeSpec SS;
11918   SS.Adopt(QualifierLoc);
11919 
11920   PseudoDestructorTypeStorage Destroyed;
11921   if (E->getDestroyedTypeInfo()) {
11922     TypeSourceInfo *DestroyedTypeInfo
11923       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11924                                                 ObjectType, nullptr, SS);
11925     if (!DestroyedTypeInfo)
11926       return ExprError();
11927     Destroyed = DestroyedTypeInfo;
11928   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11929     // We aren't likely to be able to resolve the identifier down to a type
11930     // now anyway, so just retain the identifier.
11931     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11932                                             E->getDestroyedTypeLoc());
11933   } else {
11934     // Look for a destructor known with the given name.
11935     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11936                                               *E->getDestroyedTypeIdentifier(),
11937                                                 E->getDestroyedTypeLoc(),
11938                                                 /*Scope=*/nullptr,
11939                                                 SS, ObjectTypePtr,
11940                                                 false);
11941     if (!T)
11942       return ExprError();
11943 
11944     Destroyed
11945       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11946                                                  E->getDestroyedTypeLoc());
11947   }
11948 
11949   TypeSourceInfo *ScopeTypeInfo = nullptr;
11950   if (E->getScopeTypeInfo()) {
11951     CXXScopeSpec EmptySS;
11952     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11953                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11954     if (!ScopeTypeInfo)
11955       return ExprError();
11956   }
11957 
11958   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11959                                                      E->getOperatorLoc(),
11960                                                      E->isArrow(),
11961                                                      SS,
11962                                                      ScopeTypeInfo,
11963                                                      E->getColonColonLoc(),
11964                                                      E->getTildeLoc(),
11965                                                      Destroyed);
11966 }
11967 
11968 template <typename Derived>
11969 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11970                                                         bool RequiresADL,
11971                                                         LookupResult &R) {
11972   // Transform all the decls.
11973   bool AllEmptyPacks = true;
11974   for (auto *OldD : Old->decls()) {
11975     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11976     if (!InstD) {
11977       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11978       // This can happen because of dependent hiding.
11979       if (isa<UsingShadowDecl>(OldD))
11980         continue;
11981       else {
11982         R.clear();
11983         return true;
11984       }
11985     }
11986 
11987     // Expand using pack declarations.
11988     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11989     ArrayRef<NamedDecl*> Decls = SingleDecl;
11990     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11991       Decls = UPD->expansions();
11992 
11993     // Expand using declarations.
11994     for (auto *D : Decls) {
11995       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11996         for (auto *SD : UD->shadows())
11997           R.addDecl(SD);
11998       } else {
11999         R.addDecl(D);
12000       }
12001     }
12002 
12003     AllEmptyPacks &= Decls.empty();
12004   };
12005 
12006   // C++ [temp.res]/8.4.2:
12007   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12008   //   a name in the template definition found a using-declaration, but the
12009   //   lookup in the corresponding scope in the instantiation odoes not find
12010   //   any declarations because the using-declaration was a pack expansion and
12011   //   the corresponding pack is empty
12012   if (AllEmptyPacks && !RequiresADL) {
12013     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12014         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12015     return true;
12016   }
12017 
12018   // Resolve a kind, but don't do any further analysis.  If it's
12019   // ambiguous, the callee needs to deal with it.
12020   R.resolveKind();
12021   return false;
12022 }
12023 
12024 template<typename Derived>
12025 ExprResult
12026 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12027                                                   UnresolvedLookupExpr *Old) {
12028   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12029                  Sema::LookupOrdinaryName);
12030 
12031   // Transform the declaration set.
12032   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12033     return ExprError();
12034 
12035   // Rebuild the nested-name qualifier, if present.
12036   CXXScopeSpec SS;
12037   if (Old->getQualifierLoc()) {
12038     NestedNameSpecifierLoc QualifierLoc
12039       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12040     if (!QualifierLoc)
12041       return ExprError();
12042 
12043     SS.Adopt(QualifierLoc);
12044   }
12045 
12046   if (Old->getNamingClass()) {
12047     CXXRecordDecl *NamingClass
12048       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12049                                                             Old->getNameLoc(),
12050                                                         Old->getNamingClass()));
12051     if (!NamingClass) {
12052       R.clear();
12053       return ExprError();
12054     }
12055 
12056     R.setNamingClass(NamingClass);
12057   }
12058 
12059   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12060 
12061   // If we have neither explicit template arguments, nor the template keyword,
12062   // it's a normal declaration name or member reference.
12063   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12064     NamedDecl *D = R.getAsSingle<NamedDecl>();
12065     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12066     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12067     // give a good diagnostic.
12068     if (D && D->isCXXInstanceMember()) {
12069       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12070                                                      /*TemplateArgs=*/nullptr,
12071                                                      /*Scope=*/nullptr);
12072     }
12073 
12074     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12075   }
12076 
12077   // If we have template arguments, rebuild them, then rebuild the
12078   // templateid expression.
12079   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12080   if (Old->hasExplicitTemplateArgs() &&
12081       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12082                                               Old->getNumTemplateArgs(),
12083                                               TransArgs)) {
12084     R.clear();
12085     return ExprError();
12086   }
12087 
12088   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12089                                             Old->requiresADL(), &TransArgs);
12090 }
12091 
12092 template<typename Derived>
12093 ExprResult
12094 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12095   bool ArgChanged = false;
12096   SmallVector<TypeSourceInfo *, 4> Args;
12097   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12098     TypeSourceInfo *From = E->getArg(I);
12099     TypeLoc FromTL = From->getTypeLoc();
12100     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12101       TypeLocBuilder TLB;
12102       TLB.reserve(FromTL.getFullDataSize());
12103       QualType To = getDerived().TransformType(TLB, FromTL);
12104       if (To.isNull())
12105         return ExprError();
12106 
12107       if (To == From->getType())
12108         Args.push_back(From);
12109       else {
12110         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12111         ArgChanged = true;
12112       }
12113       continue;
12114     }
12115 
12116     ArgChanged = true;
12117 
12118     // We have a pack expansion. Instantiate it.
12119     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12120     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12121     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12122     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12123 
12124     // Determine whether the set of unexpanded parameter packs can and should
12125     // be expanded.
12126     bool Expand = true;
12127     bool RetainExpansion = false;
12128     Optional<unsigned> OrigNumExpansions =
12129         ExpansionTL.getTypePtr()->getNumExpansions();
12130     Optional<unsigned> NumExpansions = OrigNumExpansions;
12131     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12132                                              PatternTL.getSourceRange(),
12133                                              Unexpanded,
12134                                              Expand, RetainExpansion,
12135                                              NumExpansions))
12136       return ExprError();
12137 
12138     if (!Expand) {
12139       // The transform has determined that we should perform a simple
12140       // transformation on the pack expansion, producing another pack
12141       // expansion.
12142       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12143 
12144       TypeLocBuilder TLB;
12145       TLB.reserve(From->getTypeLoc().getFullDataSize());
12146 
12147       QualType To = getDerived().TransformType(TLB, PatternTL);
12148       if (To.isNull())
12149         return ExprError();
12150 
12151       To = getDerived().RebuildPackExpansionType(To,
12152                                                  PatternTL.getSourceRange(),
12153                                                  ExpansionTL.getEllipsisLoc(),
12154                                                  NumExpansions);
12155       if (To.isNull())
12156         return ExprError();
12157 
12158       PackExpansionTypeLoc ToExpansionTL
12159         = TLB.push<PackExpansionTypeLoc>(To);
12160       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12161       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12162       continue;
12163     }
12164 
12165     // Expand the pack expansion by substituting for each argument in the
12166     // pack(s).
12167     for (unsigned I = 0; I != *NumExpansions; ++I) {
12168       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12169       TypeLocBuilder TLB;
12170       TLB.reserve(PatternTL.getFullDataSize());
12171       QualType To = getDerived().TransformType(TLB, PatternTL);
12172       if (To.isNull())
12173         return ExprError();
12174 
12175       if (To->containsUnexpandedParameterPack()) {
12176         To = getDerived().RebuildPackExpansionType(To,
12177                                                    PatternTL.getSourceRange(),
12178                                                    ExpansionTL.getEllipsisLoc(),
12179                                                    NumExpansions);
12180         if (To.isNull())
12181           return ExprError();
12182 
12183         PackExpansionTypeLoc ToExpansionTL
12184           = TLB.push<PackExpansionTypeLoc>(To);
12185         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12186       }
12187 
12188       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12189     }
12190 
12191     if (!RetainExpansion)
12192       continue;
12193 
12194     // If we're supposed to retain a pack expansion, do so by temporarily
12195     // forgetting the partially-substituted parameter pack.
12196     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12197 
12198     TypeLocBuilder TLB;
12199     TLB.reserve(From->getTypeLoc().getFullDataSize());
12200 
12201     QualType To = getDerived().TransformType(TLB, PatternTL);
12202     if (To.isNull())
12203       return ExprError();
12204 
12205     To = getDerived().RebuildPackExpansionType(To,
12206                                                PatternTL.getSourceRange(),
12207                                                ExpansionTL.getEllipsisLoc(),
12208                                                NumExpansions);
12209     if (To.isNull())
12210       return ExprError();
12211 
12212     PackExpansionTypeLoc ToExpansionTL
12213       = TLB.push<PackExpansionTypeLoc>(To);
12214     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12215     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12216   }
12217 
12218   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12219     return E;
12220 
12221   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12222                                        E->getEndLoc());
12223 }
12224 
12225 template<typename Derived>
12226 ExprResult
12227 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12228                                                  ConceptSpecializationExpr *E) {
12229   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12230   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12231   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12232                                               Old->NumTemplateArgs, TransArgs))
12233     return ExprError();
12234 
12235   return getDerived().RebuildConceptSpecializationExpr(
12236       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12237       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12238       &TransArgs);
12239 }
12240 
12241 template<typename Derived>
12242 ExprResult
12243 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12244   SmallVector<ParmVarDecl*, 4> TransParams;
12245   SmallVector<QualType, 4> TransParamTypes;
12246   Sema::ExtParameterInfoBuilder ExtParamInfos;
12247 
12248   // C++2a [expr.prim.req]p2
12249   // Expressions appearing within a requirement-body are unevaluated operands.
12250   EnterExpressionEvaluationContext Ctx(
12251       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12252 
12253   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12254       getSema().Context, getSema().CurContext,
12255       E->getBody()->getBeginLoc());
12256 
12257   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12258 
12259   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12260                                                E->getLocalParameters(),
12261                                                /*ParamTypes=*/nullptr,
12262                                                /*ParamInfos=*/nullptr,
12263                                                TransParamTypes, &TransParams,
12264                                                ExtParamInfos))
12265     return ExprError();
12266 
12267   for (ParmVarDecl *Param : TransParams)
12268     Param->setDeclContext(Body);
12269 
12270   SmallVector<concepts::Requirement *, 4> TransReqs;
12271   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12272                                                      TransReqs))
12273     return ExprError();
12274 
12275   for (concepts::Requirement *Req : TransReqs) {
12276     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12277       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12278         ER->getReturnTypeRequirement()
12279                 .getTypeConstraintTemplateParameterList()->getParam(0)
12280                 ->setDeclContext(Body);
12281       }
12282     }
12283   }
12284 
12285   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12286                                           TransParams, TransReqs,
12287                                           E->getRBraceLoc());
12288 }
12289 
12290 template<typename Derived>
12291 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12292     ArrayRef<concepts::Requirement *> Reqs,
12293     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12294   for (concepts::Requirement *Req : Reqs) {
12295     concepts::Requirement *TransReq = nullptr;
12296     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12297       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12298     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12299       TransReq = getDerived().TransformExprRequirement(ExprReq);
12300     else
12301       TransReq = getDerived().TransformNestedRequirement(
12302                      cast<concepts::NestedRequirement>(Req));
12303     if (!TransReq)
12304       return true;
12305     Transformed.push_back(TransReq);
12306   }
12307   return false;
12308 }
12309 
12310 template<typename Derived>
12311 concepts::TypeRequirement *
12312 TreeTransform<Derived>::TransformTypeRequirement(
12313     concepts::TypeRequirement *Req) {
12314   if (Req->isSubstitutionFailure()) {
12315     if (getDerived().AlwaysRebuild())
12316       return getDerived().RebuildTypeRequirement(
12317               Req->getSubstitutionDiagnostic());
12318     return Req;
12319   }
12320   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12321   if (!TransType)
12322     return nullptr;
12323   return getDerived().RebuildTypeRequirement(TransType);
12324 }
12325 
12326 template<typename Derived>
12327 concepts::ExprRequirement *
12328 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12329   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12330   if (Req->isExprSubstitutionFailure())
12331     TransExpr = Req->getExprSubstitutionDiagnostic();
12332   else {
12333     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12334     if (TransExprRes.isInvalid())
12335       return nullptr;
12336     TransExpr = TransExprRes.get();
12337   }
12338 
12339   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12340   const auto &RetReq = Req->getReturnTypeRequirement();
12341   if (RetReq.isEmpty())
12342     TransRetReq.emplace();
12343   else if (RetReq.isSubstitutionFailure())
12344     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12345   else if (RetReq.isTypeConstraint()) {
12346     TemplateParameterList *OrigTPL =
12347         RetReq.getTypeConstraintTemplateParameterList();
12348     TemplateParameterList *TPL =
12349         getDerived().TransformTemplateParameterList(OrigTPL);
12350     if (!TPL)
12351       return nullptr;
12352     TransRetReq.emplace(TPL);
12353   }
12354   assert(TransRetReq.hasValue() &&
12355          "All code paths leading here must set TransRetReq");
12356   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12357     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12358                                                Req->getNoexceptLoc(),
12359                                                std::move(*TransRetReq));
12360   return getDerived().RebuildExprRequirement(
12361       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12362       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12363 }
12364 
12365 template<typename Derived>
12366 concepts::NestedRequirement *
12367 TreeTransform<Derived>::TransformNestedRequirement(
12368     concepts::NestedRequirement *Req) {
12369   if (Req->isSubstitutionFailure()) {
12370     if (getDerived().AlwaysRebuild())
12371       return getDerived().RebuildNestedRequirement(
12372           Req->getSubstitutionDiagnostic());
12373     return Req;
12374   }
12375   ExprResult TransConstraint =
12376       getDerived().TransformExpr(Req->getConstraintExpr());
12377   if (TransConstraint.isInvalid())
12378     return nullptr;
12379   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12380 }
12381 
12382 template<typename Derived>
12383 ExprResult
12384 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12385   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12386   if (!T)
12387     return ExprError();
12388 
12389   if (!getDerived().AlwaysRebuild() &&
12390       T == E->getQueriedTypeSourceInfo())
12391     return E;
12392 
12393   ExprResult SubExpr;
12394   {
12395     EnterExpressionEvaluationContext Unevaluated(
12396         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12397     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12398     if (SubExpr.isInvalid())
12399       return ExprError();
12400 
12401     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12402       return E;
12403   }
12404 
12405   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12406                                             SubExpr.get(), E->getEndLoc());
12407 }
12408 
12409 template<typename Derived>
12410 ExprResult
12411 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12412   ExprResult SubExpr;
12413   {
12414     EnterExpressionEvaluationContext Unevaluated(
12415         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12416     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12417     if (SubExpr.isInvalid())
12418       return ExprError();
12419 
12420     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12421       return E;
12422   }
12423 
12424   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12425                                              SubExpr.get(), E->getEndLoc());
12426 }
12427 
12428 template <typename Derived>
12429 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12430     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12431     TypeSourceInfo **RecoveryTSI) {
12432   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12433       DRE, AddrTaken, RecoveryTSI);
12434 
12435   // Propagate both errors and recovered types, which return ExprEmpty.
12436   if (!NewDRE.isUsable())
12437     return NewDRE;
12438 
12439   // We got an expr, wrap it up in parens.
12440   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12441     return PE;
12442   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12443                                        PE->getRParen());
12444 }
12445 
12446 template <typename Derived>
12447 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12448     DependentScopeDeclRefExpr *E) {
12449   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12450                                             nullptr);
12451 }
12452 
12453 template<typename Derived>
12454 ExprResult
12455 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12456                                                DependentScopeDeclRefExpr *E,
12457                                                bool IsAddressOfOperand,
12458                                                TypeSourceInfo **RecoveryTSI) {
12459   assert(E->getQualifierLoc());
12460   NestedNameSpecifierLoc QualifierLoc
12461   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12462   if (!QualifierLoc)
12463     return ExprError();
12464   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12465 
12466   // TODO: If this is a conversion-function-id, verify that the
12467   // destination type name (if present) resolves the same way after
12468   // instantiation as it did in the local scope.
12469 
12470   DeclarationNameInfo NameInfo
12471     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12472   if (!NameInfo.getName())
12473     return ExprError();
12474 
12475   if (!E->hasExplicitTemplateArgs()) {
12476     if (!getDerived().AlwaysRebuild() &&
12477         QualifierLoc == E->getQualifierLoc() &&
12478         // Note: it is sufficient to compare the Name component of NameInfo:
12479         // if name has not changed, DNLoc has not changed either.
12480         NameInfo.getName() == E->getDeclName())
12481       return E;
12482 
12483     return getDerived().RebuildDependentScopeDeclRefExpr(
12484         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12485         IsAddressOfOperand, RecoveryTSI);
12486   }
12487 
12488   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12489   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12490                                               E->getNumTemplateArgs(),
12491                                               TransArgs))
12492     return ExprError();
12493 
12494   return getDerived().RebuildDependentScopeDeclRefExpr(
12495       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12496       RecoveryTSI);
12497 }
12498 
12499 template<typename Derived>
12500 ExprResult
12501 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12502   // CXXConstructExprs other than for list-initialization and
12503   // CXXTemporaryObjectExpr are always implicit, so when we have
12504   // a 1-argument construction we just transform that argument.
12505   if (getDerived().AllowSkippingCXXConstructExpr() &&
12506       ((E->getNumArgs() == 1 ||
12507         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12508        (!getDerived().DropCallArgument(E->getArg(0))) &&
12509        !E->isListInitialization()))
12510     return getDerived().TransformInitializer(E->getArg(0),
12511                                              /*DirectInit*/ false);
12512 
12513   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12514 
12515   QualType T = getDerived().TransformType(E->getType());
12516   if (T.isNull())
12517     return ExprError();
12518 
12519   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12520       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12521   if (!Constructor)
12522     return ExprError();
12523 
12524   bool ArgumentChanged = false;
12525   SmallVector<Expr*, 8> Args;
12526   {
12527     EnterExpressionEvaluationContext Context(
12528         getSema(), EnterExpressionEvaluationContext::InitList,
12529         E->isListInitialization());
12530     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12531                                     &ArgumentChanged))
12532       return ExprError();
12533   }
12534 
12535   if (!getDerived().AlwaysRebuild() &&
12536       T == E->getType() &&
12537       Constructor == E->getConstructor() &&
12538       !ArgumentChanged) {
12539     // Mark the constructor as referenced.
12540     // FIXME: Instantiation-specific
12541     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12542     return E;
12543   }
12544 
12545   return getDerived().RebuildCXXConstructExpr(
12546       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12547       E->hadMultipleCandidates(), E->isListInitialization(),
12548       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12549       E->getConstructionKind(), E->getParenOrBraceRange());
12550 }
12551 
12552 template<typename Derived>
12553 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12554     CXXInheritedCtorInitExpr *E) {
12555   QualType T = getDerived().TransformType(E->getType());
12556   if (T.isNull())
12557     return ExprError();
12558 
12559   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12560       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12561   if (!Constructor)
12562     return ExprError();
12563 
12564   if (!getDerived().AlwaysRebuild() &&
12565       T == E->getType() &&
12566       Constructor == E->getConstructor()) {
12567     // Mark the constructor as referenced.
12568     // FIXME: Instantiation-specific
12569     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12570     return E;
12571   }
12572 
12573   return getDerived().RebuildCXXInheritedCtorInitExpr(
12574       T, E->getLocation(), Constructor,
12575       E->constructsVBase(), E->inheritedFromVBase());
12576 }
12577 
12578 /// Transform a C++ temporary-binding expression.
12579 ///
12580 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12581 /// transform the subexpression and return that.
12582 template<typename Derived>
12583 ExprResult
12584 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12585   return getDerived().TransformExpr(E->getSubExpr());
12586 }
12587 
12588 /// Transform a C++ expression that contains cleanups that should
12589 /// be run after the expression is evaluated.
12590 ///
12591 /// Since ExprWithCleanups nodes are implicitly generated, we
12592 /// just transform the subexpression and return that.
12593 template<typename Derived>
12594 ExprResult
12595 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12596   return getDerived().TransformExpr(E->getSubExpr());
12597 }
12598 
12599 template<typename Derived>
12600 ExprResult
12601 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12602                                                     CXXTemporaryObjectExpr *E) {
12603   TypeSourceInfo *T =
12604       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12605   if (!T)
12606     return ExprError();
12607 
12608   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12609       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12610   if (!Constructor)
12611     return ExprError();
12612 
12613   bool ArgumentChanged = false;
12614   SmallVector<Expr*, 8> Args;
12615   Args.reserve(E->getNumArgs());
12616   {
12617     EnterExpressionEvaluationContext Context(
12618         getSema(), EnterExpressionEvaluationContext::InitList,
12619         E->isListInitialization());
12620     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12621                        &ArgumentChanged))
12622       return ExprError();
12623   }
12624 
12625   if (!getDerived().AlwaysRebuild() &&
12626       T == E->getTypeSourceInfo() &&
12627       Constructor == E->getConstructor() &&
12628       !ArgumentChanged) {
12629     // FIXME: Instantiation-specific
12630     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12631     return SemaRef.MaybeBindToTemporary(E);
12632   }
12633 
12634   // FIXME: We should just pass E->isListInitialization(), but we're not
12635   // prepared to handle list-initialization without a child InitListExpr.
12636   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12637   return getDerived().RebuildCXXTemporaryObjectExpr(
12638       T, LParenLoc, Args, E->getEndLoc(),
12639       /*ListInitialization=*/LParenLoc.isInvalid());
12640 }
12641 
12642 template<typename Derived>
12643 ExprResult
12644 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12645   // Transform any init-capture expressions before entering the scope of the
12646   // lambda body, because they are not semantically within that scope.
12647   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12648   struct TransformedInitCapture {
12649     // The location of the ... if the result is retaining a pack expansion.
12650     SourceLocation EllipsisLoc;
12651     // Zero or more expansions of the init-capture.
12652     SmallVector<InitCaptureInfoTy, 4> Expansions;
12653   };
12654   SmallVector<TransformedInitCapture, 4> InitCaptures;
12655   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12656   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12657                                     CEnd = E->capture_end();
12658        C != CEnd; ++C) {
12659     if (!E->isInitCapture(C))
12660       continue;
12661 
12662     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12663     VarDecl *OldVD = C->getCapturedVar();
12664 
12665     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12666                                 Optional<unsigned> NumExpansions) {
12667       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12668           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12669 
12670       if (NewExprInitResult.isInvalid()) {
12671         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12672         return;
12673       }
12674       Expr *NewExprInit = NewExprInitResult.get();
12675 
12676       QualType NewInitCaptureType =
12677           getSema().buildLambdaInitCaptureInitialization(
12678               C->getLocation(), OldVD->getType()->isReferenceType(),
12679               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12680               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12681               NewExprInit);
12682       Result.Expansions.push_back(
12683           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12684     };
12685 
12686     // If this is an init-capture pack, consider expanding the pack now.
12687     if (OldVD->isParameterPack()) {
12688       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12689                                              ->getTypeLoc()
12690                                              .castAs<PackExpansionTypeLoc>();
12691       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12692       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12693 
12694       // Determine whether the set of unexpanded parameter packs can and should
12695       // be expanded.
12696       bool Expand = true;
12697       bool RetainExpansion = false;
12698       Optional<unsigned> OrigNumExpansions =
12699           ExpansionTL.getTypePtr()->getNumExpansions();
12700       Optional<unsigned> NumExpansions = OrigNumExpansions;
12701       if (getDerived().TryExpandParameterPacks(
12702               ExpansionTL.getEllipsisLoc(),
12703               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12704               RetainExpansion, NumExpansions))
12705         return ExprError();
12706       if (Expand) {
12707         for (unsigned I = 0; I != *NumExpansions; ++I) {
12708           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12709           SubstInitCapture(SourceLocation(), None);
12710         }
12711       }
12712       if (!Expand || RetainExpansion) {
12713         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12714         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12715         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12716       }
12717     } else {
12718       SubstInitCapture(SourceLocation(), None);
12719     }
12720   }
12721 
12722   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12723   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12724 
12725   // Transform the template parameters, and add them to the current
12726   // instantiation scope. The null case is handled correctly.
12727   auto TPL = getDerived().TransformTemplateParameterList(
12728       E->getTemplateParameterList());
12729   LSI->GLTemplateParameterList = TPL;
12730 
12731   // Transform the type of the original lambda's call operator.
12732   // The transformation MUST be done in the CurrentInstantiationScope since
12733   // it introduces a mapping of the original to the newly created
12734   // transformed parameters.
12735   TypeSourceInfo *NewCallOpTSI = nullptr;
12736   {
12737     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12738     FunctionProtoTypeLoc OldCallOpFPTL =
12739         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12740 
12741     TypeLocBuilder NewCallOpTLBuilder;
12742     SmallVector<QualType, 4> ExceptionStorage;
12743     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12744     QualType NewCallOpType = TransformFunctionProtoType(
12745         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12746         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12747           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12748                                               ExceptionStorage, Changed);
12749         });
12750     if (NewCallOpType.isNull())
12751       return ExprError();
12752     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12753                                                         NewCallOpType);
12754   }
12755 
12756   // Transform the trailing requires clause
12757   ExprResult NewTrailingRequiresClause;
12758   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12759     // FIXME: Concepts: Substitution into requires clause should only happen
12760     //                  when checking satisfaction.
12761     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12762 
12763   // Create the local class that will describe the lambda.
12764   // FIXME: KnownDependent below is wrong when substituting inside a templated
12765   // context that isn't a DeclContext (such as a variable template).
12766   CXXRecordDecl *OldClass = E->getLambdaClass();
12767   CXXRecordDecl *Class
12768     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12769                                         NewCallOpTSI,
12770                                         /*KnownDependent=*/false,
12771                                         E->getCaptureDefault());
12772   getDerived().transformedLocalDecl(OldClass, {Class});
12773 
12774   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12775   if (getDerived().ReplacingOriginal())
12776     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12777                                OldClass->getLambdaManglingNumber(),
12778                                OldClass->getDeviceLambdaManglingNumber(),
12779                                OldClass->getLambdaContextDecl());
12780 
12781   // Build the call operator.
12782   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12783       Class, E->getIntroducerRange(), NewCallOpTSI,
12784       E->getCallOperator()->getEndLoc(),
12785       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12786       E->getCallOperator()->getConstexprKind(),
12787       NewTrailingRequiresClause.get());
12788 
12789   LSI->CallOperator = NewCallOperator;
12790 
12791   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12792   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12793 
12794   // Number the lambda for linkage purposes if necessary.
12795   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12796 
12797   // Introduce the context of the call operator.
12798   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12799                                  /*NewThisContext*/false);
12800 
12801   // Enter the scope of the lambda.
12802   getSema().buildLambdaScope(LSI, NewCallOperator,
12803                              E->getIntroducerRange(),
12804                              E->getCaptureDefault(),
12805                              E->getCaptureDefaultLoc(),
12806                              E->hasExplicitParameters(),
12807                              E->hasExplicitResultType(),
12808                              E->isMutable());
12809 
12810   bool Invalid = false;
12811 
12812   // Transform captures.
12813   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12814                                  CEnd = E->capture_end();
12815        C != CEnd; ++C) {
12816     // When we hit the first implicit capture, tell Sema that we've finished
12817     // the list of explicit captures.
12818     if (C->isImplicit())
12819       break;
12820 
12821     // Capturing 'this' is trivial.
12822     if (C->capturesThis()) {
12823       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12824                                     /*BuildAndDiagnose*/ true, nullptr,
12825                                     C->getCaptureKind() == LCK_StarThis);
12826       continue;
12827     }
12828     // Captured expression will be recaptured during captured variables
12829     // rebuilding.
12830     if (C->capturesVLAType())
12831       continue;
12832 
12833     // Rebuild init-captures, including the implied field declaration.
12834     if (E->isInitCapture(C)) {
12835       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12836 
12837       VarDecl *OldVD = C->getCapturedVar();
12838       llvm::SmallVector<Decl*, 4> NewVDs;
12839 
12840       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12841         ExprResult Init = Info.first;
12842         QualType InitQualType = Info.second;
12843         if (Init.isInvalid() || InitQualType.isNull()) {
12844           Invalid = true;
12845           break;
12846         }
12847         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12848             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12849             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12850         if (!NewVD) {
12851           Invalid = true;
12852           break;
12853         }
12854         NewVDs.push_back(NewVD);
12855         getSema().addInitCapture(LSI, NewVD);
12856       }
12857 
12858       if (Invalid)
12859         break;
12860 
12861       getDerived().transformedLocalDecl(OldVD, NewVDs);
12862       continue;
12863     }
12864 
12865     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12866 
12867     // Determine the capture kind for Sema.
12868     Sema::TryCaptureKind Kind
12869       = C->isImplicit()? Sema::TryCapture_Implicit
12870                        : C->getCaptureKind() == LCK_ByCopy
12871                            ? Sema::TryCapture_ExplicitByVal
12872                            : Sema::TryCapture_ExplicitByRef;
12873     SourceLocation EllipsisLoc;
12874     if (C->isPackExpansion()) {
12875       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12876       bool ShouldExpand = false;
12877       bool RetainExpansion = false;
12878       Optional<unsigned> NumExpansions;
12879       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12880                                                C->getLocation(),
12881                                                Unexpanded,
12882                                                ShouldExpand, RetainExpansion,
12883                                                NumExpansions)) {
12884         Invalid = true;
12885         continue;
12886       }
12887 
12888       if (ShouldExpand) {
12889         // The transform has determined that we should perform an expansion;
12890         // transform and capture each of the arguments.
12891         // expansion of the pattern. Do so.
12892         VarDecl *Pack = C->getCapturedVar();
12893         for (unsigned I = 0; I != *NumExpansions; ++I) {
12894           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12895           VarDecl *CapturedVar
12896             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12897                                                                Pack));
12898           if (!CapturedVar) {
12899             Invalid = true;
12900             continue;
12901           }
12902 
12903           // Capture the transformed variable.
12904           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12905         }
12906 
12907         // FIXME: Retain a pack expansion if RetainExpansion is true.
12908 
12909         continue;
12910       }
12911 
12912       EllipsisLoc = C->getEllipsisLoc();
12913     }
12914 
12915     // Transform the captured variable.
12916     VarDecl *CapturedVar
12917       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12918                                                          C->getCapturedVar()));
12919     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12920       Invalid = true;
12921       continue;
12922     }
12923 
12924     // Capture the transformed variable.
12925     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12926                                  EllipsisLoc);
12927   }
12928   getSema().finishLambdaExplicitCaptures(LSI);
12929 
12930   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12931   // evaluation context even if we're not transforming the function body.
12932   getSema().PushExpressionEvaluationContext(
12933       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12934 
12935   // Instantiate the body of the lambda expression.
12936   StmtResult Body =
12937       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12938 
12939   // ActOnLambda* will pop the function scope for us.
12940   FuncScopeCleanup.disable();
12941 
12942   if (Body.isInvalid()) {
12943     SavedContext.pop();
12944     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12945                                /*IsInstantiation=*/true);
12946     return ExprError();
12947   }
12948 
12949   // Copy the LSI before ActOnFinishFunctionBody removes it.
12950   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12951   // the call operator.
12952   auto LSICopy = *LSI;
12953   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12954                                     /*IsInstantiation*/ true);
12955   SavedContext.pop();
12956 
12957   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12958                                    &LSICopy);
12959 }
12960 
12961 template<typename Derived>
12962 StmtResult
12963 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12964   return TransformStmt(S);
12965 }
12966 
12967 template<typename Derived>
12968 StmtResult
12969 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12970   // Transform captures.
12971   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12972                                  CEnd = E->capture_end();
12973        C != CEnd; ++C) {
12974     // When we hit the first implicit capture, tell Sema that we've finished
12975     // the list of explicit captures.
12976     if (!C->isImplicit())
12977       continue;
12978 
12979     // Capturing 'this' is trivial.
12980     if (C->capturesThis()) {
12981       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12982                                     /*BuildAndDiagnose*/ true, nullptr,
12983                                     C->getCaptureKind() == LCK_StarThis);
12984       continue;
12985     }
12986     // Captured expression will be recaptured during captured variables
12987     // rebuilding.
12988     if (C->capturesVLAType())
12989       continue;
12990 
12991     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12992     assert(!E->isInitCapture(C) && "implicit init-capture?");
12993 
12994     // Transform the captured variable.
12995     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12996         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12997     if (!CapturedVar || CapturedVar->isInvalidDecl())
12998       return StmtError();
12999 
13000     // Capture the transformed variable.
13001     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13002   }
13003 
13004   return S;
13005 }
13006 
13007 template<typename Derived>
13008 ExprResult
13009 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13010                                                   CXXUnresolvedConstructExpr *E) {
13011   TypeSourceInfo *T =
13012       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13013   if (!T)
13014     return ExprError();
13015 
13016   bool ArgumentChanged = false;
13017   SmallVector<Expr*, 8> Args;
13018   Args.reserve(E->getNumArgs());
13019   {
13020     EnterExpressionEvaluationContext Context(
13021         getSema(), EnterExpressionEvaluationContext::InitList,
13022         E->isListInitialization());
13023     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13024                                     &ArgumentChanged))
13025       return ExprError();
13026   }
13027 
13028   if (!getDerived().AlwaysRebuild() &&
13029       T == E->getTypeSourceInfo() &&
13030       !ArgumentChanged)
13031     return E;
13032 
13033   // FIXME: we're faking the locations of the commas
13034   return getDerived().RebuildCXXUnresolvedConstructExpr(
13035       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13036 }
13037 
13038 template<typename Derived>
13039 ExprResult
13040 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13041                                              CXXDependentScopeMemberExpr *E) {
13042   // Transform the base of the expression.
13043   ExprResult Base((Expr*) nullptr);
13044   Expr *OldBase;
13045   QualType BaseType;
13046   QualType ObjectType;
13047   if (!E->isImplicitAccess()) {
13048     OldBase = E->getBase();
13049     Base = getDerived().TransformExpr(OldBase);
13050     if (Base.isInvalid())
13051       return ExprError();
13052 
13053     // Start the member reference and compute the object's type.
13054     ParsedType ObjectTy;
13055     bool MayBePseudoDestructor = false;
13056     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13057                                                 E->getOperatorLoc(),
13058                                       E->isArrow()? tok::arrow : tok::period,
13059                                                 ObjectTy,
13060                                                 MayBePseudoDestructor);
13061     if (Base.isInvalid())
13062       return ExprError();
13063 
13064     ObjectType = ObjectTy.get();
13065     BaseType = ((Expr*) Base.get())->getType();
13066   } else {
13067     OldBase = nullptr;
13068     BaseType = getDerived().TransformType(E->getBaseType());
13069     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13070   }
13071 
13072   // Transform the first part of the nested-name-specifier that qualifies
13073   // the member name.
13074   NamedDecl *FirstQualifierInScope
13075     = getDerived().TransformFirstQualifierInScope(
13076                                             E->getFirstQualifierFoundInScope(),
13077                                             E->getQualifierLoc().getBeginLoc());
13078 
13079   NestedNameSpecifierLoc QualifierLoc;
13080   if (E->getQualifier()) {
13081     QualifierLoc
13082       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13083                                                      ObjectType,
13084                                                      FirstQualifierInScope);
13085     if (!QualifierLoc)
13086       return ExprError();
13087   }
13088 
13089   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13090 
13091   // TODO: If this is a conversion-function-id, verify that the
13092   // destination type name (if present) resolves the same way after
13093   // instantiation as it did in the local scope.
13094 
13095   DeclarationNameInfo NameInfo
13096     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13097   if (!NameInfo.getName())
13098     return ExprError();
13099 
13100   if (!E->hasExplicitTemplateArgs()) {
13101     // This is a reference to a member without an explicitly-specified
13102     // template argument list. Optimize for this common case.
13103     if (!getDerived().AlwaysRebuild() &&
13104         Base.get() == OldBase &&
13105         BaseType == E->getBaseType() &&
13106         QualifierLoc == E->getQualifierLoc() &&
13107         NameInfo.getName() == E->getMember() &&
13108         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13109       return E;
13110 
13111     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13112                                                        BaseType,
13113                                                        E->isArrow(),
13114                                                        E->getOperatorLoc(),
13115                                                        QualifierLoc,
13116                                                        TemplateKWLoc,
13117                                                        FirstQualifierInScope,
13118                                                        NameInfo,
13119                                                        /*TemplateArgs*/nullptr);
13120   }
13121 
13122   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13123   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13124                                               E->getNumTemplateArgs(),
13125                                               TransArgs))
13126     return ExprError();
13127 
13128   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13129                                                      BaseType,
13130                                                      E->isArrow(),
13131                                                      E->getOperatorLoc(),
13132                                                      QualifierLoc,
13133                                                      TemplateKWLoc,
13134                                                      FirstQualifierInScope,
13135                                                      NameInfo,
13136                                                      &TransArgs);
13137 }
13138 
13139 template<typename Derived>
13140 ExprResult
13141 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
13142   // Transform the base of the expression.
13143   ExprResult Base((Expr*) nullptr);
13144   QualType BaseType;
13145   if (!Old->isImplicitAccess()) {
13146     Base = getDerived().TransformExpr(Old->getBase());
13147     if (Base.isInvalid())
13148       return ExprError();
13149     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
13150                                                      Old->isArrow());
13151     if (Base.isInvalid())
13152       return ExprError();
13153     BaseType = Base.get()->getType();
13154   } else {
13155     BaseType = getDerived().TransformType(Old->getBaseType());
13156   }
13157 
13158   NestedNameSpecifierLoc QualifierLoc;
13159   if (Old->getQualifierLoc()) {
13160     QualifierLoc
13161     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13162     if (!QualifierLoc)
13163       return ExprError();
13164   }
13165 
13166   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13167 
13168   LookupResult R(SemaRef, Old->getMemberNameInfo(),
13169                  Sema::LookupOrdinaryName);
13170 
13171   // Transform the declaration set.
13172   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
13173     return ExprError();
13174 
13175   // Determine the naming class.
13176   if (Old->getNamingClass()) {
13177     CXXRecordDecl *NamingClass
13178       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
13179                                                           Old->getMemberLoc(),
13180                                                         Old->getNamingClass()));
13181     if (!NamingClass)
13182       return ExprError();
13183 
13184     R.setNamingClass(NamingClass);
13185   }
13186 
13187   TemplateArgumentListInfo TransArgs;
13188   if (Old->hasExplicitTemplateArgs()) {
13189     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13190     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13191     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
13192                                                 Old->getNumTemplateArgs(),
13193                                                 TransArgs))
13194       return ExprError();
13195   }
13196 
13197   // FIXME: to do this check properly, we will need to preserve the
13198   // first-qualifier-in-scope here, just in case we had a dependent
13199   // base (and therefore couldn't do the check) and a
13200   // nested-name-qualifier (and therefore could do the lookup).
13201   NamedDecl *FirstQualifierInScope = nullptr;
13202 
13203   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
13204                                                   BaseType,
13205                                                   Old->getOperatorLoc(),
13206                                                   Old->isArrow(),
13207                                                   QualifierLoc,
13208                                                   TemplateKWLoc,
13209                                                   FirstQualifierInScope,
13210                                                   R,
13211                                               (Old->hasExplicitTemplateArgs()
13212                                                   ? &TransArgs : nullptr));
13213 }
13214 
13215 template<typename Derived>
13216 ExprResult
13217 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13218   EnterExpressionEvaluationContext Unevaluated(
13219       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13220   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13221   if (SubExpr.isInvalid())
13222     return ExprError();
13223 
13224   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13225     return E;
13226 
13227   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13228 }
13229 
13230 template<typename Derived>
13231 ExprResult
13232 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13233   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13234   if (Pattern.isInvalid())
13235     return ExprError();
13236 
13237   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13238     return E;
13239 
13240   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13241                                            E->getNumExpansions());
13242 }
13243 
13244 template<typename Derived>
13245 ExprResult
13246 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13247   // If E is not value-dependent, then nothing will change when we transform it.
13248   // Note: This is an instantiation-centric view.
13249   if (!E->isValueDependent())
13250     return E;
13251 
13252   EnterExpressionEvaluationContext Unevaluated(
13253       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13254 
13255   ArrayRef<TemplateArgument> PackArgs;
13256   TemplateArgument ArgStorage;
13257 
13258   // Find the argument list to transform.
13259   if (E->isPartiallySubstituted()) {
13260     PackArgs = E->getPartialArguments();
13261   } else if (E->isValueDependent()) {
13262     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13263     bool ShouldExpand = false;
13264     bool RetainExpansion = false;
13265     Optional<unsigned> NumExpansions;
13266     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13267                                              Unexpanded,
13268                                              ShouldExpand, RetainExpansion,
13269                                              NumExpansions))
13270       return ExprError();
13271 
13272     // If we need to expand the pack, build a template argument from it and
13273     // expand that.
13274     if (ShouldExpand) {
13275       auto *Pack = E->getPack();
13276       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13277         ArgStorage = getSema().Context.getPackExpansionType(
13278             getSema().Context.getTypeDeclType(TTPD), None);
13279       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13280         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13281       } else {
13282         auto *VD = cast<ValueDecl>(Pack);
13283         ExprResult DRE = getSema().BuildDeclRefExpr(
13284             VD, VD->getType().getNonLValueExprType(getSema().Context),
13285             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
13286             E->getPackLoc());
13287         if (DRE.isInvalid())
13288           return ExprError();
13289         ArgStorage = new (getSema().Context) PackExpansionExpr(
13290             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13291       }
13292       PackArgs = ArgStorage;
13293     }
13294   }
13295 
13296   // If we're not expanding the pack, just transform the decl.
13297   if (!PackArgs.size()) {
13298     auto *Pack = cast_or_null<NamedDecl>(
13299         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13300     if (!Pack)
13301       return ExprError();
13302     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13303                                               E->getPackLoc(),
13304                                               E->getRParenLoc(), None, None);
13305   }
13306 
13307   // Try to compute the result without performing a partial substitution.
13308   Optional<unsigned> Result = 0;
13309   for (const TemplateArgument &Arg : PackArgs) {
13310     if (!Arg.isPackExpansion()) {
13311       Result = *Result + 1;
13312       continue;
13313     }
13314 
13315     TemplateArgumentLoc ArgLoc;
13316     InventTemplateArgumentLoc(Arg, ArgLoc);
13317 
13318     // Find the pattern of the pack expansion.
13319     SourceLocation Ellipsis;
13320     Optional<unsigned> OrigNumExpansions;
13321     TemplateArgumentLoc Pattern =
13322         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13323                                                           OrigNumExpansions);
13324 
13325     // Substitute under the pack expansion. Do not expand the pack (yet).
13326     TemplateArgumentLoc OutPattern;
13327     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13328     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13329                                                /*Uneval*/ true))
13330       return true;
13331 
13332     // See if we can determine the number of arguments from the result.
13333     Optional<unsigned> NumExpansions =
13334         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13335     if (!NumExpansions) {
13336       // No: we must be in an alias template expansion, and we're going to need
13337       // to actually expand the packs.
13338       Result = None;
13339       break;
13340     }
13341 
13342     Result = *Result + *NumExpansions;
13343   }
13344 
13345   // Common case: we could determine the number of expansions without
13346   // substituting.
13347   if (Result)
13348     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13349                                               E->getPackLoc(),
13350                                               E->getRParenLoc(), *Result, None);
13351 
13352   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13353                                                E->getPackLoc());
13354   {
13355     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13356     typedef TemplateArgumentLocInventIterator<
13357         Derived, const TemplateArgument*> PackLocIterator;
13358     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13359                                    PackLocIterator(*this, PackArgs.end()),
13360                                    TransformedPackArgs, /*Uneval*/true))
13361       return ExprError();
13362   }
13363 
13364   // Check whether we managed to fully-expand the pack.
13365   // FIXME: Is it possible for us to do so and not hit the early exit path?
13366   SmallVector<TemplateArgument, 8> Args;
13367   bool PartialSubstitution = false;
13368   for (auto &Loc : TransformedPackArgs.arguments()) {
13369     Args.push_back(Loc.getArgument());
13370     if (Loc.getArgument().isPackExpansion())
13371       PartialSubstitution = true;
13372   }
13373 
13374   if (PartialSubstitution)
13375     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13376                                               E->getPackLoc(),
13377                                               E->getRParenLoc(), None, Args);
13378 
13379   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13380                                             E->getPackLoc(), E->getRParenLoc(),
13381                                             Args.size(), None);
13382 }
13383 
13384 template<typename Derived>
13385 ExprResult
13386 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13387                                           SubstNonTypeTemplateParmPackExpr *E) {
13388   // Default behavior is to do nothing with this transformation.
13389   return E;
13390 }
13391 
13392 template<typename Derived>
13393 ExprResult
13394 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13395                                           SubstNonTypeTemplateParmExpr *E) {
13396   // Default behavior is to do nothing with this transformation.
13397   return E;
13398 }
13399 
13400 template<typename Derived>
13401 ExprResult
13402 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13403   // Default behavior is to do nothing with this transformation.
13404   return E;
13405 }
13406 
13407 template<typename Derived>
13408 ExprResult
13409 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13410                                                   MaterializeTemporaryExpr *E) {
13411   return getDerived().TransformExpr(E->getSubExpr());
13412 }
13413 
13414 template<typename Derived>
13415 ExprResult
13416 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13417   UnresolvedLookupExpr *Callee = nullptr;
13418   if (Expr *OldCallee = E->getCallee()) {
13419     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13420     if (CalleeResult.isInvalid())
13421       return ExprError();
13422     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13423   }
13424 
13425   Expr *Pattern = E->getPattern();
13426 
13427   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13428   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13429   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13430 
13431   // Determine whether the set of unexpanded parameter packs can and should
13432   // be expanded.
13433   bool Expand = true;
13434   bool RetainExpansion = false;
13435   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13436                      NumExpansions = OrigNumExpansions;
13437   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13438                                            Pattern->getSourceRange(),
13439                                            Unexpanded,
13440                                            Expand, RetainExpansion,
13441                                            NumExpansions))
13442     return true;
13443 
13444   if (!Expand) {
13445     // Do not expand any packs here, just transform and rebuild a fold
13446     // expression.
13447     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13448 
13449     ExprResult LHS =
13450         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13451     if (LHS.isInvalid())
13452       return true;
13453 
13454     ExprResult RHS =
13455         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13456     if (RHS.isInvalid())
13457       return true;
13458 
13459     if (!getDerived().AlwaysRebuild() &&
13460         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13461       return E;
13462 
13463     return getDerived().RebuildCXXFoldExpr(
13464         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13465         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13466   }
13467 
13468   // Formally a fold expression expands to nested parenthesized expressions.
13469   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13470   // them.
13471   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13472     SemaRef.Diag(E->getEllipsisLoc(),
13473                  clang::diag::err_fold_expression_limit_exceeded)
13474         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13475         << E->getSourceRange();
13476     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13477     return ExprError();
13478   }
13479 
13480   // The transform has determined that we should perform an elementwise
13481   // expansion of the pattern. Do so.
13482   ExprResult Result = getDerived().TransformExpr(E->getInit());
13483   if (Result.isInvalid())
13484     return true;
13485   bool LeftFold = E->isLeftFold();
13486 
13487   // If we're retaining an expansion for a right fold, it is the innermost
13488   // component and takes the init (if any).
13489   if (!LeftFold && RetainExpansion) {
13490     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13491 
13492     ExprResult Out = getDerived().TransformExpr(Pattern);
13493     if (Out.isInvalid())
13494       return true;
13495 
13496     Result = getDerived().RebuildCXXFoldExpr(
13497         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13498         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13499     if (Result.isInvalid())
13500       return true;
13501   }
13502 
13503   for (unsigned I = 0; I != *NumExpansions; ++I) {
13504     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13505         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13506     ExprResult Out = getDerived().TransformExpr(Pattern);
13507     if (Out.isInvalid())
13508       return true;
13509 
13510     if (Out.get()->containsUnexpandedParameterPack()) {
13511       // We still have a pack; retain a pack expansion for this slice.
13512       Result = getDerived().RebuildCXXFoldExpr(
13513           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13514           E->getOperator(), E->getEllipsisLoc(),
13515           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13516           OrigNumExpansions);
13517     } else if (Result.isUsable()) {
13518       // We've got down to a single element; build a binary operator.
13519       Expr *LHS = LeftFold ? Result.get() : Out.get();
13520       Expr *RHS = LeftFold ? Out.get() : Result.get();
13521       if (Callee)
13522         Result = getDerived().RebuildCXXOperatorCallExpr(
13523             BinaryOperator::getOverloadedOperator(E->getOperator()),
13524             E->getEllipsisLoc(), Callee, LHS, RHS);
13525       else
13526         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13527                                                     E->getOperator(), LHS, RHS);
13528     } else
13529       Result = Out;
13530 
13531     if (Result.isInvalid())
13532       return true;
13533   }
13534 
13535   // If we're retaining an expansion for a left fold, it is the outermost
13536   // component and takes the complete expansion so far as its init (if any).
13537   if (LeftFold && RetainExpansion) {
13538     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13539 
13540     ExprResult Out = getDerived().TransformExpr(Pattern);
13541     if (Out.isInvalid())
13542       return true;
13543 
13544     Result = getDerived().RebuildCXXFoldExpr(
13545         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13546         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13547     if (Result.isInvalid())
13548       return true;
13549   }
13550 
13551   // If we had no init and an empty pack, and we're not retaining an expansion,
13552   // then produce a fallback value or error.
13553   if (Result.isUnset())
13554     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13555                                                 E->getOperator());
13556 
13557   return Result;
13558 }
13559 
13560 template<typename Derived>
13561 ExprResult
13562 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13563     CXXStdInitializerListExpr *E) {
13564   return getDerived().TransformExpr(E->getSubExpr());
13565 }
13566 
13567 template<typename Derived>
13568 ExprResult
13569 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13570   return SemaRef.MaybeBindToTemporary(E);
13571 }
13572 
13573 template<typename Derived>
13574 ExprResult
13575 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13576   return E;
13577 }
13578 
13579 template<typename Derived>
13580 ExprResult
13581 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13582   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13583   if (SubExpr.isInvalid())
13584     return ExprError();
13585 
13586   if (!getDerived().AlwaysRebuild() &&
13587       SubExpr.get() == E->getSubExpr())
13588     return E;
13589 
13590   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13591 }
13592 
13593 template<typename Derived>
13594 ExprResult
13595 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13596   // Transform each of the elements.
13597   SmallVector<Expr *, 8> Elements;
13598   bool ArgChanged = false;
13599   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13600                                   /*IsCall=*/false, Elements, &ArgChanged))
13601     return ExprError();
13602 
13603   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13604     return SemaRef.MaybeBindToTemporary(E);
13605 
13606   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13607                                               Elements.data(),
13608                                               Elements.size());
13609 }
13610 
13611 template<typename Derived>
13612 ExprResult
13613 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13614                                                     ObjCDictionaryLiteral *E) {
13615   // Transform each of the elements.
13616   SmallVector<ObjCDictionaryElement, 8> Elements;
13617   bool ArgChanged = false;
13618   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13619     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13620 
13621     if (OrigElement.isPackExpansion()) {
13622       // This key/value element is a pack expansion.
13623       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13624       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13625       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13626       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13627 
13628       // Determine whether the set of unexpanded parameter packs can
13629       // and should be expanded.
13630       bool Expand = true;
13631       bool RetainExpansion = false;
13632       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13633       Optional<unsigned> NumExpansions = OrigNumExpansions;
13634       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13635                                OrigElement.Value->getEndLoc());
13636       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13637                                                PatternRange, Unexpanded, Expand,
13638                                                RetainExpansion, NumExpansions))
13639         return ExprError();
13640 
13641       if (!Expand) {
13642         // The transform has determined that we should perform a simple
13643         // transformation on the pack expansion, producing another pack
13644         // expansion.
13645         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13646         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13647         if (Key.isInvalid())
13648           return ExprError();
13649 
13650         if (Key.get() != OrigElement.Key)
13651           ArgChanged = true;
13652 
13653         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13654         if (Value.isInvalid())
13655           return ExprError();
13656 
13657         if (Value.get() != OrigElement.Value)
13658           ArgChanged = true;
13659 
13660         ObjCDictionaryElement Expansion = {
13661           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13662         };
13663         Elements.push_back(Expansion);
13664         continue;
13665       }
13666 
13667       // Record right away that the argument was changed.  This needs
13668       // to happen even if the array expands to nothing.
13669       ArgChanged = true;
13670 
13671       // The transform has determined that we should perform an elementwise
13672       // expansion of the pattern. Do so.
13673       for (unsigned I = 0; I != *NumExpansions; ++I) {
13674         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13675         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13676         if (Key.isInvalid())
13677           return ExprError();
13678 
13679         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13680         if (Value.isInvalid())
13681           return ExprError();
13682 
13683         ObjCDictionaryElement Element = {
13684           Key.get(), Value.get(), SourceLocation(), NumExpansions
13685         };
13686 
13687         // If any unexpanded parameter packs remain, we still have a
13688         // pack expansion.
13689         // FIXME: Can this really happen?
13690         if (Key.get()->containsUnexpandedParameterPack() ||
13691             Value.get()->containsUnexpandedParameterPack())
13692           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13693 
13694         Elements.push_back(Element);
13695       }
13696 
13697       // FIXME: Retain a pack expansion if RetainExpansion is true.
13698 
13699       // We've finished with this pack expansion.
13700       continue;
13701     }
13702 
13703     // Transform and check key.
13704     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13705     if (Key.isInvalid())
13706       return ExprError();
13707 
13708     if (Key.get() != OrigElement.Key)
13709       ArgChanged = true;
13710 
13711     // Transform and check value.
13712     ExprResult Value
13713       = getDerived().TransformExpr(OrigElement.Value);
13714     if (Value.isInvalid())
13715       return ExprError();
13716 
13717     if (Value.get() != OrigElement.Value)
13718       ArgChanged = true;
13719 
13720     ObjCDictionaryElement Element = {
13721       Key.get(), Value.get(), SourceLocation(), None
13722     };
13723     Elements.push_back(Element);
13724   }
13725 
13726   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13727     return SemaRef.MaybeBindToTemporary(E);
13728 
13729   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13730                                                    Elements);
13731 }
13732 
13733 template<typename Derived>
13734 ExprResult
13735 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13736   TypeSourceInfo *EncodedTypeInfo
13737     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13738   if (!EncodedTypeInfo)
13739     return ExprError();
13740 
13741   if (!getDerived().AlwaysRebuild() &&
13742       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13743     return E;
13744 
13745   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13746                                             EncodedTypeInfo,
13747                                             E->getRParenLoc());
13748 }
13749 
13750 template<typename Derived>
13751 ExprResult TreeTransform<Derived>::
13752 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13753   // This is a kind of implicit conversion, and it needs to get dropped
13754   // and recomputed for the same general reasons that ImplicitCastExprs
13755   // do, as well a more specific one: this expression is only valid when
13756   // it appears *immediately* as an argument expression.
13757   return getDerived().TransformExpr(E->getSubExpr());
13758 }
13759 
13760 template<typename Derived>
13761 ExprResult TreeTransform<Derived>::
13762 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13763   TypeSourceInfo *TSInfo
13764     = getDerived().TransformType(E->getTypeInfoAsWritten());
13765   if (!TSInfo)
13766     return ExprError();
13767 
13768   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13769   if (Result.isInvalid())
13770     return ExprError();
13771 
13772   if (!getDerived().AlwaysRebuild() &&
13773       TSInfo == E->getTypeInfoAsWritten() &&
13774       Result.get() == E->getSubExpr())
13775     return E;
13776 
13777   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13778                                       E->getBridgeKeywordLoc(), TSInfo,
13779                                       Result.get());
13780 }
13781 
13782 template <typename Derived>
13783 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13784     ObjCAvailabilityCheckExpr *E) {
13785   return E;
13786 }
13787 
13788 template<typename Derived>
13789 ExprResult
13790 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13791   // Transform arguments.
13792   bool ArgChanged = false;
13793   SmallVector<Expr*, 8> Args;
13794   Args.reserve(E->getNumArgs());
13795   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13796                                   &ArgChanged))
13797     return ExprError();
13798 
13799   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13800     // Class message: transform the receiver type.
13801     TypeSourceInfo *ReceiverTypeInfo
13802       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13803     if (!ReceiverTypeInfo)
13804       return ExprError();
13805 
13806     // If nothing changed, just retain the existing message send.
13807     if (!getDerived().AlwaysRebuild() &&
13808         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13809       return SemaRef.MaybeBindToTemporary(E);
13810 
13811     // Build a new class message send.
13812     SmallVector<SourceLocation, 16> SelLocs;
13813     E->getSelectorLocs(SelLocs);
13814     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13815                                                E->getSelector(),
13816                                                SelLocs,
13817                                                E->getMethodDecl(),
13818                                                E->getLeftLoc(),
13819                                                Args,
13820                                                E->getRightLoc());
13821   }
13822   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13823            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13824     if (!E->getMethodDecl())
13825       return ExprError();
13826 
13827     // Build a new class message send to 'super'.
13828     SmallVector<SourceLocation, 16> SelLocs;
13829     E->getSelectorLocs(SelLocs);
13830     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13831                                                E->getSelector(),
13832                                                SelLocs,
13833                                                E->getReceiverType(),
13834                                                E->getMethodDecl(),
13835                                                E->getLeftLoc(),
13836                                                Args,
13837                                                E->getRightLoc());
13838   }
13839 
13840   // Instance message: transform the receiver
13841   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13842          "Only class and instance messages may be instantiated");
13843   ExprResult Receiver
13844     = getDerived().TransformExpr(E->getInstanceReceiver());
13845   if (Receiver.isInvalid())
13846     return ExprError();
13847 
13848   // If nothing changed, just retain the existing message send.
13849   if (!getDerived().AlwaysRebuild() &&
13850       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13851     return SemaRef.MaybeBindToTemporary(E);
13852 
13853   // Build a new instance message send.
13854   SmallVector<SourceLocation, 16> SelLocs;
13855   E->getSelectorLocs(SelLocs);
13856   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13857                                              E->getSelector(),
13858                                              SelLocs,
13859                                              E->getMethodDecl(),
13860                                              E->getLeftLoc(),
13861                                              Args,
13862                                              E->getRightLoc());
13863 }
13864 
13865 template<typename Derived>
13866 ExprResult
13867 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13868   return E;
13869 }
13870 
13871 template<typename Derived>
13872 ExprResult
13873 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13874   return E;
13875 }
13876 
13877 template<typename Derived>
13878 ExprResult
13879 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13880   // Transform the base expression.
13881   ExprResult Base = getDerived().TransformExpr(E->getBase());
13882   if (Base.isInvalid())
13883     return ExprError();
13884 
13885   // We don't need to transform the ivar; it will never change.
13886 
13887   // If nothing changed, just retain the existing expression.
13888   if (!getDerived().AlwaysRebuild() &&
13889       Base.get() == E->getBase())
13890     return E;
13891 
13892   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13893                                              E->getLocation(),
13894                                              E->isArrow(), E->isFreeIvar());
13895 }
13896 
13897 template<typename Derived>
13898 ExprResult
13899 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13900   // 'super' and types never change. Property never changes. Just
13901   // retain the existing expression.
13902   if (!E->isObjectReceiver())
13903     return E;
13904 
13905   // Transform the base expression.
13906   ExprResult Base = getDerived().TransformExpr(E->getBase());
13907   if (Base.isInvalid())
13908     return ExprError();
13909 
13910   // We don't need to transform the property; it will never change.
13911 
13912   // If nothing changed, just retain the existing expression.
13913   if (!getDerived().AlwaysRebuild() &&
13914       Base.get() == E->getBase())
13915     return E;
13916 
13917   if (E->isExplicitProperty())
13918     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13919                                                    E->getExplicitProperty(),
13920                                                    E->getLocation());
13921 
13922   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13923                                                  SemaRef.Context.PseudoObjectTy,
13924                                                  E->getImplicitPropertyGetter(),
13925                                                  E->getImplicitPropertySetter(),
13926                                                  E->getLocation());
13927 }
13928 
13929 template<typename Derived>
13930 ExprResult
13931 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13932   // Transform the base expression.
13933   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13934   if (Base.isInvalid())
13935     return ExprError();
13936 
13937   // Transform the key expression.
13938   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13939   if (Key.isInvalid())
13940     return ExprError();
13941 
13942   // If nothing changed, just retain the existing expression.
13943   if (!getDerived().AlwaysRebuild() &&
13944       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13945     return E;
13946 
13947   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13948                                                   Base.get(), Key.get(),
13949                                                   E->getAtIndexMethodDecl(),
13950                                                   E->setAtIndexMethodDecl());
13951 }
13952 
13953 template<typename Derived>
13954 ExprResult
13955 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13956   // Transform the base expression.
13957   ExprResult Base = getDerived().TransformExpr(E->getBase());
13958   if (Base.isInvalid())
13959     return ExprError();
13960 
13961   // If nothing changed, just retain the existing expression.
13962   if (!getDerived().AlwaysRebuild() &&
13963       Base.get() == E->getBase())
13964     return E;
13965 
13966   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13967                                          E->getOpLoc(),
13968                                          E->isArrow());
13969 }
13970 
13971 template<typename Derived>
13972 ExprResult
13973 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13974   bool ArgumentChanged = false;
13975   SmallVector<Expr*, 8> SubExprs;
13976   SubExprs.reserve(E->getNumSubExprs());
13977   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13978                                   SubExprs, &ArgumentChanged))
13979     return ExprError();
13980 
13981   if (!getDerived().AlwaysRebuild() &&
13982       !ArgumentChanged)
13983     return E;
13984 
13985   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13986                                                SubExprs,
13987                                                E->getRParenLoc());
13988 }
13989 
13990 template<typename Derived>
13991 ExprResult
13992 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13993   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13994   if (SrcExpr.isInvalid())
13995     return ExprError();
13996 
13997   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13998   if (!Type)
13999     return ExprError();
14000 
14001   if (!getDerived().AlwaysRebuild() &&
14002       Type == E->getTypeSourceInfo() &&
14003       SrcExpr.get() == E->getSrcExpr())
14004     return E;
14005 
14006   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14007                                                SrcExpr.get(), Type,
14008                                                E->getRParenLoc());
14009 }
14010 
14011 template<typename Derived>
14012 ExprResult
14013 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14014   BlockDecl *oldBlock = E->getBlockDecl();
14015 
14016   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14017   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14018 
14019   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14020   blockScope->TheDecl->setBlockMissingReturnType(
14021                          oldBlock->blockMissingReturnType());
14022 
14023   SmallVector<ParmVarDecl*, 4> params;
14024   SmallVector<QualType, 4> paramTypes;
14025 
14026   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14027 
14028   // Parameter substitution.
14029   Sema::ExtParameterInfoBuilder extParamInfos;
14030   if (getDerived().TransformFunctionTypeParams(
14031           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14032           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14033           extParamInfos)) {
14034     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14035     return ExprError();
14036   }
14037 
14038   QualType exprResultType =
14039       getDerived().TransformType(exprFunctionType->getReturnType());
14040 
14041   auto epi = exprFunctionType->getExtProtoInfo();
14042   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14043 
14044   QualType functionType =
14045     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14046   blockScope->FunctionType = functionType;
14047 
14048   // Set the parameters on the block decl.
14049   if (!params.empty())
14050     blockScope->TheDecl->setParams(params);
14051 
14052   if (!oldBlock->blockMissingReturnType()) {
14053     blockScope->HasImplicitReturnType = false;
14054     blockScope->ReturnType = exprResultType;
14055   }
14056 
14057   // Transform the body
14058   StmtResult body = getDerived().TransformStmt(E->getBody());
14059   if (body.isInvalid()) {
14060     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14061     return ExprError();
14062   }
14063 
14064 #ifndef NDEBUG
14065   // In builds with assertions, make sure that we captured everything we
14066   // captured before.
14067   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14068     for (const auto &I : oldBlock->captures()) {
14069       VarDecl *oldCapture = I.getVariable();
14070 
14071       // Ignore parameter packs.
14072       if (oldCapture->isParameterPack())
14073         continue;
14074 
14075       VarDecl *newCapture =
14076         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14077                                                  oldCapture));
14078       assert(blockScope->CaptureMap.count(newCapture));
14079     }
14080     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14081   }
14082 #endif
14083 
14084   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14085                                     /*Scope=*/nullptr);
14086 }
14087 
14088 template<typename Derived>
14089 ExprResult
14090 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14091   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14092   if (SrcExpr.isInvalid())
14093     return ExprError();
14094 
14095   QualType Type = getDerived().TransformType(E->getType());
14096 
14097   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14098                                  E->getRParenLoc());
14099 }
14100 
14101 template<typename Derived>
14102 ExprResult
14103 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14104   bool ArgumentChanged = false;
14105   SmallVector<Expr*, 8> SubExprs;
14106   SubExprs.reserve(E->getNumSubExprs());
14107   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14108                                   SubExprs, &ArgumentChanged))
14109     return ExprError();
14110 
14111   if (!getDerived().AlwaysRebuild() &&
14112       !ArgumentChanged)
14113     return E;
14114 
14115   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14116                                         E->getOp(), E->getRParenLoc());
14117 }
14118 
14119 //===----------------------------------------------------------------------===//
14120 // Type reconstruction
14121 //===----------------------------------------------------------------------===//
14122 
14123 template<typename Derived>
14124 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14125                                                     SourceLocation Star) {
14126   return SemaRef.BuildPointerType(PointeeType, Star,
14127                                   getDerived().getBaseEntity());
14128 }
14129 
14130 template<typename Derived>
14131 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14132                                                          SourceLocation Star) {
14133   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14134                                        getDerived().getBaseEntity());
14135 }
14136 
14137 template<typename Derived>
14138 QualType
14139 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14140                                              bool WrittenAsLValue,
14141                                              SourceLocation Sigil) {
14142   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14143                                     Sigil, getDerived().getBaseEntity());
14144 }
14145 
14146 template<typename Derived>
14147 QualType
14148 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14149                                                  QualType ClassType,
14150                                                  SourceLocation Sigil) {
14151   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14152                                         getDerived().getBaseEntity());
14153 }
14154 
14155 template<typename Derived>
14156 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14157            const ObjCTypeParamDecl *Decl,
14158            SourceLocation ProtocolLAngleLoc,
14159            ArrayRef<ObjCProtocolDecl *> Protocols,
14160            ArrayRef<SourceLocation> ProtocolLocs,
14161            SourceLocation ProtocolRAngleLoc) {
14162   return SemaRef.BuildObjCTypeParamType(Decl,
14163                                         ProtocolLAngleLoc, Protocols,
14164                                         ProtocolLocs, ProtocolRAngleLoc,
14165                                         /*FailOnError=*/true);
14166 }
14167 
14168 template<typename Derived>
14169 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14170            QualType BaseType,
14171            SourceLocation Loc,
14172            SourceLocation TypeArgsLAngleLoc,
14173            ArrayRef<TypeSourceInfo *> TypeArgs,
14174            SourceLocation TypeArgsRAngleLoc,
14175            SourceLocation ProtocolLAngleLoc,
14176            ArrayRef<ObjCProtocolDecl *> Protocols,
14177            ArrayRef<SourceLocation> ProtocolLocs,
14178            SourceLocation ProtocolRAngleLoc) {
14179   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14180                                      TypeArgs, TypeArgsRAngleLoc,
14181                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14182                                      ProtocolRAngleLoc,
14183                                      /*FailOnError=*/true);
14184 }
14185 
14186 template<typename Derived>
14187 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14188            QualType PointeeType,
14189            SourceLocation Star) {
14190   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14191 }
14192 
14193 template<typename Derived>
14194 QualType
14195 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14196                                          ArrayType::ArraySizeModifier SizeMod,
14197                                          const llvm::APInt *Size,
14198                                          Expr *SizeExpr,
14199                                          unsigned IndexTypeQuals,
14200                                          SourceRange BracketsRange) {
14201   if (SizeExpr || !Size)
14202     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14203                                   IndexTypeQuals, BracketsRange,
14204                                   getDerived().getBaseEntity());
14205 
14206   QualType Types[] = {
14207     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14208     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14209     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14210   };
14211   const unsigned NumTypes = llvm::array_lengthof(Types);
14212   QualType SizeType;
14213   for (unsigned I = 0; I != NumTypes; ++I)
14214     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14215       SizeType = Types[I];
14216       break;
14217     }
14218 
14219   // Note that we can return a VariableArrayType here in the case where
14220   // the element type was a dependent VariableArrayType.
14221   IntegerLiteral *ArraySize
14222       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14223                                /*FIXME*/BracketsRange.getBegin());
14224   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14225                                 IndexTypeQuals, BracketsRange,
14226                                 getDerived().getBaseEntity());
14227 }
14228 
14229 template<typename Derived>
14230 QualType
14231 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14232                                                  ArrayType::ArraySizeModifier SizeMod,
14233                                                  const llvm::APInt &Size,
14234                                                  Expr *SizeExpr,
14235                                                  unsigned IndexTypeQuals,
14236                                                  SourceRange BracketsRange) {
14237   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14238                                         IndexTypeQuals, BracketsRange);
14239 }
14240 
14241 template<typename Derived>
14242 QualType
14243 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14244                                           ArrayType::ArraySizeModifier SizeMod,
14245                                                  unsigned IndexTypeQuals,
14246                                                    SourceRange BracketsRange) {
14247   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14248                                        IndexTypeQuals, BracketsRange);
14249 }
14250 
14251 template<typename Derived>
14252 QualType
14253 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14254                                           ArrayType::ArraySizeModifier SizeMod,
14255                                                  Expr *SizeExpr,
14256                                                  unsigned IndexTypeQuals,
14257                                                  SourceRange BracketsRange) {
14258   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14259                                        SizeExpr,
14260                                        IndexTypeQuals, BracketsRange);
14261 }
14262 
14263 template<typename Derived>
14264 QualType
14265 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14266                                           ArrayType::ArraySizeModifier SizeMod,
14267                                                        Expr *SizeExpr,
14268                                                        unsigned IndexTypeQuals,
14269                                                    SourceRange BracketsRange) {
14270   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14271                                        SizeExpr,
14272                                        IndexTypeQuals, BracketsRange);
14273 }
14274 
14275 template <typename Derived>
14276 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14277     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14278   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14279                                           AttributeLoc);
14280 }
14281 
14282 template <typename Derived>
14283 QualType
14284 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14285                                           unsigned NumElements,
14286                                           VectorType::VectorKind VecKind) {
14287   // FIXME: semantic checking!
14288   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14289 }
14290 
14291 template <typename Derived>
14292 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14293     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14294     VectorType::VectorKind VecKind) {
14295   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14296 }
14297 
14298 template<typename Derived>
14299 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14300                                                       unsigned NumElements,
14301                                                  SourceLocation AttributeLoc) {
14302   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14303                           NumElements, true);
14304   IntegerLiteral *VectorSize
14305     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14306                              AttributeLoc);
14307   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14308 }
14309 
14310 template<typename Derived>
14311 QualType
14312 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14313                                                            Expr *SizeExpr,
14314                                                   SourceLocation AttributeLoc) {
14315   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14316 }
14317 
14318 template <typename Derived>
14319 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14320     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14321   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14322                                                NumColumns);
14323 }
14324 
14325 template <typename Derived>
14326 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14327     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14328     SourceLocation AttributeLoc) {
14329   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14330                                  AttributeLoc);
14331 }
14332 
14333 template<typename Derived>
14334 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14335     QualType T,
14336     MutableArrayRef<QualType> ParamTypes,
14337     const FunctionProtoType::ExtProtoInfo &EPI) {
14338   return SemaRef.BuildFunctionType(T, ParamTypes,
14339                                    getDerived().getBaseLocation(),
14340                                    getDerived().getBaseEntity(),
14341                                    EPI);
14342 }
14343 
14344 template<typename Derived>
14345 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14346   return SemaRef.Context.getFunctionNoProtoType(T);
14347 }
14348 
14349 template<typename Derived>
14350 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14351                                                             Decl *D) {
14352   assert(D && "no decl found");
14353   if (D->isInvalidDecl()) return QualType();
14354 
14355   // FIXME: Doesn't account for ObjCInterfaceDecl!
14356   TypeDecl *Ty;
14357   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14358     // A valid resolved using typename pack expansion decl can have multiple
14359     // UsingDecls, but they must each have exactly one type, and it must be
14360     // the same type in every case. But we must have at least one expansion!
14361     if (UPD->expansions().empty()) {
14362       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14363           << UPD->isCXXClassMember() << UPD;
14364       return QualType();
14365     }
14366 
14367     // We might still have some unresolved types. Try to pick a resolved type
14368     // if we can. The final instantiation will check that the remaining
14369     // unresolved types instantiate to the type we pick.
14370     QualType FallbackT;
14371     QualType T;
14372     for (auto *E : UPD->expansions()) {
14373       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14374       if (ThisT.isNull())
14375         continue;
14376       else if (ThisT->getAs<UnresolvedUsingType>())
14377         FallbackT = ThisT;
14378       else if (T.isNull())
14379         T = ThisT;
14380       else
14381         assert(getSema().Context.hasSameType(ThisT, T) &&
14382                "mismatched resolved types in using pack expansion");
14383     }
14384     return T.isNull() ? FallbackT : T;
14385   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14386     assert(Using->hasTypename() &&
14387            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14388 
14389     // A valid resolved using typename decl points to exactly one type decl.
14390     assert(++Using->shadow_begin() == Using->shadow_end());
14391 
14392     NamedDecl *Target = Using->shadow_begin()->getTargetDecl();
14393     if (SemaRef.DiagnoseUseOfDecl(Target, Loc))
14394       return QualType();
14395     Ty = cast<TypeDecl>(Target);
14396   } else {
14397     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14398            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14399     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14400   }
14401 
14402   return SemaRef.Context.getTypeDeclType(Ty);
14403 }
14404 
14405 template<typename Derived>
14406 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14407                                                        SourceLocation Loc) {
14408   return SemaRef.BuildTypeofExprType(E, Loc);
14409 }
14410 
14411 template<typename Derived>
14412 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14413   return SemaRef.Context.getTypeOfType(Underlying);
14414 }
14415 
14416 template<typename Derived>
14417 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14418                                                      SourceLocation Loc) {
14419   return SemaRef.BuildDecltypeType(E, Loc);
14420 }
14421 
14422 template<typename Derived>
14423 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14424                                             UnaryTransformType::UTTKind UKind,
14425                                             SourceLocation Loc) {
14426   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14427 }
14428 
14429 template<typename Derived>
14430 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14431                                                       TemplateName Template,
14432                                              SourceLocation TemplateNameLoc,
14433                                      TemplateArgumentListInfo &TemplateArgs) {
14434   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14435 }
14436 
14437 template<typename Derived>
14438 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14439                                                    SourceLocation KWLoc) {
14440   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14441 }
14442 
14443 template<typename Derived>
14444 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14445                                                  SourceLocation KWLoc,
14446                                                  bool isReadPipe) {
14447   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14448                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14449 }
14450 
14451 template <typename Derived>
14452 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14453                                                    unsigned NumBits,
14454                                                    SourceLocation Loc) {
14455   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14456                         NumBits, true);
14457   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14458                                                 SemaRef.Context.IntTy, Loc);
14459   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14460 }
14461 
14462 template <typename Derived>
14463 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14464     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14465   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14466 }
14467 
14468 template<typename Derived>
14469 TemplateName
14470 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14471                                             bool TemplateKW,
14472                                             TemplateDecl *Template) {
14473   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14474                                                   Template);
14475 }
14476 
14477 template<typename Derived>
14478 TemplateName
14479 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14480                                             SourceLocation TemplateKWLoc,
14481                                             const IdentifierInfo &Name,
14482                                             SourceLocation NameLoc,
14483                                             QualType ObjectType,
14484                                             NamedDecl *FirstQualifierInScope,
14485                                             bool AllowInjectedClassName) {
14486   UnqualifiedId TemplateName;
14487   TemplateName.setIdentifier(&Name, NameLoc);
14488   Sema::TemplateTy Template;
14489   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14490                               TemplateName, ParsedType::make(ObjectType),
14491                               /*EnteringContext=*/false, Template,
14492                               AllowInjectedClassName);
14493   return Template.get();
14494 }
14495 
14496 template<typename Derived>
14497 TemplateName
14498 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14499                                             SourceLocation TemplateKWLoc,
14500                                             OverloadedOperatorKind Operator,
14501                                             SourceLocation NameLoc,
14502                                             QualType ObjectType,
14503                                             bool AllowInjectedClassName) {
14504   UnqualifiedId Name;
14505   // FIXME: Bogus location information.
14506   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14507   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14508   Sema::TemplateTy Template;
14509   getSema().ActOnTemplateName(
14510       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14511       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14512   return Template.get();
14513 }
14514 
14515 template<typename Derived>
14516 ExprResult
14517 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14518                                                    SourceLocation OpLoc,
14519                                                    Expr *OrigCallee,
14520                                                    Expr *First,
14521                                                    Expr *Second) {
14522   Expr *Callee = OrigCallee->IgnoreParenCasts();
14523   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14524 
14525   if (First->getObjectKind() == OK_ObjCProperty) {
14526     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14527     if (BinaryOperator::isAssignmentOp(Opc))
14528       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14529                                                  First, Second);
14530     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14531     if (Result.isInvalid())
14532       return ExprError();
14533     First = Result.get();
14534   }
14535 
14536   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14537     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14538     if (Result.isInvalid())
14539       return ExprError();
14540     Second = Result.get();
14541   }
14542 
14543   // Determine whether this should be a builtin operation.
14544   if (Op == OO_Subscript) {
14545     if (!First->getType()->isOverloadableType() &&
14546         !Second->getType()->isOverloadableType())
14547       return getSema().CreateBuiltinArraySubscriptExpr(
14548           First, Callee->getBeginLoc(), Second, OpLoc);
14549   } else if (Op == OO_Arrow) {
14550     // -> is never a builtin operation.
14551     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14552   } else if (Second == nullptr || isPostIncDec) {
14553     if (!First->getType()->isOverloadableType() ||
14554         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14555       // The argument is not of overloadable type, or this is an expression
14556       // of the form &Class::member, so try to create a built-in unary
14557       // operation.
14558       UnaryOperatorKind Opc
14559         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14560 
14561       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14562     }
14563   } else {
14564     if (!First->getType()->isOverloadableType() &&
14565         !Second->getType()->isOverloadableType()) {
14566       // Neither of the arguments is an overloadable type, so try to
14567       // create a built-in binary operation.
14568       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14569       ExprResult Result
14570         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14571       if (Result.isInvalid())
14572         return ExprError();
14573 
14574       return Result;
14575     }
14576   }
14577 
14578   // Compute the transformed set of functions (and function templates) to be
14579   // used during overload resolution.
14580   UnresolvedSet<16> Functions;
14581   bool RequiresADL;
14582 
14583   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14584     Functions.append(ULE->decls_begin(), ULE->decls_end());
14585     // If the overload could not be resolved in the template definition
14586     // (because we had a dependent argument), ADL is performed as part of
14587     // template instantiation.
14588     RequiresADL = ULE->requiresADL();
14589   } else {
14590     // If we've resolved this to a particular non-member function, just call
14591     // that function. If we resolved it to a member function,
14592     // CreateOverloaded* will find that function for us.
14593     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14594     if (!isa<CXXMethodDecl>(ND))
14595       Functions.addDecl(ND);
14596     RequiresADL = false;
14597   }
14598 
14599   // Add any functions found via argument-dependent lookup.
14600   Expr *Args[2] = { First, Second };
14601   unsigned NumArgs = 1 + (Second != nullptr);
14602 
14603   // Create the overloaded operator invocation for unary operators.
14604   if (NumArgs == 1 || isPostIncDec) {
14605     UnaryOperatorKind Opc
14606       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14607     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14608                                            RequiresADL);
14609   }
14610 
14611   if (Op == OO_Subscript) {
14612     SourceLocation LBrace;
14613     SourceLocation RBrace;
14614 
14615     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14616       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14617       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14618       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14619     } else {
14620       LBrace = Callee->getBeginLoc();
14621       RBrace = OpLoc;
14622     }
14623 
14624     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14625                                                       First, Second);
14626   }
14627 
14628   // Create the overloaded operator invocation for binary operators.
14629   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14630   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14631       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14632   if (Result.isInvalid())
14633     return ExprError();
14634 
14635   return Result;
14636 }
14637 
14638 template<typename Derived>
14639 ExprResult
14640 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14641                                                      SourceLocation OperatorLoc,
14642                                                        bool isArrow,
14643                                                        CXXScopeSpec &SS,
14644                                                      TypeSourceInfo *ScopeType,
14645                                                        SourceLocation CCLoc,
14646                                                        SourceLocation TildeLoc,
14647                                         PseudoDestructorTypeStorage Destroyed) {
14648   QualType BaseType = Base->getType();
14649   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14650       (!isArrow && !BaseType->getAs<RecordType>()) ||
14651       (isArrow && BaseType->getAs<PointerType>() &&
14652        !BaseType->castAs<PointerType>()->getPointeeType()
14653                                               ->template getAs<RecordType>())){
14654     // This pseudo-destructor expression is still a pseudo-destructor.
14655     return SemaRef.BuildPseudoDestructorExpr(
14656         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14657         CCLoc, TildeLoc, Destroyed);
14658   }
14659 
14660   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14661   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14662                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14663   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14664   NameInfo.setNamedTypeInfo(DestroyedType);
14665 
14666   // The scope type is now known to be a valid nested name specifier
14667   // component. Tack it on to the end of the nested name specifier.
14668   if (ScopeType) {
14669     if (!ScopeType->getType()->getAs<TagType>()) {
14670       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14671                      diag::err_expected_class_or_namespace)
14672           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14673       return ExprError();
14674     }
14675     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14676               CCLoc);
14677   }
14678 
14679   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14680   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14681                                             OperatorLoc, isArrow,
14682                                             SS, TemplateKWLoc,
14683                                             /*FIXME: FirstQualifier*/ nullptr,
14684                                             NameInfo,
14685                                             /*TemplateArgs*/ nullptr,
14686                                             /*S*/nullptr);
14687 }
14688 
14689 template<typename Derived>
14690 StmtResult
14691 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14692   SourceLocation Loc = S->getBeginLoc();
14693   CapturedDecl *CD = S->getCapturedDecl();
14694   unsigned NumParams = CD->getNumParams();
14695   unsigned ContextParamPos = CD->getContextParamPosition();
14696   SmallVector<Sema::CapturedParamNameType, 4> Params;
14697   for (unsigned I = 0; I < NumParams; ++I) {
14698     if (I != ContextParamPos) {
14699       Params.push_back(
14700              std::make_pair(
14701                   CD->getParam(I)->getName(),
14702                   getDerived().TransformType(CD->getParam(I)->getType())));
14703     } else {
14704       Params.push_back(std::make_pair(StringRef(), QualType()));
14705     }
14706   }
14707   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14708                                      S->getCapturedRegionKind(), Params);
14709   StmtResult Body;
14710   {
14711     Sema::CompoundScopeRAII CompoundScope(getSema());
14712     Body = getDerived().TransformStmt(S->getCapturedStmt());
14713   }
14714 
14715   if (Body.isInvalid()) {
14716     getSema().ActOnCapturedRegionError();
14717     return StmtError();
14718   }
14719 
14720   return getSema().ActOnCapturedRegionEnd(Body.get());
14721 }
14722 
14723 } // end namespace clang
14724 
14725 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14726