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/OpenMPKinds.h"
32 #include "clang/Sema/Designator.h"
33 #include "clang/Sema/Lookup.h"
34 #include "clang/Sema/Ownership.h"
35 #include "clang/Sema/ParsedTemplate.h"
36 #include "clang/Sema/ScopeInfo.h"
37 #include "clang/Sema/SemaDiagnostic.h"
38 #include "clang/Sema/SemaInternal.h"
39 #include "llvm/ADT/ArrayRef.h"
40 #include "llvm/Support/ErrorHandling.h"
41 #include <algorithm>
42 
43 using namespace llvm::omp;
44 
45 namespace clang {
46 using namespace sema;
47 
48 /// A semantic tree transformation that allows one to transform one
49 /// abstract syntax tree into another.
50 ///
51 /// A new tree transformation is defined by creating a new subclass \c X of
52 /// \c TreeTransform<X> and then overriding certain operations to provide
53 /// behavior specific to that transformation. For example, template
54 /// instantiation is implemented as a tree transformation where the
55 /// transformation of TemplateTypeParmType nodes involves substituting the
56 /// template arguments for their corresponding template parameters; a similar
57 /// transformation is performed for non-type template parameters and
58 /// template template parameters.
59 ///
60 /// This tree-transformation template uses static polymorphism to allow
61 /// subclasses to customize any of its operations. Thus, a subclass can
62 /// override any of the transformation or rebuild operators by providing an
63 /// operation with the same signature as the default implementation. The
64 /// overriding function should not be virtual.
65 ///
66 /// Semantic tree transformations are split into two stages, either of which
67 /// can be replaced by a subclass. The "transform" step transforms an AST node
68 /// or the parts of an AST node using the various transformation functions,
69 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
70 /// node of the appropriate kind from the pieces. The default transformation
71 /// routines recursively transform the operands to composite AST nodes (e.g.,
72 /// the pointee type of a PointerType node) and, if any of those operand nodes
73 /// were changed by the transformation, invokes the rebuild operation to create
74 /// a new AST node.
75 ///
76 /// Subclasses can customize the transformation at various levels. The
77 /// most coarse-grained transformations involve replacing TransformType(),
78 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
79 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
80 /// new implementations.
81 ///
82 /// For more fine-grained transformations, subclasses can replace any of the
83 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
84 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
85 /// replacing TransformTemplateTypeParmType() allows template instantiation
86 /// to substitute template arguments for their corresponding template
87 /// parameters. Additionally, subclasses can override the \c RebuildXXX
88 /// functions to control how AST nodes are rebuilt when their operands change.
89 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
90 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
91 /// be able to use more efficient rebuild steps.
92 ///
93 /// There are a handful of other functions that can be overridden, allowing one
94 /// to avoid traversing nodes that don't need any transformation
95 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
96 /// operands have not changed (\c AlwaysRebuild()), and customize the
97 /// default locations and entity names used for type-checking
98 /// (\c getBaseLocation(), \c getBaseEntity()).
99 template<typename Derived>
100 class TreeTransform {
101   /// Private RAII object that helps us forget and then re-remember
102   /// the template argument corresponding to a partially-substituted parameter
103   /// pack.
104   class ForgetPartiallySubstitutedPackRAII {
105     Derived &Self;
106     TemplateArgument Old;
107 
108   public:
109     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
110       Old = Self.ForgetPartiallySubstitutedPack();
111     }
112 
113     ~ForgetPartiallySubstitutedPackRAII() {
114       Self.RememberPartiallySubstitutedPack(Old);
115     }
116   };
117 
118 protected:
119   Sema &SemaRef;
120 
121   /// The set of local declarations that have been transformed, for
122   /// cases where we are forced to build new declarations within the transformer
123   /// rather than in the subclass (e.g., lambda closure types).
124   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
125 
126 public:
127   /// Initializes a new tree transformer.
128   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
129 
130   /// Retrieves a reference to the derived class.
131   Derived &getDerived() { return static_cast<Derived&>(*this); }
132 
133   /// Retrieves a reference to the derived class.
134   const Derived &getDerived() const {
135     return static_cast<const Derived&>(*this);
136   }
137 
138   static inline ExprResult Owned(Expr *E) { return E; }
139   static inline StmtResult Owned(Stmt *S) { return S; }
140 
141   /// Retrieves a reference to the semantic analysis object used for
142   /// this tree transform.
143   Sema &getSema() const { return SemaRef; }
144 
145   /// Whether the transformation should always rebuild AST nodes, even
146   /// if none of the children have changed.
147   ///
148   /// Subclasses may override this function to specify when the transformation
149   /// should rebuild all AST nodes.
150   ///
151   /// We must always rebuild all AST nodes when performing variadic template
152   /// pack expansion, in order to avoid violating the AST invariant that each
153   /// statement node appears at most once in its containing declaration.
154   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
155 
156   /// Whether the transformation is forming an expression or statement that
157   /// replaces the original. In this case, we'll reuse mangling numbers from
158   /// existing lambdas.
159   bool ReplacingOriginal() { return false; }
160 
161   /// Wether CXXConstructExpr can be skipped when they are implicit.
162   /// They will be reconstructed when used if needed.
163   /// This is usefull when the user that cause rebuilding of the
164   /// CXXConstructExpr is outside of the expression at which the TreeTransform
165   /// started.
166   bool AllowSkippingCXXConstructExpr() { return true; }
167 
168   /// Returns the location of the entity being transformed, if that
169   /// information was not available elsewhere in the AST.
170   ///
171   /// By default, returns no source-location information. Subclasses can
172   /// provide an alternative implementation that provides better location
173   /// information.
174   SourceLocation getBaseLocation() { return SourceLocation(); }
175 
176   /// Returns the name of the entity being transformed, if that
177   /// information was not available elsewhere in the AST.
178   ///
179   /// By default, returns an empty name. Subclasses can provide an alternative
180   /// implementation with a more precise name.
181   DeclarationName getBaseEntity() { return DeclarationName(); }
182 
183   /// Sets the "base" location and entity when that
184   /// information is known based on another transformation.
185   ///
186   /// By default, the source location and entity are ignored. Subclasses can
187   /// override this function to provide a customized implementation.
188   void setBase(SourceLocation Loc, DeclarationName Entity) { }
189 
190   /// RAII object that temporarily sets the base location and entity
191   /// used for reporting diagnostics in types.
192   class TemporaryBase {
193     TreeTransform &Self;
194     SourceLocation OldLocation;
195     DeclarationName OldEntity;
196 
197   public:
198     TemporaryBase(TreeTransform &Self, SourceLocation Location,
199                   DeclarationName Entity) : Self(Self) {
200       OldLocation = Self.getDerived().getBaseLocation();
201       OldEntity = Self.getDerived().getBaseEntity();
202 
203       if (Location.isValid())
204         Self.getDerived().setBase(Location, Entity);
205     }
206 
207     ~TemporaryBase() {
208       Self.getDerived().setBase(OldLocation, OldEntity);
209     }
210   };
211 
212   /// Determine whether the given type \p T has already been
213   /// transformed.
214   ///
215   /// Subclasses can provide an alternative implementation of this routine
216   /// to short-circuit evaluation when it is known that a given type will
217   /// not change. For example, template instantiation need not traverse
218   /// non-dependent types.
219   bool AlreadyTransformed(QualType T) {
220     return T.isNull();
221   }
222 
223   /// Transform a template parameter depth level.
224   ///
225   /// During a transformation that transforms template parameters, this maps
226   /// an old template parameter depth to a new depth.
227   unsigned TransformTemplateDepth(unsigned Depth) {
228     return Depth;
229   }
230 
231   /// Determine whether the given call argument should be dropped, e.g.,
232   /// because it is a default argument.
233   ///
234   /// Subclasses can provide an alternative implementation of this routine to
235   /// determine which kinds of call arguments get dropped. By default,
236   /// CXXDefaultArgument nodes are dropped (prior to transformation).
237   bool DropCallArgument(Expr *E) {
238     return E->isDefaultArgument();
239   }
240 
241   /// Determine whether we should expand a pack expansion with the
242   /// given set of parameter packs into separate arguments by repeatedly
243   /// transforming the pattern.
244   ///
245   /// By default, the transformer never tries to expand pack expansions.
246   /// Subclasses can override this routine to provide different behavior.
247   ///
248   /// \param EllipsisLoc The location of the ellipsis that identifies the
249   /// pack expansion.
250   ///
251   /// \param PatternRange The source range that covers the entire pattern of
252   /// the pack expansion.
253   ///
254   /// \param Unexpanded The set of unexpanded parameter packs within the
255   /// pattern.
256   ///
257   /// \param ShouldExpand Will be set to \c true if the transformer should
258   /// expand the corresponding pack expansions into separate arguments. When
259   /// set, \c NumExpansions must also be set.
260   ///
261   /// \param RetainExpansion Whether the caller should add an unexpanded
262   /// pack expansion after all of the expanded arguments. This is used
263   /// when extending explicitly-specified template argument packs per
264   /// C++0x [temp.arg.explicit]p9.
265   ///
266   /// \param NumExpansions The number of separate arguments that will be in
267   /// the expanded form of the corresponding pack expansion. This is both an
268   /// input and an output parameter, which can be set by the caller if the
269   /// number of expansions is known a priori (e.g., due to a prior substitution)
270   /// and will be set by the callee when the number of expansions is known.
271   /// The callee must set this value when \c ShouldExpand is \c true; it may
272   /// set this value in other cases.
273   ///
274   /// \returns true if an error occurred (e.g., because the parameter packs
275   /// are to be instantiated with arguments of different lengths), false
276   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
277   /// must be set.
278   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
279                                SourceRange PatternRange,
280                                ArrayRef<UnexpandedParameterPack> Unexpanded,
281                                bool &ShouldExpand,
282                                bool &RetainExpansion,
283                                Optional<unsigned> &NumExpansions) {
284     ShouldExpand = false;
285     return false;
286   }
287 
288   /// "Forget" about the partially-substituted pack template argument,
289   /// when performing an instantiation that must preserve the parameter pack
290   /// use.
291   ///
292   /// This routine is meant to be overridden by the template instantiator.
293   TemplateArgument ForgetPartiallySubstitutedPack() {
294     return TemplateArgument();
295   }
296 
297   /// "Remember" the partially-substituted pack template argument
298   /// after performing an instantiation that must preserve the parameter pack
299   /// use.
300   ///
301   /// This routine is meant to be overridden by the template instantiator.
302   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
303 
304   /// Note to the derived class when a function parameter pack is
305   /// being expanded.
306   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
307 
308   /// Transforms the given type into another type.
309   ///
310   /// By default, this routine transforms a type by creating a
311   /// TypeSourceInfo for it and delegating to the appropriate
312   /// function.  This is expensive, but we don't mind, because
313   /// this method is deprecated anyway;  all users should be
314   /// switched to storing TypeSourceInfos.
315   ///
316   /// \returns the transformed type.
317   QualType TransformType(QualType T);
318 
319   /// Transforms the given type-with-location into a new
320   /// type-with-location.
321   ///
322   /// By default, this routine transforms a type by delegating to the
323   /// appropriate TransformXXXType to build a new type.  Subclasses
324   /// may override this function (to take over all type
325   /// transformations) or some set of the TransformXXXType functions
326   /// to alter the transformation.
327   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
328 
329   /// Transform the given type-with-location into a new
330   /// type, collecting location information in the given builder
331   /// as necessary.
332   ///
333   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
334 
335   /// Transform a type that is permitted to produce a
336   /// DeducedTemplateSpecializationType.
337   ///
338   /// This is used in the (relatively rare) contexts where it is acceptable
339   /// for transformation to produce a class template type with deduced
340   /// template arguments.
341   /// @{
342   QualType TransformTypeWithDeducedTST(QualType T);
343   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
344   /// @}
345 
346   /// The reason why the value of a statement is not discarded, if any.
347   enum StmtDiscardKind {
348     SDK_Discarded,
349     SDK_NotDiscarded,
350     SDK_StmtExprResult,
351   };
352 
353   /// Transform the given statement.
354   ///
355   /// By default, this routine transforms a statement by delegating to the
356   /// appropriate TransformXXXStmt function to transform a specific kind of
357   /// statement or the TransformExpr() function to transform an expression.
358   /// Subclasses may override this function to transform statements using some
359   /// other mechanism.
360   ///
361   /// \returns the transformed statement.
362   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
363 
364   /// Transform the given statement.
365   ///
366   /// By default, this routine transforms a statement by delegating to the
367   /// appropriate TransformOMPXXXClause function to transform a specific kind
368   /// of clause. Subclasses may override this function to transform statements
369   /// using some other mechanism.
370   ///
371   /// \returns the transformed OpenMP clause.
372   OMPClause *TransformOMPClause(OMPClause *S);
373 
374   /// Transform the given attribute.
375   ///
376   /// By default, this routine transforms a statement by delegating to the
377   /// appropriate TransformXXXAttr function to transform a specific kind
378   /// of attribute. Subclasses may override this function to transform
379   /// attributed statements using some other mechanism.
380   ///
381   /// \returns the transformed attribute
382   const Attr *TransformAttr(const Attr *S);
383 
384 /// Transform the specified attribute.
385 ///
386 /// Subclasses should override the transformation of attributes with a pragma
387 /// spelling to transform expressions stored within the attribute.
388 ///
389 /// \returns the transformed attribute.
390 #define ATTR(X)
391 #define PRAGMA_SPELLING_ATTR(X)                                                \
392   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
393 #include "clang/Basic/AttrList.inc"
394 
395   /// Transform the given expression.
396   ///
397   /// By default, this routine transforms an expression by delegating to the
398   /// appropriate TransformXXXExpr function to build a new expression.
399   /// Subclasses may override this function to transform expressions using some
400   /// other mechanism.
401   ///
402   /// \returns the transformed expression.
403   ExprResult TransformExpr(Expr *E);
404 
405   /// Transform the given initializer.
406   ///
407   /// By default, this routine transforms an initializer by stripping off the
408   /// semantic nodes added by initialization, then passing the result to
409   /// TransformExpr or TransformExprs.
410   ///
411   /// \returns the transformed initializer.
412   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
413 
414   /// Transform the given list of expressions.
415   ///
416   /// This routine transforms a list of expressions by invoking
417   /// \c TransformExpr() for each subexpression. However, it also provides
418   /// support for variadic templates by expanding any pack expansions (if the
419   /// derived class permits such expansion) along the way. When pack expansions
420   /// are present, the number of outputs may not equal the number of inputs.
421   ///
422   /// \param Inputs The set of expressions to be transformed.
423   ///
424   /// \param NumInputs The number of expressions in \c Inputs.
425   ///
426   /// \param IsCall If \c true, then this transform is being performed on
427   /// function-call arguments, and any arguments that should be dropped, will
428   /// be.
429   ///
430   /// \param Outputs The transformed input expressions will be added to this
431   /// vector.
432   ///
433   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
434   /// due to transformation.
435   ///
436   /// \returns true if an error occurred, false otherwise.
437   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
438                       SmallVectorImpl<Expr *> &Outputs,
439                       bool *ArgChanged = nullptr);
440 
441   /// Transform the given declaration, which is referenced from a type
442   /// or expression.
443   ///
444   /// By default, acts as the identity function on declarations, unless the
445   /// transformer has had to transform the declaration itself. Subclasses
446   /// may override this function to provide alternate behavior.
447   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
448     llvm::DenseMap<Decl *, Decl *>::iterator Known
449       = TransformedLocalDecls.find(D);
450     if (Known != TransformedLocalDecls.end())
451       return Known->second;
452 
453     return D;
454   }
455 
456   /// Transform the specified condition.
457   ///
458   /// By default, this transforms the variable and expression and rebuilds
459   /// the condition.
460   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
461                                            Expr *Expr,
462                                            Sema::ConditionKind Kind);
463 
464   /// Transform the attributes associated with the given declaration and
465   /// place them on the new declaration.
466   ///
467   /// By default, this operation does nothing. Subclasses may override this
468   /// behavior to transform attributes.
469   void transformAttrs(Decl *Old, Decl *New) { }
470 
471   /// Note that a local declaration has been transformed by this
472   /// transformer.
473   ///
474   /// Local declarations are typically transformed via a call to
475   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
476   /// the transformer itself has to transform the declarations. This routine
477   /// can be overridden by a subclass that keeps track of such mappings.
478   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
479     assert(New.size() == 1 &&
480            "must override transformedLocalDecl if performing pack expansion");
481     TransformedLocalDecls[Old] = New.front();
482   }
483 
484   /// Transform the definition of the given declaration.
485   ///
486   /// By default, invokes TransformDecl() to transform the declaration.
487   /// Subclasses may override this function to provide alternate behavior.
488   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
489     return getDerived().TransformDecl(Loc, D);
490   }
491 
492   /// Transform the given declaration, which was the first part of a
493   /// nested-name-specifier in a member access expression.
494   ///
495   /// This specific declaration transformation only applies to the first
496   /// identifier in a nested-name-specifier of a member access expression, e.g.,
497   /// the \c T in \c x->T::member
498   ///
499   /// By default, invokes TransformDecl() to transform the declaration.
500   /// Subclasses may override this function to provide alternate behavior.
501   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
502     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
503   }
504 
505   /// Transform the set of declarations in an OverloadExpr.
506   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
507                                   LookupResult &R);
508 
509   /// Transform the given nested-name-specifier with source-location
510   /// information.
511   ///
512   /// By default, transforms all of the types and declarations within the
513   /// nested-name-specifier. Subclasses may override this function to provide
514   /// alternate behavior.
515   NestedNameSpecifierLoc
516   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
517                                   QualType ObjectType = QualType(),
518                                   NamedDecl *FirstQualifierInScope = nullptr);
519 
520   /// Transform the given declaration name.
521   ///
522   /// By default, transforms the types of conversion function, constructor,
523   /// and destructor names and then (if needed) rebuilds the declaration name.
524   /// Identifiers and selectors are returned unmodified. Sublcasses may
525   /// override this function to provide alternate behavior.
526   DeclarationNameInfo
527   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
528 
529   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
530       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
531   concepts::TypeRequirement *
532   TransformTypeRequirement(concepts::TypeRequirement *Req);
533   concepts::ExprRequirement *
534   TransformExprRequirement(concepts::ExprRequirement *Req);
535   concepts::NestedRequirement *
536   TransformNestedRequirement(concepts::NestedRequirement *Req);
537 
538   /// Transform the given template name.
539   ///
540   /// \param SS The nested-name-specifier that qualifies the template
541   /// name. This nested-name-specifier must already have been transformed.
542   ///
543   /// \param Name The template name to transform.
544   ///
545   /// \param NameLoc The source location of the template name.
546   ///
547   /// \param ObjectType If we're translating a template name within a member
548   /// access expression, this is the type of the object whose member template
549   /// is being referenced.
550   ///
551   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
552   /// also refers to a name within the current (lexical) scope, this is the
553   /// declaration it refers to.
554   ///
555   /// By default, transforms the template name by transforming the declarations
556   /// and nested-name-specifiers that occur within the template name.
557   /// Subclasses may override this function to provide alternate behavior.
558   TemplateName
559   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
560                         SourceLocation NameLoc,
561                         QualType ObjectType = QualType(),
562                         NamedDecl *FirstQualifierInScope = nullptr,
563                         bool AllowInjectedClassName = false);
564 
565   /// Transform the given template argument.
566   ///
567   /// By default, this operation transforms the type, expression, or
568   /// declaration stored within the template argument and constructs a
569   /// new template argument from the transformed result. Subclasses may
570   /// override this function to provide alternate behavior.
571   ///
572   /// Returns true if there was an error.
573   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
574                                  TemplateArgumentLoc &Output,
575                                  bool Uneval = false);
576 
577   /// Transform the given set of template arguments.
578   ///
579   /// By default, this operation transforms all of the template arguments
580   /// in the input set using \c TransformTemplateArgument(), and appends
581   /// the transformed arguments to the output list.
582   ///
583   /// Note that this overload of \c TransformTemplateArguments() is merely
584   /// a convenience function. Subclasses that wish to override this behavior
585   /// should override the iterator-based member template version.
586   ///
587   /// \param Inputs The set of template arguments to be transformed.
588   ///
589   /// \param NumInputs The number of template arguments in \p Inputs.
590   ///
591   /// \param Outputs The set of transformed template arguments output by this
592   /// routine.
593   ///
594   /// Returns true if an error occurred.
595   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
596                                   unsigned NumInputs,
597                                   TemplateArgumentListInfo &Outputs,
598                                   bool Uneval = false) {
599     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
600                                       Uneval);
601   }
602 
603   /// Transform the given set of template arguments.
604   ///
605   /// By default, this operation transforms all of the template arguments
606   /// in the input set using \c TransformTemplateArgument(), and appends
607   /// the transformed arguments to the output list.
608   ///
609   /// \param First An iterator to the first template argument.
610   ///
611   /// \param Last An iterator one step past the last template argument.
612   ///
613   /// \param Outputs The set of transformed template arguments output by this
614   /// routine.
615   ///
616   /// Returns true if an error occurred.
617   template<typename InputIterator>
618   bool TransformTemplateArguments(InputIterator First,
619                                   InputIterator Last,
620                                   TemplateArgumentListInfo &Outputs,
621                                   bool Uneval = false);
622 
623   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
624   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
625                                  TemplateArgumentLoc &ArgLoc);
626 
627   /// Fakes up a TypeSourceInfo for a type.
628   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
629     return SemaRef.Context.getTrivialTypeSourceInfo(T,
630                        getDerived().getBaseLocation());
631   }
632 
633 #define ABSTRACT_TYPELOC(CLASS, PARENT)
634 #define TYPELOC(CLASS, PARENT)                                   \
635   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
636 #include "clang/AST/TypeLocNodes.def"
637 
638   template<typename Fn>
639   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
640                                       FunctionProtoTypeLoc TL,
641                                       CXXRecordDecl *ThisContext,
642                                       Qualifiers ThisTypeQuals,
643                                       Fn TransformExceptionSpec);
644 
645   bool TransformExceptionSpec(SourceLocation Loc,
646                               FunctionProtoType::ExceptionSpecInfo &ESI,
647                               SmallVectorImpl<QualType> &Exceptions,
648                               bool &Changed);
649 
650   StmtResult TransformSEHHandler(Stmt *Handler);
651 
652   QualType
653   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
654                                       TemplateSpecializationTypeLoc TL,
655                                       TemplateName Template);
656 
657   QualType
658   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
659                                       DependentTemplateSpecializationTypeLoc TL,
660                                                TemplateName Template,
661                                                CXXScopeSpec &SS);
662 
663   QualType TransformDependentTemplateSpecializationType(
664       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
665       NestedNameSpecifierLoc QualifierLoc);
666 
667   /// Transforms the parameters of a function type into the
668   /// given vectors.
669   ///
670   /// The result vectors should be kept in sync; null entries in the
671   /// variables vector are acceptable.
672   ///
673   /// Return true on error.
674   bool TransformFunctionTypeParams(
675       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
676       const QualType *ParamTypes,
677       const FunctionProtoType::ExtParameterInfo *ParamInfos,
678       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
679       Sema::ExtParameterInfoBuilder &PInfos);
680 
681   /// Transforms a single function-type parameter.  Return null
682   /// on error.
683   ///
684   /// \param indexAdjustment - A number to add to the parameter's
685   ///   scope index;  can be negative
686   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
687                                           int indexAdjustment,
688                                           Optional<unsigned> NumExpansions,
689                                           bool ExpectParameterPack);
690 
691   /// Transform the body of a lambda-expression.
692   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
693   /// Alternative implementation of TransformLambdaBody that skips transforming
694   /// the body.
695   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
696 
697   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
698 
699   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
700   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
701 
702   TemplateParameterList *TransformTemplateParameterList(
703         TemplateParameterList *TPL) {
704     return TPL;
705   }
706 
707   ExprResult TransformAddressOfOperand(Expr *E);
708 
709   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
710                                                 bool IsAddressOfOperand,
711                                                 TypeSourceInfo **RecoveryTSI);
712 
713   ExprResult TransformParenDependentScopeDeclRefExpr(
714       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
715       TypeSourceInfo **RecoveryTSI);
716 
717   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
718 
719 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
720 // amount of stack usage with clang.
721 #define STMT(Node, Parent)                        \
722   LLVM_ATTRIBUTE_NOINLINE \
723   StmtResult Transform##Node(Node *S);
724 #define VALUESTMT(Node, Parent)                   \
725   LLVM_ATTRIBUTE_NOINLINE \
726   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
727 #define EXPR(Node, Parent)                        \
728   LLVM_ATTRIBUTE_NOINLINE \
729   ExprResult Transform##Node(Node *E);
730 #define ABSTRACT_STMT(Stmt)
731 #include "clang/AST/StmtNodes.inc"
732 
733 #define OMP_CLAUSE_CLASS(Enum, Str, Class)                                           \
734   LLVM_ATTRIBUTE_NOINLINE \
735   OMPClause *Transform ## Class(Class *S);
736 #include "llvm/Frontend/OpenMP/OMPKinds.def"
737 
738   /// Build a new qualified type given its unqualified type and type location.
739   ///
740   /// By default, this routine adds type qualifiers only to types that can
741   /// have qualifiers, and silently suppresses those qualifiers that are not
742   /// permitted. Subclasses may override this routine to provide different
743   /// behavior.
744   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
745 
746   /// Build a new pointer type given its pointee type.
747   ///
748   /// By default, performs semantic analysis when building the pointer type.
749   /// Subclasses may override this routine to provide different behavior.
750   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
751 
752   /// Build a new block pointer type given its pointee type.
753   ///
754   /// By default, performs semantic analysis when building the block pointer
755   /// type. Subclasses may override this routine to provide different behavior.
756   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
757 
758   /// Build a new reference type given the type it references.
759   ///
760   /// By default, performs semantic analysis when building the
761   /// reference type. Subclasses may override this routine to provide
762   /// different behavior.
763   ///
764   /// \param LValue whether the type was written with an lvalue sigil
765   /// or an rvalue sigil.
766   QualType RebuildReferenceType(QualType ReferentType,
767                                 bool LValue,
768                                 SourceLocation Sigil);
769 
770   /// Build a new member pointer type given the pointee type and the
771   /// class type it refers into.
772   ///
773   /// By default, performs semantic analysis when building the member pointer
774   /// type. Subclasses may override this routine to provide different behavior.
775   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
776                                     SourceLocation Sigil);
777 
778   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
779                                     SourceLocation ProtocolLAngleLoc,
780                                     ArrayRef<ObjCProtocolDecl *> Protocols,
781                                     ArrayRef<SourceLocation> ProtocolLocs,
782                                     SourceLocation ProtocolRAngleLoc);
783 
784   /// Build an Objective-C object type.
785   ///
786   /// By default, performs semantic analysis when building the object type.
787   /// Subclasses may override this routine to provide different behavior.
788   QualType RebuildObjCObjectType(QualType BaseType,
789                                  SourceLocation Loc,
790                                  SourceLocation TypeArgsLAngleLoc,
791                                  ArrayRef<TypeSourceInfo *> TypeArgs,
792                                  SourceLocation TypeArgsRAngleLoc,
793                                  SourceLocation ProtocolLAngleLoc,
794                                  ArrayRef<ObjCProtocolDecl *> Protocols,
795                                  ArrayRef<SourceLocation> ProtocolLocs,
796                                  SourceLocation ProtocolRAngleLoc);
797 
798   /// Build a new Objective-C object pointer type given the pointee type.
799   ///
800   /// By default, directly builds the pointer type, with no additional semantic
801   /// analysis.
802   QualType RebuildObjCObjectPointerType(QualType PointeeType,
803                                         SourceLocation Star);
804 
805   /// Build a new array type given the element type, size
806   /// modifier, size of the array (if known), size expression, and index type
807   /// qualifiers.
808   ///
809   /// By default, performs semantic analysis when building the array type.
810   /// Subclasses may override this routine to provide different behavior.
811   /// Also by default, all of the other Rebuild*Array
812   QualType RebuildArrayType(QualType ElementType,
813                             ArrayType::ArraySizeModifier SizeMod,
814                             const llvm::APInt *Size,
815                             Expr *SizeExpr,
816                             unsigned IndexTypeQuals,
817                             SourceRange BracketsRange);
818 
819   /// Build a new constant array type given the element type, size
820   /// modifier, (known) size of the array, and index type qualifiers.
821   ///
822   /// By default, performs semantic analysis when building the array type.
823   /// Subclasses may override this routine to provide different behavior.
824   QualType RebuildConstantArrayType(QualType ElementType,
825                                     ArrayType::ArraySizeModifier SizeMod,
826                                     const llvm::APInt &Size,
827                                     Expr *SizeExpr,
828                                     unsigned IndexTypeQuals,
829                                     SourceRange BracketsRange);
830 
831   /// Build a new incomplete array type given the element type, size
832   /// modifier, and index type qualifiers.
833   ///
834   /// By default, performs semantic analysis when building the array type.
835   /// Subclasses may override this routine to provide different behavior.
836   QualType RebuildIncompleteArrayType(QualType ElementType,
837                                       ArrayType::ArraySizeModifier SizeMod,
838                                       unsigned IndexTypeQuals,
839                                       SourceRange BracketsRange);
840 
841   /// Build a new variable-length array type given the element type,
842   /// size modifier, size expression, and index type qualifiers.
843   ///
844   /// By default, performs semantic analysis when building the array type.
845   /// Subclasses may override this routine to provide different behavior.
846   QualType RebuildVariableArrayType(QualType ElementType,
847                                     ArrayType::ArraySizeModifier SizeMod,
848                                     Expr *SizeExpr,
849                                     unsigned IndexTypeQuals,
850                                     SourceRange BracketsRange);
851 
852   /// Build a new dependent-sized array type given the element type,
853   /// size modifier, size expression, and index type qualifiers.
854   ///
855   /// By default, performs semantic analysis when building the array type.
856   /// Subclasses may override this routine to provide different behavior.
857   QualType RebuildDependentSizedArrayType(QualType ElementType,
858                                           ArrayType::ArraySizeModifier SizeMod,
859                                           Expr *SizeExpr,
860                                           unsigned IndexTypeQuals,
861                                           SourceRange BracketsRange);
862 
863   /// Build a new vector type given the element type and
864   /// number of elements.
865   ///
866   /// By default, performs semantic analysis when building the vector type.
867   /// Subclasses may override this routine to provide different behavior.
868   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
869                              VectorType::VectorKind VecKind);
870 
871   /// Build a new potentially dependently-sized extended vector type
872   /// given the element type and number of elements.
873   ///
874   /// By default, performs semantic analysis when building the vector type.
875   /// Subclasses may override this routine to provide different behavior.
876   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
877                                            SourceLocation AttributeLoc,
878                                            VectorType::VectorKind);
879 
880   /// Build a new extended vector type given the element type and
881   /// number of elements.
882   ///
883   /// By default, performs semantic analysis when building the vector type.
884   /// Subclasses may override this routine to provide different behavior.
885   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
886                                 SourceLocation AttributeLoc);
887 
888   /// Build a new potentially dependently-sized extended vector type
889   /// given the element type and number of elements.
890   ///
891   /// By default, performs semantic analysis when building the vector type.
892   /// Subclasses may override this routine to provide different behavior.
893   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
894                                               Expr *SizeExpr,
895                                               SourceLocation AttributeLoc);
896 
897   /// Build a new DependentAddressSpaceType or return the pointee
898   /// type variable with the correct address space (retrieved from
899   /// AddrSpaceExpr) applied to it. The former will be returned in cases
900   /// where the address space remains dependent.
901   ///
902   /// By default, performs semantic analysis when building the type with address
903   /// space applied. Subclasses may override this routine to provide different
904   /// behavior.
905   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
906                                             Expr *AddrSpaceExpr,
907                                             SourceLocation AttributeLoc);
908 
909   /// Build a new function type.
910   ///
911   /// By default, performs semantic analysis when building the function type.
912   /// Subclasses may override this routine to provide different behavior.
913   QualType RebuildFunctionProtoType(QualType T,
914                                     MutableArrayRef<QualType> ParamTypes,
915                                     const FunctionProtoType::ExtProtoInfo &EPI);
916 
917   /// Build a new unprototyped function type.
918   QualType RebuildFunctionNoProtoType(QualType ResultType);
919 
920   /// Rebuild an unresolved typename type, given the decl that
921   /// the UnresolvedUsingTypenameDecl was transformed to.
922   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
923 
924   /// Build a new typedef type.
925   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
926     return SemaRef.Context.getTypeDeclType(Typedef);
927   }
928 
929   /// Build a new MacroDefined type.
930   QualType RebuildMacroQualifiedType(QualType T,
931                                      const IdentifierInfo *MacroII) {
932     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
933   }
934 
935   /// Build a new class/struct/union type.
936   QualType RebuildRecordType(RecordDecl *Record) {
937     return SemaRef.Context.getTypeDeclType(Record);
938   }
939 
940   /// Build a new Enum type.
941   QualType RebuildEnumType(EnumDecl *Enum) {
942     return SemaRef.Context.getTypeDeclType(Enum);
943   }
944 
945   /// Build a new typeof(expr) type.
946   ///
947   /// By default, performs semantic analysis when building the typeof type.
948   /// Subclasses may override this routine to provide different behavior.
949   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
950 
951   /// Build a new typeof(type) type.
952   ///
953   /// By default, builds a new TypeOfType with the given underlying type.
954   QualType RebuildTypeOfType(QualType Underlying);
955 
956   /// Build a new unary transform type.
957   QualType RebuildUnaryTransformType(QualType BaseType,
958                                      UnaryTransformType::UTTKind UKind,
959                                      SourceLocation Loc);
960 
961   /// Build a new C++11 decltype type.
962   ///
963   /// By default, performs semantic analysis when building the decltype type.
964   /// Subclasses may override this routine to provide different behavior.
965   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
966 
967   /// Build a new C++11 auto type.
968   ///
969   /// By default, builds a new AutoType with the given deduced type.
970   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
971                            ConceptDecl *TypeConstraintConcept,
972                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
973     // Note, IsDependent is always false here: we implicitly convert an 'auto'
974     // which has been deduced to a dependent type into an undeduced 'auto', so
975     // that we'll retry deduction after the transformation.
976     return SemaRef.Context.getAutoType(Deduced, Keyword,
977                                        /*IsDependent*/ false, /*IsPack=*/false,
978                                        TypeConstraintConcept,
979                                        TypeConstraintArgs);
980   }
981 
982   /// By default, builds a new DeducedTemplateSpecializationType with the given
983   /// deduced type.
984   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
985       QualType Deduced) {
986     return SemaRef.Context.getDeducedTemplateSpecializationType(
987         Template, Deduced, /*IsDependent*/ false);
988   }
989 
990   /// Build a new template specialization type.
991   ///
992   /// By default, performs semantic analysis when building the template
993   /// specialization type. Subclasses may override this routine to provide
994   /// different behavior.
995   QualType RebuildTemplateSpecializationType(TemplateName Template,
996                                              SourceLocation TemplateLoc,
997                                              TemplateArgumentListInfo &Args);
998 
999   /// Build a new parenthesized type.
1000   ///
1001   /// By default, builds a new ParenType type from the inner type.
1002   /// Subclasses may override this routine to provide different behavior.
1003   QualType RebuildParenType(QualType InnerType) {
1004     return SemaRef.BuildParenType(InnerType);
1005   }
1006 
1007   /// Build a new qualified name type.
1008   ///
1009   /// By default, builds a new ElaboratedType type from the keyword,
1010   /// the nested-name-specifier and the named type.
1011   /// Subclasses may override this routine to provide different behavior.
1012   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1013                                  ElaboratedTypeKeyword Keyword,
1014                                  NestedNameSpecifierLoc QualifierLoc,
1015                                  QualType Named) {
1016     return SemaRef.Context.getElaboratedType(Keyword,
1017                                          QualifierLoc.getNestedNameSpecifier(),
1018                                              Named);
1019   }
1020 
1021   /// Build a new typename type that refers to a template-id.
1022   ///
1023   /// By default, builds a new DependentNameType type from the
1024   /// nested-name-specifier and the given type. Subclasses may override
1025   /// this routine to provide different behavior.
1026   QualType RebuildDependentTemplateSpecializationType(
1027                                           ElaboratedTypeKeyword Keyword,
1028                                           NestedNameSpecifierLoc QualifierLoc,
1029                                           SourceLocation TemplateKWLoc,
1030                                           const IdentifierInfo *Name,
1031                                           SourceLocation NameLoc,
1032                                           TemplateArgumentListInfo &Args,
1033                                           bool AllowInjectedClassName) {
1034     // Rebuild the template name.
1035     // TODO: avoid TemplateName abstraction
1036     CXXScopeSpec SS;
1037     SS.Adopt(QualifierLoc);
1038     TemplateName InstName = getDerived().RebuildTemplateName(
1039         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1040         AllowInjectedClassName);
1041 
1042     if (InstName.isNull())
1043       return QualType();
1044 
1045     // If it's still dependent, make a dependent specialization.
1046     if (InstName.getAsDependentTemplateName())
1047       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1048                                           QualifierLoc.getNestedNameSpecifier(),
1049                                                                     Name,
1050                                                                     Args);
1051 
1052     // Otherwise, make an elaborated type wrapping a non-dependent
1053     // specialization.
1054     QualType T =
1055     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1056     if (T.isNull()) return QualType();
1057 
1058     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1059       return T;
1060 
1061     return SemaRef.Context.getElaboratedType(Keyword,
1062                                        QualifierLoc.getNestedNameSpecifier(),
1063                                              T);
1064   }
1065 
1066   /// Build a new typename type that refers to an identifier.
1067   ///
1068   /// By default, performs semantic analysis when building the typename type
1069   /// (or elaborated type). Subclasses may override this routine to provide
1070   /// different behavior.
1071   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1072                                     SourceLocation KeywordLoc,
1073                                     NestedNameSpecifierLoc QualifierLoc,
1074                                     const IdentifierInfo *Id,
1075                                     SourceLocation IdLoc,
1076                                     bool DeducedTSTContext) {
1077     CXXScopeSpec SS;
1078     SS.Adopt(QualifierLoc);
1079 
1080     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1081       // If the name is still dependent, just build a new dependent name type.
1082       if (!SemaRef.computeDeclContext(SS))
1083         return SemaRef.Context.getDependentNameType(Keyword,
1084                                           QualifierLoc.getNestedNameSpecifier(),
1085                                                     Id);
1086     }
1087 
1088     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1089       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1090                                        *Id, IdLoc, DeducedTSTContext);
1091     }
1092 
1093     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1094 
1095     // We had a dependent elaborated-type-specifier that has been transformed
1096     // into a non-dependent elaborated-type-specifier. Find the tag we're
1097     // referring to.
1098     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1099     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1100     if (!DC)
1101       return QualType();
1102 
1103     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1104       return QualType();
1105 
1106     TagDecl *Tag = nullptr;
1107     SemaRef.LookupQualifiedName(Result, DC);
1108     switch (Result.getResultKind()) {
1109       case LookupResult::NotFound:
1110       case LookupResult::NotFoundInCurrentInstantiation:
1111         break;
1112 
1113       case LookupResult::Found:
1114         Tag = Result.getAsSingle<TagDecl>();
1115         break;
1116 
1117       case LookupResult::FoundOverloaded:
1118       case LookupResult::FoundUnresolvedValue:
1119         llvm_unreachable("Tag lookup cannot find non-tags");
1120 
1121       case LookupResult::Ambiguous:
1122         // Let the LookupResult structure handle ambiguities.
1123         return QualType();
1124     }
1125 
1126     if (!Tag) {
1127       // Check where the name exists but isn't a tag type and use that to emit
1128       // better diagnostics.
1129       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1130       SemaRef.LookupQualifiedName(Result, DC);
1131       switch (Result.getResultKind()) {
1132         case LookupResult::Found:
1133         case LookupResult::FoundOverloaded:
1134         case LookupResult::FoundUnresolvedValue: {
1135           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1136           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1137           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1138                                                                << NTK << Kind;
1139           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1140           break;
1141         }
1142         default:
1143           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1144               << Kind << Id << DC << QualifierLoc.getSourceRange();
1145           break;
1146       }
1147       return QualType();
1148     }
1149 
1150     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1151                                               IdLoc, Id)) {
1152       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1153       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1154       return QualType();
1155     }
1156 
1157     // Build the elaborated-type-specifier type.
1158     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1159     return SemaRef.Context.getElaboratedType(Keyword,
1160                                          QualifierLoc.getNestedNameSpecifier(),
1161                                              T);
1162   }
1163 
1164   /// Build a new pack expansion type.
1165   ///
1166   /// By default, builds a new PackExpansionType type from the given pattern.
1167   /// Subclasses may override this routine to provide different behavior.
1168   QualType RebuildPackExpansionType(QualType Pattern,
1169                                     SourceRange PatternRange,
1170                                     SourceLocation EllipsisLoc,
1171                                     Optional<unsigned> NumExpansions) {
1172     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1173                                         NumExpansions);
1174   }
1175 
1176   /// Build a new atomic type given its value type.
1177   ///
1178   /// By default, performs semantic analysis when building the atomic type.
1179   /// Subclasses may override this routine to provide different behavior.
1180   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1181 
1182   /// Build a new pipe type given its value type.
1183   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1184                            bool isReadPipe);
1185 
1186    /// Build an extended int given its value type.
1187   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1188                              SourceLocation Loc);
1189 
1190   /// Build a dependent extended int given its value type.
1191   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1192                                       SourceLocation Loc);
1193 
1194   /// Build a new template name given a nested name specifier, a flag
1195   /// indicating whether the "template" keyword was provided, and the template
1196   /// that the template name refers to.
1197   ///
1198   /// By default, builds the new template name directly. Subclasses may override
1199   /// this routine to provide different behavior.
1200   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1201                                    bool TemplateKW,
1202                                    TemplateDecl *Template);
1203 
1204   /// Build a new template name given a nested name specifier and the
1205   /// name that is referred to as a template.
1206   ///
1207   /// By default, performs semantic analysis to determine whether the name can
1208   /// be resolved to a specific template, then builds the appropriate kind of
1209   /// template name. Subclasses may override this routine to provide different
1210   /// behavior.
1211   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1212                                    SourceLocation TemplateKWLoc,
1213                                    const IdentifierInfo &Name,
1214                                    SourceLocation NameLoc, QualType ObjectType,
1215                                    NamedDecl *FirstQualifierInScope,
1216                                    bool AllowInjectedClassName);
1217 
1218   /// Build a new template name given a nested name specifier and the
1219   /// overloaded operator name that is referred to as a template.
1220   ///
1221   /// By default, performs semantic analysis to determine whether the name can
1222   /// be resolved to a specific template, then builds the appropriate kind of
1223   /// template name. Subclasses may override this routine to provide different
1224   /// behavior.
1225   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1226                                    SourceLocation TemplateKWLoc,
1227                                    OverloadedOperatorKind Operator,
1228                                    SourceLocation NameLoc, QualType ObjectType,
1229                                    bool AllowInjectedClassName);
1230 
1231   /// Build a new template name given a template template parameter pack
1232   /// and the
1233   ///
1234   /// By default, performs semantic analysis to determine whether the name can
1235   /// be resolved to a specific template, then builds the appropriate kind of
1236   /// template name. Subclasses may override this routine to provide different
1237   /// behavior.
1238   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1239                                    const TemplateArgument &ArgPack) {
1240     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1241   }
1242 
1243   /// Build a new compound statement.
1244   ///
1245   /// By default, performs semantic analysis to build the new statement.
1246   /// Subclasses may override this routine to provide different behavior.
1247   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1248                                        MultiStmtArg Statements,
1249                                        SourceLocation RBraceLoc,
1250                                        bool IsStmtExpr) {
1251     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1252                                        IsStmtExpr);
1253   }
1254 
1255   /// Build a new case 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 RebuildCaseStmt(SourceLocation CaseLoc,
1260                                    Expr *LHS,
1261                                    SourceLocation EllipsisLoc,
1262                                    Expr *RHS,
1263                                    SourceLocation ColonLoc) {
1264     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1265                                    ColonLoc);
1266   }
1267 
1268   /// Attach the body to a new case statement.
1269   ///
1270   /// By default, performs semantic analysis to build the new statement.
1271   /// Subclasses may override this routine to provide different behavior.
1272   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1273     getSema().ActOnCaseStmtBody(S, Body);
1274     return S;
1275   }
1276 
1277   /// Build a new default statement.
1278   ///
1279   /// By default, performs semantic analysis to build the new statement.
1280   /// Subclasses may override this routine to provide different behavior.
1281   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1282                                       SourceLocation ColonLoc,
1283                                       Stmt *SubStmt) {
1284     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1285                                       /*CurScope=*/nullptr);
1286   }
1287 
1288   /// Build a new label statement.
1289   ///
1290   /// By default, performs semantic analysis to build the new statement.
1291   /// Subclasses may override this routine to provide different behavior.
1292   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1293                               SourceLocation ColonLoc, Stmt *SubStmt) {
1294     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1295   }
1296 
1297   /// Build a new label statement.
1298   ///
1299   /// By default, performs semantic analysis to build the new statement.
1300   /// Subclasses may override this routine to provide different behavior.
1301   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1302                                    ArrayRef<const Attr*> Attrs,
1303                                    Stmt *SubStmt) {
1304     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1305   }
1306 
1307   /// Build a new "if" statement.
1308   ///
1309   /// By default, performs semantic analysis to build the new statement.
1310   /// Subclasses may override this routine to provide different behavior.
1311   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1312                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1313                            SourceLocation ElseLoc, Stmt *Else) {
1314     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1315                                  ElseLoc, Else);
1316   }
1317 
1318   /// Start building a new switch statement.
1319   ///
1320   /// By default, performs semantic analysis to build the new statement.
1321   /// Subclasses may override this routine to provide different behavior.
1322   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1323                                     Sema::ConditionResult Cond) {
1324     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1325   }
1326 
1327   /// Attach the body to the switch statement.
1328   ///
1329   /// By default, performs semantic analysis to build the new statement.
1330   /// Subclasses may override this routine to provide different behavior.
1331   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1332                                    Stmt *Switch, Stmt *Body) {
1333     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1334   }
1335 
1336   /// Build a new while statement.
1337   ///
1338   /// By default, performs semantic analysis to build the new statement.
1339   /// Subclasses may override this routine to provide different behavior.
1340   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1341                               Sema::ConditionResult Cond, Stmt *Body) {
1342     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1343   }
1344 
1345   /// Build a new do-while statement.
1346   ///
1347   /// By default, performs semantic analysis to build the new statement.
1348   /// Subclasses may override this routine to provide different behavior.
1349   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1350                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1351                            Expr *Cond, SourceLocation RParenLoc) {
1352     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1353                                  Cond, RParenLoc);
1354   }
1355 
1356   /// Build a new for statement.
1357   ///
1358   /// By default, performs semantic analysis to build the new statement.
1359   /// Subclasses may override this routine to provide different behavior.
1360   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1361                             Stmt *Init, Sema::ConditionResult Cond,
1362                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1363                             Stmt *Body) {
1364     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1365                                   Inc, RParenLoc, Body);
1366   }
1367 
1368   /// Build a new goto statement.
1369   ///
1370   /// By default, performs semantic analysis to build the new statement.
1371   /// Subclasses may override this routine to provide different behavior.
1372   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1373                              LabelDecl *Label) {
1374     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1375   }
1376 
1377   /// Build a new indirect goto statement.
1378   ///
1379   /// By default, performs semantic analysis to build the new statement.
1380   /// Subclasses may override this routine to provide different behavior.
1381   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1382                                      SourceLocation StarLoc,
1383                                      Expr *Target) {
1384     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1385   }
1386 
1387   /// Build a new return statement.
1388   ///
1389   /// By default, performs semantic analysis to build the new statement.
1390   /// Subclasses may override this routine to provide different behavior.
1391   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1392     return getSema().BuildReturnStmt(ReturnLoc, Result);
1393   }
1394 
1395   /// Build a new declaration statement.
1396   ///
1397   /// By default, performs semantic analysis to build the new statement.
1398   /// Subclasses may override this routine to provide different behavior.
1399   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1400                              SourceLocation StartLoc, SourceLocation EndLoc) {
1401     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1402     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1403   }
1404 
1405   /// Build a new inline asm statement.
1406   ///
1407   /// By default, performs semantic analysis to build the new statement.
1408   /// Subclasses may override this routine to provide different behavior.
1409   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1410                                bool IsVolatile, unsigned NumOutputs,
1411                                unsigned NumInputs, IdentifierInfo **Names,
1412                                MultiExprArg Constraints, MultiExprArg Exprs,
1413                                Expr *AsmString, MultiExprArg Clobbers,
1414                                unsigned NumLabels,
1415                                SourceLocation RParenLoc) {
1416     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1417                                      NumInputs, Names, Constraints, Exprs,
1418                                      AsmString, Clobbers, NumLabels, RParenLoc);
1419   }
1420 
1421   /// Build a new MS style inline asm statement.
1422   ///
1423   /// By default, performs semantic analysis to build the new statement.
1424   /// Subclasses may override this routine to provide different behavior.
1425   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1426                               ArrayRef<Token> AsmToks,
1427                               StringRef AsmString,
1428                               unsigned NumOutputs, unsigned NumInputs,
1429                               ArrayRef<StringRef> Constraints,
1430                               ArrayRef<StringRef> Clobbers,
1431                               ArrayRef<Expr*> Exprs,
1432                               SourceLocation EndLoc) {
1433     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1434                                     NumOutputs, NumInputs,
1435                                     Constraints, Clobbers, Exprs, EndLoc);
1436   }
1437 
1438   /// Build a new co_return 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 RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1443                                  bool IsImplicit) {
1444     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1445   }
1446 
1447   /// Build a new co_await expression.
1448   ///
1449   /// By default, performs semantic analysis to build the new expression.
1450   /// Subclasses may override this routine to provide different behavior.
1451   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1452                                 bool IsImplicit) {
1453     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1454   }
1455 
1456   /// Build a new co_await expression.
1457   ///
1458   /// By default, performs semantic analysis to build the new expression.
1459   /// Subclasses may override this routine to provide different behavior.
1460   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1461                                          Expr *Result,
1462                                          UnresolvedLookupExpr *Lookup) {
1463     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1464   }
1465 
1466   /// Build a new co_yield expression.
1467   ///
1468   /// By default, performs semantic analysis to build the new expression.
1469   /// Subclasses may override this routine to provide different behavior.
1470   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1471     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1472   }
1473 
1474   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1475     return getSema().BuildCoroutineBodyStmt(Args);
1476   }
1477 
1478   /// Build a new Objective-C \@try statement.
1479   ///
1480   /// By default, performs semantic analysis to build the new statement.
1481   /// Subclasses may override this routine to provide different behavior.
1482   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1483                                         Stmt *TryBody,
1484                                         MultiStmtArg CatchStmts,
1485                                         Stmt *Finally) {
1486     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1487                                         Finally);
1488   }
1489 
1490   /// Rebuild an Objective-C exception declaration.
1491   ///
1492   /// By default, performs semantic analysis to build the new declaration.
1493   /// Subclasses may override this routine to provide different behavior.
1494   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1495                                     TypeSourceInfo *TInfo, QualType T) {
1496     return getSema().BuildObjCExceptionDecl(TInfo, T,
1497                                             ExceptionDecl->getInnerLocStart(),
1498                                             ExceptionDecl->getLocation(),
1499                                             ExceptionDecl->getIdentifier());
1500   }
1501 
1502   /// Build a new Objective-C \@catch statement.
1503   ///
1504   /// By default, performs semantic analysis to build the new statement.
1505   /// Subclasses may override this routine to provide different behavior.
1506   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1507                                           SourceLocation RParenLoc,
1508                                           VarDecl *Var,
1509                                           Stmt *Body) {
1510     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1511                                           Var, Body);
1512   }
1513 
1514   /// Build a new Objective-C \@finally statement.
1515   ///
1516   /// By default, performs semantic analysis to build the new statement.
1517   /// Subclasses may override this routine to provide different behavior.
1518   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1519                                             Stmt *Body) {
1520     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1521   }
1522 
1523   /// Build a new Objective-C \@throw statement.
1524   ///
1525   /// By default, performs semantic analysis to build the new statement.
1526   /// Subclasses may override this routine to provide different behavior.
1527   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1528                                           Expr *Operand) {
1529     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1530   }
1531 
1532   /// Build a new OpenMP executable directive.
1533   ///
1534   /// By default, performs semantic analysis to build the new statement.
1535   /// Subclasses may override this routine to provide different behavior.
1536   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1537                                            DeclarationNameInfo DirName,
1538                                            OpenMPDirectiveKind CancelRegion,
1539                                            ArrayRef<OMPClause *> Clauses,
1540                                            Stmt *AStmt, SourceLocation StartLoc,
1541                                            SourceLocation EndLoc) {
1542     return getSema().ActOnOpenMPExecutableDirective(
1543         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1544   }
1545 
1546   /// Build a new OpenMP 'if' clause.
1547   ///
1548   /// By default, performs semantic analysis to build the new OpenMP clause.
1549   /// Subclasses may override this routine to provide different behavior.
1550   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1551                                 Expr *Condition, SourceLocation StartLoc,
1552                                 SourceLocation LParenLoc,
1553                                 SourceLocation NameModifierLoc,
1554                                 SourceLocation ColonLoc,
1555                                 SourceLocation EndLoc) {
1556     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1557                                          LParenLoc, NameModifierLoc, ColonLoc,
1558                                          EndLoc);
1559   }
1560 
1561   /// Build a new OpenMP 'final' clause.
1562   ///
1563   /// By default, performs semantic analysis to build the new OpenMP clause.
1564   /// Subclasses may override this routine to provide different behavior.
1565   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1566                                    SourceLocation LParenLoc,
1567                                    SourceLocation EndLoc) {
1568     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1569                                             EndLoc);
1570   }
1571 
1572   /// Build a new OpenMP 'num_threads' clause.
1573   ///
1574   /// By default, performs semantic analysis to build the new OpenMP clause.
1575   /// Subclasses may override this routine to provide different behavior.
1576   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1577                                         SourceLocation StartLoc,
1578                                         SourceLocation LParenLoc,
1579                                         SourceLocation EndLoc) {
1580     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1581                                                  LParenLoc, EndLoc);
1582   }
1583 
1584   /// Build a new OpenMP 'safelen' clause.
1585   ///
1586   /// By default, performs semantic analysis to build the new OpenMP clause.
1587   /// Subclasses may override this routine to provide different behavior.
1588   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1589                                      SourceLocation LParenLoc,
1590                                      SourceLocation EndLoc) {
1591     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1592   }
1593 
1594   /// Build a new OpenMP 'simdlen' clause.
1595   ///
1596   /// By default, performs semantic analysis to build the new OpenMP clause.
1597   /// Subclasses may override this routine to provide different behavior.
1598   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1599                                      SourceLocation LParenLoc,
1600                                      SourceLocation EndLoc) {
1601     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1602   }
1603 
1604   /// Build a new OpenMP 'allocator' clause.
1605   ///
1606   /// By default, performs semantic analysis to build the new OpenMP clause.
1607   /// Subclasses may override this routine to provide different behavior.
1608   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1609                                        SourceLocation LParenLoc,
1610                                        SourceLocation EndLoc) {
1611     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1612   }
1613 
1614   /// Build a new OpenMP 'collapse' clause.
1615   ///
1616   /// By default, performs semantic analysis to build the new OpenMP clause.
1617   /// Subclasses may override this routine to provide different behavior.
1618   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1619                                       SourceLocation LParenLoc,
1620                                       SourceLocation EndLoc) {
1621     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1622                                                EndLoc);
1623   }
1624 
1625   /// Build a new OpenMP 'default' clause.
1626   ///
1627   /// By default, performs semantic analysis to build the new OpenMP clause.
1628   /// Subclasses may override this routine to provide different behavior.
1629   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1630                                      SourceLocation StartLoc,
1631                                      SourceLocation LParenLoc,
1632                                      SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1634                                               StartLoc, LParenLoc, EndLoc);
1635   }
1636 
1637   /// Build a new OpenMP 'proc_bind' clause.
1638   ///
1639   /// By default, performs semantic analysis to build the new OpenMP clause.
1640   /// Subclasses may override this routine to provide different behavior.
1641   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1642                                       SourceLocation KindKwLoc,
1643                                       SourceLocation StartLoc,
1644                                       SourceLocation LParenLoc,
1645                                       SourceLocation EndLoc) {
1646     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1647                                                StartLoc, LParenLoc, EndLoc);
1648   }
1649 
1650   /// Build a new OpenMP 'schedule' clause.
1651   ///
1652   /// By default, performs semantic analysis to build the new OpenMP clause.
1653   /// Subclasses may override this routine to provide different behavior.
1654   OMPClause *RebuildOMPScheduleClause(
1655       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1656       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1657       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1658       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1659     return getSema().ActOnOpenMPScheduleClause(
1660         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1661         CommaLoc, EndLoc);
1662   }
1663 
1664   /// Build a new OpenMP 'ordered' clause.
1665   ///
1666   /// By default, performs semantic analysis to build the new OpenMP clause.
1667   /// Subclasses may override this routine to provide different behavior.
1668   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1669                                      SourceLocation EndLoc,
1670                                      SourceLocation LParenLoc, Expr *Num) {
1671     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1672   }
1673 
1674   /// Build a new OpenMP 'private' clause.
1675   ///
1676   /// By default, performs semantic analysis to build the new OpenMP clause.
1677   /// Subclasses may override this routine to provide different behavior.
1678   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1679                                      SourceLocation StartLoc,
1680                                      SourceLocation LParenLoc,
1681                                      SourceLocation EndLoc) {
1682     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1683                                               EndLoc);
1684   }
1685 
1686   /// Build a new OpenMP 'firstprivate' clause.
1687   ///
1688   /// By default, performs semantic analysis to build the new OpenMP clause.
1689   /// Subclasses may override this routine to provide different behavior.
1690   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1691                                           SourceLocation StartLoc,
1692                                           SourceLocation LParenLoc,
1693                                           SourceLocation EndLoc) {
1694     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1695                                                    EndLoc);
1696   }
1697 
1698   /// Build a new OpenMP 'lastprivate' clause.
1699   ///
1700   /// By default, performs semantic analysis to build the new OpenMP clause.
1701   /// Subclasses may override this routine to provide different behavior.
1702   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1703                                          OpenMPLastprivateModifier LPKind,
1704                                          SourceLocation LPKindLoc,
1705                                          SourceLocation ColonLoc,
1706                                          SourceLocation StartLoc,
1707                                          SourceLocation LParenLoc,
1708                                          SourceLocation EndLoc) {
1709     return getSema().ActOnOpenMPLastprivateClause(
1710         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1711   }
1712 
1713   /// Build a new OpenMP 'shared' clause.
1714   ///
1715   /// By default, performs semantic analysis to build the new OpenMP clause.
1716   /// Subclasses may override this routine to provide different behavior.
1717   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1718                                     SourceLocation StartLoc,
1719                                     SourceLocation LParenLoc,
1720                                     SourceLocation EndLoc) {
1721     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1722                                              EndLoc);
1723   }
1724 
1725   /// Build a new OpenMP 'reduction' clause.
1726   ///
1727   /// By default, performs semantic analysis to build the new statement.
1728   /// Subclasses may override this routine to provide different behavior.
1729   OMPClause *RebuildOMPReductionClause(
1730       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1731       SourceLocation StartLoc, SourceLocation LParenLoc,
1732       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1733       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1734       const DeclarationNameInfo &ReductionId,
1735       ArrayRef<Expr *> UnresolvedReductions) {
1736     return getSema().ActOnOpenMPReductionClause(
1737         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1738         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1739   }
1740 
1741   /// Build a new OpenMP 'task_reduction' clause.
1742   ///
1743   /// By default, performs semantic analysis to build the new statement.
1744   /// Subclasses may override this routine to provide different behavior.
1745   OMPClause *RebuildOMPTaskReductionClause(
1746       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1747       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1748       CXXScopeSpec &ReductionIdScopeSpec,
1749       const DeclarationNameInfo &ReductionId,
1750       ArrayRef<Expr *> UnresolvedReductions) {
1751     return getSema().ActOnOpenMPTaskReductionClause(
1752         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1753         ReductionId, UnresolvedReductions);
1754   }
1755 
1756   /// Build a new OpenMP 'in_reduction' clause.
1757   ///
1758   /// By default, performs semantic analysis to build the new statement.
1759   /// Subclasses may override this routine to provide different behavior.
1760   OMPClause *
1761   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1762                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1763                               SourceLocation EndLoc,
1764                               CXXScopeSpec &ReductionIdScopeSpec,
1765                               const DeclarationNameInfo &ReductionId,
1766                               ArrayRef<Expr *> UnresolvedReductions) {
1767     return getSema().ActOnOpenMPInReductionClause(
1768         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1769         ReductionId, UnresolvedReductions);
1770   }
1771 
1772   /// Build a new OpenMP 'linear' clause.
1773   ///
1774   /// By default, performs semantic analysis to build the new OpenMP clause.
1775   /// Subclasses may override this routine to provide different behavior.
1776   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1777                                     SourceLocation StartLoc,
1778                                     SourceLocation LParenLoc,
1779                                     OpenMPLinearClauseKind Modifier,
1780                                     SourceLocation ModifierLoc,
1781                                     SourceLocation ColonLoc,
1782                                     SourceLocation EndLoc) {
1783     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1784                                              Modifier, ModifierLoc, ColonLoc,
1785                                              EndLoc);
1786   }
1787 
1788   /// Build a new OpenMP 'aligned' clause.
1789   ///
1790   /// By default, performs semantic analysis to build the new OpenMP clause.
1791   /// Subclasses may override this routine to provide different behavior.
1792   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1793                                      SourceLocation StartLoc,
1794                                      SourceLocation LParenLoc,
1795                                      SourceLocation ColonLoc,
1796                                      SourceLocation EndLoc) {
1797     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1798                                               LParenLoc, ColonLoc, EndLoc);
1799   }
1800 
1801   /// Build a new OpenMP 'copyin' clause.
1802   ///
1803   /// By default, performs semantic analysis to build the new OpenMP clause.
1804   /// Subclasses may override this routine to provide different behavior.
1805   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1806                                     SourceLocation StartLoc,
1807                                     SourceLocation LParenLoc,
1808                                     SourceLocation EndLoc) {
1809     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1810                                              EndLoc);
1811   }
1812 
1813   /// Build a new OpenMP 'copyprivate' clause.
1814   ///
1815   /// By default, performs semantic analysis to build the new OpenMP clause.
1816   /// Subclasses may override this routine to provide different behavior.
1817   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1818                                          SourceLocation StartLoc,
1819                                          SourceLocation LParenLoc,
1820                                          SourceLocation EndLoc) {
1821     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1822                                                   EndLoc);
1823   }
1824 
1825   /// Build a new OpenMP 'flush' pseudo clause.
1826   ///
1827   /// By default, performs semantic analysis to build the new OpenMP clause.
1828   /// Subclasses may override this routine to provide different behavior.
1829   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1830                                    SourceLocation StartLoc,
1831                                    SourceLocation LParenLoc,
1832                                    SourceLocation EndLoc) {
1833     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1834                                             EndLoc);
1835   }
1836 
1837   /// Build a new OpenMP 'depobj' pseudo clause.
1838   ///
1839   /// By default, performs semantic analysis to build the new OpenMP clause.
1840   /// Subclasses may override this routine to provide different behavior.
1841   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1842                                     SourceLocation LParenLoc,
1843                                     SourceLocation EndLoc) {
1844     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1845                                              EndLoc);
1846   }
1847 
1848   /// Build a new OpenMP 'depend' pseudo clause.
1849   ///
1850   /// By default, performs semantic analysis to build the new OpenMP clause.
1851   /// Subclasses may override this routine to provide different behavior.
1852   OMPClause *
1853   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1854                          SourceLocation DepLoc, SourceLocation ColonLoc,
1855                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1856                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1857     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1858                                              ColonLoc, VarList, StartLoc,
1859                                              LParenLoc, EndLoc);
1860   }
1861 
1862   /// Build a new OpenMP 'device' clause.
1863   ///
1864   /// By default, performs semantic analysis to build the new statement.
1865   /// Subclasses may override this routine to provide different behavior.
1866   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1867                                     Expr *Device, SourceLocation StartLoc,
1868                                     SourceLocation LParenLoc,
1869                                     SourceLocation ModifierLoc,
1870                                     SourceLocation EndLoc) {
1871     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1872                                              LParenLoc, ModifierLoc, EndLoc);
1873   }
1874 
1875   /// Build a new OpenMP 'map' clause.
1876   ///
1877   /// By default, performs semantic analysis to build the new OpenMP clause.
1878   /// Subclasses may override this routine to provide different behavior.
1879   OMPClause *RebuildOMPMapClause(
1880       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1881       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1882       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1883       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1884       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1885       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1886     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1887                                           MapperIdScopeSpec, MapperId, MapType,
1888                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1889                                           VarList, Locs, UnresolvedMappers);
1890   }
1891 
1892   /// Build a new OpenMP 'allocate' clause.
1893   ///
1894   /// By default, performs semantic analysis to build the new OpenMP clause.
1895   /// Subclasses may override this routine to provide different behavior.
1896   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1897                                       SourceLocation StartLoc,
1898                                       SourceLocation LParenLoc,
1899                                       SourceLocation ColonLoc,
1900                                       SourceLocation EndLoc) {
1901     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1902                                                LParenLoc, ColonLoc, EndLoc);
1903   }
1904 
1905   /// Build a new OpenMP 'num_teams' clause.
1906   ///
1907   /// By default, performs semantic analysis to build the new statement.
1908   /// Subclasses may override this routine to provide different behavior.
1909   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1910                                       SourceLocation LParenLoc,
1911                                       SourceLocation EndLoc) {
1912     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1913                                                EndLoc);
1914   }
1915 
1916   /// Build a new OpenMP 'thread_limit' clause.
1917   ///
1918   /// By default, performs semantic analysis to build the new statement.
1919   /// Subclasses may override this routine to provide different behavior.
1920   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1921                                          SourceLocation StartLoc,
1922                                          SourceLocation LParenLoc,
1923                                          SourceLocation EndLoc) {
1924     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1925                                                   LParenLoc, EndLoc);
1926   }
1927 
1928   /// Build a new OpenMP 'priority' clause.
1929   ///
1930   /// By default, performs semantic analysis to build the new statement.
1931   /// Subclasses may override this routine to provide different behavior.
1932   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1933                                       SourceLocation LParenLoc,
1934                                       SourceLocation EndLoc) {
1935     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1936                                                EndLoc);
1937   }
1938 
1939   /// Build a new OpenMP 'grainsize' clause.
1940   ///
1941   /// By default, performs semantic analysis to build the new statement.
1942   /// Subclasses may override this routine to provide different behavior.
1943   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1944                                        SourceLocation LParenLoc,
1945                                        SourceLocation EndLoc) {
1946     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1947                                                 EndLoc);
1948   }
1949 
1950   /// Build a new OpenMP 'num_tasks' clause.
1951   ///
1952   /// By default, performs semantic analysis to build the new statement.
1953   /// Subclasses may override this routine to provide different behavior.
1954   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1955                                       SourceLocation LParenLoc,
1956                                       SourceLocation EndLoc) {
1957     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1958                                                EndLoc);
1959   }
1960 
1961   /// Build a new OpenMP 'hint' clause.
1962   ///
1963   /// By default, performs semantic analysis to build the new statement.
1964   /// Subclasses may override this routine to provide different behavior.
1965   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1966                                   SourceLocation LParenLoc,
1967                                   SourceLocation EndLoc) {
1968     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1969   }
1970 
1971   /// Build a new OpenMP 'detach' 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 *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
1976                                     SourceLocation LParenLoc,
1977                                     SourceLocation EndLoc) {
1978     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
1979   }
1980 
1981   /// Build a new OpenMP 'dist_schedule' clause.
1982   ///
1983   /// By default, performs semantic analysis to build the new OpenMP clause.
1984   /// Subclasses may override this routine to provide different behavior.
1985   OMPClause *
1986   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1987                                Expr *ChunkSize, SourceLocation StartLoc,
1988                                SourceLocation LParenLoc, SourceLocation KindLoc,
1989                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1990     return getSema().ActOnOpenMPDistScheduleClause(
1991         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1992   }
1993 
1994   /// Build a new OpenMP 'to' clause.
1995   ///
1996   /// By default, performs semantic analysis to build the new statement.
1997   /// Subclasses may override this routine to provide different behavior.
1998   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1999                                 CXXScopeSpec &MapperIdScopeSpec,
2000                                 DeclarationNameInfo &MapperId,
2001                                 const OMPVarListLocTy &Locs,
2002                                 ArrayRef<Expr *> UnresolvedMappers) {
2003     return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId,
2004                                          Locs, UnresolvedMappers);
2005   }
2006 
2007   /// Build a new OpenMP 'from' clause.
2008   ///
2009   /// By default, performs semantic analysis to build the new statement.
2010   /// Subclasses may override this routine to provide different behavior.
2011   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
2012                                   CXXScopeSpec &MapperIdScopeSpec,
2013                                   DeclarationNameInfo &MapperId,
2014                                   const OMPVarListLocTy &Locs,
2015                                   ArrayRef<Expr *> UnresolvedMappers) {
2016     return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId,
2017                                            Locs, UnresolvedMappers);
2018   }
2019 
2020   /// Build a new OpenMP 'use_device_ptr' clause.
2021   ///
2022   /// By default, performs semantic analysis to build the new OpenMP clause.
2023   /// Subclasses may override this routine to provide different behavior.
2024   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2025                                           const OMPVarListLocTy &Locs) {
2026     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2027   }
2028 
2029   /// Build a new OpenMP 'is_device_ptr' clause.
2030   ///
2031   /// By default, performs semantic analysis to build the new OpenMP clause.
2032   /// Subclasses may override this routine to provide different behavior.
2033   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2034                                          const OMPVarListLocTy &Locs) {
2035     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2036   }
2037 
2038   /// Build a new OpenMP 'defaultmap' clause.
2039   ///
2040   /// By default, performs semantic analysis to build the new OpenMP clause.
2041   /// Subclasses may override this routine to provide different behavior.
2042   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2043                                         OpenMPDefaultmapClauseKind Kind,
2044                                         SourceLocation StartLoc,
2045                                         SourceLocation LParenLoc,
2046                                         SourceLocation MLoc,
2047                                         SourceLocation KindLoc,
2048                                         SourceLocation EndLoc) {
2049     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2050                                                  MLoc, KindLoc, EndLoc);
2051   }
2052 
2053   /// Build a new OpenMP 'nontemporal' clause.
2054   ///
2055   /// By default, performs semantic analysis to build the new OpenMP clause.
2056   /// Subclasses may override this routine to provide different behavior.
2057   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2058                                          SourceLocation StartLoc,
2059                                          SourceLocation LParenLoc,
2060                                          SourceLocation EndLoc) {
2061     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2062                                                   EndLoc);
2063   }
2064 
2065   /// Build a new OpenMP 'inclusive' clause.
2066   ///
2067   /// By default, performs semantic analysis to build the new OpenMP clause.
2068   /// Subclasses may override this routine to provide different behavior.
2069   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2070                                        SourceLocation StartLoc,
2071                                        SourceLocation LParenLoc,
2072                                        SourceLocation EndLoc) {
2073     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2074                                                 EndLoc);
2075   }
2076 
2077   /// Build a new OpenMP 'exclusive' clause.
2078   ///
2079   /// By default, performs semantic analysis to build the new OpenMP clause.
2080   /// Subclasses may override this routine to provide different behavior.
2081   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2082                                        SourceLocation StartLoc,
2083                                        SourceLocation LParenLoc,
2084                                        SourceLocation EndLoc) {
2085     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2086                                                 EndLoc);
2087   }
2088 
2089   /// Build a new OpenMP 'order' clause.
2090   ///
2091   /// By default, performs semantic analysis to build the new OpenMP clause.
2092   /// Subclasses may override this routine to provide different behavior.
2093   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2094                                    SourceLocation KindKwLoc,
2095                                    SourceLocation StartLoc,
2096                                    SourceLocation LParenLoc,
2097                                    SourceLocation EndLoc) {
2098     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2099                                             LParenLoc, EndLoc);
2100   }
2101 
2102   /// Rebuild the operand to an Objective-C \@synchronized statement.
2103   ///
2104   /// By default, performs semantic analysis to build the new statement.
2105   /// Subclasses may override this routine to provide different behavior.
2106   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2107                                               Expr *object) {
2108     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2109   }
2110 
2111   /// Build a new Objective-C \@synchronized statement.
2112   ///
2113   /// By default, performs semantic analysis to build the new statement.
2114   /// Subclasses may override this routine to provide different behavior.
2115   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2116                                            Expr *Object, Stmt *Body) {
2117     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2118   }
2119 
2120   /// Build a new Objective-C \@autoreleasepool statement.
2121   ///
2122   /// By default, performs semantic analysis to build the new statement.
2123   /// Subclasses may override this routine to provide different behavior.
2124   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2125                                             Stmt *Body) {
2126     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2127   }
2128 
2129   /// Build a new Objective-C fast enumeration statement.
2130   ///
2131   /// By default, performs semantic analysis to build the new statement.
2132   /// Subclasses may override this routine to provide different behavior.
2133   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2134                                           Stmt *Element,
2135                                           Expr *Collection,
2136                                           SourceLocation RParenLoc,
2137                                           Stmt *Body) {
2138     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2139                                                 Element,
2140                                                 Collection,
2141                                                 RParenLoc);
2142     if (ForEachStmt.isInvalid())
2143       return StmtError();
2144 
2145     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2146   }
2147 
2148   /// Build a new C++ exception declaration.
2149   ///
2150   /// By default, performs semantic analysis to build the new decaration.
2151   /// Subclasses may override this routine to provide different behavior.
2152   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2153                                 TypeSourceInfo *Declarator,
2154                                 SourceLocation StartLoc,
2155                                 SourceLocation IdLoc,
2156                                 IdentifierInfo *Id) {
2157     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2158                                                        StartLoc, IdLoc, Id);
2159     if (Var)
2160       getSema().CurContext->addDecl(Var);
2161     return Var;
2162   }
2163 
2164   /// Build a new C++ catch statement.
2165   ///
2166   /// By default, performs semantic analysis to build the new statement.
2167   /// Subclasses may override this routine to provide different behavior.
2168   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2169                                  VarDecl *ExceptionDecl,
2170                                  Stmt *Handler) {
2171     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2172                                                       Handler));
2173   }
2174 
2175   /// Build a new C++ try statement.
2176   ///
2177   /// By default, performs semantic analysis to build the new statement.
2178   /// Subclasses may override this routine to provide different behavior.
2179   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2180                                ArrayRef<Stmt *> Handlers) {
2181     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2182   }
2183 
2184   /// Build a new C++0x range-based for statement.
2185   ///
2186   /// By default, performs semantic analysis to build the new statement.
2187   /// Subclasses may override this routine to provide different behavior.
2188   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2189                                     SourceLocation CoawaitLoc, Stmt *Init,
2190                                     SourceLocation ColonLoc, Stmt *Range,
2191                                     Stmt *Begin, Stmt *End, Expr *Cond,
2192                                     Expr *Inc, Stmt *LoopVar,
2193                                     SourceLocation RParenLoc) {
2194     // If we've just learned that the range is actually an Objective-C
2195     // collection, treat this as an Objective-C fast enumeration loop.
2196     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2197       if (RangeStmt->isSingleDecl()) {
2198         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2199           if (RangeVar->isInvalidDecl())
2200             return StmtError();
2201 
2202           Expr *RangeExpr = RangeVar->getInit();
2203           if (!RangeExpr->isTypeDependent() &&
2204               RangeExpr->getType()->isObjCObjectPointerType()) {
2205             // FIXME: Support init-statements in Objective-C++20 ranged for
2206             // statement.
2207             if (Init) {
2208               return SemaRef.Diag(Init->getBeginLoc(),
2209                                   diag::err_objc_for_range_init_stmt)
2210                          << Init->getSourceRange();
2211             }
2212             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2213                                                         RangeExpr, RParenLoc);
2214           }
2215         }
2216       }
2217     }
2218 
2219     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2220                                           Range, Begin, End, Cond, Inc, LoopVar,
2221                                           RParenLoc, Sema::BFRK_Rebuild);
2222   }
2223 
2224   /// Build a new C++0x range-based for statement.
2225   ///
2226   /// By default, performs semantic analysis to build the new statement.
2227   /// Subclasses may override this routine to provide different behavior.
2228   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2229                                           bool IsIfExists,
2230                                           NestedNameSpecifierLoc QualifierLoc,
2231                                           DeclarationNameInfo NameInfo,
2232                                           Stmt *Nested) {
2233     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2234                                                 QualifierLoc, NameInfo, Nested);
2235   }
2236 
2237   /// Attach body to a C++0x range-based for statement.
2238   ///
2239   /// By default, performs semantic analysis to finish the new statement.
2240   /// Subclasses may override this routine to provide different behavior.
2241   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2242     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2243   }
2244 
2245   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2246                                Stmt *TryBlock, Stmt *Handler) {
2247     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2248   }
2249 
2250   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2251                                   Stmt *Block) {
2252     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2253   }
2254 
2255   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2256     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2257   }
2258 
2259   /// Build a new predefined expression.
2260   ///
2261   /// By default, performs semantic analysis to build the new expression.
2262   /// Subclasses may override this routine to provide different behavior.
2263   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2264                                    PredefinedExpr::IdentKind IK) {
2265     return getSema().BuildPredefinedExpr(Loc, IK);
2266   }
2267 
2268   /// Build a new expression that references a declaration.
2269   ///
2270   /// By default, performs semantic analysis to build the new expression.
2271   /// Subclasses may override this routine to provide different behavior.
2272   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2273                                         LookupResult &R,
2274                                         bool RequiresADL) {
2275     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2276   }
2277 
2278 
2279   /// Build a new expression that references a declaration.
2280   ///
2281   /// By default, performs semantic analysis to build the new expression.
2282   /// Subclasses may override this routine to provide different behavior.
2283   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2284                                 ValueDecl *VD,
2285                                 const DeclarationNameInfo &NameInfo,
2286                                 NamedDecl *Found,
2287                                 TemplateArgumentListInfo *TemplateArgs) {
2288     CXXScopeSpec SS;
2289     SS.Adopt(QualifierLoc);
2290     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2291                                               TemplateArgs);
2292   }
2293 
2294   /// Build a new expression in parentheses.
2295   ///
2296   /// By default, performs semantic analysis to build the new expression.
2297   /// Subclasses may override this routine to provide different behavior.
2298   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2299                                     SourceLocation RParen) {
2300     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2301   }
2302 
2303   /// Build a new pseudo-destructor expression.
2304   ///
2305   /// By default, performs semantic analysis to build the new expression.
2306   /// Subclasses may override this routine to provide different behavior.
2307   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2308                                             SourceLocation OperatorLoc,
2309                                             bool isArrow,
2310                                             CXXScopeSpec &SS,
2311                                             TypeSourceInfo *ScopeType,
2312                                             SourceLocation CCLoc,
2313                                             SourceLocation TildeLoc,
2314                                         PseudoDestructorTypeStorage Destroyed);
2315 
2316   /// Build a new unary operator expression.
2317   ///
2318   /// By default, performs semantic analysis to build the new expression.
2319   /// Subclasses may override this routine to provide different behavior.
2320   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2321                                         UnaryOperatorKind Opc,
2322                                         Expr *SubExpr) {
2323     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2324   }
2325 
2326   /// Build a new builtin offsetof expression.
2327   ///
2328   /// By default, performs semantic analysis to build the new expression.
2329   /// Subclasses may override this routine to provide different behavior.
2330   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2331                                  TypeSourceInfo *Type,
2332                                  ArrayRef<Sema::OffsetOfComponent> Components,
2333                                  SourceLocation RParenLoc) {
2334     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2335                                           RParenLoc);
2336   }
2337 
2338   /// Build a new sizeof, alignof or vec_step expression with a
2339   /// type argument.
2340   ///
2341   /// By default, performs semantic analysis to build the new expression.
2342   /// Subclasses may override this routine to provide different behavior.
2343   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2344                                          SourceLocation OpLoc,
2345                                          UnaryExprOrTypeTrait ExprKind,
2346                                          SourceRange R) {
2347     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2348   }
2349 
2350   /// Build a new sizeof, alignof or vec step expression with an
2351   /// expression argument.
2352   ///
2353   /// By default, performs semantic analysis to build the new expression.
2354   /// Subclasses may override this routine to provide different behavior.
2355   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2356                                          UnaryExprOrTypeTrait ExprKind,
2357                                          SourceRange R) {
2358     ExprResult Result
2359       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2360     if (Result.isInvalid())
2361       return ExprError();
2362 
2363     return Result;
2364   }
2365 
2366   /// Build a new array subscript expression.
2367   ///
2368   /// By default, performs semantic analysis to build the new expression.
2369   /// Subclasses may override this routine to provide different behavior.
2370   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2371                                              SourceLocation LBracketLoc,
2372                                              Expr *RHS,
2373                                              SourceLocation RBracketLoc) {
2374     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2375                                              LBracketLoc, RHS,
2376                                              RBracketLoc);
2377   }
2378 
2379   /// Build a new array section expression.
2380   ///
2381   /// By default, performs semantic analysis to build the new expression.
2382   /// Subclasses may override this routine to provide different behavior.
2383   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2384                                         Expr *LowerBound,
2385                                         SourceLocation ColonLoc, Expr *Length,
2386                                         SourceLocation RBracketLoc) {
2387     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2388                                               ColonLoc, Length, RBracketLoc);
2389   }
2390 
2391   /// Build a new array shaping expression.
2392   ///
2393   /// By default, performs semantic analysis to build the new expression.
2394   /// Subclasses may override this routine to provide different behavior.
2395   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2396                                         SourceLocation RParenLoc,
2397                                         ArrayRef<Expr *> Dims,
2398                                         ArrayRef<SourceRange> BracketsRanges) {
2399     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2400                                               BracketsRanges);
2401   }
2402 
2403   /// Build a new iterator expression.
2404   ///
2405   /// By default, performs semantic analysis to build the new expression.
2406   /// Subclasses may override this routine to provide different behavior.
2407   ExprResult RebuildOMPIteratorExpr(
2408       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2409       ArrayRef<Sema::OMPIteratorData> Data) {
2410     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2411                                           LLoc, RLoc, Data);
2412   }
2413 
2414   /// Build a new call expression.
2415   ///
2416   /// By default, performs semantic analysis to build the new expression.
2417   /// Subclasses may override this routine to provide different behavior.
2418   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2419                                    MultiExprArg Args,
2420                                    SourceLocation RParenLoc,
2421                                    Expr *ExecConfig = nullptr) {
2422     return getSema().ActOnCallExpr(
2423         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2424   }
2425 
2426   /// Build a new member access expression.
2427   ///
2428   /// By default, performs semantic analysis to build the new expression.
2429   /// Subclasses may override this routine to provide different behavior.
2430   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2431                                bool isArrow,
2432                                NestedNameSpecifierLoc QualifierLoc,
2433                                SourceLocation TemplateKWLoc,
2434                                const DeclarationNameInfo &MemberNameInfo,
2435                                ValueDecl *Member,
2436                                NamedDecl *FoundDecl,
2437                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2438                                NamedDecl *FirstQualifierInScope) {
2439     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2440                                                                       isArrow);
2441     if (!Member->getDeclName()) {
2442       // We have a reference to an unnamed field.  This is always the
2443       // base of an anonymous struct/union member access, i.e. the
2444       // field is always of record type.
2445       assert(Member->getType()->isRecordType() &&
2446              "unnamed member not of record type?");
2447 
2448       BaseResult =
2449         getSema().PerformObjectMemberConversion(BaseResult.get(),
2450                                                 QualifierLoc.getNestedNameSpecifier(),
2451                                                 FoundDecl, Member);
2452       if (BaseResult.isInvalid())
2453         return ExprError();
2454       Base = BaseResult.get();
2455 
2456       CXXScopeSpec EmptySS;
2457       return getSema().BuildFieldReferenceExpr(
2458           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2459           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2460     }
2461 
2462     CXXScopeSpec SS;
2463     SS.Adopt(QualifierLoc);
2464 
2465     Base = BaseResult.get();
2466     QualType BaseType = Base->getType();
2467 
2468     if (isArrow && !BaseType->isPointerType())
2469       return ExprError();
2470 
2471     // FIXME: this involves duplicating earlier analysis in a lot of
2472     // cases; we should avoid this when possible.
2473     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2474     R.addDecl(FoundDecl);
2475     R.resolveKind();
2476 
2477     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2478                                               SS, TemplateKWLoc,
2479                                               FirstQualifierInScope,
2480                                               R, ExplicitTemplateArgs,
2481                                               /*S*/nullptr);
2482   }
2483 
2484   /// Build a new binary operator expression.
2485   ///
2486   /// By default, performs semantic analysis to build the new expression.
2487   /// Subclasses may override this routine to provide different behavior.
2488   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2489                                          BinaryOperatorKind Opc,
2490                                          Expr *LHS, Expr *RHS) {
2491     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2492   }
2493 
2494   /// Build a new rewritten operator expression.
2495   ///
2496   /// By default, performs semantic analysis to build the new expression.
2497   /// Subclasses may override this routine to provide different behavior.
2498   ExprResult RebuildCXXRewrittenBinaryOperator(
2499       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2500       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2501     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2502                                            RHS, /*RequiresADL*/false);
2503   }
2504 
2505   /// Build a new conditional operator expression.
2506   ///
2507   /// By default, performs semantic analysis to build the new expression.
2508   /// Subclasses may override this routine to provide different behavior.
2509   ExprResult RebuildConditionalOperator(Expr *Cond,
2510                                         SourceLocation QuestionLoc,
2511                                         Expr *LHS,
2512                                         SourceLocation ColonLoc,
2513                                         Expr *RHS) {
2514     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2515                                         LHS, RHS);
2516   }
2517 
2518   /// Build a new C-style cast expression.
2519   ///
2520   /// By default, performs semantic analysis to build the new expression.
2521   /// Subclasses may override this routine to provide different behavior.
2522   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2523                                          TypeSourceInfo *TInfo,
2524                                          SourceLocation RParenLoc,
2525                                          Expr *SubExpr) {
2526     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2527                                          SubExpr);
2528   }
2529 
2530   /// Build a new compound literal expression.
2531   ///
2532   /// By default, performs semantic analysis to build the new expression.
2533   /// Subclasses may override this routine to provide different behavior.
2534   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2535                                               TypeSourceInfo *TInfo,
2536                                               SourceLocation RParenLoc,
2537                                               Expr *Init) {
2538     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2539                                               Init);
2540   }
2541 
2542   /// Build a new extended vector element access expression.
2543   ///
2544   /// By default, performs semantic analysis to build the new expression.
2545   /// Subclasses may override this routine to provide different behavior.
2546   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2547                                                SourceLocation OpLoc,
2548                                                SourceLocation AccessorLoc,
2549                                                IdentifierInfo &Accessor) {
2550 
2551     CXXScopeSpec SS;
2552     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2553     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2554                                               OpLoc, /*IsArrow*/ false,
2555                                               SS, SourceLocation(),
2556                                               /*FirstQualifierInScope*/ nullptr,
2557                                               NameInfo,
2558                                               /* TemplateArgs */ nullptr,
2559                                               /*S*/ nullptr);
2560   }
2561 
2562   /// Build a new initializer list expression.
2563   ///
2564   /// By default, performs semantic analysis to build the new expression.
2565   /// Subclasses may override this routine to provide different behavior.
2566   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2567                              MultiExprArg Inits,
2568                              SourceLocation RBraceLoc) {
2569     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2570   }
2571 
2572   /// Build a new designated initializer expression.
2573   ///
2574   /// By default, performs semantic analysis to build the new expression.
2575   /// Subclasses may override this routine to provide different behavior.
2576   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2577                                              MultiExprArg ArrayExprs,
2578                                              SourceLocation EqualOrColonLoc,
2579                                              bool GNUSyntax,
2580                                              Expr *Init) {
2581     ExprResult Result
2582       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2583                                            Init);
2584     if (Result.isInvalid())
2585       return ExprError();
2586 
2587     return Result;
2588   }
2589 
2590   /// Build a new value-initialized expression.
2591   ///
2592   /// By default, builds the implicit value initialization without performing
2593   /// any semantic analysis. Subclasses may override this routine to provide
2594   /// different behavior.
2595   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2596     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2597   }
2598 
2599   /// Build a new \c va_arg expression.
2600   ///
2601   /// By default, performs semantic analysis to build the new expression.
2602   /// Subclasses may override this routine to provide different behavior.
2603   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2604                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2605                                     SourceLocation RParenLoc) {
2606     return getSema().BuildVAArgExpr(BuiltinLoc,
2607                                     SubExpr, TInfo,
2608                                     RParenLoc);
2609   }
2610 
2611   /// Build a new expression list in parentheses.
2612   ///
2613   /// By default, performs semantic analysis to build the new expression.
2614   /// Subclasses may override this routine to provide different behavior.
2615   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2616                                   MultiExprArg SubExprs,
2617                                   SourceLocation RParenLoc) {
2618     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2619   }
2620 
2621   /// Build a new address-of-label expression.
2622   ///
2623   /// By default, performs semantic analysis, using the name of the label
2624   /// rather than attempting to map the label statement itself.
2625   /// Subclasses may override this routine to provide different behavior.
2626   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2627                                   SourceLocation LabelLoc, LabelDecl *Label) {
2628     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2629   }
2630 
2631   /// Build a new GNU statement expression.
2632   ///
2633   /// By default, performs semantic analysis to build the new expression.
2634   /// Subclasses may override this routine to provide different behavior.
2635   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2636                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2637     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2638                                    TemplateDepth);
2639   }
2640 
2641   /// Build a new __builtin_choose_expr expression.
2642   ///
2643   /// By default, performs semantic analysis to build the new expression.
2644   /// Subclasses may override this routine to provide different behavior.
2645   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2646                                      Expr *Cond, Expr *LHS, Expr *RHS,
2647                                      SourceLocation RParenLoc) {
2648     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2649                                    Cond, LHS, RHS,
2650                                    RParenLoc);
2651   }
2652 
2653   /// Build a new generic selection expression.
2654   ///
2655   /// By default, performs semantic analysis to build the new expression.
2656   /// Subclasses may override this routine to provide different behavior.
2657   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2658                                          SourceLocation DefaultLoc,
2659                                          SourceLocation RParenLoc,
2660                                          Expr *ControllingExpr,
2661                                          ArrayRef<TypeSourceInfo *> Types,
2662                                          ArrayRef<Expr *> Exprs) {
2663     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2664                                                 ControllingExpr, Types, Exprs);
2665   }
2666 
2667   /// Build a new overloaded operator call expression.
2668   ///
2669   /// By default, performs semantic analysis to build the new expression.
2670   /// The semantic analysis provides the behavior of template instantiation,
2671   /// copying with transformations that turn what looks like an overloaded
2672   /// operator call into a use of a builtin operator, performing
2673   /// argument-dependent lookup, etc. Subclasses may override this routine to
2674   /// provide different behavior.
2675   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2676                                               SourceLocation OpLoc,
2677                                               Expr *Callee,
2678                                               Expr *First,
2679                                               Expr *Second);
2680 
2681   /// Build a new C++ "named" cast expression, such as static_cast or
2682   /// reinterpret_cast.
2683   ///
2684   /// By default, this routine dispatches to one of the more-specific routines
2685   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2686   /// Subclasses may override this routine to provide different behavior.
2687   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2688                                            Stmt::StmtClass Class,
2689                                            SourceLocation LAngleLoc,
2690                                            TypeSourceInfo *TInfo,
2691                                            SourceLocation RAngleLoc,
2692                                            SourceLocation LParenLoc,
2693                                            Expr *SubExpr,
2694                                            SourceLocation RParenLoc) {
2695     switch (Class) {
2696     case Stmt::CXXStaticCastExprClass:
2697       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2698                                                    RAngleLoc, LParenLoc,
2699                                                    SubExpr, RParenLoc);
2700 
2701     case Stmt::CXXDynamicCastExprClass:
2702       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2703                                                     RAngleLoc, LParenLoc,
2704                                                     SubExpr, RParenLoc);
2705 
2706     case Stmt::CXXReinterpretCastExprClass:
2707       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2708                                                         RAngleLoc, LParenLoc,
2709                                                         SubExpr,
2710                                                         RParenLoc);
2711 
2712     case Stmt::CXXConstCastExprClass:
2713       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2714                                                    RAngleLoc, LParenLoc,
2715                                                    SubExpr, RParenLoc);
2716 
2717     default:
2718       llvm_unreachable("Invalid C++ named cast");
2719     }
2720   }
2721 
2722   /// Build a new C++ static_cast expression.
2723   ///
2724   /// By default, performs semantic analysis to build the new expression.
2725   /// Subclasses may override this routine to provide different behavior.
2726   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2727                                             SourceLocation LAngleLoc,
2728                                             TypeSourceInfo *TInfo,
2729                                             SourceLocation RAngleLoc,
2730                                             SourceLocation LParenLoc,
2731                                             Expr *SubExpr,
2732                                             SourceLocation RParenLoc) {
2733     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2734                                        TInfo, SubExpr,
2735                                        SourceRange(LAngleLoc, RAngleLoc),
2736                                        SourceRange(LParenLoc, RParenLoc));
2737   }
2738 
2739   /// Build a new C++ dynamic_cast expression.
2740   ///
2741   /// By default, performs semantic analysis to build the new expression.
2742   /// Subclasses may override this routine to provide different behavior.
2743   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2744                                              SourceLocation LAngleLoc,
2745                                              TypeSourceInfo *TInfo,
2746                                              SourceLocation RAngleLoc,
2747                                              SourceLocation LParenLoc,
2748                                              Expr *SubExpr,
2749                                              SourceLocation RParenLoc) {
2750     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2751                                        TInfo, SubExpr,
2752                                        SourceRange(LAngleLoc, RAngleLoc),
2753                                        SourceRange(LParenLoc, RParenLoc));
2754   }
2755 
2756   /// Build a new C++ reinterpret_cast expression.
2757   ///
2758   /// By default, performs semantic analysis to build the new expression.
2759   /// Subclasses may override this routine to provide different behavior.
2760   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2761                                                  SourceLocation LAngleLoc,
2762                                                  TypeSourceInfo *TInfo,
2763                                                  SourceLocation RAngleLoc,
2764                                                  SourceLocation LParenLoc,
2765                                                  Expr *SubExpr,
2766                                                  SourceLocation RParenLoc) {
2767     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2768                                        TInfo, SubExpr,
2769                                        SourceRange(LAngleLoc, RAngleLoc),
2770                                        SourceRange(LParenLoc, RParenLoc));
2771   }
2772 
2773   /// Build a new C++ const_cast expression.
2774   ///
2775   /// By default, performs semantic analysis to build the new expression.
2776   /// Subclasses may override this routine to provide different behavior.
2777   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2778                                            SourceLocation LAngleLoc,
2779                                            TypeSourceInfo *TInfo,
2780                                            SourceLocation RAngleLoc,
2781                                            SourceLocation LParenLoc,
2782                                            Expr *SubExpr,
2783                                            SourceLocation RParenLoc) {
2784     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2785                                        TInfo, SubExpr,
2786                                        SourceRange(LAngleLoc, RAngleLoc),
2787                                        SourceRange(LParenLoc, RParenLoc));
2788   }
2789 
2790   /// Build a new C++ functional-style cast expression.
2791   ///
2792   /// By default, performs semantic analysis to build the new expression.
2793   /// Subclasses may override this routine to provide different behavior.
2794   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2795                                           SourceLocation LParenLoc,
2796                                           Expr *Sub,
2797                                           SourceLocation RParenLoc,
2798                                           bool ListInitialization) {
2799     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2800                                                MultiExprArg(&Sub, 1), RParenLoc,
2801                                                ListInitialization);
2802   }
2803 
2804   /// Build a new C++ __builtin_bit_cast expression.
2805   ///
2806   /// By default, performs semantic analysis to build the new expression.
2807   /// Subclasses may override this routine to provide different behavior.
2808   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2809                                        TypeSourceInfo *TSI, Expr *Sub,
2810                                        SourceLocation RParenLoc) {
2811     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2812   }
2813 
2814   /// Build a new C++ typeid(type) expression.
2815   ///
2816   /// By default, performs semantic analysis to build the new expression.
2817   /// Subclasses may override this routine to provide different behavior.
2818   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2819                                         SourceLocation TypeidLoc,
2820                                         TypeSourceInfo *Operand,
2821                                         SourceLocation RParenLoc) {
2822     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2823                                     RParenLoc);
2824   }
2825 
2826 
2827   /// Build a new C++ typeid(expr) expression.
2828   ///
2829   /// By default, performs semantic analysis to build the new expression.
2830   /// Subclasses may override this routine to provide different behavior.
2831   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2832                                         SourceLocation TypeidLoc,
2833                                         Expr *Operand,
2834                                         SourceLocation RParenLoc) {
2835     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2836                                     RParenLoc);
2837   }
2838 
2839   /// Build a new C++ __uuidof(type) expression.
2840   ///
2841   /// By default, performs semantic analysis to build the new expression.
2842   /// Subclasses may override this routine to provide different behavior.
2843   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2844                                   TypeSourceInfo *Operand,
2845                                   SourceLocation RParenLoc) {
2846     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2847   }
2848 
2849   /// Build a new C++ __uuidof(expr) expression.
2850   ///
2851   /// By default, performs semantic analysis to build the new expression.
2852   /// Subclasses may override this routine to provide different behavior.
2853   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2854                                   Expr *Operand, SourceLocation RParenLoc) {
2855     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2856   }
2857 
2858   /// Build a new C++ "this" expression.
2859   ///
2860   /// By default, builds a new "this" expression without performing any
2861   /// semantic analysis. Subclasses may override this routine to provide
2862   /// different behavior.
2863   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2864                                 QualType ThisType,
2865                                 bool isImplicit) {
2866     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2867   }
2868 
2869   /// Build a new C++ throw expression.
2870   ///
2871   /// By default, performs semantic analysis to build the new expression.
2872   /// Subclasses may override this routine to provide different behavior.
2873   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2874                                  bool IsThrownVariableInScope) {
2875     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2876   }
2877 
2878   /// Build a new C++ default-argument expression.
2879   ///
2880   /// By default, builds a new default-argument expression, which does not
2881   /// require any semantic analysis. Subclasses may override this routine to
2882   /// provide different behavior.
2883   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2884     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2885                                      getSema().CurContext);
2886   }
2887 
2888   /// Build a new C++11 default-initialization expression.
2889   ///
2890   /// By default, builds a new default field initialization expression, which
2891   /// does not require any semantic analysis. Subclasses may override this
2892   /// routine to provide different behavior.
2893   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2894                                        FieldDecl *Field) {
2895     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2896                                       getSema().CurContext);
2897   }
2898 
2899   /// Build a new C++ zero-initialization expression.
2900   ///
2901   /// By default, performs semantic analysis to build the new expression.
2902   /// Subclasses may override this routine to provide different behavior.
2903   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2904                                            SourceLocation LParenLoc,
2905                                            SourceLocation RParenLoc) {
2906     return getSema().BuildCXXTypeConstructExpr(
2907         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2908   }
2909 
2910   /// Build a new C++ "new" expression.
2911   ///
2912   /// By default, performs semantic analysis to build the new expression.
2913   /// Subclasses may override this routine to provide different behavior.
2914   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2915                                bool UseGlobal,
2916                                SourceLocation PlacementLParen,
2917                                MultiExprArg PlacementArgs,
2918                                SourceLocation PlacementRParen,
2919                                SourceRange TypeIdParens,
2920                                QualType AllocatedType,
2921                                TypeSourceInfo *AllocatedTypeInfo,
2922                                Optional<Expr *> ArraySize,
2923                                SourceRange DirectInitRange,
2924                                Expr *Initializer) {
2925     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2926                                  PlacementLParen,
2927                                  PlacementArgs,
2928                                  PlacementRParen,
2929                                  TypeIdParens,
2930                                  AllocatedType,
2931                                  AllocatedTypeInfo,
2932                                  ArraySize,
2933                                  DirectInitRange,
2934                                  Initializer);
2935   }
2936 
2937   /// Build a new C++ "delete" expression.
2938   ///
2939   /// By default, performs semantic analysis to build the new expression.
2940   /// Subclasses may override this routine to provide different behavior.
2941   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2942                                         bool IsGlobalDelete,
2943                                         bool IsArrayForm,
2944                                         Expr *Operand) {
2945     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2946                                     Operand);
2947   }
2948 
2949   /// Build a new type trait expression.
2950   ///
2951   /// By default, performs semantic analysis to build the new expression.
2952   /// Subclasses may override this routine to provide different behavior.
2953   ExprResult RebuildTypeTrait(TypeTrait Trait,
2954                               SourceLocation StartLoc,
2955                               ArrayRef<TypeSourceInfo *> Args,
2956                               SourceLocation RParenLoc) {
2957     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2958   }
2959 
2960   /// Build a new array type trait expression.
2961   ///
2962   /// By default, performs semantic analysis to build the new expression.
2963   /// Subclasses may override this routine to provide different behavior.
2964   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2965                                    SourceLocation StartLoc,
2966                                    TypeSourceInfo *TSInfo,
2967                                    Expr *DimExpr,
2968                                    SourceLocation RParenLoc) {
2969     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2970   }
2971 
2972   /// Build a new expression trait expression.
2973   ///
2974   /// By default, performs semantic analysis to build the new expression.
2975   /// Subclasses may override this routine to provide different behavior.
2976   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2977                                    SourceLocation StartLoc,
2978                                    Expr *Queried,
2979                                    SourceLocation RParenLoc) {
2980     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2981   }
2982 
2983   /// Build a new (previously unresolved) declaration reference
2984   /// expression.
2985   ///
2986   /// By default, performs semantic analysis to build the new expression.
2987   /// Subclasses may override this routine to provide different behavior.
2988   ExprResult RebuildDependentScopeDeclRefExpr(
2989                                           NestedNameSpecifierLoc QualifierLoc,
2990                                           SourceLocation TemplateKWLoc,
2991                                        const DeclarationNameInfo &NameInfo,
2992                               const TemplateArgumentListInfo *TemplateArgs,
2993                                           bool IsAddressOfOperand,
2994                                           TypeSourceInfo **RecoveryTSI) {
2995     CXXScopeSpec SS;
2996     SS.Adopt(QualifierLoc);
2997 
2998     if (TemplateArgs || TemplateKWLoc.isValid())
2999       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3000                                                     TemplateArgs);
3001 
3002     return getSema().BuildQualifiedDeclarationNameExpr(
3003         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3004   }
3005 
3006   /// Build a new template-id expression.
3007   ///
3008   /// By default, performs semantic analysis to build the new expression.
3009   /// Subclasses may override this routine to provide different behavior.
3010   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3011                                    SourceLocation TemplateKWLoc,
3012                                    LookupResult &R,
3013                                    bool RequiresADL,
3014                               const TemplateArgumentListInfo *TemplateArgs) {
3015     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3016                                          TemplateArgs);
3017   }
3018 
3019   /// Build a new object-construction expression.
3020   ///
3021   /// By default, performs semantic analysis to build the new expression.
3022   /// Subclasses may override this routine to provide different behavior.
3023   ExprResult RebuildCXXConstructExpr(QualType T,
3024                                      SourceLocation Loc,
3025                                      CXXConstructorDecl *Constructor,
3026                                      bool IsElidable,
3027                                      MultiExprArg Args,
3028                                      bool HadMultipleCandidates,
3029                                      bool ListInitialization,
3030                                      bool StdInitListInitialization,
3031                                      bool RequiresZeroInit,
3032                              CXXConstructExpr::ConstructionKind ConstructKind,
3033                                      SourceRange ParenRange) {
3034     // Reconstruct the constructor we originally found, which might be
3035     // different if this is a call to an inherited constructor.
3036     CXXConstructorDecl *FoundCtor = Constructor;
3037     if (Constructor->isInheritingConstructor())
3038       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3039 
3040     SmallVector<Expr*, 8> ConvertedArgs;
3041     if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs))
3042       return ExprError();
3043 
3044     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3045                                            IsElidable,
3046                                            ConvertedArgs,
3047                                            HadMultipleCandidates,
3048                                            ListInitialization,
3049                                            StdInitListInitialization,
3050                                            RequiresZeroInit, ConstructKind,
3051                                            ParenRange);
3052   }
3053 
3054   /// Build a new implicit construction via inherited constructor
3055   /// expression.
3056   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3057                                              CXXConstructorDecl *Constructor,
3058                                              bool ConstructsVBase,
3059                                              bool InheritedFromVBase) {
3060     return new (getSema().Context) CXXInheritedCtorInitExpr(
3061         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3062   }
3063 
3064   /// Build a new object-construction expression.
3065   ///
3066   /// By default, performs semantic analysis to build the new expression.
3067   /// Subclasses may override this routine to provide different behavior.
3068   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3069                                            SourceLocation LParenOrBraceLoc,
3070                                            MultiExprArg Args,
3071                                            SourceLocation RParenOrBraceLoc,
3072                                            bool ListInitialization) {
3073     return getSema().BuildCXXTypeConstructExpr(
3074         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3075   }
3076 
3077   /// Build a new object-construction 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 RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3082                                                SourceLocation LParenLoc,
3083                                                MultiExprArg Args,
3084                                                SourceLocation RParenLoc,
3085                                                bool ListInitialization) {
3086     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3087                                                RParenLoc, ListInitialization);
3088   }
3089 
3090   /// Build a new member reference expression.
3091   ///
3092   /// By default, performs semantic analysis to build the new expression.
3093   /// Subclasses may override this routine to provide different behavior.
3094   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3095                                                 QualType BaseType,
3096                                                 bool IsArrow,
3097                                                 SourceLocation OperatorLoc,
3098                                           NestedNameSpecifierLoc QualifierLoc,
3099                                                 SourceLocation TemplateKWLoc,
3100                                             NamedDecl *FirstQualifierInScope,
3101                                    const DeclarationNameInfo &MemberNameInfo,
3102                               const TemplateArgumentListInfo *TemplateArgs) {
3103     CXXScopeSpec SS;
3104     SS.Adopt(QualifierLoc);
3105 
3106     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3107                                             OperatorLoc, IsArrow,
3108                                             SS, TemplateKWLoc,
3109                                             FirstQualifierInScope,
3110                                             MemberNameInfo,
3111                                             TemplateArgs, /*S*/nullptr);
3112   }
3113 
3114   /// Build a new member reference expression.
3115   ///
3116   /// By default, performs semantic analysis to build the new expression.
3117   /// Subclasses may override this routine to provide different behavior.
3118   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3119                                          SourceLocation OperatorLoc,
3120                                          bool IsArrow,
3121                                          NestedNameSpecifierLoc QualifierLoc,
3122                                          SourceLocation TemplateKWLoc,
3123                                          NamedDecl *FirstQualifierInScope,
3124                                          LookupResult &R,
3125                                 const TemplateArgumentListInfo *TemplateArgs) {
3126     CXXScopeSpec SS;
3127     SS.Adopt(QualifierLoc);
3128 
3129     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3130                                             OperatorLoc, IsArrow,
3131                                             SS, TemplateKWLoc,
3132                                             FirstQualifierInScope,
3133                                             R, TemplateArgs, /*S*/nullptr);
3134   }
3135 
3136   /// Build a new noexcept expression.
3137   ///
3138   /// By default, performs semantic analysis to build the new expression.
3139   /// Subclasses may override this routine to provide different behavior.
3140   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3141     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3142   }
3143 
3144   /// Build a new expression to compute the length of a parameter pack.
3145   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3146                                    NamedDecl *Pack,
3147                                    SourceLocation PackLoc,
3148                                    SourceLocation RParenLoc,
3149                                    Optional<unsigned> Length,
3150                                    ArrayRef<TemplateArgument> PartialArgs) {
3151     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3152                                   RParenLoc, Length, PartialArgs);
3153   }
3154 
3155   /// Build a new expression representing a call to a source location
3156   ///  builtin.
3157   ///
3158   /// By default, performs semantic analysis to build the new expression.
3159   /// Subclasses may override this routine to provide different behavior.
3160   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3161                                   SourceLocation BuiltinLoc,
3162                                   SourceLocation RPLoc,
3163                                   DeclContext *ParentContext) {
3164     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3165   }
3166 
3167   /// Build a new Objective-C boxed expression.
3168   ///
3169   /// By default, performs semantic analysis to build the new expression.
3170   /// Subclasses may override this routine to provide different behavior.
3171   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3172       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3173       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3174       TemplateArgumentListInfo *TALI) {
3175     CXXScopeSpec SS;
3176     SS.Adopt(NNS);
3177     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3178                                                          ConceptNameInfo,
3179                                                          FoundDecl,
3180                                                          NamedConcept, TALI);
3181     if (Result.isInvalid())
3182       return ExprError();
3183     return Result;
3184   }
3185 
3186   /// \brief Build a new requires expression.
3187   ///
3188   /// By default, performs semantic analysis to build the new expression.
3189   /// Subclasses may override this routine to provide different behavior.
3190   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3191                                  RequiresExprBodyDecl *Body,
3192                                  ArrayRef<ParmVarDecl *> LocalParameters,
3193                                  ArrayRef<concepts::Requirement *> Requirements,
3194                                  SourceLocation ClosingBraceLoc) {
3195     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3196                                 LocalParameters, Requirements, ClosingBraceLoc);
3197   }
3198 
3199   concepts::TypeRequirement *
3200   RebuildTypeRequirement(
3201       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3202     return SemaRef.BuildTypeRequirement(SubstDiag);
3203   }
3204 
3205   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3206     return SemaRef.BuildTypeRequirement(T);
3207   }
3208 
3209   concepts::ExprRequirement *
3210   RebuildExprRequirement(
3211       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3212       SourceLocation NoexceptLoc,
3213       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3214     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3215                                         std::move(Ret));
3216   }
3217 
3218   concepts::ExprRequirement *
3219   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3220                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3221     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3222                                         std::move(Ret));
3223   }
3224 
3225   concepts::NestedRequirement *
3226   RebuildNestedRequirement(
3227       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3228     return SemaRef.BuildNestedRequirement(SubstDiag);
3229   }
3230 
3231   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3232     return SemaRef.BuildNestedRequirement(Constraint);
3233   }
3234 
3235   /// \brief Build a new Objective-C boxed expression.
3236   ///
3237   /// By default, performs semantic analysis to build the new expression.
3238   /// Subclasses may override this routine to provide different behavior.
3239   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3240     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3241   }
3242 
3243   /// Build a new Objective-C array literal.
3244   ///
3245   /// By default, performs semantic analysis to build the new expression.
3246   /// Subclasses may override this routine to provide different behavior.
3247   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3248                                      Expr **Elements, unsigned NumElements) {
3249     return getSema().BuildObjCArrayLiteral(Range,
3250                                            MultiExprArg(Elements, NumElements));
3251   }
3252 
3253   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3254                                          Expr *Base, Expr *Key,
3255                                          ObjCMethodDecl *getterMethod,
3256                                          ObjCMethodDecl *setterMethod) {
3257     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3258                                                    getterMethod, setterMethod);
3259   }
3260 
3261   /// Build a new Objective-C dictionary literal.
3262   ///
3263   /// By default, performs semantic analysis to build the new expression.
3264   /// Subclasses may override this routine to provide different behavior.
3265   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3266                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3267     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3268   }
3269 
3270   /// Build a new Objective-C \@encode expression.
3271   ///
3272   /// By default, performs semantic analysis to build the new expression.
3273   /// Subclasses may override this routine to provide different behavior.
3274   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3275                                          TypeSourceInfo *EncodeTypeInfo,
3276                                          SourceLocation RParenLoc) {
3277     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3278   }
3279 
3280   /// Build a new Objective-C class message.
3281   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3282                                           Selector Sel,
3283                                           ArrayRef<SourceLocation> SelectorLocs,
3284                                           ObjCMethodDecl *Method,
3285                                           SourceLocation LBracLoc,
3286                                           MultiExprArg Args,
3287                                           SourceLocation RBracLoc) {
3288     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3289                                      ReceiverTypeInfo->getType(),
3290                                      /*SuperLoc=*/SourceLocation(),
3291                                      Sel, Method, LBracLoc, SelectorLocs,
3292                                      RBracLoc, Args);
3293   }
3294 
3295   /// Build a new Objective-C instance message.
3296   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3297                                           Selector Sel,
3298                                           ArrayRef<SourceLocation> SelectorLocs,
3299                                           ObjCMethodDecl *Method,
3300                                           SourceLocation LBracLoc,
3301                                           MultiExprArg Args,
3302                                           SourceLocation RBracLoc) {
3303     return SemaRef.BuildInstanceMessage(Receiver,
3304                                         Receiver->getType(),
3305                                         /*SuperLoc=*/SourceLocation(),
3306                                         Sel, Method, LBracLoc, SelectorLocs,
3307                                         RBracLoc, Args);
3308   }
3309 
3310   /// Build a new Objective-C instance/class message to 'super'.
3311   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3312                                     Selector Sel,
3313                                     ArrayRef<SourceLocation> SelectorLocs,
3314                                     QualType SuperType,
3315                                     ObjCMethodDecl *Method,
3316                                     SourceLocation LBracLoc,
3317                                     MultiExprArg Args,
3318                                     SourceLocation RBracLoc) {
3319     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3320                                           SuperType,
3321                                           SuperLoc,
3322                                           Sel, Method, LBracLoc, SelectorLocs,
3323                                           RBracLoc, Args)
3324                                       : SemaRef.BuildClassMessage(nullptr,
3325                                           SuperType,
3326                                           SuperLoc,
3327                                           Sel, Method, LBracLoc, SelectorLocs,
3328                                           RBracLoc, Args);
3329 
3330 
3331   }
3332 
3333   /// Build a new Objective-C ivar reference expression.
3334   ///
3335   /// By default, performs semantic analysis to build the new expression.
3336   /// Subclasses may override this routine to provide different behavior.
3337   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3338                                           SourceLocation IvarLoc,
3339                                           bool IsArrow, bool IsFreeIvar) {
3340     CXXScopeSpec SS;
3341     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3342     ExprResult Result = getSema().BuildMemberReferenceExpr(
3343         BaseArg, BaseArg->getType(),
3344         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3345         /*FirstQualifierInScope=*/nullptr, NameInfo,
3346         /*TemplateArgs=*/nullptr,
3347         /*S=*/nullptr);
3348     if (IsFreeIvar && Result.isUsable())
3349       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3350     return Result;
3351   }
3352 
3353   /// Build a new Objective-C property reference expression.
3354   ///
3355   /// By default, performs semantic analysis to build the new expression.
3356   /// Subclasses may override this routine to provide different behavior.
3357   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3358                                         ObjCPropertyDecl *Property,
3359                                         SourceLocation PropertyLoc) {
3360     CXXScopeSpec SS;
3361     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3362     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3363                                               /*FIXME:*/PropertyLoc,
3364                                               /*IsArrow=*/false,
3365                                               SS, SourceLocation(),
3366                                               /*FirstQualifierInScope=*/nullptr,
3367                                               NameInfo,
3368                                               /*TemplateArgs=*/nullptr,
3369                                               /*S=*/nullptr);
3370   }
3371 
3372   /// Build a new Objective-C property reference expression.
3373   ///
3374   /// By default, performs semantic analysis to build the new expression.
3375   /// Subclasses may override this routine to provide different behavior.
3376   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3377                                         ObjCMethodDecl *Getter,
3378                                         ObjCMethodDecl *Setter,
3379                                         SourceLocation PropertyLoc) {
3380     // Since these expressions can only be value-dependent, we do not
3381     // need to perform semantic analysis again.
3382     return Owned(
3383       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3384                                                   VK_LValue, OK_ObjCProperty,
3385                                                   PropertyLoc, Base));
3386   }
3387 
3388   /// Build a new Objective-C "isa" expression.
3389   ///
3390   /// By default, performs semantic analysis to build the new expression.
3391   /// Subclasses may override this routine to provide different behavior.
3392   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3393                                 SourceLocation OpLoc, bool IsArrow) {
3394     CXXScopeSpec SS;
3395     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3396     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3397                                               OpLoc, IsArrow,
3398                                               SS, SourceLocation(),
3399                                               /*FirstQualifierInScope=*/nullptr,
3400                                               NameInfo,
3401                                               /*TemplateArgs=*/nullptr,
3402                                               /*S=*/nullptr);
3403   }
3404 
3405   /// Build a new shuffle vector expression.
3406   ///
3407   /// By default, performs semantic analysis to build the new expression.
3408   /// Subclasses may override this routine to provide different behavior.
3409   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3410                                       MultiExprArg SubExprs,
3411                                       SourceLocation RParenLoc) {
3412     // Find the declaration for __builtin_shufflevector
3413     const IdentifierInfo &Name
3414       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3415     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3416     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3417     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3418 
3419     // Build a reference to the __builtin_shufflevector builtin
3420     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3421     Expr *Callee = new (SemaRef.Context)
3422         DeclRefExpr(SemaRef.Context, Builtin, false,
3423                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3424     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3425     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3426                                        CK_BuiltinFnToFnPtr).get();
3427 
3428     // Build the CallExpr
3429     ExprResult TheCall = CallExpr::Create(
3430         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3431         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3432 
3433     // Type-check the __builtin_shufflevector expression.
3434     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3435   }
3436 
3437   /// Build a new convert vector expression.
3438   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3439                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3440                                       SourceLocation RParenLoc) {
3441     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3442                                          BuiltinLoc, RParenLoc);
3443   }
3444 
3445   /// Build a new template argument pack expansion.
3446   ///
3447   /// By default, performs semantic analysis to build a new pack expansion
3448   /// for a template argument. Subclasses may override this routine to provide
3449   /// different behavior.
3450   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3451                                            SourceLocation EllipsisLoc,
3452                                            Optional<unsigned> NumExpansions) {
3453     switch (Pattern.getArgument().getKind()) {
3454     case TemplateArgument::Expression: {
3455       ExprResult Result
3456         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3457                                        EllipsisLoc, NumExpansions);
3458       if (Result.isInvalid())
3459         return TemplateArgumentLoc();
3460 
3461       return TemplateArgumentLoc(Result.get(), Result.get());
3462     }
3463 
3464     case TemplateArgument::Template:
3465       return TemplateArgumentLoc(TemplateArgument(
3466                                           Pattern.getArgument().getAsTemplate(),
3467                                                   NumExpansions),
3468                                  Pattern.getTemplateQualifierLoc(),
3469                                  Pattern.getTemplateNameLoc(),
3470                                  EllipsisLoc);
3471 
3472     case TemplateArgument::Null:
3473     case TemplateArgument::Integral:
3474     case TemplateArgument::Declaration:
3475     case TemplateArgument::Pack:
3476     case TemplateArgument::TemplateExpansion:
3477     case TemplateArgument::NullPtr:
3478       llvm_unreachable("Pack expansion pattern has no parameter packs");
3479 
3480     case TemplateArgument::Type:
3481       if (TypeSourceInfo *Expansion
3482             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3483                                            EllipsisLoc,
3484                                            NumExpansions))
3485         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3486                                    Expansion);
3487       break;
3488     }
3489 
3490     return TemplateArgumentLoc();
3491   }
3492 
3493   /// Build a new expression pack expansion.
3494   ///
3495   /// By default, performs semantic analysis to build a new pack expansion
3496   /// for an expression. Subclasses may override this routine to provide
3497   /// different behavior.
3498   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3499                                   Optional<unsigned> NumExpansions) {
3500     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3501   }
3502 
3503   /// Build a new C++1z fold-expression.
3504   ///
3505   /// By default, performs semantic analysis in order to build a new fold
3506   /// expression.
3507   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3508                                 BinaryOperatorKind Operator,
3509                                 SourceLocation EllipsisLoc, Expr *RHS,
3510                                 SourceLocation RParenLoc,
3511                                 Optional<unsigned> NumExpansions) {
3512     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3513                                       RHS, RParenLoc, NumExpansions);
3514   }
3515 
3516   /// Build an empty C++1z fold-expression with the given operator.
3517   ///
3518   /// By default, produces the fallback value for the fold-expression, or
3519   /// produce an error if there is no fallback value.
3520   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3521                                      BinaryOperatorKind Operator) {
3522     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3523   }
3524 
3525   /// Build a new atomic operation expression.
3526   ///
3527   /// By default, performs semantic analysis to build the new expression.
3528   /// Subclasses may override this routine to provide different behavior.
3529   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3530                                AtomicExpr::AtomicOp Op,
3531                                SourceLocation RParenLoc) {
3532     // Use this for all of the locations, since we don't know the difference
3533     // between the call and the expr at this point.
3534     SourceRange Range{BuiltinLoc, RParenLoc};
3535     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3536                                      Sema::AtomicArgumentOrder::AST);
3537   }
3538 
3539   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3540                                  ArrayRef<Expr *> SubExprs) {
3541     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs);
3542   }
3543 
3544 private:
3545   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3546                                      QualType ObjectType,
3547                                      NamedDecl *FirstQualifierInScope,
3548                                      CXXScopeSpec &SS);
3549 
3550   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3551                                              QualType ObjectType,
3552                                              NamedDecl *FirstQualifierInScope,
3553                                              CXXScopeSpec &SS);
3554 
3555   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3556                                             NamedDecl *FirstQualifierInScope,
3557                                             CXXScopeSpec &SS);
3558 
3559   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3560                                       DependentNameTypeLoc TL,
3561                                       bool DeducibleTSTContext);
3562 };
3563 
3564 template <typename Derived>
3565 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3566   if (!S)
3567     return S;
3568 
3569   switch (S->getStmtClass()) {
3570   case Stmt::NoStmtClass: break;
3571 
3572   // Transform individual statement nodes
3573   // Pass SDK into statements that can produce a value
3574 #define STMT(Node, Parent)                                              \
3575   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3576 #define VALUESTMT(Node, Parent)                                         \
3577   case Stmt::Node##Class:                                               \
3578     return getDerived().Transform##Node(cast<Node>(S), SDK);
3579 #define ABSTRACT_STMT(Node)
3580 #define EXPR(Node, Parent)
3581 #include "clang/AST/StmtNodes.inc"
3582 
3583   // Transform expressions by calling TransformExpr.
3584 #define STMT(Node, Parent)
3585 #define ABSTRACT_STMT(Stmt)
3586 #define EXPR(Node, Parent) case Stmt::Node##Class:
3587 #include "clang/AST/StmtNodes.inc"
3588     {
3589       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3590 
3591       if (SDK == SDK_StmtExprResult)
3592         E = getSema().ActOnStmtExprResult(E);
3593       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3594     }
3595   }
3596 
3597   return S;
3598 }
3599 
3600 template<typename Derived>
3601 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3602   if (!S)
3603     return S;
3604 
3605   switch (S->getClauseKind()) {
3606   default: break;
3607   // Transform individual clause nodes
3608 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \
3609   case Enum:                                                                   \
3610     return getDerived().Transform ## Class(cast<Class>(S));
3611 #include "llvm/Frontend/OpenMP/OMPKinds.def"
3612   }
3613 
3614   return S;
3615 }
3616 
3617 
3618 template<typename Derived>
3619 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3620   if (!E)
3621     return E;
3622 
3623   switch (E->getStmtClass()) {
3624     case Stmt::NoStmtClass: break;
3625 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3626 #define ABSTRACT_STMT(Stmt)
3627 #define EXPR(Node, Parent)                                              \
3628     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3629 #include "clang/AST/StmtNodes.inc"
3630   }
3631 
3632   return E;
3633 }
3634 
3635 template<typename Derived>
3636 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3637                                                         bool NotCopyInit) {
3638   // Initializers are instantiated like expressions, except that various outer
3639   // layers are stripped.
3640   if (!Init)
3641     return Init;
3642 
3643   if (auto *FE = dyn_cast<FullExpr>(Init))
3644     Init = FE->getSubExpr();
3645 
3646   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3647     Init = AIL->getCommonExpr();
3648 
3649   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3650     Init = MTE->getSubExpr();
3651 
3652   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3653     Init = Binder->getSubExpr();
3654 
3655   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3656     Init = ICE->getSubExprAsWritten();
3657 
3658   if (CXXStdInitializerListExpr *ILE =
3659           dyn_cast<CXXStdInitializerListExpr>(Init))
3660     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3661 
3662   // If this is copy-initialization, we only need to reconstruct
3663   // InitListExprs. Other forms of copy-initialization will be a no-op if
3664   // the initializer is already the right type.
3665   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3666   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3667     return getDerived().TransformExpr(Init);
3668 
3669   // Revert value-initialization back to empty parens.
3670   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3671     SourceRange Parens = VIE->getSourceRange();
3672     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3673                                              Parens.getEnd());
3674   }
3675 
3676   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3677   if (isa<ImplicitValueInitExpr>(Init))
3678     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3679                                              SourceLocation());
3680 
3681   // Revert initialization by constructor back to a parenthesized or braced list
3682   // of expressions. Any other form of initializer can just be reused directly.
3683   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3684     return getDerived().TransformExpr(Init);
3685 
3686   // If the initialization implicitly converted an initializer list to a
3687   // std::initializer_list object, unwrap the std::initializer_list too.
3688   if (Construct && Construct->isStdInitListInitialization())
3689     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3690 
3691   // Enter a list-init context if this was list initialization.
3692   EnterExpressionEvaluationContext Context(
3693       getSema(), EnterExpressionEvaluationContext::InitList,
3694       Construct->isListInitialization());
3695 
3696   SmallVector<Expr*, 8> NewArgs;
3697   bool ArgChanged = false;
3698   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3699                                   /*IsCall*/true, NewArgs, &ArgChanged))
3700     return ExprError();
3701 
3702   // If this was list initialization, revert to syntactic list form.
3703   if (Construct->isListInitialization())
3704     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3705                                         Construct->getEndLoc());
3706 
3707   // Build a ParenListExpr to represent anything else.
3708   SourceRange Parens = Construct->getParenOrBraceRange();
3709   if (Parens.isInvalid()) {
3710     // This was a variable declaration's initialization for which no initializer
3711     // was specified.
3712     assert(NewArgs.empty() &&
3713            "no parens or braces but have direct init with arguments?");
3714     return ExprEmpty();
3715   }
3716   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3717                                            Parens.getEnd());
3718 }
3719 
3720 template<typename Derived>
3721 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3722                                             unsigned NumInputs,
3723                                             bool IsCall,
3724                                       SmallVectorImpl<Expr *> &Outputs,
3725                                             bool *ArgChanged) {
3726   for (unsigned I = 0; I != NumInputs; ++I) {
3727     // If requested, drop call arguments that need to be dropped.
3728     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3729       if (ArgChanged)
3730         *ArgChanged = true;
3731 
3732       break;
3733     }
3734 
3735     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3736       Expr *Pattern = Expansion->getPattern();
3737 
3738       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3739       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3740       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3741 
3742       // Determine whether the set of unexpanded parameter packs can and should
3743       // be expanded.
3744       bool Expand = true;
3745       bool RetainExpansion = false;
3746       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3747       Optional<unsigned> NumExpansions = OrigNumExpansions;
3748       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3749                                                Pattern->getSourceRange(),
3750                                                Unexpanded,
3751                                                Expand, RetainExpansion,
3752                                                NumExpansions))
3753         return true;
3754 
3755       if (!Expand) {
3756         // The transform has determined that we should perform a simple
3757         // transformation on the pack expansion, producing another pack
3758         // expansion.
3759         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3760         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3761         if (OutPattern.isInvalid())
3762           return true;
3763 
3764         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3765                                                 Expansion->getEllipsisLoc(),
3766                                                            NumExpansions);
3767         if (Out.isInvalid())
3768           return true;
3769 
3770         if (ArgChanged)
3771           *ArgChanged = true;
3772         Outputs.push_back(Out.get());
3773         continue;
3774       }
3775 
3776       // Record right away that the argument was changed.  This needs
3777       // to happen even if the array expands to nothing.
3778       if (ArgChanged) *ArgChanged = true;
3779 
3780       // The transform has determined that we should perform an elementwise
3781       // expansion of the pattern. Do so.
3782       for (unsigned I = 0; I != *NumExpansions; ++I) {
3783         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3784         ExprResult Out = getDerived().TransformExpr(Pattern);
3785         if (Out.isInvalid())
3786           return true;
3787 
3788         if (Out.get()->containsUnexpandedParameterPack()) {
3789           Out = getDerived().RebuildPackExpansion(
3790               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3791           if (Out.isInvalid())
3792             return true;
3793         }
3794 
3795         Outputs.push_back(Out.get());
3796       }
3797 
3798       // If we're supposed to retain a pack expansion, do so by temporarily
3799       // forgetting the partially-substituted parameter pack.
3800       if (RetainExpansion) {
3801         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3802 
3803         ExprResult Out = getDerived().TransformExpr(Pattern);
3804         if (Out.isInvalid())
3805           return true;
3806 
3807         Out = getDerived().RebuildPackExpansion(
3808             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3809         if (Out.isInvalid())
3810           return true;
3811 
3812         Outputs.push_back(Out.get());
3813       }
3814 
3815       continue;
3816     }
3817 
3818     ExprResult Result =
3819       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3820              : getDerived().TransformExpr(Inputs[I]);
3821     if (Result.isInvalid())
3822       return true;
3823 
3824     if (Result.get() != Inputs[I] && ArgChanged)
3825       *ArgChanged = true;
3826 
3827     Outputs.push_back(Result.get());
3828   }
3829 
3830   return false;
3831 }
3832 
3833 template <typename Derived>
3834 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3835     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3836   if (Var) {
3837     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3838         getDerived().TransformDefinition(Var->getLocation(), Var));
3839 
3840     if (!ConditionVar)
3841       return Sema::ConditionError();
3842 
3843     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3844   }
3845 
3846   if (Expr) {
3847     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3848 
3849     if (CondExpr.isInvalid())
3850       return Sema::ConditionError();
3851 
3852     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3853   }
3854 
3855   return Sema::ConditionResult();
3856 }
3857 
3858 template<typename Derived>
3859 NestedNameSpecifierLoc
3860 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3861                                                     NestedNameSpecifierLoc NNS,
3862                                                      QualType ObjectType,
3863                                              NamedDecl *FirstQualifierInScope) {
3864   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3865   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3866        Qualifier = Qualifier.getPrefix())
3867     Qualifiers.push_back(Qualifier);
3868 
3869   CXXScopeSpec SS;
3870   while (!Qualifiers.empty()) {
3871     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3872     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3873 
3874     switch (QNNS->getKind()) {
3875     case NestedNameSpecifier::Identifier: {
3876       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3877                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3878       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3879                                               SS, FirstQualifierInScope, false))
3880         return NestedNameSpecifierLoc();
3881     }
3882       break;
3883 
3884     case NestedNameSpecifier::Namespace: {
3885       NamespaceDecl *NS
3886         = cast_or_null<NamespaceDecl>(
3887                                     getDerived().TransformDecl(
3888                                                           Q.getLocalBeginLoc(),
3889                                                        QNNS->getAsNamespace()));
3890       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3891       break;
3892     }
3893 
3894     case NestedNameSpecifier::NamespaceAlias: {
3895       NamespaceAliasDecl *Alias
3896         = cast_or_null<NamespaceAliasDecl>(
3897                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3898                                                  QNNS->getAsNamespaceAlias()));
3899       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3900                 Q.getLocalEndLoc());
3901       break;
3902     }
3903 
3904     case NestedNameSpecifier::Global:
3905       // There is no meaningful transformation that one could perform on the
3906       // global scope.
3907       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3908       break;
3909 
3910     case NestedNameSpecifier::Super: {
3911       CXXRecordDecl *RD =
3912           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3913               SourceLocation(), QNNS->getAsRecordDecl()));
3914       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3915       break;
3916     }
3917 
3918     case NestedNameSpecifier::TypeSpecWithTemplate:
3919     case NestedNameSpecifier::TypeSpec: {
3920       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3921                                               FirstQualifierInScope, SS);
3922 
3923       if (!TL)
3924         return NestedNameSpecifierLoc();
3925 
3926       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3927           (SemaRef.getLangOpts().CPlusPlus11 &&
3928            TL.getType()->isEnumeralType())) {
3929         assert(!TL.getType().hasLocalQualifiers() &&
3930                "Can't get cv-qualifiers here");
3931         if (TL.getType()->isEnumeralType())
3932           SemaRef.Diag(TL.getBeginLoc(),
3933                        diag::warn_cxx98_compat_enum_nested_name_spec);
3934         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3935                   Q.getLocalEndLoc());
3936         break;
3937       }
3938       // If the nested-name-specifier is an invalid type def, don't emit an
3939       // error because a previous error should have already been emitted.
3940       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3941       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3942         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3943           << TL.getType() << SS.getRange();
3944       }
3945       return NestedNameSpecifierLoc();
3946     }
3947     }
3948 
3949     // The qualifier-in-scope and object type only apply to the leftmost entity.
3950     FirstQualifierInScope = nullptr;
3951     ObjectType = QualType();
3952   }
3953 
3954   // Don't rebuild the nested-name-specifier if we don't have to.
3955   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3956       !getDerived().AlwaysRebuild())
3957     return NNS;
3958 
3959   // If we can re-use the source-location data from the original
3960   // nested-name-specifier, do so.
3961   if (SS.location_size() == NNS.getDataLength() &&
3962       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3963     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3964 
3965   // Allocate new nested-name-specifier location information.
3966   return SS.getWithLocInContext(SemaRef.Context);
3967 }
3968 
3969 template<typename Derived>
3970 DeclarationNameInfo
3971 TreeTransform<Derived>
3972 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3973   DeclarationName Name = NameInfo.getName();
3974   if (!Name)
3975     return DeclarationNameInfo();
3976 
3977   switch (Name.getNameKind()) {
3978   case DeclarationName::Identifier:
3979   case DeclarationName::ObjCZeroArgSelector:
3980   case DeclarationName::ObjCOneArgSelector:
3981   case DeclarationName::ObjCMultiArgSelector:
3982   case DeclarationName::CXXOperatorName:
3983   case DeclarationName::CXXLiteralOperatorName:
3984   case DeclarationName::CXXUsingDirective:
3985     return NameInfo;
3986 
3987   case DeclarationName::CXXDeductionGuideName: {
3988     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3989     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3990         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3991     if (!NewTemplate)
3992       return DeclarationNameInfo();
3993 
3994     DeclarationNameInfo NewNameInfo(NameInfo);
3995     NewNameInfo.setName(
3996         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3997     return NewNameInfo;
3998   }
3999 
4000   case DeclarationName::CXXConstructorName:
4001   case DeclarationName::CXXDestructorName:
4002   case DeclarationName::CXXConversionFunctionName: {
4003     TypeSourceInfo *NewTInfo;
4004     CanQualType NewCanTy;
4005     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4006       NewTInfo = getDerived().TransformType(OldTInfo);
4007       if (!NewTInfo)
4008         return DeclarationNameInfo();
4009       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4010     }
4011     else {
4012       NewTInfo = nullptr;
4013       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4014       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4015       if (NewT.isNull())
4016         return DeclarationNameInfo();
4017       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4018     }
4019 
4020     DeclarationName NewName
4021       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4022                                                            NewCanTy);
4023     DeclarationNameInfo NewNameInfo(NameInfo);
4024     NewNameInfo.setName(NewName);
4025     NewNameInfo.setNamedTypeInfo(NewTInfo);
4026     return NewNameInfo;
4027   }
4028   }
4029 
4030   llvm_unreachable("Unknown name kind.");
4031 }
4032 
4033 template<typename Derived>
4034 TemplateName
4035 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4036                                               TemplateName Name,
4037                                               SourceLocation NameLoc,
4038                                               QualType ObjectType,
4039                                               NamedDecl *FirstQualifierInScope,
4040                                               bool AllowInjectedClassName) {
4041   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4042     TemplateDecl *Template = QTN->getTemplateDecl();
4043     assert(Template && "qualified template name must refer to a template");
4044 
4045     TemplateDecl *TransTemplate
4046       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4047                                                               Template));
4048     if (!TransTemplate)
4049       return TemplateName();
4050 
4051     if (!getDerived().AlwaysRebuild() &&
4052         SS.getScopeRep() == QTN->getQualifier() &&
4053         TransTemplate == Template)
4054       return Name;
4055 
4056     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4057                                             TransTemplate);
4058   }
4059 
4060   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4061     if (SS.getScopeRep()) {
4062       // These apply to the scope specifier, not the template.
4063       ObjectType = QualType();
4064       FirstQualifierInScope = nullptr;
4065     }
4066 
4067     if (!getDerived().AlwaysRebuild() &&
4068         SS.getScopeRep() == DTN->getQualifier() &&
4069         ObjectType.isNull())
4070       return Name;
4071 
4072     // FIXME: Preserve the location of the "template" keyword.
4073     SourceLocation TemplateKWLoc = NameLoc;
4074 
4075     if (DTN->isIdentifier()) {
4076       return getDerived().RebuildTemplateName(SS,
4077                                               TemplateKWLoc,
4078                                               *DTN->getIdentifier(),
4079                                               NameLoc,
4080                                               ObjectType,
4081                                               FirstQualifierInScope,
4082                                               AllowInjectedClassName);
4083     }
4084 
4085     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4086                                             DTN->getOperator(), NameLoc,
4087                                             ObjectType, AllowInjectedClassName);
4088   }
4089 
4090   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4091     TemplateDecl *TransTemplate
4092       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4093                                                               Template));
4094     if (!TransTemplate)
4095       return TemplateName();
4096 
4097     if (!getDerived().AlwaysRebuild() &&
4098         TransTemplate == Template)
4099       return Name;
4100 
4101     return TemplateName(TransTemplate);
4102   }
4103 
4104   if (SubstTemplateTemplateParmPackStorage *SubstPack
4105       = Name.getAsSubstTemplateTemplateParmPack()) {
4106     TemplateTemplateParmDecl *TransParam
4107     = cast_or_null<TemplateTemplateParmDecl>(
4108             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4109     if (!TransParam)
4110       return TemplateName();
4111 
4112     if (!getDerived().AlwaysRebuild() &&
4113         TransParam == SubstPack->getParameterPack())
4114       return Name;
4115 
4116     return getDerived().RebuildTemplateName(TransParam,
4117                                             SubstPack->getArgumentPack());
4118   }
4119 
4120   // These should be getting filtered out before they reach the AST.
4121   llvm_unreachable("overloaded function decl survived to here");
4122 }
4123 
4124 template<typename Derived>
4125 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4126                                          const TemplateArgument &Arg,
4127                                          TemplateArgumentLoc &Output) {
4128   Output = getSema().getTrivialTemplateArgumentLoc(
4129       Arg, QualType(), getDerived().getBaseLocation());
4130 }
4131 
4132 template<typename Derived>
4133 bool TreeTransform<Derived>::TransformTemplateArgument(
4134                                          const TemplateArgumentLoc &Input,
4135                                          TemplateArgumentLoc &Output, bool Uneval) {
4136   const TemplateArgument &Arg = Input.getArgument();
4137   switch (Arg.getKind()) {
4138   case TemplateArgument::Null:
4139   case TemplateArgument::Pack:
4140     llvm_unreachable("Unexpected TemplateArgument");
4141 
4142   case TemplateArgument::Integral:
4143   case TemplateArgument::NullPtr:
4144   case TemplateArgument::Declaration: {
4145     // Transform a resolved template argument straight to a resolved template
4146     // argument. We get here when substituting into an already-substituted
4147     // template type argument during concept satisfaction checking.
4148     QualType T = Arg.getNonTypeTemplateArgumentType();
4149     QualType NewT = getDerived().TransformType(T);
4150     if (NewT.isNull())
4151       return true;
4152 
4153     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4154                        ? Arg.getAsDecl()
4155                        : nullptr;
4156     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4157                               getDerived().getBaseLocation(), D))
4158                         : nullptr;
4159     if (D && !NewD)
4160       return true;
4161 
4162     if (NewT == T && D == NewD)
4163       Output = Input;
4164     else if (Arg.getKind() == TemplateArgument::Integral)
4165       Output = TemplateArgumentLoc(
4166           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4167           TemplateArgumentLocInfo());
4168     else if (Arg.getKind() == TemplateArgument::NullPtr)
4169       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4170                                    TemplateArgumentLocInfo());
4171     else
4172       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4173                                    TemplateArgumentLocInfo());
4174 
4175     return false;
4176   }
4177 
4178   case TemplateArgument::Type: {
4179     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4180     if (!DI)
4181       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4182 
4183     DI = getDerived().TransformType(DI);
4184     if (!DI) return true;
4185 
4186     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4187     return false;
4188   }
4189 
4190   case TemplateArgument::Template: {
4191     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4192     if (QualifierLoc) {
4193       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4194       if (!QualifierLoc)
4195         return true;
4196     }
4197 
4198     CXXScopeSpec SS;
4199     SS.Adopt(QualifierLoc);
4200     TemplateName Template
4201       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4202                                            Input.getTemplateNameLoc());
4203     if (Template.isNull())
4204       return true;
4205 
4206     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
4207                                  Input.getTemplateNameLoc());
4208     return false;
4209   }
4210 
4211   case TemplateArgument::TemplateExpansion:
4212     llvm_unreachable("Caller should expand pack expansions");
4213 
4214   case TemplateArgument::Expression: {
4215     // Template argument expressions are constant expressions.
4216     EnterExpressionEvaluationContext Unevaluated(
4217         getSema(),
4218         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4219                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4220         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4221         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4222 
4223     Expr *InputExpr = Input.getSourceExpression();
4224     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4225 
4226     ExprResult E = getDerived().TransformExpr(InputExpr);
4227     E = SemaRef.ActOnConstantExpression(E);
4228     if (E.isInvalid()) return true;
4229     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4230     return false;
4231   }
4232   }
4233 
4234   // Work around bogus GCC warning
4235   return true;
4236 }
4237 
4238 /// Iterator adaptor that invents template argument location information
4239 /// for each of the template arguments in its underlying iterator.
4240 template<typename Derived, typename InputIterator>
4241 class TemplateArgumentLocInventIterator {
4242   TreeTransform<Derived> &Self;
4243   InputIterator Iter;
4244 
4245 public:
4246   typedef TemplateArgumentLoc value_type;
4247   typedef TemplateArgumentLoc reference;
4248   typedef typename std::iterator_traits<InputIterator>::difference_type
4249     difference_type;
4250   typedef std::input_iterator_tag iterator_category;
4251 
4252   class pointer {
4253     TemplateArgumentLoc Arg;
4254 
4255   public:
4256     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4257 
4258     const TemplateArgumentLoc *operator->() const { return &Arg; }
4259   };
4260 
4261   TemplateArgumentLocInventIterator() { }
4262 
4263   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4264                                              InputIterator Iter)
4265     : Self(Self), Iter(Iter) { }
4266 
4267   TemplateArgumentLocInventIterator &operator++() {
4268     ++Iter;
4269     return *this;
4270   }
4271 
4272   TemplateArgumentLocInventIterator operator++(int) {
4273     TemplateArgumentLocInventIterator Old(*this);
4274     ++(*this);
4275     return Old;
4276   }
4277 
4278   reference operator*() const {
4279     TemplateArgumentLoc Result;
4280     Self.InventTemplateArgumentLoc(*Iter, Result);
4281     return Result;
4282   }
4283 
4284   pointer operator->() const { return pointer(**this); }
4285 
4286   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4287                          const TemplateArgumentLocInventIterator &Y) {
4288     return X.Iter == Y.Iter;
4289   }
4290 
4291   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4292                          const TemplateArgumentLocInventIterator &Y) {
4293     return X.Iter != Y.Iter;
4294   }
4295 };
4296 
4297 template<typename Derived>
4298 template<typename InputIterator>
4299 bool TreeTransform<Derived>::TransformTemplateArguments(
4300     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4301     bool Uneval) {
4302   for (; First != Last; ++First) {
4303     TemplateArgumentLoc Out;
4304     TemplateArgumentLoc In = *First;
4305 
4306     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4307       // Unpack argument packs, which we translate them into separate
4308       // arguments.
4309       // FIXME: We could do much better if we could guarantee that the
4310       // TemplateArgumentLocInfo for the pack expansion would be usable for
4311       // all of the template arguments in the argument pack.
4312       typedef TemplateArgumentLocInventIterator<Derived,
4313                                                 TemplateArgument::pack_iterator>
4314         PackLocIterator;
4315       if (TransformTemplateArguments(PackLocIterator(*this,
4316                                                  In.getArgument().pack_begin()),
4317                                      PackLocIterator(*this,
4318                                                    In.getArgument().pack_end()),
4319                                      Outputs, Uneval))
4320         return true;
4321 
4322       continue;
4323     }
4324 
4325     if (In.getArgument().isPackExpansion()) {
4326       // We have a pack expansion, for which we will be substituting into
4327       // the pattern.
4328       SourceLocation Ellipsis;
4329       Optional<unsigned> OrigNumExpansions;
4330       TemplateArgumentLoc Pattern
4331         = getSema().getTemplateArgumentPackExpansionPattern(
4332               In, Ellipsis, OrigNumExpansions);
4333 
4334       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4335       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4336       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4337 
4338       // Determine whether the set of unexpanded parameter packs can and should
4339       // be expanded.
4340       bool Expand = true;
4341       bool RetainExpansion = false;
4342       Optional<unsigned> NumExpansions = OrigNumExpansions;
4343       if (getDerived().TryExpandParameterPacks(Ellipsis,
4344                                                Pattern.getSourceRange(),
4345                                                Unexpanded,
4346                                                Expand,
4347                                                RetainExpansion,
4348                                                NumExpansions))
4349         return true;
4350 
4351       if (!Expand) {
4352         // The transform has determined that we should perform a simple
4353         // transformation on the pack expansion, producing another pack
4354         // expansion.
4355         TemplateArgumentLoc OutPattern;
4356         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4357         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4358           return true;
4359 
4360         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4361                                                 NumExpansions);
4362         if (Out.getArgument().isNull())
4363           return true;
4364 
4365         Outputs.addArgument(Out);
4366         continue;
4367       }
4368 
4369       // The transform has determined that we should perform an elementwise
4370       // expansion of the pattern. Do so.
4371       for (unsigned I = 0; I != *NumExpansions; ++I) {
4372         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4373 
4374         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4375           return true;
4376 
4377         if (Out.getArgument().containsUnexpandedParameterPack()) {
4378           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4379                                                   OrigNumExpansions);
4380           if (Out.getArgument().isNull())
4381             return true;
4382         }
4383 
4384         Outputs.addArgument(Out);
4385       }
4386 
4387       // If we're supposed to retain a pack expansion, do so by temporarily
4388       // forgetting the partially-substituted parameter pack.
4389       if (RetainExpansion) {
4390         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4391 
4392         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4393           return true;
4394 
4395         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4396                                                 OrigNumExpansions);
4397         if (Out.getArgument().isNull())
4398           return true;
4399 
4400         Outputs.addArgument(Out);
4401       }
4402 
4403       continue;
4404     }
4405 
4406     // The simple case:
4407     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4408       return true;
4409 
4410     Outputs.addArgument(Out);
4411   }
4412 
4413   return false;
4414 
4415 }
4416 
4417 //===----------------------------------------------------------------------===//
4418 // Type transformation
4419 //===----------------------------------------------------------------------===//
4420 
4421 template<typename Derived>
4422 QualType TreeTransform<Derived>::TransformType(QualType T) {
4423   if (getDerived().AlreadyTransformed(T))
4424     return T;
4425 
4426   // Temporary workaround.  All of these transformations should
4427   // eventually turn into transformations on TypeLocs.
4428   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4429                                                 getDerived().getBaseLocation());
4430 
4431   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4432 
4433   if (!NewDI)
4434     return QualType();
4435 
4436   return NewDI->getType();
4437 }
4438 
4439 template<typename Derived>
4440 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4441   // Refine the base location to the type's location.
4442   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4443                        getDerived().getBaseEntity());
4444   if (getDerived().AlreadyTransformed(DI->getType()))
4445     return DI;
4446 
4447   TypeLocBuilder TLB;
4448 
4449   TypeLoc TL = DI->getTypeLoc();
4450   TLB.reserve(TL.getFullDataSize());
4451 
4452   QualType Result = getDerived().TransformType(TLB, TL);
4453   if (Result.isNull())
4454     return nullptr;
4455 
4456   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4457 }
4458 
4459 template<typename Derived>
4460 QualType
4461 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4462   switch (T.getTypeLocClass()) {
4463 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4464 #define TYPELOC(CLASS, PARENT)                                                 \
4465   case TypeLoc::CLASS:                                                         \
4466     return getDerived().Transform##CLASS##Type(TLB,                            \
4467                                                T.castAs<CLASS##TypeLoc>());
4468 #include "clang/AST/TypeLocNodes.def"
4469   }
4470 
4471   llvm_unreachable("unhandled type loc!");
4472 }
4473 
4474 template<typename Derived>
4475 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4476   if (!isa<DependentNameType>(T))
4477     return TransformType(T);
4478 
4479   if (getDerived().AlreadyTransformed(T))
4480     return T;
4481   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4482                                                 getDerived().getBaseLocation());
4483   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4484   return NewDI ? NewDI->getType() : QualType();
4485 }
4486 
4487 template<typename Derived>
4488 TypeSourceInfo *
4489 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4490   if (!isa<DependentNameType>(DI->getType()))
4491     return TransformType(DI);
4492 
4493   // Refine the base location to the type's location.
4494   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4495                        getDerived().getBaseEntity());
4496   if (getDerived().AlreadyTransformed(DI->getType()))
4497     return DI;
4498 
4499   TypeLocBuilder TLB;
4500 
4501   TypeLoc TL = DI->getTypeLoc();
4502   TLB.reserve(TL.getFullDataSize());
4503 
4504   auto QTL = TL.getAs<QualifiedTypeLoc>();
4505   if (QTL)
4506     TL = QTL.getUnqualifiedLoc();
4507 
4508   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4509 
4510   QualType Result = getDerived().TransformDependentNameType(
4511       TLB, DNTL, /*DeducedTSTContext*/true);
4512   if (Result.isNull())
4513     return nullptr;
4514 
4515   if (QTL) {
4516     Result = getDerived().RebuildQualifiedType(Result, QTL);
4517     if (Result.isNull())
4518       return nullptr;
4519     TLB.TypeWasModifiedSafely(Result);
4520   }
4521 
4522   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4523 }
4524 
4525 template<typename Derived>
4526 QualType
4527 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4528                                                QualifiedTypeLoc T) {
4529   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4530   if (Result.isNull())
4531     return QualType();
4532 
4533   Result = getDerived().RebuildQualifiedType(Result, T);
4534 
4535   if (Result.isNull())
4536     return QualType();
4537 
4538   // RebuildQualifiedType might have updated the type, but not in a way
4539   // that invalidates the TypeLoc. (There's no location information for
4540   // qualifiers.)
4541   TLB.TypeWasModifiedSafely(Result);
4542 
4543   return Result;
4544 }
4545 
4546 template <typename Derived>
4547 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4548                                                       QualifiedTypeLoc TL) {
4549 
4550   SourceLocation Loc = TL.getBeginLoc();
4551   Qualifiers Quals = TL.getType().getLocalQualifiers();
4552 
4553   if (((T.getAddressSpace() != LangAS::Default &&
4554         Quals.getAddressSpace() != LangAS::Default)) &&
4555       T.getAddressSpace() != Quals.getAddressSpace()) {
4556     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4557         << TL.getType() << T;
4558     return QualType();
4559   }
4560 
4561   // C++ [dcl.fct]p7:
4562   //   [When] adding cv-qualifications on top of the function type [...] the
4563   //   cv-qualifiers are ignored.
4564   if (T->isFunctionType()) {
4565     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4566                                                      Quals.getAddressSpace());
4567     return T;
4568   }
4569 
4570   // C++ [dcl.ref]p1:
4571   //   when the cv-qualifiers are introduced through the use of a typedef-name
4572   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4573   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4574   // applied to a reference type.
4575   if (T->isReferenceType()) {
4576     // The only qualifier that applies to a reference type is restrict.
4577     if (!Quals.hasRestrict())
4578       return T;
4579     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4580   }
4581 
4582   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4583   // resulting type.
4584   if (Quals.hasObjCLifetime()) {
4585     if (!T->isObjCLifetimeType() && !T->isDependentType())
4586       Quals.removeObjCLifetime();
4587     else if (T.getObjCLifetime()) {
4588       // Objective-C ARC:
4589       //   A lifetime qualifier applied to a substituted template parameter
4590       //   overrides the lifetime qualifier from the template argument.
4591       const AutoType *AutoTy;
4592       if (const SubstTemplateTypeParmType *SubstTypeParam
4593                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4594         QualType Replacement = SubstTypeParam->getReplacementType();
4595         Qualifiers Qs = Replacement.getQualifiers();
4596         Qs.removeObjCLifetime();
4597         Replacement = SemaRef.Context.getQualifiedType(
4598             Replacement.getUnqualifiedType(), Qs);
4599         T = SemaRef.Context.getSubstTemplateTypeParmType(
4600             SubstTypeParam->getReplacedParameter(), Replacement);
4601       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4602         // 'auto' types behave the same way as template parameters.
4603         QualType Deduced = AutoTy->getDeducedType();
4604         Qualifiers Qs = Deduced.getQualifiers();
4605         Qs.removeObjCLifetime();
4606         Deduced =
4607             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4608         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4609                                         AutoTy->isDependentType(),
4610                                         /*isPack=*/false,
4611                                         AutoTy->getTypeConstraintConcept(),
4612                                         AutoTy->getTypeConstraintArguments());
4613       } else {
4614         // Otherwise, complain about the addition of a qualifier to an
4615         // already-qualified type.
4616         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4617         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4618         Quals.removeObjCLifetime();
4619       }
4620     }
4621   }
4622 
4623   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4624 }
4625 
4626 template<typename Derived>
4627 TypeLoc
4628 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4629                                                    QualType ObjectType,
4630                                                    NamedDecl *UnqualLookup,
4631                                                    CXXScopeSpec &SS) {
4632   if (getDerived().AlreadyTransformed(TL.getType()))
4633     return TL;
4634 
4635   TypeSourceInfo *TSI =
4636       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4637   if (TSI)
4638     return TSI->getTypeLoc();
4639   return TypeLoc();
4640 }
4641 
4642 template<typename Derived>
4643 TypeSourceInfo *
4644 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4645                                                    QualType ObjectType,
4646                                                    NamedDecl *UnqualLookup,
4647                                                    CXXScopeSpec &SS) {
4648   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4649     return TSInfo;
4650 
4651   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4652                                    UnqualLookup, SS);
4653 }
4654 
4655 template <typename Derived>
4656 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4657     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4658     CXXScopeSpec &SS) {
4659   QualType T = TL.getType();
4660   assert(!getDerived().AlreadyTransformed(T));
4661 
4662   TypeLocBuilder TLB;
4663   QualType Result;
4664 
4665   if (isa<TemplateSpecializationType>(T)) {
4666     TemplateSpecializationTypeLoc SpecTL =
4667         TL.castAs<TemplateSpecializationTypeLoc>();
4668 
4669     TemplateName Template = getDerived().TransformTemplateName(
4670         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4671         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4672     if (Template.isNull())
4673       return nullptr;
4674 
4675     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4676                                                               Template);
4677   } else if (isa<DependentTemplateSpecializationType>(T)) {
4678     DependentTemplateSpecializationTypeLoc SpecTL =
4679         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4680 
4681     TemplateName Template
4682       = getDerived().RebuildTemplateName(SS,
4683                                          SpecTL.getTemplateKeywordLoc(),
4684                                          *SpecTL.getTypePtr()->getIdentifier(),
4685                                          SpecTL.getTemplateNameLoc(),
4686                                          ObjectType, UnqualLookup,
4687                                          /*AllowInjectedClassName*/true);
4688     if (Template.isNull())
4689       return nullptr;
4690 
4691     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4692                                                                        SpecTL,
4693                                                                        Template,
4694                                                                        SS);
4695   } else {
4696     // Nothing special needs to be done for these.
4697     Result = getDerived().TransformType(TLB, TL);
4698   }
4699 
4700   if (Result.isNull())
4701     return nullptr;
4702 
4703   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4704 }
4705 
4706 template <class TyLoc> static inline
4707 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4708   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4709   NewT.setNameLoc(T.getNameLoc());
4710   return T.getType();
4711 }
4712 
4713 template<typename Derived>
4714 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4715                                                       BuiltinTypeLoc T) {
4716   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4717   NewT.setBuiltinLoc(T.getBuiltinLoc());
4718   if (T.needsExtraLocalData())
4719     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4720   return T.getType();
4721 }
4722 
4723 template<typename Derived>
4724 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4725                                                       ComplexTypeLoc T) {
4726   // FIXME: recurse?
4727   return TransformTypeSpecType(TLB, T);
4728 }
4729 
4730 template <typename Derived>
4731 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4732                                                        AdjustedTypeLoc TL) {
4733   // Adjustments applied during transformation are handled elsewhere.
4734   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4735 }
4736 
4737 template<typename Derived>
4738 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4739                                                       DecayedTypeLoc TL) {
4740   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4741   if (OriginalType.isNull())
4742     return QualType();
4743 
4744   QualType Result = TL.getType();
4745   if (getDerived().AlwaysRebuild() ||
4746       OriginalType != TL.getOriginalLoc().getType())
4747     Result = SemaRef.Context.getDecayedType(OriginalType);
4748   TLB.push<DecayedTypeLoc>(Result);
4749   // Nothing to set for DecayedTypeLoc.
4750   return Result;
4751 }
4752 
4753 template<typename Derived>
4754 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4755                                                       PointerTypeLoc TL) {
4756   QualType PointeeType
4757     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4758   if (PointeeType.isNull())
4759     return QualType();
4760 
4761   QualType Result = TL.getType();
4762   if (PointeeType->getAs<ObjCObjectType>()) {
4763     // A dependent pointer type 'T *' has is being transformed such
4764     // that an Objective-C class type is being replaced for 'T'. The
4765     // resulting pointer type is an ObjCObjectPointerType, not a
4766     // PointerType.
4767     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4768 
4769     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4770     NewT.setStarLoc(TL.getStarLoc());
4771     return Result;
4772   }
4773 
4774   if (getDerived().AlwaysRebuild() ||
4775       PointeeType != TL.getPointeeLoc().getType()) {
4776     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4777     if (Result.isNull())
4778       return QualType();
4779   }
4780 
4781   // Objective-C ARC can add lifetime qualifiers to the type that we're
4782   // pointing to.
4783   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4784 
4785   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4786   NewT.setSigilLoc(TL.getSigilLoc());
4787   return Result;
4788 }
4789 
4790 template<typename Derived>
4791 QualType
4792 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4793                                                   BlockPointerTypeLoc TL) {
4794   QualType PointeeType
4795     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4796   if (PointeeType.isNull())
4797     return QualType();
4798 
4799   QualType Result = TL.getType();
4800   if (getDerived().AlwaysRebuild() ||
4801       PointeeType != TL.getPointeeLoc().getType()) {
4802     Result = getDerived().RebuildBlockPointerType(PointeeType,
4803                                                   TL.getSigilLoc());
4804     if (Result.isNull())
4805       return QualType();
4806   }
4807 
4808   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4809   NewT.setSigilLoc(TL.getSigilLoc());
4810   return Result;
4811 }
4812 
4813 /// Transforms a reference type.  Note that somewhat paradoxically we
4814 /// don't care whether the type itself is an l-value type or an r-value
4815 /// type;  we only care if the type was *written* as an l-value type
4816 /// or an r-value type.
4817 template<typename Derived>
4818 QualType
4819 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4820                                                ReferenceTypeLoc TL) {
4821   const ReferenceType *T = TL.getTypePtr();
4822 
4823   // Note that this works with the pointee-as-written.
4824   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4825   if (PointeeType.isNull())
4826     return QualType();
4827 
4828   QualType Result = TL.getType();
4829   if (getDerived().AlwaysRebuild() ||
4830       PointeeType != T->getPointeeTypeAsWritten()) {
4831     Result = getDerived().RebuildReferenceType(PointeeType,
4832                                                T->isSpelledAsLValue(),
4833                                                TL.getSigilLoc());
4834     if (Result.isNull())
4835       return QualType();
4836   }
4837 
4838   // Objective-C ARC can add lifetime qualifiers to the type that we're
4839   // referring to.
4840   TLB.TypeWasModifiedSafely(
4841       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4842 
4843   // r-value references can be rebuilt as l-value references.
4844   ReferenceTypeLoc NewTL;
4845   if (isa<LValueReferenceType>(Result))
4846     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4847   else
4848     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4849   NewTL.setSigilLoc(TL.getSigilLoc());
4850 
4851   return Result;
4852 }
4853 
4854 template<typename Derived>
4855 QualType
4856 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4857                                                  LValueReferenceTypeLoc TL) {
4858   return TransformReferenceType(TLB, TL);
4859 }
4860 
4861 template<typename Derived>
4862 QualType
4863 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4864                                                  RValueReferenceTypeLoc TL) {
4865   return TransformReferenceType(TLB, TL);
4866 }
4867 
4868 template<typename Derived>
4869 QualType
4870 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4871                                                    MemberPointerTypeLoc TL) {
4872   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4873   if (PointeeType.isNull())
4874     return QualType();
4875 
4876   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4877   TypeSourceInfo *NewClsTInfo = nullptr;
4878   if (OldClsTInfo) {
4879     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4880     if (!NewClsTInfo)
4881       return QualType();
4882   }
4883 
4884   const MemberPointerType *T = TL.getTypePtr();
4885   QualType OldClsType = QualType(T->getClass(), 0);
4886   QualType NewClsType;
4887   if (NewClsTInfo)
4888     NewClsType = NewClsTInfo->getType();
4889   else {
4890     NewClsType = getDerived().TransformType(OldClsType);
4891     if (NewClsType.isNull())
4892       return QualType();
4893   }
4894 
4895   QualType Result = TL.getType();
4896   if (getDerived().AlwaysRebuild() ||
4897       PointeeType != T->getPointeeType() ||
4898       NewClsType != OldClsType) {
4899     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4900                                                    TL.getStarLoc());
4901     if (Result.isNull())
4902       return QualType();
4903   }
4904 
4905   // If we had to adjust the pointee type when building a member pointer, make
4906   // sure to push TypeLoc info for it.
4907   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4908   if (MPT && PointeeType != MPT->getPointeeType()) {
4909     assert(isa<AdjustedType>(MPT->getPointeeType()));
4910     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4911   }
4912 
4913   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4914   NewTL.setSigilLoc(TL.getSigilLoc());
4915   NewTL.setClassTInfo(NewClsTInfo);
4916 
4917   return Result;
4918 }
4919 
4920 template<typename Derived>
4921 QualType
4922 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4923                                                    ConstantArrayTypeLoc TL) {
4924   const ConstantArrayType *T = TL.getTypePtr();
4925   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4926   if (ElementType.isNull())
4927     return QualType();
4928 
4929   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4930   Expr *OldSize = TL.getSizeExpr();
4931   if (!OldSize)
4932     OldSize = const_cast<Expr*>(T->getSizeExpr());
4933   Expr *NewSize = nullptr;
4934   if (OldSize) {
4935     EnterExpressionEvaluationContext Unevaluated(
4936         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4937     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
4938     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
4939   }
4940 
4941   QualType Result = TL.getType();
4942   if (getDerived().AlwaysRebuild() ||
4943       ElementType != T->getElementType() ||
4944       (T->getSizeExpr() && NewSize != OldSize)) {
4945     Result = getDerived().RebuildConstantArrayType(ElementType,
4946                                                    T->getSizeModifier(),
4947                                                    T->getSize(), NewSize,
4948                                              T->getIndexTypeCVRQualifiers(),
4949                                                    TL.getBracketsRange());
4950     if (Result.isNull())
4951       return QualType();
4952   }
4953 
4954   // We might have either a ConstantArrayType or a VariableArrayType now:
4955   // a ConstantArrayType is allowed to have an element type which is a
4956   // VariableArrayType if the type is dependent.  Fortunately, all array
4957   // types have the same location layout.
4958   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4959   NewTL.setLBracketLoc(TL.getLBracketLoc());
4960   NewTL.setRBracketLoc(TL.getRBracketLoc());
4961   NewTL.setSizeExpr(NewSize);
4962 
4963   return Result;
4964 }
4965 
4966 template<typename Derived>
4967 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4968                                               TypeLocBuilder &TLB,
4969                                               IncompleteArrayTypeLoc TL) {
4970   const IncompleteArrayType *T = TL.getTypePtr();
4971   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4972   if (ElementType.isNull())
4973     return QualType();
4974 
4975   QualType Result = TL.getType();
4976   if (getDerived().AlwaysRebuild() ||
4977       ElementType != T->getElementType()) {
4978     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4979                                                      T->getSizeModifier(),
4980                                            T->getIndexTypeCVRQualifiers(),
4981                                                      TL.getBracketsRange());
4982     if (Result.isNull())
4983       return QualType();
4984   }
4985 
4986   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4987   NewTL.setLBracketLoc(TL.getLBracketLoc());
4988   NewTL.setRBracketLoc(TL.getRBracketLoc());
4989   NewTL.setSizeExpr(nullptr);
4990 
4991   return Result;
4992 }
4993 
4994 template<typename Derived>
4995 QualType
4996 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4997                                                    VariableArrayTypeLoc TL) {
4998   const VariableArrayType *T = TL.getTypePtr();
4999   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5000   if (ElementType.isNull())
5001     return QualType();
5002 
5003   ExprResult SizeResult;
5004   {
5005     EnterExpressionEvaluationContext Context(
5006         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5007     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5008   }
5009   if (SizeResult.isInvalid())
5010     return QualType();
5011   SizeResult =
5012       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5013   if (SizeResult.isInvalid())
5014     return QualType();
5015 
5016   Expr *Size = SizeResult.get();
5017 
5018   QualType Result = TL.getType();
5019   if (getDerived().AlwaysRebuild() ||
5020       ElementType != T->getElementType() ||
5021       Size != T->getSizeExpr()) {
5022     Result = getDerived().RebuildVariableArrayType(ElementType,
5023                                                    T->getSizeModifier(),
5024                                                    Size,
5025                                              T->getIndexTypeCVRQualifiers(),
5026                                                    TL.getBracketsRange());
5027     if (Result.isNull())
5028       return QualType();
5029   }
5030 
5031   // We might have constant size array now, but fortunately it has the same
5032   // location layout.
5033   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5034   NewTL.setLBracketLoc(TL.getLBracketLoc());
5035   NewTL.setRBracketLoc(TL.getRBracketLoc());
5036   NewTL.setSizeExpr(Size);
5037 
5038   return Result;
5039 }
5040 
5041 template<typename Derived>
5042 QualType
5043 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5044                                              DependentSizedArrayTypeLoc TL) {
5045   const DependentSizedArrayType *T = TL.getTypePtr();
5046   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5047   if (ElementType.isNull())
5048     return QualType();
5049 
5050   // Array bounds are constant expressions.
5051   EnterExpressionEvaluationContext Unevaluated(
5052       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5053 
5054   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5055   Expr *origSize = TL.getSizeExpr();
5056   if (!origSize) origSize = T->getSizeExpr();
5057 
5058   ExprResult sizeResult
5059     = getDerived().TransformExpr(origSize);
5060   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5061   if (sizeResult.isInvalid())
5062     return QualType();
5063 
5064   Expr *size = sizeResult.get();
5065 
5066   QualType Result = TL.getType();
5067   if (getDerived().AlwaysRebuild() ||
5068       ElementType != T->getElementType() ||
5069       size != origSize) {
5070     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5071                                                          T->getSizeModifier(),
5072                                                          size,
5073                                                 T->getIndexTypeCVRQualifiers(),
5074                                                         TL.getBracketsRange());
5075     if (Result.isNull())
5076       return QualType();
5077   }
5078 
5079   // We might have any sort of array type now, but fortunately they
5080   // all have the same location layout.
5081   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5082   NewTL.setLBracketLoc(TL.getLBracketLoc());
5083   NewTL.setRBracketLoc(TL.getRBracketLoc());
5084   NewTL.setSizeExpr(size);
5085 
5086   return Result;
5087 }
5088 
5089 template <typename Derived>
5090 QualType TreeTransform<Derived>::TransformDependentVectorType(
5091     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5092   const DependentVectorType *T = TL.getTypePtr();
5093   QualType ElementType = getDerived().TransformType(T->getElementType());
5094   if (ElementType.isNull())
5095     return QualType();
5096 
5097   EnterExpressionEvaluationContext Unevaluated(
5098       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5099 
5100   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5101   Size = SemaRef.ActOnConstantExpression(Size);
5102   if (Size.isInvalid())
5103     return QualType();
5104 
5105   QualType Result = TL.getType();
5106   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5107       Size.get() != T->getSizeExpr()) {
5108     Result = getDerived().RebuildDependentVectorType(
5109         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5110     if (Result.isNull())
5111       return QualType();
5112   }
5113 
5114   // Result might be dependent or not.
5115   if (isa<DependentVectorType>(Result)) {
5116     DependentVectorTypeLoc NewTL =
5117         TLB.push<DependentVectorTypeLoc>(Result);
5118     NewTL.setNameLoc(TL.getNameLoc());
5119   } else {
5120     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5121     NewTL.setNameLoc(TL.getNameLoc());
5122   }
5123 
5124   return Result;
5125 }
5126 
5127 template<typename Derived>
5128 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5129                                       TypeLocBuilder &TLB,
5130                                       DependentSizedExtVectorTypeLoc TL) {
5131   const DependentSizedExtVectorType *T = TL.getTypePtr();
5132 
5133   // FIXME: ext vector locs should be nested
5134   QualType ElementType = getDerived().TransformType(T->getElementType());
5135   if (ElementType.isNull())
5136     return QualType();
5137 
5138   // Vector sizes are constant expressions.
5139   EnterExpressionEvaluationContext Unevaluated(
5140       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5141 
5142   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5143   Size = SemaRef.ActOnConstantExpression(Size);
5144   if (Size.isInvalid())
5145     return QualType();
5146 
5147   QualType Result = TL.getType();
5148   if (getDerived().AlwaysRebuild() ||
5149       ElementType != T->getElementType() ||
5150       Size.get() != T->getSizeExpr()) {
5151     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5152                                                              Size.get(),
5153                                                          T->getAttributeLoc());
5154     if (Result.isNull())
5155       return QualType();
5156   }
5157 
5158   // Result might be dependent or not.
5159   if (isa<DependentSizedExtVectorType>(Result)) {
5160     DependentSizedExtVectorTypeLoc NewTL
5161       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5162     NewTL.setNameLoc(TL.getNameLoc());
5163   } else {
5164     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5165     NewTL.setNameLoc(TL.getNameLoc());
5166   }
5167 
5168   return Result;
5169 }
5170 
5171 template <typename Derived>
5172 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5173     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5174   const DependentAddressSpaceType *T = TL.getTypePtr();
5175 
5176   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5177 
5178   if (pointeeType.isNull())
5179     return QualType();
5180 
5181   // Address spaces are constant expressions.
5182   EnterExpressionEvaluationContext Unevaluated(
5183       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5184 
5185   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5186   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5187   if (AddrSpace.isInvalid())
5188     return QualType();
5189 
5190   QualType Result = TL.getType();
5191   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5192       AddrSpace.get() != T->getAddrSpaceExpr()) {
5193     Result = getDerived().RebuildDependentAddressSpaceType(
5194         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5195     if (Result.isNull())
5196       return QualType();
5197   }
5198 
5199   // Result might be dependent or not.
5200   if (isa<DependentAddressSpaceType>(Result)) {
5201     DependentAddressSpaceTypeLoc NewTL =
5202         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5203 
5204     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5205     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5206     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5207 
5208   } else {
5209     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5210         Result, getDerived().getBaseLocation());
5211     TransformType(TLB, DI->getTypeLoc());
5212   }
5213 
5214   return Result;
5215 }
5216 
5217 template <typename Derived>
5218 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5219                                                      VectorTypeLoc TL) {
5220   const VectorType *T = TL.getTypePtr();
5221   QualType ElementType = getDerived().TransformType(T->getElementType());
5222   if (ElementType.isNull())
5223     return QualType();
5224 
5225   QualType Result = TL.getType();
5226   if (getDerived().AlwaysRebuild() ||
5227       ElementType != T->getElementType()) {
5228     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5229                                             T->getVectorKind());
5230     if (Result.isNull())
5231       return QualType();
5232   }
5233 
5234   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5235   NewTL.setNameLoc(TL.getNameLoc());
5236 
5237   return Result;
5238 }
5239 
5240 template<typename Derived>
5241 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5242                                                         ExtVectorTypeLoc TL) {
5243   const VectorType *T = TL.getTypePtr();
5244   QualType ElementType = getDerived().TransformType(T->getElementType());
5245   if (ElementType.isNull())
5246     return QualType();
5247 
5248   QualType Result = TL.getType();
5249   if (getDerived().AlwaysRebuild() ||
5250       ElementType != T->getElementType()) {
5251     Result = getDerived().RebuildExtVectorType(ElementType,
5252                                                T->getNumElements(),
5253                                                /*FIXME*/ SourceLocation());
5254     if (Result.isNull())
5255       return QualType();
5256   }
5257 
5258   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5259   NewTL.setNameLoc(TL.getNameLoc());
5260 
5261   return Result;
5262 }
5263 
5264 template <typename Derived>
5265 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5266     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5267     bool ExpectParameterPack) {
5268   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5269   TypeSourceInfo *NewDI = nullptr;
5270 
5271   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5272     // If we're substituting into a pack expansion type and we know the
5273     // length we want to expand to, just substitute for the pattern.
5274     TypeLoc OldTL = OldDI->getTypeLoc();
5275     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5276 
5277     TypeLocBuilder TLB;
5278     TypeLoc NewTL = OldDI->getTypeLoc();
5279     TLB.reserve(NewTL.getFullDataSize());
5280 
5281     QualType Result = getDerived().TransformType(TLB,
5282                                                OldExpansionTL.getPatternLoc());
5283     if (Result.isNull())
5284       return nullptr;
5285 
5286     Result = RebuildPackExpansionType(Result,
5287                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5288                                       OldExpansionTL.getEllipsisLoc(),
5289                                       NumExpansions);
5290     if (Result.isNull())
5291       return nullptr;
5292 
5293     PackExpansionTypeLoc NewExpansionTL
5294       = TLB.push<PackExpansionTypeLoc>(Result);
5295     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5296     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5297   } else
5298     NewDI = getDerived().TransformType(OldDI);
5299   if (!NewDI)
5300     return nullptr;
5301 
5302   if (NewDI == OldDI && indexAdjustment == 0)
5303     return OldParm;
5304 
5305   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5306                                              OldParm->getDeclContext(),
5307                                              OldParm->getInnerLocStart(),
5308                                              OldParm->getLocation(),
5309                                              OldParm->getIdentifier(),
5310                                              NewDI->getType(),
5311                                              NewDI,
5312                                              OldParm->getStorageClass(),
5313                                              /* DefArg */ nullptr);
5314   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5315                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5316   return newParm;
5317 }
5318 
5319 template <typename Derived>
5320 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5321     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5322     const QualType *ParamTypes,
5323     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5324     SmallVectorImpl<QualType> &OutParamTypes,
5325     SmallVectorImpl<ParmVarDecl *> *PVars,
5326     Sema::ExtParameterInfoBuilder &PInfos) {
5327   int indexAdjustment = 0;
5328 
5329   unsigned NumParams = Params.size();
5330   for (unsigned i = 0; i != NumParams; ++i) {
5331     if (ParmVarDecl *OldParm = Params[i]) {
5332       assert(OldParm->getFunctionScopeIndex() == i);
5333 
5334       Optional<unsigned> NumExpansions;
5335       ParmVarDecl *NewParm = nullptr;
5336       if (OldParm->isParameterPack()) {
5337         // We have a function parameter pack that may need to be expanded.
5338         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5339 
5340         // Find the parameter packs that could be expanded.
5341         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5342         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5343         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5344         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5345 
5346         // Determine whether we should expand the parameter packs.
5347         bool ShouldExpand = false;
5348         bool RetainExpansion = false;
5349         Optional<unsigned> OrigNumExpansions;
5350         if (Unexpanded.size() > 0) {
5351           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5352           NumExpansions = OrigNumExpansions;
5353           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5354                                                    Pattern.getSourceRange(),
5355                                                    Unexpanded,
5356                                                    ShouldExpand,
5357                                                    RetainExpansion,
5358                                                    NumExpansions)) {
5359             return true;
5360           }
5361         } else {
5362 #ifndef NDEBUG
5363           const AutoType *AT =
5364               Pattern.getType().getTypePtr()->getContainedAutoType();
5365           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5366                  "Could not find parameter packs or undeduced auto type!");
5367 #endif
5368         }
5369 
5370         if (ShouldExpand) {
5371           // Expand the function parameter pack into multiple, separate
5372           // parameters.
5373           getDerived().ExpandingFunctionParameterPack(OldParm);
5374           for (unsigned I = 0; I != *NumExpansions; ++I) {
5375             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5376             ParmVarDecl *NewParm
5377               = getDerived().TransformFunctionTypeParam(OldParm,
5378                                                         indexAdjustment++,
5379                                                         OrigNumExpansions,
5380                                                 /*ExpectParameterPack=*/false);
5381             if (!NewParm)
5382               return true;
5383 
5384             if (ParamInfos)
5385               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5386             OutParamTypes.push_back(NewParm->getType());
5387             if (PVars)
5388               PVars->push_back(NewParm);
5389           }
5390 
5391           // If we're supposed to retain a pack expansion, do so by temporarily
5392           // forgetting the partially-substituted parameter pack.
5393           if (RetainExpansion) {
5394             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5395             ParmVarDecl *NewParm
5396               = getDerived().TransformFunctionTypeParam(OldParm,
5397                                                         indexAdjustment++,
5398                                                         OrigNumExpansions,
5399                                                 /*ExpectParameterPack=*/false);
5400             if (!NewParm)
5401               return true;
5402 
5403             if (ParamInfos)
5404               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5405             OutParamTypes.push_back(NewParm->getType());
5406             if (PVars)
5407               PVars->push_back(NewParm);
5408           }
5409 
5410           // The next parameter should have the same adjustment as the
5411           // last thing we pushed, but we post-incremented indexAdjustment
5412           // on every push.  Also, if we push nothing, the adjustment should
5413           // go down by one.
5414           indexAdjustment--;
5415 
5416           // We're done with the pack expansion.
5417           continue;
5418         }
5419 
5420         // We'll substitute the parameter now without expanding the pack
5421         // expansion.
5422         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5423         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5424                                                           indexAdjustment,
5425                                                           NumExpansions,
5426                                                   /*ExpectParameterPack=*/true);
5427         assert(NewParm->isParameterPack() &&
5428                "Parameter pack no longer a parameter pack after "
5429                "transformation.");
5430       } else {
5431         NewParm = getDerived().TransformFunctionTypeParam(
5432             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5433       }
5434 
5435       if (!NewParm)
5436         return true;
5437 
5438       if (ParamInfos)
5439         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5440       OutParamTypes.push_back(NewParm->getType());
5441       if (PVars)
5442         PVars->push_back(NewParm);
5443       continue;
5444     }
5445 
5446     // Deal with the possibility that we don't have a parameter
5447     // declaration for this parameter.
5448     QualType OldType = ParamTypes[i];
5449     bool IsPackExpansion = false;
5450     Optional<unsigned> NumExpansions;
5451     QualType NewType;
5452     if (const PackExpansionType *Expansion
5453                                        = dyn_cast<PackExpansionType>(OldType)) {
5454       // We have a function parameter pack that may need to be expanded.
5455       QualType Pattern = Expansion->getPattern();
5456       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5457       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5458 
5459       // Determine whether we should expand the parameter packs.
5460       bool ShouldExpand = false;
5461       bool RetainExpansion = false;
5462       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5463                                                Unexpanded,
5464                                                ShouldExpand,
5465                                                RetainExpansion,
5466                                                NumExpansions)) {
5467         return true;
5468       }
5469 
5470       if (ShouldExpand) {
5471         // Expand the function parameter pack into multiple, separate
5472         // parameters.
5473         for (unsigned I = 0; I != *NumExpansions; ++I) {
5474           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5475           QualType NewType = getDerived().TransformType(Pattern);
5476           if (NewType.isNull())
5477             return true;
5478 
5479           if (NewType->containsUnexpandedParameterPack()) {
5480             NewType =
5481                 getSema().getASTContext().getPackExpansionType(NewType, None);
5482 
5483             if (NewType.isNull())
5484               return true;
5485           }
5486 
5487           if (ParamInfos)
5488             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5489           OutParamTypes.push_back(NewType);
5490           if (PVars)
5491             PVars->push_back(nullptr);
5492         }
5493 
5494         // We're done with the pack expansion.
5495         continue;
5496       }
5497 
5498       // If we're supposed to retain a pack expansion, do so by temporarily
5499       // forgetting the partially-substituted parameter pack.
5500       if (RetainExpansion) {
5501         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5502         QualType NewType = getDerived().TransformType(Pattern);
5503         if (NewType.isNull())
5504           return true;
5505 
5506         if (ParamInfos)
5507           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5508         OutParamTypes.push_back(NewType);
5509         if (PVars)
5510           PVars->push_back(nullptr);
5511       }
5512 
5513       // We'll substitute the parameter now without expanding the pack
5514       // expansion.
5515       OldType = Expansion->getPattern();
5516       IsPackExpansion = true;
5517       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5518       NewType = getDerived().TransformType(OldType);
5519     } else {
5520       NewType = getDerived().TransformType(OldType);
5521     }
5522 
5523     if (NewType.isNull())
5524       return true;
5525 
5526     if (IsPackExpansion)
5527       NewType = getSema().Context.getPackExpansionType(NewType,
5528                                                        NumExpansions);
5529 
5530     if (ParamInfos)
5531       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5532     OutParamTypes.push_back(NewType);
5533     if (PVars)
5534       PVars->push_back(nullptr);
5535   }
5536 
5537 #ifndef NDEBUG
5538   if (PVars) {
5539     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5540       if (ParmVarDecl *parm = (*PVars)[i])
5541         assert(parm->getFunctionScopeIndex() == i);
5542   }
5543 #endif
5544 
5545   return false;
5546 }
5547 
5548 template<typename Derived>
5549 QualType
5550 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5551                                                    FunctionProtoTypeLoc TL) {
5552   SmallVector<QualType, 4> ExceptionStorage;
5553   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5554   return getDerived().TransformFunctionProtoType(
5555       TLB, TL, nullptr, Qualifiers(),
5556       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5557         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5558                                             ExceptionStorage, Changed);
5559       });
5560 }
5561 
5562 template<typename Derived> template<typename Fn>
5563 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5564     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5565     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5566 
5567   // Transform the parameters and return type.
5568   //
5569   // We are required to instantiate the params and return type in source order.
5570   // When the function has a trailing return type, we instantiate the
5571   // parameters before the return type,  since the return type can then refer
5572   // to the parameters themselves (via decltype, sizeof, etc.).
5573   //
5574   SmallVector<QualType, 4> ParamTypes;
5575   SmallVector<ParmVarDecl*, 4> ParamDecls;
5576   Sema::ExtParameterInfoBuilder ExtParamInfos;
5577   const FunctionProtoType *T = TL.getTypePtr();
5578 
5579   QualType ResultType;
5580 
5581   if (T->hasTrailingReturn()) {
5582     if (getDerived().TransformFunctionTypeParams(
5583             TL.getBeginLoc(), TL.getParams(),
5584             TL.getTypePtr()->param_type_begin(),
5585             T->getExtParameterInfosOrNull(),
5586             ParamTypes, &ParamDecls, ExtParamInfos))
5587       return QualType();
5588 
5589     {
5590       // C++11 [expr.prim.general]p3:
5591       //   If a declaration declares a member function or member function
5592       //   template of a class X, the expression this is a prvalue of type
5593       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5594       //   and the end of the function-definition, member-declarator, or
5595       //   declarator.
5596       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5597 
5598       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5599       if (ResultType.isNull())
5600         return QualType();
5601     }
5602   }
5603   else {
5604     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5605     if (ResultType.isNull())
5606       return QualType();
5607 
5608     if (getDerived().TransformFunctionTypeParams(
5609             TL.getBeginLoc(), TL.getParams(),
5610             TL.getTypePtr()->param_type_begin(),
5611             T->getExtParameterInfosOrNull(),
5612             ParamTypes, &ParamDecls, ExtParamInfos))
5613       return QualType();
5614   }
5615 
5616   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5617 
5618   bool EPIChanged = false;
5619   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5620     return QualType();
5621 
5622   // Handle extended parameter information.
5623   if (auto NewExtParamInfos =
5624         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5625     if (!EPI.ExtParameterInfos ||
5626         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5627           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5628       EPIChanged = true;
5629     }
5630     EPI.ExtParameterInfos = NewExtParamInfos;
5631   } else if (EPI.ExtParameterInfos) {
5632     EPIChanged = true;
5633     EPI.ExtParameterInfos = nullptr;
5634   }
5635 
5636   QualType Result = TL.getType();
5637   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5638       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5639     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5640     if (Result.isNull())
5641       return QualType();
5642   }
5643 
5644   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5645   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5646   NewTL.setLParenLoc(TL.getLParenLoc());
5647   NewTL.setRParenLoc(TL.getRParenLoc());
5648   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5649   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5650   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5651     NewTL.setParam(i, ParamDecls[i]);
5652 
5653   return Result;
5654 }
5655 
5656 template<typename Derived>
5657 bool TreeTransform<Derived>::TransformExceptionSpec(
5658     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5659     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5660   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5661 
5662   // Instantiate a dynamic noexcept expression, if any.
5663   if (isComputedNoexcept(ESI.Type)) {
5664     EnterExpressionEvaluationContext Unevaluated(
5665         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5666     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5667     if (NoexceptExpr.isInvalid())
5668       return true;
5669 
5670     ExceptionSpecificationType EST = ESI.Type;
5671     NoexceptExpr =
5672         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5673     if (NoexceptExpr.isInvalid())
5674       return true;
5675 
5676     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5677       Changed = true;
5678     ESI.NoexceptExpr = NoexceptExpr.get();
5679     ESI.Type = EST;
5680   }
5681 
5682   if (ESI.Type != EST_Dynamic)
5683     return false;
5684 
5685   // Instantiate a dynamic exception specification's type.
5686   for (QualType T : ESI.Exceptions) {
5687     if (const PackExpansionType *PackExpansion =
5688             T->getAs<PackExpansionType>()) {
5689       Changed = true;
5690 
5691       // We have a pack expansion. Instantiate it.
5692       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5693       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5694                                               Unexpanded);
5695       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5696 
5697       // Determine whether the set of unexpanded parameter packs can and
5698       // should
5699       // be expanded.
5700       bool Expand = false;
5701       bool RetainExpansion = false;
5702       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5703       // FIXME: Track the location of the ellipsis (and track source location
5704       // information for the types in the exception specification in general).
5705       if (getDerived().TryExpandParameterPacks(
5706               Loc, SourceRange(), Unexpanded, Expand,
5707               RetainExpansion, NumExpansions))
5708         return true;
5709 
5710       if (!Expand) {
5711         // We can't expand this pack expansion into separate arguments yet;
5712         // just substitute into the pattern and create a new pack expansion
5713         // type.
5714         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5715         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5716         if (U.isNull())
5717           return true;
5718 
5719         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5720         Exceptions.push_back(U);
5721         continue;
5722       }
5723 
5724       // Substitute into the pack expansion pattern for each slice of the
5725       // pack.
5726       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5727         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5728 
5729         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5730         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5731           return true;
5732 
5733         Exceptions.push_back(U);
5734       }
5735     } else {
5736       QualType U = getDerived().TransformType(T);
5737       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5738         return true;
5739       if (T != U)
5740         Changed = true;
5741 
5742       Exceptions.push_back(U);
5743     }
5744   }
5745 
5746   ESI.Exceptions = Exceptions;
5747   if (ESI.Exceptions.empty())
5748     ESI.Type = EST_DynamicNone;
5749   return false;
5750 }
5751 
5752 template<typename Derived>
5753 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5754                                                  TypeLocBuilder &TLB,
5755                                                  FunctionNoProtoTypeLoc TL) {
5756   const FunctionNoProtoType *T = TL.getTypePtr();
5757   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5758   if (ResultType.isNull())
5759     return QualType();
5760 
5761   QualType Result = TL.getType();
5762   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5763     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5764 
5765   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5766   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5767   NewTL.setLParenLoc(TL.getLParenLoc());
5768   NewTL.setRParenLoc(TL.getRParenLoc());
5769   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5770 
5771   return Result;
5772 }
5773 
5774 template<typename Derived> QualType
5775 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5776                                                  UnresolvedUsingTypeLoc TL) {
5777   const UnresolvedUsingType *T = TL.getTypePtr();
5778   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5779   if (!D)
5780     return QualType();
5781 
5782   QualType Result = TL.getType();
5783   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5784     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5785     if (Result.isNull())
5786       return QualType();
5787   }
5788 
5789   // We might get an arbitrary type spec type back.  We should at
5790   // least always get a type spec type, though.
5791   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5792   NewTL.setNameLoc(TL.getNameLoc());
5793 
5794   return Result;
5795 }
5796 
5797 template<typename Derived>
5798 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5799                                                       TypedefTypeLoc TL) {
5800   const TypedefType *T = TL.getTypePtr();
5801   TypedefNameDecl *Typedef
5802     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5803                                                                T->getDecl()));
5804   if (!Typedef)
5805     return QualType();
5806 
5807   QualType Result = TL.getType();
5808   if (getDerived().AlwaysRebuild() ||
5809       Typedef != T->getDecl()) {
5810     Result = getDerived().RebuildTypedefType(Typedef);
5811     if (Result.isNull())
5812       return QualType();
5813   }
5814 
5815   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5816   NewTL.setNameLoc(TL.getNameLoc());
5817 
5818   return Result;
5819 }
5820 
5821 template<typename Derived>
5822 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5823                                                       TypeOfExprTypeLoc TL) {
5824   // typeof expressions are not potentially evaluated contexts
5825   EnterExpressionEvaluationContext Unevaluated(
5826       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5827       Sema::ReuseLambdaContextDecl);
5828 
5829   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5830   if (E.isInvalid())
5831     return QualType();
5832 
5833   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5834   if (E.isInvalid())
5835     return QualType();
5836 
5837   QualType Result = TL.getType();
5838   if (getDerived().AlwaysRebuild() ||
5839       E.get() != TL.getUnderlyingExpr()) {
5840     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5841     if (Result.isNull())
5842       return QualType();
5843   }
5844   else E.get();
5845 
5846   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5847   NewTL.setTypeofLoc(TL.getTypeofLoc());
5848   NewTL.setLParenLoc(TL.getLParenLoc());
5849   NewTL.setRParenLoc(TL.getRParenLoc());
5850 
5851   return Result;
5852 }
5853 
5854 template<typename Derived>
5855 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5856                                                      TypeOfTypeLoc TL) {
5857   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5858   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5859   if (!New_Under_TI)
5860     return QualType();
5861 
5862   QualType Result = TL.getType();
5863   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5864     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5865     if (Result.isNull())
5866       return QualType();
5867   }
5868 
5869   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5870   NewTL.setTypeofLoc(TL.getTypeofLoc());
5871   NewTL.setLParenLoc(TL.getLParenLoc());
5872   NewTL.setRParenLoc(TL.getRParenLoc());
5873   NewTL.setUnderlyingTInfo(New_Under_TI);
5874 
5875   return Result;
5876 }
5877 
5878 template<typename Derived>
5879 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5880                                                        DecltypeTypeLoc TL) {
5881   const DecltypeType *T = TL.getTypePtr();
5882 
5883   // decltype expressions are not potentially evaluated contexts
5884   EnterExpressionEvaluationContext Unevaluated(
5885       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5886       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
5887 
5888   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5889   if (E.isInvalid())
5890     return QualType();
5891 
5892   E = getSema().ActOnDecltypeExpression(E.get());
5893   if (E.isInvalid())
5894     return QualType();
5895 
5896   QualType Result = TL.getType();
5897   if (getDerived().AlwaysRebuild() ||
5898       E.get() != T->getUnderlyingExpr()) {
5899     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5900     if (Result.isNull())
5901       return QualType();
5902   }
5903   else E.get();
5904 
5905   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5906   NewTL.setNameLoc(TL.getNameLoc());
5907 
5908   return Result;
5909 }
5910 
5911 template<typename Derived>
5912 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5913                                                             TypeLocBuilder &TLB,
5914                                                      UnaryTransformTypeLoc TL) {
5915   QualType Result = TL.getType();
5916   if (Result->isDependentType()) {
5917     const UnaryTransformType *T = TL.getTypePtr();
5918     QualType NewBase =
5919       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5920     Result = getDerived().RebuildUnaryTransformType(NewBase,
5921                                                     T->getUTTKind(),
5922                                                     TL.getKWLoc());
5923     if (Result.isNull())
5924       return QualType();
5925   }
5926 
5927   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5928   NewTL.setKWLoc(TL.getKWLoc());
5929   NewTL.setParensRange(TL.getParensRange());
5930   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5931   return Result;
5932 }
5933 
5934 template<typename Derived>
5935 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5936     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5937   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5938 
5939   CXXScopeSpec SS;
5940   TemplateName TemplateName = getDerived().TransformTemplateName(
5941       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5942   if (TemplateName.isNull())
5943     return QualType();
5944 
5945   QualType OldDeduced = T->getDeducedType();
5946   QualType NewDeduced;
5947   if (!OldDeduced.isNull()) {
5948     NewDeduced = getDerived().TransformType(OldDeduced);
5949     if (NewDeduced.isNull())
5950       return QualType();
5951   }
5952 
5953   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5954       TemplateName, NewDeduced);
5955   if (Result.isNull())
5956     return QualType();
5957 
5958   DeducedTemplateSpecializationTypeLoc NewTL =
5959       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5960   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5961 
5962   return Result;
5963 }
5964 
5965 template<typename Derived>
5966 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5967                                                      RecordTypeLoc TL) {
5968   const RecordType *T = TL.getTypePtr();
5969   RecordDecl *Record
5970     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5971                                                           T->getDecl()));
5972   if (!Record)
5973     return QualType();
5974 
5975   QualType Result = TL.getType();
5976   if (getDerived().AlwaysRebuild() ||
5977       Record != T->getDecl()) {
5978     Result = getDerived().RebuildRecordType(Record);
5979     if (Result.isNull())
5980       return QualType();
5981   }
5982 
5983   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5984   NewTL.setNameLoc(TL.getNameLoc());
5985 
5986   return Result;
5987 }
5988 
5989 template<typename Derived>
5990 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5991                                                    EnumTypeLoc TL) {
5992   const EnumType *T = TL.getTypePtr();
5993   EnumDecl *Enum
5994     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5995                                                         T->getDecl()));
5996   if (!Enum)
5997     return QualType();
5998 
5999   QualType Result = TL.getType();
6000   if (getDerived().AlwaysRebuild() ||
6001       Enum != T->getDecl()) {
6002     Result = getDerived().RebuildEnumType(Enum);
6003     if (Result.isNull())
6004       return QualType();
6005   }
6006 
6007   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6008   NewTL.setNameLoc(TL.getNameLoc());
6009 
6010   return Result;
6011 }
6012 
6013 template<typename Derived>
6014 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6015                                          TypeLocBuilder &TLB,
6016                                          InjectedClassNameTypeLoc TL) {
6017   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6018                                        TL.getTypePtr()->getDecl());
6019   if (!D) return QualType();
6020 
6021   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6022   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6023   return T;
6024 }
6025 
6026 template<typename Derived>
6027 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6028                                                 TypeLocBuilder &TLB,
6029                                                 TemplateTypeParmTypeLoc TL) {
6030   return TransformTypeSpecType(TLB, TL);
6031 }
6032 
6033 template<typename Derived>
6034 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6035                                          TypeLocBuilder &TLB,
6036                                          SubstTemplateTypeParmTypeLoc TL) {
6037   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6038 
6039   // Substitute into the replacement type, which itself might involve something
6040   // that needs to be transformed. This only tends to occur with default
6041   // template arguments of template template parameters.
6042   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6043   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6044   if (Replacement.isNull())
6045     return QualType();
6046 
6047   // Always canonicalize the replacement type.
6048   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6049   QualType Result
6050     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6051                                                    Replacement);
6052 
6053   // Propagate type-source information.
6054   SubstTemplateTypeParmTypeLoc NewTL
6055     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6056   NewTL.setNameLoc(TL.getNameLoc());
6057   return Result;
6058 
6059 }
6060 
6061 template<typename Derived>
6062 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6063                                           TypeLocBuilder &TLB,
6064                                           SubstTemplateTypeParmPackTypeLoc TL) {
6065   return TransformTypeSpecType(TLB, TL);
6066 }
6067 
6068 template<typename Derived>
6069 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6070                                                         TypeLocBuilder &TLB,
6071                                            TemplateSpecializationTypeLoc TL) {
6072   const TemplateSpecializationType *T = TL.getTypePtr();
6073 
6074   // The nested-name-specifier never matters in a TemplateSpecializationType,
6075   // because we can't have a dependent nested-name-specifier anyway.
6076   CXXScopeSpec SS;
6077   TemplateName Template
6078     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6079                                          TL.getTemplateNameLoc());
6080   if (Template.isNull())
6081     return QualType();
6082 
6083   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6084 }
6085 
6086 template<typename Derived>
6087 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6088                                                      AtomicTypeLoc TL) {
6089   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6090   if (ValueType.isNull())
6091     return QualType();
6092 
6093   QualType Result = TL.getType();
6094   if (getDerived().AlwaysRebuild() ||
6095       ValueType != TL.getValueLoc().getType()) {
6096     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6097     if (Result.isNull())
6098       return QualType();
6099   }
6100 
6101   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6102   NewTL.setKWLoc(TL.getKWLoc());
6103   NewTL.setLParenLoc(TL.getLParenLoc());
6104   NewTL.setRParenLoc(TL.getRParenLoc());
6105 
6106   return Result;
6107 }
6108 
6109 template <typename Derived>
6110 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6111                                                    PipeTypeLoc TL) {
6112   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6113   if (ValueType.isNull())
6114     return QualType();
6115 
6116   QualType Result = TL.getType();
6117   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6118     const PipeType *PT = Result->castAs<PipeType>();
6119     bool isReadPipe = PT->isReadOnly();
6120     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6121     if (Result.isNull())
6122       return QualType();
6123   }
6124 
6125   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6126   NewTL.setKWLoc(TL.getKWLoc());
6127 
6128   return Result;
6129 }
6130 
6131 template <typename Derived>
6132 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6133                                                      ExtIntTypeLoc TL) {
6134   const ExtIntType *EIT = TL.getTypePtr();
6135   QualType Result = TL.getType();
6136 
6137   if (getDerived().AlwaysRebuild()) {
6138     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6139                                             EIT->getNumBits(), TL.getNameLoc());
6140     if (Result.isNull())
6141       return QualType();
6142   }
6143 
6144   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6145   NewTL.setNameLoc(TL.getNameLoc());
6146   return Result;
6147 }
6148 
6149 template <typename Derived>
6150 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6151     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6152   const DependentExtIntType *EIT = TL.getTypePtr();
6153 
6154   EnterExpressionEvaluationContext Unevaluated(
6155       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6156   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6157   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6158 
6159   if (BitsExpr.isInvalid())
6160     return QualType();
6161 
6162   QualType Result = TL.getType();
6163 
6164   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6165     Result = getDerived().RebuildDependentExtIntType(
6166         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6167 
6168     if (Result.isNull())
6169       return QualType();
6170   }
6171 
6172   if (isa<DependentExtIntType>(Result)) {
6173     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6174     NewTL.setNameLoc(TL.getNameLoc());
6175   } else {
6176     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6177     NewTL.setNameLoc(TL.getNameLoc());
6178   }
6179   return Result;
6180 }
6181 
6182   /// Simple iterator that traverses the template arguments in a
6183   /// container that provides a \c getArgLoc() member function.
6184   ///
6185   /// This iterator is intended to be used with the iterator form of
6186   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6187   template<typename ArgLocContainer>
6188   class TemplateArgumentLocContainerIterator {
6189     ArgLocContainer *Container;
6190     unsigned Index;
6191 
6192   public:
6193     typedef TemplateArgumentLoc value_type;
6194     typedef TemplateArgumentLoc reference;
6195     typedef int difference_type;
6196     typedef std::input_iterator_tag iterator_category;
6197 
6198     class pointer {
6199       TemplateArgumentLoc Arg;
6200 
6201     public:
6202       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6203 
6204       const TemplateArgumentLoc *operator->() const {
6205         return &Arg;
6206       }
6207     };
6208 
6209 
6210     TemplateArgumentLocContainerIterator() {}
6211 
6212     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6213                                  unsigned Index)
6214       : Container(&Container), Index(Index) { }
6215 
6216     TemplateArgumentLocContainerIterator &operator++() {
6217       ++Index;
6218       return *this;
6219     }
6220 
6221     TemplateArgumentLocContainerIterator operator++(int) {
6222       TemplateArgumentLocContainerIterator Old(*this);
6223       ++(*this);
6224       return Old;
6225     }
6226 
6227     TemplateArgumentLoc operator*() const {
6228       return Container->getArgLoc(Index);
6229     }
6230 
6231     pointer operator->() const {
6232       return pointer(Container->getArgLoc(Index));
6233     }
6234 
6235     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6236                            const TemplateArgumentLocContainerIterator &Y) {
6237       return X.Container == Y.Container && X.Index == Y.Index;
6238     }
6239 
6240     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6241                            const TemplateArgumentLocContainerIterator &Y) {
6242       return !(X == Y);
6243     }
6244   };
6245 
6246 template<typename Derived>
6247 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6248                                                    AutoTypeLoc TL) {
6249   const AutoType *T = TL.getTypePtr();
6250   QualType OldDeduced = T->getDeducedType();
6251   QualType NewDeduced;
6252   if (!OldDeduced.isNull()) {
6253     NewDeduced = getDerived().TransformType(OldDeduced);
6254     if (NewDeduced.isNull())
6255       return QualType();
6256   }
6257 
6258   ConceptDecl *NewCD = nullptr;
6259   TemplateArgumentListInfo NewTemplateArgs;
6260   NestedNameSpecifierLoc NewNestedNameSpec;
6261   if (TL.getTypePtr()->isConstrained()) {
6262     NewCD = cast_or_null<ConceptDecl>(
6263         getDerived().TransformDecl(
6264             TL.getConceptNameLoc(),
6265             TL.getTypePtr()->getTypeConstraintConcept()));
6266 
6267     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6268     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6269     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6270     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6271                                                 ArgIterator(TL,
6272                                                             TL.getNumArgs()),
6273                                                 NewTemplateArgs))
6274       return QualType();
6275 
6276     if (TL.getNestedNameSpecifierLoc()) {
6277       NewNestedNameSpec
6278         = getDerived().TransformNestedNameSpecifierLoc(
6279             TL.getNestedNameSpecifierLoc());
6280       if (!NewNestedNameSpec)
6281         return QualType();
6282     }
6283   }
6284 
6285   QualType Result = TL.getType();
6286   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6287       T->isDependentType()) {
6288     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6289     NewArgList.reserve(NewArgList.size());
6290     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6291       NewArgList.push_back(ArgLoc.getArgument());
6292     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6293                                           NewArgList);
6294     if (Result.isNull())
6295       return QualType();
6296   }
6297 
6298   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6299   NewTL.setNameLoc(TL.getNameLoc());
6300   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6301   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6302   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6303   NewTL.setFoundDecl(TL.getFoundDecl());
6304   NewTL.setLAngleLoc(TL.getLAngleLoc());
6305   NewTL.setRAngleLoc(TL.getRAngleLoc());
6306   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6307     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6308 
6309   return Result;
6310 }
6311 
6312 template <typename Derived>
6313 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6314                                                         TypeLocBuilder &TLB,
6315                                            TemplateSpecializationTypeLoc TL,
6316                                                       TemplateName Template) {
6317   TemplateArgumentListInfo NewTemplateArgs;
6318   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6319   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6320   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6321     ArgIterator;
6322   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6323                                               ArgIterator(TL, TL.getNumArgs()),
6324                                               NewTemplateArgs))
6325     return QualType();
6326 
6327   // FIXME: maybe don't rebuild if all the template arguments are the same.
6328 
6329   QualType Result =
6330     getDerived().RebuildTemplateSpecializationType(Template,
6331                                                    TL.getTemplateNameLoc(),
6332                                                    NewTemplateArgs);
6333 
6334   if (!Result.isNull()) {
6335     // Specializations of template template parameters are represented as
6336     // TemplateSpecializationTypes, and substitution of type alias templates
6337     // within a dependent context can transform them into
6338     // DependentTemplateSpecializationTypes.
6339     if (isa<DependentTemplateSpecializationType>(Result)) {
6340       DependentTemplateSpecializationTypeLoc NewTL
6341         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6342       NewTL.setElaboratedKeywordLoc(SourceLocation());
6343       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6344       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6345       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6346       NewTL.setLAngleLoc(TL.getLAngleLoc());
6347       NewTL.setRAngleLoc(TL.getRAngleLoc());
6348       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6349         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6350       return Result;
6351     }
6352 
6353     TemplateSpecializationTypeLoc NewTL
6354       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6355     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6356     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6357     NewTL.setLAngleLoc(TL.getLAngleLoc());
6358     NewTL.setRAngleLoc(TL.getRAngleLoc());
6359     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6360       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6361   }
6362 
6363   return Result;
6364 }
6365 
6366 template <typename Derived>
6367 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6368                                      TypeLocBuilder &TLB,
6369                                      DependentTemplateSpecializationTypeLoc TL,
6370                                      TemplateName Template,
6371                                      CXXScopeSpec &SS) {
6372   TemplateArgumentListInfo NewTemplateArgs;
6373   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6374   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6375   typedef TemplateArgumentLocContainerIterator<
6376             DependentTemplateSpecializationTypeLoc> ArgIterator;
6377   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6378                                               ArgIterator(TL, TL.getNumArgs()),
6379                                               NewTemplateArgs))
6380     return QualType();
6381 
6382   // FIXME: maybe don't rebuild if all the template arguments are the same.
6383 
6384   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6385     QualType Result
6386       = getSema().Context.getDependentTemplateSpecializationType(
6387                                                 TL.getTypePtr()->getKeyword(),
6388                                                          DTN->getQualifier(),
6389                                                          DTN->getIdentifier(),
6390                                                                NewTemplateArgs);
6391 
6392     DependentTemplateSpecializationTypeLoc NewTL
6393       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6394     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6395     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6396     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6397     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6398     NewTL.setLAngleLoc(TL.getLAngleLoc());
6399     NewTL.setRAngleLoc(TL.getRAngleLoc());
6400     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6401       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6402     return Result;
6403   }
6404 
6405   QualType Result
6406     = getDerived().RebuildTemplateSpecializationType(Template,
6407                                                      TL.getTemplateNameLoc(),
6408                                                      NewTemplateArgs);
6409 
6410   if (!Result.isNull()) {
6411     /// FIXME: Wrap this in an elaborated-type-specifier?
6412     TemplateSpecializationTypeLoc NewTL
6413       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6414     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6415     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6416     NewTL.setLAngleLoc(TL.getLAngleLoc());
6417     NewTL.setRAngleLoc(TL.getRAngleLoc());
6418     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6419       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6420   }
6421 
6422   return Result;
6423 }
6424 
6425 template<typename Derived>
6426 QualType
6427 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6428                                                 ElaboratedTypeLoc TL) {
6429   const ElaboratedType *T = TL.getTypePtr();
6430 
6431   NestedNameSpecifierLoc QualifierLoc;
6432   // NOTE: the qualifier in an ElaboratedType is optional.
6433   if (TL.getQualifierLoc()) {
6434     QualifierLoc
6435       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6436     if (!QualifierLoc)
6437       return QualType();
6438   }
6439 
6440   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6441   if (NamedT.isNull())
6442     return QualType();
6443 
6444   // C++0x [dcl.type.elab]p2:
6445   //   If the identifier resolves to a typedef-name or the simple-template-id
6446   //   resolves to an alias template specialization, the
6447   //   elaborated-type-specifier is ill-formed.
6448   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6449     if (const TemplateSpecializationType *TST =
6450           NamedT->getAs<TemplateSpecializationType>()) {
6451       TemplateName Template = TST->getTemplateName();
6452       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6453               Template.getAsTemplateDecl())) {
6454         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6455                      diag::err_tag_reference_non_tag)
6456             << TAT << Sema::NTK_TypeAliasTemplate
6457             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6458         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6459       }
6460     }
6461   }
6462 
6463   QualType Result = TL.getType();
6464   if (getDerived().AlwaysRebuild() ||
6465       QualifierLoc != TL.getQualifierLoc() ||
6466       NamedT != T->getNamedType()) {
6467     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6468                                                 T->getKeyword(),
6469                                                 QualifierLoc, NamedT);
6470     if (Result.isNull())
6471       return QualType();
6472   }
6473 
6474   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6475   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6476   NewTL.setQualifierLoc(QualifierLoc);
6477   return Result;
6478 }
6479 
6480 template<typename Derived>
6481 QualType TreeTransform<Derived>::TransformAttributedType(
6482                                                 TypeLocBuilder &TLB,
6483                                                 AttributedTypeLoc TL) {
6484   const AttributedType *oldType = TL.getTypePtr();
6485   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6486   if (modifiedType.isNull())
6487     return QualType();
6488 
6489   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6490   const Attr *oldAttr = TL.getAttr();
6491   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6492   if (oldAttr && !newAttr)
6493     return QualType();
6494 
6495   QualType result = TL.getType();
6496 
6497   // FIXME: dependent operand expressions?
6498   if (getDerived().AlwaysRebuild() ||
6499       modifiedType != oldType->getModifiedType()) {
6500     // TODO: this is really lame; we should really be rebuilding the
6501     // equivalent type from first principles.
6502     QualType equivalentType
6503       = getDerived().TransformType(oldType->getEquivalentType());
6504     if (equivalentType.isNull())
6505       return QualType();
6506 
6507     // Check whether we can add nullability; it is only represented as
6508     // type sugar, and therefore cannot be diagnosed in any other way.
6509     if (auto nullability = oldType->getImmediateNullability()) {
6510       if (!modifiedType->canHaveNullability()) {
6511         SemaRef.Diag(TL.getAttr()->getLocation(),
6512                      diag::err_nullability_nonpointer)
6513             << DiagNullabilityKind(*nullability, false) << modifiedType;
6514         return QualType();
6515       }
6516     }
6517 
6518     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6519                                                modifiedType,
6520                                                equivalentType);
6521   }
6522 
6523   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6524   newTL.setAttr(newAttr);
6525   return result;
6526 }
6527 
6528 template<typename Derived>
6529 QualType
6530 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6531                                            ParenTypeLoc TL) {
6532   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6533   if (Inner.isNull())
6534     return QualType();
6535 
6536   QualType Result = TL.getType();
6537   if (getDerived().AlwaysRebuild() ||
6538       Inner != TL.getInnerLoc().getType()) {
6539     Result = getDerived().RebuildParenType(Inner);
6540     if (Result.isNull())
6541       return QualType();
6542   }
6543 
6544   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6545   NewTL.setLParenLoc(TL.getLParenLoc());
6546   NewTL.setRParenLoc(TL.getRParenLoc());
6547   return Result;
6548 }
6549 
6550 template <typename Derived>
6551 QualType
6552 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6553                                                     MacroQualifiedTypeLoc TL) {
6554   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6555   if (Inner.isNull())
6556     return QualType();
6557 
6558   QualType Result = TL.getType();
6559   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6560     Result =
6561         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6562     if (Result.isNull())
6563       return QualType();
6564   }
6565 
6566   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6567   NewTL.setExpansionLoc(TL.getExpansionLoc());
6568   return Result;
6569 }
6570 
6571 template<typename Derived>
6572 QualType TreeTransform<Derived>::TransformDependentNameType(
6573     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6574   return TransformDependentNameType(TLB, TL, false);
6575 }
6576 
6577 template<typename Derived>
6578 QualType TreeTransform<Derived>::TransformDependentNameType(
6579     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6580   const DependentNameType *T = TL.getTypePtr();
6581 
6582   NestedNameSpecifierLoc QualifierLoc
6583     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6584   if (!QualifierLoc)
6585     return QualType();
6586 
6587   QualType Result
6588     = getDerived().RebuildDependentNameType(T->getKeyword(),
6589                                             TL.getElaboratedKeywordLoc(),
6590                                             QualifierLoc,
6591                                             T->getIdentifier(),
6592                                             TL.getNameLoc(),
6593                                             DeducedTSTContext);
6594   if (Result.isNull())
6595     return QualType();
6596 
6597   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6598     QualType NamedT = ElabT->getNamedType();
6599     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6600 
6601     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6602     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6603     NewTL.setQualifierLoc(QualifierLoc);
6604   } else {
6605     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6606     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6607     NewTL.setQualifierLoc(QualifierLoc);
6608     NewTL.setNameLoc(TL.getNameLoc());
6609   }
6610   return Result;
6611 }
6612 
6613 template<typename Derived>
6614 QualType TreeTransform<Derived>::
6615           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6616                                  DependentTemplateSpecializationTypeLoc TL) {
6617   NestedNameSpecifierLoc QualifierLoc;
6618   if (TL.getQualifierLoc()) {
6619     QualifierLoc
6620       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6621     if (!QualifierLoc)
6622       return QualType();
6623   }
6624 
6625   return getDerived()
6626            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6627 }
6628 
6629 template<typename Derived>
6630 QualType TreeTransform<Derived>::
6631 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6632                                    DependentTemplateSpecializationTypeLoc TL,
6633                                        NestedNameSpecifierLoc QualifierLoc) {
6634   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6635 
6636   TemplateArgumentListInfo NewTemplateArgs;
6637   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6638   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6639 
6640   typedef TemplateArgumentLocContainerIterator<
6641   DependentTemplateSpecializationTypeLoc> ArgIterator;
6642   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6643                                               ArgIterator(TL, TL.getNumArgs()),
6644                                               NewTemplateArgs))
6645     return QualType();
6646 
6647   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6648       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6649       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6650       /*AllowInjectedClassName*/ false);
6651   if (Result.isNull())
6652     return QualType();
6653 
6654   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6655     QualType NamedT = ElabT->getNamedType();
6656 
6657     // Copy information relevant to the template specialization.
6658     TemplateSpecializationTypeLoc NamedTL
6659       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6660     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6661     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6662     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6663     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6664     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6665       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6666 
6667     // Copy information relevant to the elaborated type.
6668     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6669     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6670     NewTL.setQualifierLoc(QualifierLoc);
6671   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6672     DependentTemplateSpecializationTypeLoc SpecTL
6673       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6674     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6675     SpecTL.setQualifierLoc(QualifierLoc);
6676     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6677     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6678     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6679     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6680     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6681       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6682   } else {
6683     TemplateSpecializationTypeLoc SpecTL
6684       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6685     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6686     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6687     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6688     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6689     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6690       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6691   }
6692   return Result;
6693 }
6694 
6695 template<typename Derived>
6696 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6697                                                       PackExpansionTypeLoc TL) {
6698   QualType Pattern
6699     = getDerived().TransformType(TLB, TL.getPatternLoc());
6700   if (Pattern.isNull())
6701     return QualType();
6702 
6703   QualType Result = TL.getType();
6704   if (getDerived().AlwaysRebuild() ||
6705       Pattern != TL.getPatternLoc().getType()) {
6706     Result = getDerived().RebuildPackExpansionType(Pattern,
6707                                            TL.getPatternLoc().getSourceRange(),
6708                                                    TL.getEllipsisLoc(),
6709                                            TL.getTypePtr()->getNumExpansions());
6710     if (Result.isNull())
6711       return QualType();
6712   }
6713 
6714   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6715   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6716   return Result;
6717 }
6718 
6719 template<typename Derived>
6720 QualType
6721 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6722                                                    ObjCInterfaceTypeLoc TL) {
6723   // ObjCInterfaceType is never dependent.
6724   TLB.pushFullCopy(TL);
6725   return TL.getType();
6726 }
6727 
6728 template<typename Derived>
6729 QualType
6730 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6731                                                    ObjCTypeParamTypeLoc TL) {
6732   const ObjCTypeParamType *T = TL.getTypePtr();
6733   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6734       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6735   if (!OTP)
6736     return QualType();
6737 
6738   QualType Result = TL.getType();
6739   if (getDerived().AlwaysRebuild() ||
6740       OTP != T->getDecl()) {
6741     Result = getDerived().RebuildObjCTypeParamType(OTP,
6742                  TL.getProtocolLAngleLoc(),
6743                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6744                                     TL.getNumProtocols()),
6745                  TL.getProtocolLocs(),
6746                  TL.getProtocolRAngleLoc());
6747     if (Result.isNull())
6748       return QualType();
6749   }
6750 
6751   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6752   if (TL.getNumProtocols()) {
6753     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6754     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6755       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6756     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6757   }
6758   return Result;
6759 }
6760 
6761 template<typename Derived>
6762 QualType
6763 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6764                                                 ObjCObjectTypeLoc TL) {
6765   // Transform base type.
6766   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6767   if (BaseType.isNull())
6768     return QualType();
6769 
6770   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6771 
6772   // Transform type arguments.
6773   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6774   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6775     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6776     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6777     QualType TypeArg = TypeArgInfo->getType();
6778     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6779       AnyChanged = true;
6780 
6781       // We have a pack expansion. Instantiate it.
6782       const auto *PackExpansion = PackExpansionLoc.getType()
6783                                     ->castAs<PackExpansionType>();
6784       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6785       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6786                                               Unexpanded);
6787       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6788 
6789       // Determine whether the set of unexpanded parameter packs can
6790       // and should be expanded.
6791       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6792       bool Expand = false;
6793       bool RetainExpansion = false;
6794       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6795       if (getDerived().TryExpandParameterPacks(
6796             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6797             Unexpanded, Expand, RetainExpansion, NumExpansions))
6798         return QualType();
6799 
6800       if (!Expand) {
6801         // We can't expand this pack expansion into separate arguments yet;
6802         // just substitute into the pattern and create a new pack expansion
6803         // type.
6804         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6805 
6806         TypeLocBuilder TypeArgBuilder;
6807         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6808         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6809                                                              PatternLoc);
6810         if (NewPatternType.isNull())
6811           return QualType();
6812 
6813         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6814                                       NewPatternType, NumExpansions);
6815         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6816         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6817         NewTypeArgInfos.push_back(
6818           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6819         continue;
6820       }
6821 
6822       // Substitute into the pack expansion pattern for each slice of the
6823       // pack.
6824       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6825         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6826 
6827         TypeLocBuilder TypeArgBuilder;
6828         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6829 
6830         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6831                                                          PatternLoc);
6832         if (NewTypeArg.isNull())
6833           return QualType();
6834 
6835         NewTypeArgInfos.push_back(
6836           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6837       }
6838 
6839       continue;
6840     }
6841 
6842     TypeLocBuilder TypeArgBuilder;
6843     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6844     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6845     if (NewTypeArg.isNull())
6846       return QualType();
6847 
6848     // If nothing changed, just keep the old TypeSourceInfo.
6849     if (NewTypeArg == TypeArg) {
6850       NewTypeArgInfos.push_back(TypeArgInfo);
6851       continue;
6852     }
6853 
6854     NewTypeArgInfos.push_back(
6855       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6856     AnyChanged = true;
6857   }
6858 
6859   QualType Result = TL.getType();
6860   if (getDerived().AlwaysRebuild() || AnyChanged) {
6861     // Rebuild the type.
6862     Result = getDerived().RebuildObjCObjectType(
6863         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
6864         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
6865         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
6866         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
6867 
6868     if (Result.isNull())
6869       return QualType();
6870   }
6871 
6872   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6873   NewT.setHasBaseTypeAsWritten(true);
6874   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6875   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6876     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6877   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6878   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6879   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6880     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6881   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6882   return Result;
6883 }
6884 
6885 template<typename Derived>
6886 QualType
6887 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6888                                                ObjCObjectPointerTypeLoc TL) {
6889   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6890   if (PointeeType.isNull())
6891     return QualType();
6892 
6893   QualType Result = TL.getType();
6894   if (getDerived().AlwaysRebuild() ||
6895       PointeeType != TL.getPointeeLoc().getType()) {
6896     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6897                                                        TL.getStarLoc());
6898     if (Result.isNull())
6899       return QualType();
6900   }
6901 
6902   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6903   NewT.setStarLoc(TL.getStarLoc());
6904   return Result;
6905 }
6906 
6907 //===----------------------------------------------------------------------===//
6908 // Statement transformation
6909 //===----------------------------------------------------------------------===//
6910 template<typename Derived>
6911 StmtResult
6912 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6913   return S;
6914 }
6915 
6916 template<typename Derived>
6917 StmtResult
6918 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6919   return getDerived().TransformCompoundStmt(S, false);
6920 }
6921 
6922 template<typename Derived>
6923 StmtResult
6924 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6925                                               bool IsStmtExpr) {
6926   Sema::CompoundScopeRAII CompoundScope(getSema());
6927 
6928   const Stmt *ExprResult = S->getStmtExprResult();
6929   bool SubStmtInvalid = false;
6930   bool SubStmtChanged = false;
6931   SmallVector<Stmt*, 8> Statements;
6932   for (auto *B : S->body()) {
6933     StmtResult Result = getDerived().TransformStmt(
6934         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
6935 
6936     if (Result.isInvalid()) {
6937       // Immediately fail if this was a DeclStmt, since it's very
6938       // likely that this will cause problems for future statements.
6939       if (isa<DeclStmt>(B))
6940         return StmtError();
6941 
6942       // Otherwise, just keep processing substatements and fail later.
6943       SubStmtInvalid = true;
6944       continue;
6945     }
6946 
6947     SubStmtChanged = SubStmtChanged || Result.get() != B;
6948     Statements.push_back(Result.getAs<Stmt>());
6949   }
6950 
6951   if (SubStmtInvalid)
6952     return StmtError();
6953 
6954   if (!getDerived().AlwaysRebuild() &&
6955       !SubStmtChanged)
6956     return S;
6957 
6958   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6959                                           Statements,
6960                                           S->getRBracLoc(),
6961                                           IsStmtExpr);
6962 }
6963 
6964 template<typename Derived>
6965 StmtResult
6966 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6967   ExprResult LHS, RHS;
6968   {
6969     EnterExpressionEvaluationContext Unevaluated(
6970         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6971 
6972     // Transform the left-hand case value.
6973     LHS = getDerived().TransformExpr(S->getLHS());
6974     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
6975     if (LHS.isInvalid())
6976       return StmtError();
6977 
6978     // Transform the right-hand case value (for the GNU case-range extension).
6979     RHS = getDerived().TransformExpr(S->getRHS());
6980     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
6981     if (RHS.isInvalid())
6982       return StmtError();
6983   }
6984 
6985   // Build the case statement.
6986   // Case statements are always rebuilt so that they will attached to their
6987   // transformed switch statement.
6988   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6989                                                        LHS.get(),
6990                                                        S->getEllipsisLoc(),
6991                                                        RHS.get(),
6992                                                        S->getColonLoc());
6993   if (Case.isInvalid())
6994     return StmtError();
6995 
6996   // Transform the statement following the case
6997   StmtResult SubStmt =
6998       getDerived().TransformStmt(S->getSubStmt());
6999   if (SubStmt.isInvalid())
7000     return StmtError();
7001 
7002   // Attach the body to the case statement
7003   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7004 }
7005 
7006 template <typename Derived>
7007 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7008   // Transform the statement following the default case
7009   StmtResult SubStmt =
7010       getDerived().TransformStmt(S->getSubStmt());
7011   if (SubStmt.isInvalid())
7012     return StmtError();
7013 
7014   // Default statements are always rebuilt
7015   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7016                                          SubStmt.get());
7017 }
7018 
7019 template<typename Derived>
7020 StmtResult
7021 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7022   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7023   if (SubStmt.isInvalid())
7024     return StmtError();
7025 
7026   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7027                                         S->getDecl());
7028   if (!LD)
7029     return StmtError();
7030 
7031   // If we're transforming "in-place" (we're not creating new local
7032   // declarations), assume we're replacing the old label statement
7033   // and clear out the reference to it.
7034   if (LD == S->getDecl())
7035     S->getDecl()->setStmt(nullptr);
7036 
7037   // FIXME: Pass the real colon location in.
7038   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7039                                        cast<LabelDecl>(LD), SourceLocation(),
7040                                        SubStmt.get());
7041 }
7042 
7043 template <typename Derived>
7044 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7045   if (!R)
7046     return R;
7047 
7048   switch (R->getKind()) {
7049 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7050 #define ATTR(X)
7051 #define PRAGMA_SPELLING_ATTR(X)                                                \
7052   case attr::X:                                                                \
7053     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7054 #include "clang/Basic/AttrList.inc"
7055   default:
7056     return R;
7057   }
7058 }
7059 
7060 template <typename Derived>
7061 StmtResult
7062 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7063                                                 StmtDiscardKind SDK) {
7064   bool AttrsChanged = false;
7065   SmallVector<const Attr *, 1> Attrs;
7066 
7067   // Visit attributes and keep track if any are transformed.
7068   for (const auto *I : S->getAttrs()) {
7069     const Attr *R = getDerived().TransformAttr(I);
7070     AttrsChanged |= (I != R);
7071     Attrs.push_back(R);
7072   }
7073 
7074   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7075   if (SubStmt.isInvalid())
7076     return StmtError();
7077 
7078   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7079     return S;
7080 
7081   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7082                                             SubStmt.get());
7083 }
7084 
7085 template<typename Derived>
7086 StmtResult
7087 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7088   // Transform the initialization statement
7089   StmtResult Init = getDerived().TransformStmt(S->getInit());
7090   if (Init.isInvalid())
7091     return StmtError();
7092 
7093   // Transform the condition
7094   Sema::ConditionResult Cond = getDerived().TransformCondition(
7095       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7096       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7097                        : Sema::ConditionKind::Boolean);
7098   if (Cond.isInvalid())
7099     return StmtError();
7100 
7101   // If this is a constexpr if, determine which arm we should instantiate.
7102   llvm::Optional<bool> ConstexprConditionValue;
7103   if (S->isConstexpr())
7104     ConstexprConditionValue = Cond.getKnownValue();
7105 
7106   // Transform the "then" branch.
7107   StmtResult Then;
7108   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7109     Then = getDerived().TransformStmt(S->getThen());
7110     if (Then.isInvalid())
7111       return StmtError();
7112   } else {
7113     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7114   }
7115 
7116   // Transform the "else" branch.
7117   StmtResult Else;
7118   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7119     Else = getDerived().TransformStmt(S->getElse());
7120     if (Else.isInvalid())
7121       return StmtError();
7122   }
7123 
7124   if (!getDerived().AlwaysRebuild() &&
7125       Init.get() == S->getInit() &&
7126       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7127       Then.get() == S->getThen() &&
7128       Else.get() == S->getElse())
7129     return S;
7130 
7131   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
7132                                     Init.get(), Then.get(), S->getElseLoc(),
7133                                     Else.get());
7134 }
7135 
7136 template<typename Derived>
7137 StmtResult
7138 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7139   // Transform the initialization statement
7140   StmtResult Init = getDerived().TransformStmt(S->getInit());
7141   if (Init.isInvalid())
7142     return StmtError();
7143 
7144   // Transform the condition.
7145   Sema::ConditionResult Cond = getDerived().TransformCondition(
7146       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7147       Sema::ConditionKind::Switch);
7148   if (Cond.isInvalid())
7149     return StmtError();
7150 
7151   // Rebuild the switch statement.
7152   StmtResult Switch
7153     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
7154   if (Switch.isInvalid())
7155     return StmtError();
7156 
7157   // Transform the body of the switch statement.
7158   StmtResult Body = getDerived().TransformStmt(S->getBody());
7159   if (Body.isInvalid())
7160     return StmtError();
7161 
7162   // Complete the switch statement.
7163   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7164                                             Body.get());
7165 }
7166 
7167 template<typename Derived>
7168 StmtResult
7169 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7170   // Transform the condition
7171   Sema::ConditionResult Cond = getDerived().TransformCondition(
7172       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7173       Sema::ConditionKind::Boolean);
7174   if (Cond.isInvalid())
7175     return StmtError();
7176 
7177   // Transform the body
7178   StmtResult Body = getDerived().TransformStmt(S->getBody());
7179   if (Body.isInvalid())
7180     return StmtError();
7181 
7182   if (!getDerived().AlwaysRebuild() &&
7183       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7184       Body.get() == S->getBody())
7185     return Owned(S);
7186 
7187   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
7188 }
7189 
7190 template<typename Derived>
7191 StmtResult
7192 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7193   // Transform the body
7194   StmtResult Body = getDerived().TransformStmt(S->getBody());
7195   if (Body.isInvalid())
7196     return StmtError();
7197 
7198   // Transform the condition
7199   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7200   if (Cond.isInvalid())
7201     return StmtError();
7202 
7203   if (!getDerived().AlwaysRebuild() &&
7204       Cond.get() == S->getCond() &&
7205       Body.get() == S->getBody())
7206     return S;
7207 
7208   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7209                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7210                                     S->getRParenLoc());
7211 }
7212 
7213 template<typename Derived>
7214 StmtResult
7215 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7216   if (getSema().getLangOpts().OpenMP)
7217     getSema().startOpenMPLoop();
7218 
7219   // Transform the initialization statement
7220   StmtResult Init = getDerived().TransformStmt(S->getInit());
7221   if (Init.isInvalid())
7222     return StmtError();
7223 
7224   // In OpenMP loop region loop control variable must be captured and be
7225   // private. Perform analysis of first part (if any).
7226   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7227     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7228 
7229   // Transform the condition
7230   Sema::ConditionResult Cond = getDerived().TransformCondition(
7231       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7232       Sema::ConditionKind::Boolean);
7233   if (Cond.isInvalid())
7234     return StmtError();
7235 
7236   // Transform the increment
7237   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7238   if (Inc.isInvalid())
7239     return StmtError();
7240 
7241   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7242   if (S->getInc() && !FullInc.get())
7243     return StmtError();
7244 
7245   // Transform the body
7246   StmtResult Body = getDerived().TransformStmt(S->getBody());
7247   if (Body.isInvalid())
7248     return StmtError();
7249 
7250   if (!getDerived().AlwaysRebuild() &&
7251       Init.get() == S->getInit() &&
7252       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7253       Inc.get() == S->getInc() &&
7254       Body.get() == S->getBody())
7255     return S;
7256 
7257   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7258                                      Init.get(), Cond, FullInc,
7259                                      S->getRParenLoc(), Body.get());
7260 }
7261 
7262 template<typename Derived>
7263 StmtResult
7264 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7265   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7266                                         S->getLabel());
7267   if (!LD)
7268     return StmtError();
7269 
7270   // Goto statements must always be rebuilt, to resolve the label.
7271   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7272                                       cast<LabelDecl>(LD));
7273 }
7274 
7275 template<typename Derived>
7276 StmtResult
7277 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7278   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7279   if (Target.isInvalid())
7280     return StmtError();
7281   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7282 
7283   if (!getDerived().AlwaysRebuild() &&
7284       Target.get() == S->getTarget())
7285     return S;
7286 
7287   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7288                                               Target.get());
7289 }
7290 
7291 template<typename Derived>
7292 StmtResult
7293 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7294   return S;
7295 }
7296 
7297 template<typename Derived>
7298 StmtResult
7299 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7300   return S;
7301 }
7302 
7303 template<typename Derived>
7304 StmtResult
7305 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7306   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7307                                                         /*NotCopyInit*/false);
7308   if (Result.isInvalid())
7309     return StmtError();
7310 
7311   // FIXME: We always rebuild the return statement because there is no way
7312   // to tell whether the return type of the function has changed.
7313   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7314 }
7315 
7316 template<typename Derived>
7317 StmtResult
7318 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7319   bool DeclChanged = false;
7320   SmallVector<Decl *, 4> Decls;
7321   for (auto *D : S->decls()) {
7322     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7323     if (!Transformed)
7324       return StmtError();
7325 
7326     if (Transformed != D)
7327       DeclChanged = true;
7328 
7329     Decls.push_back(Transformed);
7330   }
7331 
7332   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7333     return S;
7334 
7335   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7336 }
7337 
7338 template<typename Derived>
7339 StmtResult
7340 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7341 
7342   SmallVector<Expr*, 8> Constraints;
7343   SmallVector<Expr*, 8> Exprs;
7344   SmallVector<IdentifierInfo *, 4> Names;
7345 
7346   ExprResult AsmString;
7347   SmallVector<Expr*, 8> Clobbers;
7348 
7349   bool ExprsChanged = false;
7350 
7351   // Go through the outputs.
7352   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7353     Names.push_back(S->getOutputIdentifier(I));
7354 
7355     // No need to transform the constraint literal.
7356     Constraints.push_back(S->getOutputConstraintLiteral(I));
7357 
7358     // Transform the output expr.
7359     Expr *OutputExpr = S->getOutputExpr(I);
7360     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7361     if (Result.isInvalid())
7362       return StmtError();
7363 
7364     ExprsChanged |= Result.get() != OutputExpr;
7365 
7366     Exprs.push_back(Result.get());
7367   }
7368 
7369   // Go through the inputs.
7370   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7371     Names.push_back(S->getInputIdentifier(I));
7372 
7373     // No need to transform the constraint literal.
7374     Constraints.push_back(S->getInputConstraintLiteral(I));
7375 
7376     // Transform the input expr.
7377     Expr *InputExpr = S->getInputExpr(I);
7378     ExprResult Result = getDerived().TransformExpr(InputExpr);
7379     if (Result.isInvalid())
7380       return StmtError();
7381 
7382     ExprsChanged |= Result.get() != InputExpr;
7383 
7384     Exprs.push_back(Result.get());
7385   }
7386 
7387   // Go through the Labels.
7388   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7389     Names.push_back(S->getLabelIdentifier(I));
7390 
7391     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7392     if (Result.isInvalid())
7393       return StmtError();
7394     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7395     Exprs.push_back(Result.get());
7396   }
7397   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7398     return S;
7399 
7400   // Go through the clobbers.
7401   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7402     Clobbers.push_back(S->getClobberStringLiteral(I));
7403 
7404   // No need to transform the asm string literal.
7405   AsmString = S->getAsmString();
7406   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7407                                         S->isVolatile(), S->getNumOutputs(),
7408                                         S->getNumInputs(), Names.data(),
7409                                         Constraints, Exprs, AsmString.get(),
7410                                         Clobbers, S->getNumLabels(),
7411                                         S->getRParenLoc());
7412 }
7413 
7414 template<typename Derived>
7415 StmtResult
7416 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7417   ArrayRef<Token> AsmToks =
7418     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7419 
7420   bool HadError = false, HadChange = false;
7421 
7422   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7423   SmallVector<Expr*, 8> TransformedExprs;
7424   TransformedExprs.reserve(SrcExprs.size());
7425   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7426     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7427     if (!Result.isUsable()) {
7428       HadError = true;
7429     } else {
7430       HadChange |= (Result.get() != SrcExprs[i]);
7431       TransformedExprs.push_back(Result.get());
7432     }
7433   }
7434 
7435   if (HadError) return StmtError();
7436   if (!HadChange && !getDerived().AlwaysRebuild())
7437     return Owned(S);
7438 
7439   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7440                                        AsmToks, S->getAsmString(),
7441                                        S->getNumOutputs(), S->getNumInputs(),
7442                                        S->getAllConstraints(), S->getClobbers(),
7443                                        TransformedExprs, S->getEndLoc());
7444 }
7445 
7446 // C++ Coroutines TS
7447 
7448 template<typename Derived>
7449 StmtResult
7450 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7451   auto *ScopeInfo = SemaRef.getCurFunction();
7452   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7453   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7454          ScopeInfo->NeedsCoroutineSuspends &&
7455          ScopeInfo->CoroutineSuspends.first == nullptr &&
7456          ScopeInfo->CoroutineSuspends.second == nullptr &&
7457          "expected clean scope info");
7458 
7459   // Set that we have (possibly-invalid) suspend points before we do anything
7460   // that may fail.
7461   ScopeInfo->setNeedsCoroutineSuspends(false);
7462 
7463   // We re-build the coroutine promise object (and the coroutine parameters its
7464   // type and constructor depend on) based on the types used in our current
7465   // function. We must do so, and set it on the current FunctionScopeInfo,
7466   // before attempting to transform the other parts of the coroutine body
7467   // statement, such as the implicit suspend statements (because those
7468   // statements reference the FunctionScopeInfo::CoroutinePromise).
7469   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7470     return StmtError();
7471   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7472   if (!Promise)
7473     return StmtError();
7474   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7475   ScopeInfo->CoroutinePromise = Promise;
7476 
7477   // Transform the implicit coroutine statements constructed using dependent
7478   // types during the previous parse: initial and final suspensions, the return
7479   // object, and others. We also transform the coroutine function's body.
7480   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7481   if (InitSuspend.isInvalid())
7482     return StmtError();
7483   StmtResult FinalSuspend =
7484       getDerived().TransformStmt(S->getFinalSuspendStmt());
7485   if (FinalSuspend.isInvalid())
7486     return StmtError();
7487   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7488   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7489 
7490   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7491   if (BodyRes.isInvalid())
7492     return StmtError();
7493 
7494   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7495   if (Builder.isInvalid())
7496     return StmtError();
7497 
7498   Expr *ReturnObject = S->getReturnValueInit();
7499   assert(ReturnObject && "the return object is expected to be valid");
7500   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7501                                                      /*NoCopyInit*/ false);
7502   if (Res.isInvalid())
7503     return StmtError();
7504   Builder.ReturnValue = Res.get();
7505 
7506   // If during the previous parse the coroutine still had a dependent promise
7507   // statement, we may need to build some implicit coroutine statements
7508   // (such as exception and fallthrough handlers) for the first time.
7509   if (S->hasDependentPromiseType()) {
7510     // We can only build these statements, however, if the current promise type
7511     // is not dependent.
7512     if (!Promise->getType()->isDependentType()) {
7513       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7514              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7515              "these nodes should not have been built yet");
7516       if (!Builder.buildDependentStatements())
7517         return StmtError();
7518     }
7519   } else {
7520     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7521       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7522       if (Res.isInvalid())
7523         return StmtError();
7524       Builder.OnFallthrough = Res.get();
7525     }
7526 
7527     if (auto *OnException = S->getExceptionHandler()) {
7528       StmtResult Res = getDerived().TransformStmt(OnException);
7529       if (Res.isInvalid())
7530         return StmtError();
7531       Builder.OnException = Res.get();
7532     }
7533 
7534     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7535       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7536       if (Res.isInvalid())
7537         return StmtError();
7538       Builder.ReturnStmtOnAllocFailure = Res.get();
7539     }
7540 
7541     // Transform any additional statements we may have already built
7542     assert(S->getAllocate() && S->getDeallocate() &&
7543            "allocation and deallocation calls must already be built");
7544     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7545     if (AllocRes.isInvalid())
7546       return StmtError();
7547     Builder.Allocate = AllocRes.get();
7548 
7549     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7550     if (DeallocRes.isInvalid())
7551       return StmtError();
7552     Builder.Deallocate = DeallocRes.get();
7553 
7554     assert(S->getResultDecl() && "ResultDecl must already be built");
7555     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7556     if (ResultDecl.isInvalid())
7557       return StmtError();
7558     Builder.ResultDecl = ResultDecl.get();
7559 
7560     if (auto *ReturnStmt = S->getReturnStmt()) {
7561       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7562       if (Res.isInvalid())
7563         return StmtError();
7564       Builder.ReturnStmt = Res.get();
7565     }
7566   }
7567 
7568   return getDerived().RebuildCoroutineBodyStmt(Builder);
7569 }
7570 
7571 template<typename Derived>
7572 StmtResult
7573 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7574   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7575                                                         /*NotCopyInit*/false);
7576   if (Result.isInvalid())
7577     return StmtError();
7578 
7579   // Always rebuild; we don't know if this needs to be injected into a new
7580   // context or if the promise type has changed.
7581   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7582                                           S->isImplicit());
7583 }
7584 
7585 template<typename Derived>
7586 ExprResult
7587 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7588   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7589                                                         /*NotCopyInit*/false);
7590   if (Result.isInvalid())
7591     return ExprError();
7592 
7593   // Always rebuild; we don't know if this needs to be injected into a new
7594   // context or if the promise type has changed.
7595   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7596                                          E->isImplicit());
7597 }
7598 
7599 template <typename Derived>
7600 ExprResult
7601 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7602   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7603                                                         /*NotCopyInit*/ false);
7604   if (OperandResult.isInvalid())
7605     return ExprError();
7606 
7607   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7608           E->getOperatorCoawaitLookup());
7609 
7610   if (LookupResult.isInvalid())
7611     return ExprError();
7612 
7613   // Always rebuild; we don't know if this needs to be injected into a new
7614   // context or if the promise type has changed.
7615   return getDerived().RebuildDependentCoawaitExpr(
7616       E->getKeywordLoc(), OperandResult.get(),
7617       cast<UnresolvedLookupExpr>(LookupResult.get()));
7618 }
7619 
7620 template<typename Derived>
7621 ExprResult
7622 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7623   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7624                                                         /*NotCopyInit*/false);
7625   if (Result.isInvalid())
7626     return ExprError();
7627 
7628   // Always rebuild; we don't know if this needs to be injected into a new
7629   // context or if the promise type has changed.
7630   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7631 }
7632 
7633 // Objective-C Statements.
7634 
7635 template<typename Derived>
7636 StmtResult
7637 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7638   // Transform the body of the @try.
7639   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7640   if (TryBody.isInvalid())
7641     return StmtError();
7642 
7643   // Transform the @catch statements (if present).
7644   bool AnyCatchChanged = false;
7645   SmallVector<Stmt*, 8> CatchStmts;
7646   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7647     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7648     if (Catch.isInvalid())
7649       return StmtError();
7650     if (Catch.get() != S->getCatchStmt(I))
7651       AnyCatchChanged = true;
7652     CatchStmts.push_back(Catch.get());
7653   }
7654 
7655   // Transform the @finally statement (if present).
7656   StmtResult Finally;
7657   if (S->getFinallyStmt()) {
7658     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7659     if (Finally.isInvalid())
7660       return StmtError();
7661   }
7662 
7663   // If nothing changed, just retain this statement.
7664   if (!getDerived().AlwaysRebuild() &&
7665       TryBody.get() == S->getTryBody() &&
7666       !AnyCatchChanged &&
7667       Finally.get() == S->getFinallyStmt())
7668     return S;
7669 
7670   // Build a new statement.
7671   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7672                                            CatchStmts, Finally.get());
7673 }
7674 
7675 template<typename Derived>
7676 StmtResult
7677 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7678   // Transform the @catch parameter, if there is one.
7679   VarDecl *Var = nullptr;
7680   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7681     TypeSourceInfo *TSInfo = nullptr;
7682     if (FromVar->getTypeSourceInfo()) {
7683       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7684       if (!TSInfo)
7685         return StmtError();
7686     }
7687 
7688     QualType T;
7689     if (TSInfo)
7690       T = TSInfo->getType();
7691     else {
7692       T = getDerived().TransformType(FromVar->getType());
7693       if (T.isNull())
7694         return StmtError();
7695     }
7696 
7697     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7698     if (!Var)
7699       return StmtError();
7700   }
7701 
7702   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7703   if (Body.isInvalid())
7704     return StmtError();
7705 
7706   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7707                                              S->getRParenLoc(),
7708                                              Var, Body.get());
7709 }
7710 
7711 template<typename Derived>
7712 StmtResult
7713 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7714   // Transform the body.
7715   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7716   if (Body.isInvalid())
7717     return StmtError();
7718 
7719   // If nothing changed, just retain this statement.
7720   if (!getDerived().AlwaysRebuild() &&
7721       Body.get() == S->getFinallyBody())
7722     return S;
7723 
7724   // Build a new statement.
7725   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7726                                                Body.get());
7727 }
7728 
7729 template<typename Derived>
7730 StmtResult
7731 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7732   ExprResult Operand;
7733   if (S->getThrowExpr()) {
7734     Operand = getDerived().TransformExpr(S->getThrowExpr());
7735     if (Operand.isInvalid())
7736       return StmtError();
7737   }
7738 
7739   if (!getDerived().AlwaysRebuild() &&
7740       Operand.get() == S->getThrowExpr())
7741     return S;
7742 
7743   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7744 }
7745 
7746 template<typename Derived>
7747 StmtResult
7748 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7749                                                   ObjCAtSynchronizedStmt *S) {
7750   // Transform the object we are locking.
7751   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7752   if (Object.isInvalid())
7753     return StmtError();
7754   Object =
7755     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7756                                                   Object.get());
7757   if (Object.isInvalid())
7758     return StmtError();
7759 
7760   // Transform the body.
7761   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7762   if (Body.isInvalid())
7763     return StmtError();
7764 
7765   // If nothing change, just retain the current statement.
7766   if (!getDerived().AlwaysRebuild() &&
7767       Object.get() == S->getSynchExpr() &&
7768       Body.get() == S->getSynchBody())
7769     return S;
7770 
7771   // Build a new statement.
7772   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7773                                                     Object.get(), Body.get());
7774 }
7775 
7776 template<typename Derived>
7777 StmtResult
7778 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7779                                               ObjCAutoreleasePoolStmt *S) {
7780   // Transform the body.
7781   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7782   if (Body.isInvalid())
7783     return StmtError();
7784 
7785   // If nothing changed, just retain this statement.
7786   if (!getDerived().AlwaysRebuild() &&
7787       Body.get() == S->getSubStmt())
7788     return S;
7789 
7790   // Build a new statement.
7791   return getDerived().RebuildObjCAutoreleasePoolStmt(
7792                         S->getAtLoc(), Body.get());
7793 }
7794 
7795 template<typename Derived>
7796 StmtResult
7797 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7798                                                   ObjCForCollectionStmt *S) {
7799   // Transform the element statement.
7800   StmtResult Element =
7801       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7802   if (Element.isInvalid())
7803     return StmtError();
7804 
7805   // Transform the collection expression.
7806   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7807   if (Collection.isInvalid())
7808     return StmtError();
7809 
7810   // Transform the body.
7811   StmtResult Body = getDerived().TransformStmt(S->getBody());
7812   if (Body.isInvalid())
7813     return StmtError();
7814 
7815   // If nothing changed, just retain this statement.
7816   if (!getDerived().AlwaysRebuild() &&
7817       Element.get() == S->getElement() &&
7818       Collection.get() == S->getCollection() &&
7819       Body.get() == S->getBody())
7820     return S;
7821 
7822   // Build a new statement.
7823   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7824                                                    Element.get(),
7825                                                    Collection.get(),
7826                                                    S->getRParenLoc(),
7827                                                    Body.get());
7828 }
7829 
7830 template <typename Derived>
7831 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7832   // Transform the exception declaration, if any.
7833   VarDecl *Var = nullptr;
7834   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7835     TypeSourceInfo *T =
7836         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7837     if (!T)
7838       return StmtError();
7839 
7840     Var = getDerived().RebuildExceptionDecl(
7841         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7842         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7843     if (!Var || Var->isInvalidDecl())
7844       return StmtError();
7845   }
7846 
7847   // Transform the actual exception handler.
7848   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7849   if (Handler.isInvalid())
7850     return StmtError();
7851 
7852   if (!getDerived().AlwaysRebuild() && !Var &&
7853       Handler.get() == S->getHandlerBlock())
7854     return S;
7855 
7856   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7857 }
7858 
7859 template <typename Derived>
7860 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7861   // Transform the try block itself.
7862   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7863   if (TryBlock.isInvalid())
7864     return StmtError();
7865 
7866   // Transform the handlers.
7867   bool HandlerChanged = false;
7868   SmallVector<Stmt *, 8> Handlers;
7869   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7870     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7871     if (Handler.isInvalid())
7872       return StmtError();
7873 
7874     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7875     Handlers.push_back(Handler.getAs<Stmt>());
7876   }
7877 
7878   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7879       !HandlerChanged)
7880     return S;
7881 
7882   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7883                                         Handlers);
7884 }
7885 
7886 template<typename Derived>
7887 StmtResult
7888 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7889   StmtResult Init =
7890       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
7891   if (Init.isInvalid())
7892     return StmtError();
7893 
7894   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7895   if (Range.isInvalid())
7896     return StmtError();
7897 
7898   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7899   if (Begin.isInvalid())
7900     return StmtError();
7901   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7902   if (End.isInvalid())
7903     return StmtError();
7904 
7905   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7906   if (Cond.isInvalid())
7907     return StmtError();
7908   if (Cond.get())
7909     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7910   if (Cond.isInvalid())
7911     return StmtError();
7912   if (Cond.get())
7913     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7914 
7915   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7916   if (Inc.isInvalid())
7917     return StmtError();
7918   if (Inc.get())
7919     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7920 
7921   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7922   if (LoopVar.isInvalid())
7923     return StmtError();
7924 
7925   StmtResult NewStmt = S;
7926   if (getDerived().AlwaysRebuild() ||
7927       Init.get() != S->getInit() ||
7928       Range.get() != S->getRangeStmt() ||
7929       Begin.get() != S->getBeginStmt() ||
7930       End.get() != S->getEndStmt() ||
7931       Cond.get() != S->getCond() ||
7932       Inc.get() != S->getInc() ||
7933       LoopVar.get() != S->getLoopVarStmt()) {
7934     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7935                                                   S->getCoawaitLoc(), Init.get(),
7936                                                   S->getColonLoc(), Range.get(),
7937                                                   Begin.get(), End.get(),
7938                                                   Cond.get(),
7939                                                   Inc.get(), LoopVar.get(),
7940                                                   S->getRParenLoc());
7941     if (NewStmt.isInvalid())
7942       return StmtError();
7943   }
7944 
7945   StmtResult Body = getDerived().TransformStmt(S->getBody());
7946   if (Body.isInvalid())
7947     return StmtError();
7948 
7949   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7950   // it now so we have a new statement to attach the body to.
7951   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7952     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7953                                                   S->getCoawaitLoc(), Init.get(),
7954                                                   S->getColonLoc(), Range.get(),
7955                                                   Begin.get(), End.get(),
7956                                                   Cond.get(),
7957                                                   Inc.get(), LoopVar.get(),
7958                                                   S->getRParenLoc());
7959     if (NewStmt.isInvalid())
7960       return StmtError();
7961   }
7962 
7963   if (NewStmt.get() == S)
7964     return S;
7965 
7966   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7967 }
7968 
7969 template<typename Derived>
7970 StmtResult
7971 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7972                                                     MSDependentExistsStmt *S) {
7973   // Transform the nested-name-specifier, if any.
7974   NestedNameSpecifierLoc QualifierLoc;
7975   if (S->getQualifierLoc()) {
7976     QualifierLoc
7977       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7978     if (!QualifierLoc)
7979       return StmtError();
7980   }
7981 
7982   // Transform the declaration name.
7983   DeclarationNameInfo NameInfo = S->getNameInfo();
7984   if (NameInfo.getName()) {
7985     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7986     if (!NameInfo.getName())
7987       return StmtError();
7988   }
7989 
7990   // Check whether anything changed.
7991   if (!getDerived().AlwaysRebuild() &&
7992       QualifierLoc == S->getQualifierLoc() &&
7993       NameInfo.getName() == S->getNameInfo().getName())
7994     return S;
7995 
7996   // Determine whether this name exists, if we can.
7997   CXXScopeSpec SS;
7998   SS.Adopt(QualifierLoc);
7999   bool Dependent = false;
8000   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8001   case Sema::IER_Exists:
8002     if (S->isIfExists())
8003       break;
8004 
8005     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8006 
8007   case Sema::IER_DoesNotExist:
8008     if (S->isIfNotExists())
8009       break;
8010 
8011     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8012 
8013   case Sema::IER_Dependent:
8014     Dependent = true;
8015     break;
8016 
8017   case Sema::IER_Error:
8018     return StmtError();
8019   }
8020 
8021   // We need to continue with the instantiation, so do so now.
8022   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8023   if (SubStmt.isInvalid())
8024     return StmtError();
8025 
8026   // If we have resolved the name, just transform to the substatement.
8027   if (!Dependent)
8028     return SubStmt;
8029 
8030   // The name is still dependent, so build a dependent expression again.
8031   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8032                                                    S->isIfExists(),
8033                                                    QualifierLoc,
8034                                                    NameInfo,
8035                                                    SubStmt.get());
8036 }
8037 
8038 template<typename Derived>
8039 ExprResult
8040 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8041   NestedNameSpecifierLoc QualifierLoc;
8042   if (E->getQualifierLoc()) {
8043     QualifierLoc
8044     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8045     if (!QualifierLoc)
8046       return ExprError();
8047   }
8048 
8049   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8050     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8051   if (!PD)
8052     return ExprError();
8053 
8054   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8055   if (Base.isInvalid())
8056     return ExprError();
8057 
8058   return new (SemaRef.getASTContext())
8059       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8060                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8061                         QualifierLoc, E->getMemberLoc());
8062 }
8063 
8064 template <typename Derived>
8065 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8066     MSPropertySubscriptExpr *E) {
8067   auto BaseRes = getDerived().TransformExpr(E->getBase());
8068   if (BaseRes.isInvalid())
8069     return ExprError();
8070   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8071   if (IdxRes.isInvalid())
8072     return ExprError();
8073 
8074   if (!getDerived().AlwaysRebuild() &&
8075       BaseRes.get() == E->getBase() &&
8076       IdxRes.get() == E->getIdx())
8077     return E;
8078 
8079   return getDerived().RebuildArraySubscriptExpr(
8080       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8081 }
8082 
8083 template <typename Derived>
8084 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8085   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8086   if (TryBlock.isInvalid())
8087     return StmtError();
8088 
8089   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8090   if (Handler.isInvalid())
8091     return StmtError();
8092 
8093   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8094       Handler.get() == S->getHandler())
8095     return S;
8096 
8097   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8098                                         TryBlock.get(), Handler.get());
8099 }
8100 
8101 template <typename Derived>
8102 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8103   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8104   if (Block.isInvalid())
8105     return StmtError();
8106 
8107   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8108 }
8109 
8110 template <typename Derived>
8111 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8112   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8113   if (FilterExpr.isInvalid())
8114     return StmtError();
8115 
8116   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8117   if (Block.isInvalid())
8118     return StmtError();
8119 
8120   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8121                                            Block.get());
8122 }
8123 
8124 template <typename Derived>
8125 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8126   if (isa<SEHFinallyStmt>(Handler))
8127     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8128   else
8129     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8130 }
8131 
8132 template<typename Derived>
8133 StmtResult
8134 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8135   return S;
8136 }
8137 
8138 //===----------------------------------------------------------------------===//
8139 // OpenMP directive transformation
8140 //===----------------------------------------------------------------------===//
8141 template <typename Derived>
8142 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8143     OMPExecutableDirective *D) {
8144 
8145   // Transform the clauses
8146   llvm::SmallVector<OMPClause *, 16> TClauses;
8147   ArrayRef<OMPClause *> Clauses = D->clauses();
8148   TClauses.reserve(Clauses.size());
8149   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8150        I != E; ++I) {
8151     if (*I) {
8152       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8153       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8154       getDerived().getSema().EndOpenMPClause();
8155       if (Clause)
8156         TClauses.push_back(Clause);
8157     } else {
8158       TClauses.push_back(nullptr);
8159     }
8160   }
8161   StmtResult AssociatedStmt;
8162   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8163     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8164                                                   /*CurScope=*/nullptr);
8165     StmtResult Body;
8166     {
8167       Sema::CompoundScopeRAII CompoundScope(getSema());
8168       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
8169       Body = getDerived().TransformStmt(CS);
8170     }
8171     AssociatedStmt =
8172         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8173     if (AssociatedStmt.isInvalid()) {
8174       return StmtError();
8175     }
8176   }
8177   if (TClauses.size() != Clauses.size()) {
8178     return StmtError();
8179   }
8180 
8181   // Transform directive name for 'omp critical' directive.
8182   DeclarationNameInfo DirName;
8183   if (D->getDirectiveKind() == OMPD_critical) {
8184     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8185     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8186   }
8187   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8188   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8189     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8190   } else if (D->getDirectiveKind() == OMPD_cancel) {
8191     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8192   }
8193 
8194   return getDerived().RebuildOMPExecutableDirective(
8195       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8196       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8197 }
8198 
8199 template <typename Derived>
8200 StmtResult
8201 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8202   DeclarationNameInfo DirName;
8203   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8204                                              D->getBeginLoc());
8205   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8206   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8207   return Res;
8208 }
8209 
8210 template <typename Derived>
8211 StmtResult
8212 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8213   DeclarationNameInfo DirName;
8214   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8215                                              D->getBeginLoc());
8216   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8217   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8218   return Res;
8219 }
8220 
8221 template <typename Derived>
8222 StmtResult
8223 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8224   DeclarationNameInfo DirName;
8225   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8226                                              D->getBeginLoc());
8227   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8228   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8229   return Res;
8230 }
8231 
8232 template <typename Derived>
8233 StmtResult
8234 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8235   DeclarationNameInfo DirName;
8236   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8237                                              D->getBeginLoc());
8238   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8239   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8240   return Res;
8241 }
8242 
8243 template <typename Derived>
8244 StmtResult
8245 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8246   DeclarationNameInfo DirName;
8247   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8248                                              D->getBeginLoc());
8249   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8250   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8251   return Res;
8252 }
8253 
8254 template <typename Derived>
8255 StmtResult
8256 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8257   DeclarationNameInfo DirName;
8258   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8259                                              D->getBeginLoc());
8260   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8261   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8262   return Res;
8263 }
8264 
8265 template <typename Derived>
8266 StmtResult
8267 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8268   DeclarationNameInfo DirName;
8269   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8270                                              D->getBeginLoc());
8271   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8272   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8273   return Res;
8274 }
8275 
8276 template <typename Derived>
8277 StmtResult
8278 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8279   DeclarationNameInfo DirName;
8280   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8281                                              D->getBeginLoc());
8282   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8283   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8284   return Res;
8285 }
8286 
8287 template <typename Derived>
8288 StmtResult
8289 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8290   getDerived().getSema().StartOpenMPDSABlock(
8291       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8292   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8293   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8294   return Res;
8295 }
8296 
8297 template <typename Derived>
8298 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8299     OMPParallelForDirective *D) {
8300   DeclarationNameInfo DirName;
8301   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8302                                              nullptr, D->getBeginLoc());
8303   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8304   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8305   return Res;
8306 }
8307 
8308 template <typename Derived>
8309 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8310     OMPParallelForSimdDirective *D) {
8311   DeclarationNameInfo DirName;
8312   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8313                                              nullptr, D->getBeginLoc());
8314   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8315   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8316   return Res;
8317 }
8318 
8319 template <typename Derived>
8320 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8321     OMPParallelMasterDirective *D) {
8322   DeclarationNameInfo DirName;
8323   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8324                                              nullptr, D->getBeginLoc());
8325   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8326   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8327   return Res;
8328 }
8329 
8330 template <typename Derived>
8331 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8332     OMPParallelSectionsDirective *D) {
8333   DeclarationNameInfo DirName;
8334   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8335                                              nullptr, D->getBeginLoc());
8336   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8337   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8338   return Res;
8339 }
8340 
8341 template <typename Derived>
8342 StmtResult
8343 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8344   DeclarationNameInfo DirName;
8345   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8346                                              D->getBeginLoc());
8347   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8348   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8349   return Res;
8350 }
8351 
8352 template <typename Derived>
8353 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8354     OMPTaskyieldDirective *D) {
8355   DeclarationNameInfo DirName;
8356   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8357                                              D->getBeginLoc());
8358   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8359   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8360   return Res;
8361 }
8362 
8363 template <typename Derived>
8364 StmtResult
8365 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8366   DeclarationNameInfo DirName;
8367   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8368                                              D->getBeginLoc());
8369   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8370   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8371   return Res;
8372 }
8373 
8374 template <typename Derived>
8375 StmtResult
8376 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8377   DeclarationNameInfo DirName;
8378   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8379                                              D->getBeginLoc());
8380   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8381   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8382   return Res;
8383 }
8384 
8385 template <typename Derived>
8386 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8387     OMPTaskgroupDirective *D) {
8388   DeclarationNameInfo DirName;
8389   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8390                                              D->getBeginLoc());
8391   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8392   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8393   return Res;
8394 }
8395 
8396 template <typename Derived>
8397 StmtResult
8398 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8399   DeclarationNameInfo DirName;
8400   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8401                                              D->getBeginLoc());
8402   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8403   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8404   return Res;
8405 }
8406 
8407 template <typename Derived>
8408 StmtResult
8409 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8410   DeclarationNameInfo DirName;
8411   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8412                                              D->getBeginLoc());
8413   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8414   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8415   return Res;
8416 }
8417 
8418 template <typename Derived>
8419 StmtResult
8420 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8421   DeclarationNameInfo DirName;
8422   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8423                                              D->getBeginLoc());
8424   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8425   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8426   return Res;
8427 }
8428 
8429 template <typename Derived>
8430 StmtResult
8431 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8432   DeclarationNameInfo DirName;
8433   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8434                                              D->getBeginLoc());
8435   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8436   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8437   return Res;
8438 }
8439 
8440 template <typename Derived>
8441 StmtResult
8442 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8443   DeclarationNameInfo DirName;
8444   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8445                                              D->getBeginLoc());
8446   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8447   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8448   return Res;
8449 }
8450 
8451 template <typename Derived>
8452 StmtResult
8453 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8454   DeclarationNameInfo DirName;
8455   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8456                                              D->getBeginLoc());
8457   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8458   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8459   return Res;
8460 }
8461 
8462 template <typename Derived>
8463 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8464     OMPTargetDataDirective *D) {
8465   DeclarationNameInfo DirName;
8466   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8467                                              D->getBeginLoc());
8468   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8469   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8470   return Res;
8471 }
8472 
8473 template <typename Derived>
8474 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8475     OMPTargetEnterDataDirective *D) {
8476   DeclarationNameInfo DirName;
8477   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8478                                              nullptr, D->getBeginLoc());
8479   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8480   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8481   return Res;
8482 }
8483 
8484 template <typename Derived>
8485 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8486     OMPTargetExitDataDirective *D) {
8487   DeclarationNameInfo DirName;
8488   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8489                                              nullptr, D->getBeginLoc());
8490   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8491   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8492   return Res;
8493 }
8494 
8495 template <typename Derived>
8496 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8497     OMPTargetParallelDirective *D) {
8498   DeclarationNameInfo DirName;
8499   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8500                                              nullptr, D->getBeginLoc());
8501   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8502   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8503   return Res;
8504 }
8505 
8506 template <typename Derived>
8507 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8508     OMPTargetParallelForDirective *D) {
8509   DeclarationNameInfo DirName;
8510   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8511                                              nullptr, D->getBeginLoc());
8512   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8513   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8514   return Res;
8515 }
8516 
8517 template <typename Derived>
8518 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8519     OMPTargetUpdateDirective *D) {
8520   DeclarationNameInfo DirName;
8521   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8522                                              nullptr, D->getBeginLoc());
8523   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8524   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8525   return Res;
8526 }
8527 
8528 template <typename Derived>
8529 StmtResult
8530 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8531   DeclarationNameInfo DirName;
8532   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8533                                              D->getBeginLoc());
8534   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8535   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8536   return Res;
8537 }
8538 
8539 template <typename Derived>
8540 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8541     OMPCancellationPointDirective *D) {
8542   DeclarationNameInfo DirName;
8543   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8544                                              nullptr, D->getBeginLoc());
8545   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8546   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8547   return Res;
8548 }
8549 
8550 template <typename Derived>
8551 StmtResult
8552 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8553   DeclarationNameInfo DirName;
8554   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8555                                              D->getBeginLoc());
8556   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8557   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8558   return Res;
8559 }
8560 
8561 template <typename Derived>
8562 StmtResult
8563 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8564   DeclarationNameInfo DirName;
8565   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8566                                              D->getBeginLoc());
8567   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8568   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8569   return Res;
8570 }
8571 
8572 template <typename Derived>
8573 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8574     OMPTaskLoopSimdDirective *D) {
8575   DeclarationNameInfo DirName;
8576   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8577                                              nullptr, D->getBeginLoc());
8578   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8579   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8580   return Res;
8581 }
8582 
8583 template <typename Derived>
8584 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8585     OMPMasterTaskLoopDirective *D) {
8586   DeclarationNameInfo DirName;
8587   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8588                                              nullptr, D->getBeginLoc());
8589   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8590   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8591   return Res;
8592 }
8593 
8594 template <typename Derived>
8595 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8596     OMPMasterTaskLoopSimdDirective *D) {
8597   DeclarationNameInfo DirName;
8598   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8599                                              nullptr, D->getBeginLoc());
8600   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8601   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8602   return Res;
8603 }
8604 
8605 template <typename Derived>
8606 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8607     OMPParallelMasterTaskLoopDirective *D) {
8608   DeclarationNameInfo DirName;
8609   getDerived().getSema().StartOpenMPDSABlock(
8610       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8611   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8612   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8613   return Res;
8614 }
8615 
8616 template <typename Derived>
8617 StmtResult
8618 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8619     OMPParallelMasterTaskLoopSimdDirective *D) {
8620   DeclarationNameInfo DirName;
8621   getDerived().getSema().StartOpenMPDSABlock(
8622       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8623   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8624   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8625   return Res;
8626 }
8627 
8628 template <typename Derived>
8629 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8630     OMPDistributeDirective *D) {
8631   DeclarationNameInfo DirName;
8632   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8633                                              D->getBeginLoc());
8634   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8635   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8636   return Res;
8637 }
8638 
8639 template <typename Derived>
8640 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8641     OMPDistributeParallelForDirective *D) {
8642   DeclarationNameInfo DirName;
8643   getDerived().getSema().StartOpenMPDSABlock(
8644       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8645   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8646   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8647   return Res;
8648 }
8649 
8650 template <typename Derived>
8651 StmtResult
8652 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8653     OMPDistributeParallelForSimdDirective *D) {
8654   DeclarationNameInfo DirName;
8655   getDerived().getSema().StartOpenMPDSABlock(
8656       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8657   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8658   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8659   return Res;
8660 }
8661 
8662 template <typename Derived>
8663 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8664     OMPDistributeSimdDirective *D) {
8665   DeclarationNameInfo DirName;
8666   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8667                                              nullptr, D->getBeginLoc());
8668   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8669   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8670   return Res;
8671 }
8672 
8673 template <typename Derived>
8674 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8675     OMPTargetParallelForSimdDirective *D) {
8676   DeclarationNameInfo DirName;
8677   getDerived().getSema().StartOpenMPDSABlock(
8678       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8679   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8680   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8681   return Res;
8682 }
8683 
8684 template <typename Derived>
8685 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8686     OMPTargetSimdDirective *D) {
8687   DeclarationNameInfo DirName;
8688   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8689                                              D->getBeginLoc());
8690   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8691   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8692   return Res;
8693 }
8694 
8695 template <typename Derived>
8696 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8697     OMPTeamsDistributeDirective *D) {
8698   DeclarationNameInfo DirName;
8699   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8700                                              nullptr, D->getBeginLoc());
8701   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8702   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8703   return Res;
8704 }
8705 
8706 template <typename Derived>
8707 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8708     OMPTeamsDistributeSimdDirective *D) {
8709   DeclarationNameInfo DirName;
8710   getDerived().getSema().StartOpenMPDSABlock(
8711       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8712   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8713   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8714   return Res;
8715 }
8716 
8717 template <typename Derived>
8718 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8719     OMPTeamsDistributeParallelForSimdDirective *D) {
8720   DeclarationNameInfo DirName;
8721   getDerived().getSema().StartOpenMPDSABlock(
8722       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8723       D->getBeginLoc());
8724   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8725   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8726   return Res;
8727 }
8728 
8729 template <typename Derived>
8730 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8731     OMPTeamsDistributeParallelForDirective *D) {
8732   DeclarationNameInfo DirName;
8733   getDerived().getSema().StartOpenMPDSABlock(
8734       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8735   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8736   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8737   return Res;
8738 }
8739 
8740 template <typename Derived>
8741 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8742     OMPTargetTeamsDirective *D) {
8743   DeclarationNameInfo DirName;
8744   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8745                                              nullptr, D->getBeginLoc());
8746   auto Res = getDerived().TransformOMPExecutableDirective(D);
8747   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8748   return Res;
8749 }
8750 
8751 template <typename Derived>
8752 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8753     OMPTargetTeamsDistributeDirective *D) {
8754   DeclarationNameInfo DirName;
8755   getDerived().getSema().StartOpenMPDSABlock(
8756       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8757   auto Res = getDerived().TransformOMPExecutableDirective(D);
8758   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8759   return Res;
8760 }
8761 
8762 template <typename Derived>
8763 StmtResult
8764 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8765     OMPTargetTeamsDistributeParallelForDirective *D) {
8766   DeclarationNameInfo DirName;
8767   getDerived().getSema().StartOpenMPDSABlock(
8768       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8769       D->getBeginLoc());
8770   auto Res = getDerived().TransformOMPExecutableDirective(D);
8771   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8772   return Res;
8773 }
8774 
8775 template <typename Derived>
8776 StmtResult TreeTransform<Derived>::
8777     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8778         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8779   DeclarationNameInfo DirName;
8780   getDerived().getSema().StartOpenMPDSABlock(
8781       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8782       D->getBeginLoc());
8783   auto Res = getDerived().TransformOMPExecutableDirective(D);
8784   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8785   return Res;
8786 }
8787 
8788 template <typename Derived>
8789 StmtResult
8790 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8791     OMPTargetTeamsDistributeSimdDirective *D) {
8792   DeclarationNameInfo DirName;
8793   getDerived().getSema().StartOpenMPDSABlock(
8794       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8795   auto Res = getDerived().TransformOMPExecutableDirective(D);
8796   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8797   return Res;
8798 }
8799 
8800 
8801 //===----------------------------------------------------------------------===//
8802 // OpenMP clause transformation
8803 //===----------------------------------------------------------------------===//
8804 template <typename Derived>
8805 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8806   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8807   if (Cond.isInvalid())
8808     return nullptr;
8809   return getDerived().RebuildOMPIfClause(
8810       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8811       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8812 }
8813 
8814 template <typename Derived>
8815 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8816   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8817   if (Cond.isInvalid())
8818     return nullptr;
8819   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8820                                             C->getLParenLoc(), C->getEndLoc());
8821 }
8822 
8823 template <typename Derived>
8824 OMPClause *
8825 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8826   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8827   if (NumThreads.isInvalid())
8828     return nullptr;
8829   return getDerived().RebuildOMPNumThreadsClause(
8830       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8831 }
8832 
8833 template <typename Derived>
8834 OMPClause *
8835 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8836   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8837   if (E.isInvalid())
8838     return nullptr;
8839   return getDerived().RebuildOMPSafelenClause(
8840       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8841 }
8842 
8843 template <typename Derived>
8844 OMPClause *
8845 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
8846   ExprResult E = getDerived().TransformExpr(C->getAllocator());
8847   if (E.isInvalid())
8848     return nullptr;
8849   return getDerived().RebuildOMPAllocatorClause(
8850       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8851 }
8852 
8853 template <typename Derived>
8854 OMPClause *
8855 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8856   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8857   if (E.isInvalid())
8858     return nullptr;
8859   return getDerived().RebuildOMPSimdlenClause(
8860       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8861 }
8862 
8863 template <typename Derived>
8864 OMPClause *
8865 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8866   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8867   if (E.isInvalid())
8868     return nullptr;
8869   return getDerived().RebuildOMPCollapseClause(
8870       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8871 }
8872 
8873 template <typename Derived>
8874 OMPClause *
8875 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8876   return getDerived().RebuildOMPDefaultClause(
8877       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
8878       C->getLParenLoc(), C->getEndLoc());
8879 }
8880 
8881 template <typename Derived>
8882 OMPClause *
8883 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8884   return getDerived().RebuildOMPProcBindClause(
8885       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
8886       C->getLParenLoc(), C->getEndLoc());
8887 }
8888 
8889 template <typename Derived>
8890 OMPClause *
8891 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8892   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8893   if (E.isInvalid())
8894     return nullptr;
8895   return getDerived().RebuildOMPScheduleClause(
8896       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8897       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8898       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8899       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8900 }
8901 
8902 template <typename Derived>
8903 OMPClause *
8904 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8905   ExprResult E;
8906   if (auto *Num = C->getNumForLoops()) {
8907     E = getDerived().TransformExpr(Num);
8908     if (E.isInvalid())
8909       return nullptr;
8910   }
8911   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
8912                                               C->getLParenLoc(), E.get());
8913 }
8914 
8915 template <typename Derived>
8916 OMPClause *
8917 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
8918   ExprResult E;
8919   if (Expr *Evt = C->getEventHandler()) {
8920     E = getDerived().TransformExpr(Evt);
8921     if (E.isInvalid())
8922       return nullptr;
8923   }
8924   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
8925                                              C->getLParenLoc(), C->getEndLoc());
8926 }
8927 
8928 template <typename Derived>
8929 OMPClause *
8930 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8931   // No need to rebuild this clause, no template-dependent parameters.
8932   return C;
8933 }
8934 
8935 template <typename Derived>
8936 OMPClause *
8937 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8938   // No need to rebuild this clause, no template-dependent parameters.
8939   return C;
8940 }
8941 
8942 template <typename Derived>
8943 OMPClause *
8944 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8945   // No need to rebuild this clause, no template-dependent parameters.
8946   return C;
8947 }
8948 
8949 template <typename Derived>
8950 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8951   // No need to rebuild this clause, no template-dependent parameters.
8952   return C;
8953 }
8954 
8955 template <typename Derived>
8956 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8957   // No need to rebuild this clause, no template-dependent parameters.
8958   return C;
8959 }
8960 
8961 template <typename Derived>
8962 OMPClause *
8963 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8964   // No need to rebuild this clause, no template-dependent parameters.
8965   return C;
8966 }
8967 
8968 template <typename Derived>
8969 OMPClause *
8970 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8971   // No need to rebuild this clause, no template-dependent parameters.
8972   return C;
8973 }
8974 
8975 template <typename Derived>
8976 OMPClause *
8977 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8978   // No need to rebuild this clause, no template-dependent parameters.
8979   return C;
8980 }
8981 
8982 template <typename Derived>
8983 OMPClause *
8984 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
8985   // No need to rebuild this clause, no template-dependent parameters.
8986   return C;
8987 }
8988 
8989 template <typename Derived>
8990 OMPClause *
8991 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
8992   // No need to rebuild this clause, no template-dependent parameters.
8993   return C;
8994 }
8995 
8996 template <typename Derived>
8997 OMPClause *
8998 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
8999   // No need to rebuild this clause, no template-dependent parameters.
9000   return C;
9001 }
9002 
9003 template <typename Derived>
9004 OMPClause *
9005 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9006   // No need to rebuild this clause, no template-dependent parameters.
9007   return C;
9008 }
9009 
9010 template <typename Derived>
9011 OMPClause *
9012 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9013   // No need to rebuild this clause, no template-dependent parameters.
9014   return C;
9015 }
9016 
9017 template <typename Derived>
9018 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9019   // No need to rebuild this clause, no template-dependent parameters.
9020   return C;
9021 }
9022 
9023 template <typename Derived>
9024 OMPClause *
9025 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9026   // No need to rebuild this clause, no template-dependent parameters.
9027   return C;
9028 }
9029 
9030 template <typename Derived>
9031 OMPClause *
9032 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9033   // No need to rebuild this clause, no template-dependent parameters.
9034   return C;
9035 }
9036 
9037 template <typename Derived>
9038 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9039     OMPUnifiedAddressClause *C) {
9040   llvm_unreachable("unified_address clause cannot appear in dependent context");
9041 }
9042 
9043 template <typename Derived>
9044 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9045     OMPUnifiedSharedMemoryClause *C) {
9046   llvm_unreachable(
9047       "unified_shared_memory clause cannot appear in dependent context");
9048 }
9049 
9050 template <typename Derived>
9051 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9052     OMPReverseOffloadClause *C) {
9053   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9054 }
9055 
9056 template <typename Derived>
9057 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9058     OMPDynamicAllocatorsClause *C) {
9059   llvm_unreachable(
9060       "dynamic_allocators clause cannot appear in dependent context");
9061 }
9062 
9063 template <typename Derived>
9064 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9065     OMPAtomicDefaultMemOrderClause *C) {
9066   llvm_unreachable(
9067       "atomic_default_mem_order clause cannot appear in dependent context");
9068 }
9069 
9070 template <typename Derived>
9071 OMPClause *
9072 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9073   llvm::SmallVector<Expr *, 16> Vars;
9074   Vars.reserve(C->varlist_size());
9075   for (auto *VE : C->varlists()) {
9076     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9077     if (EVar.isInvalid())
9078       return nullptr;
9079     Vars.push_back(EVar.get());
9080   }
9081   return getDerived().RebuildOMPPrivateClause(
9082       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9083 }
9084 
9085 template <typename Derived>
9086 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9087     OMPFirstprivateClause *C) {
9088   llvm::SmallVector<Expr *, 16> Vars;
9089   Vars.reserve(C->varlist_size());
9090   for (auto *VE : C->varlists()) {
9091     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9092     if (EVar.isInvalid())
9093       return nullptr;
9094     Vars.push_back(EVar.get());
9095   }
9096   return getDerived().RebuildOMPFirstprivateClause(
9097       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9098 }
9099 
9100 template <typename Derived>
9101 OMPClause *
9102 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9103   llvm::SmallVector<Expr *, 16> Vars;
9104   Vars.reserve(C->varlist_size());
9105   for (auto *VE : C->varlists()) {
9106     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9107     if (EVar.isInvalid())
9108       return nullptr;
9109     Vars.push_back(EVar.get());
9110   }
9111   return getDerived().RebuildOMPLastprivateClause(
9112       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9113       C->getLParenLoc(), C->getEndLoc());
9114 }
9115 
9116 template <typename Derived>
9117 OMPClause *
9118 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9119   llvm::SmallVector<Expr *, 16> Vars;
9120   Vars.reserve(C->varlist_size());
9121   for (auto *VE : C->varlists()) {
9122     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9123     if (EVar.isInvalid())
9124       return nullptr;
9125     Vars.push_back(EVar.get());
9126   }
9127   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9128                                              C->getLParenLoc(), C->getEndLoc());
9129 }
9130 
9131 template <typename Derived>
9132 OMPClause *
9133 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9134   llvm::SmallVector<Expr *, 16> Vars;
9135   Vars.reserve(C->varlist_size());
9136   for (auto *VE : C->varlists()) {
9137     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9138     if (EVar.isInvalid())
9139       return nullptr;
9140     Vars.push_back(EVar.get());
9141   }
9142   CXXScopeSpec ReductionIdScopeSpec;
9143   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9144 
9145   DeclarationNameInfo NameInfo = C->getNameInfo();
9146   if (NameInfo.getName()) {
9147     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9148     if (!NameInfo.getName())
9149       return nullptr;
9150   }
9151   // Build a list of all UDR decls with the same names ranged by the Scopes.
9152   // The Scope boundary is a duplication of the previous decl.
9153   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9154   for (auto *E : C->reduction_ops()) {
9155     // Transform all the decls.
9156     if (E) {
9157       auto *ULE = cast<UnresolvedLookupExpr>(E);
9158       UnresolvedSet<8> Decls;
9159       for (auto *D : ULE->decls()) {
9160         NamedDecl *InstD =
9161             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9162         Decls.addDecl(InstD, InstD->getAccess());
9163       }
9164       UnresolvedReductions.push_back(
9165        UnresolvedLookupExpr::Create(
9166           SemaRef.Context, /*NamingClass=*/nullptr,
9167           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9168           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9169           Decls.begin(), Decls.end()));
9170     } else
9171       UnresolvedReductions.push_back(nullptr);
9172   }
9173   return getDerived().RebuildOMPReductionClause(
9174       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9175       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9176       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9177 }
9178 
9179 template <typename Derived>
9180 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9181     OMPTaskReductionClause *C) {
9182   llvm::SmallVector<Expr *, 16> Vars;
9183   Vars.reserve(C->varlist_size());
9184   for (auto *VE : C->varlists()) {
9185     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9186     if (EVar.isInvalid())
9187       return nullptr;
9188     Vars.push_back(EVar.get());
9189   }
9190   CXXScopeSpec ReductionIdScopeSpec;
9191   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9192 
9193   DeclarationNameInfo NameInfo = C->getNameInfo();
9194   if (NameInfo.getName()) {
9195     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9196     if (!NameInfo.getName())
9197       return nullptr;
9198   }
9199   // Build a list of all UDR decls with the same names ranged by the Scopes.
9200   // The Scope boundary is a duplication of the previous decl.
9201   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9202   for (auto *E : C->reduction_ops()) {
9203     // Transform all the decls.
9204     if (E) {
9205       auto *ULE = cast<UnresolvedLookupExpr>(E);
9206       UnresolvedSet<8> Decls;
9207       for (auto *D : ULE->decls()) {
9208         NamedDecl *InstD =
9209             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9210         Decls.addDecl(InstD, InstD->getAccess());
9211       }
9212       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9213           SemaRef.Context, /*NamingClass=*/nullptr,
9214           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9215           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9216     } else
9217       UnresolvedReductions.push_back(nullptr);
9218   }
9219   return getDerived().RebuildOMPTaskReductionClause(
9220       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9221       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9222 }
9223 
9224 template <typename Derived>
9225 OMPClause *
9226 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9227   llvm::SmallVector<Expr *, 16> Vars;
9228   Vars.reserve(C->varlist_size());
9229   for (auto *VE : C->varlists()) {
9230     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9231     if (EVar.isInvalid())
9232       return nullptr;
9233     Vars.push_back(EVar.get());
9234   }
9235   CXXScopeSpec ReductionIdScopeSpec;
9236   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9237 
9238   DeclarationNameInfo NameInfo = C->getNameInfo();
9239   if (NameInfo.getName()) {
9240     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9241     if (!NameInfo.getName())
9242       return nullptr;
9243   }
9244   // Build a list of all UDR decls with the same names ranged by the Scopes.
9245   // The Scope boundary is a duplication of the previous decl.
9246   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9247   for (auto *E : C->reduction_ops()) {
9248     // Transform all the decls.
9249     if (E) {
9250       auto *ULE = cast<UnresolvedLookupExpr>(E);
9251       UnresolvedSet<8> Decls;
9252       for (auto *D : ULE->decls()) {
9253         NamedDecl *InstD =
9254             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9255         Decls.addDecl(InstD, InstD->getAccess());
9256       }
9257       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9258           SemaRef.Context, /*NamingClass=*/nullptr,
9259           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9260           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9261     } else
9262       UnresolvedReductions.push_back(nullptr);
9263   }
9264   return getDerived().RebuildOMPInReductionClause(
9265       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9266       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9267 }
9268 
9269 template <typename Derived>
9270 OMPClause *
9271 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9272   llvm::SmallVector<Expr *, 16> Vars;
9273   Vars.reserve(C->varlist_size());
9274   for (auto *VE : C->varlists()) {
9275     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9276     if (EVar.isInvalid())
9277       return nullptr;
9278     Vars.push_back(EVar.get());
9279   }
9280   ExprResult Step = getDerived().TransformExpr(C->getStep());
9281   if (Step.isInvalid())
9282     return nullptr;
9283   return getDerived().RebuildOMPLinearClause(
9284       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9285       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9286 }
9287 
9288 template <typename Derived>
9289 OMPClause *
9290 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9291   llvm::SmallVector<Expr *, 16> Vars;
9292   Vars.reserve(C->varlist_size());
9293   for (auto *VE : C->varlists()) {
9294     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9295     if (EVar.isInvalid())
9296       return nullptr;
9297     Vars.push_back(EVar.get());
9298   }
9299   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9300   if (Alignment.isInvalid())
9301     return nullptr;
9302   return getDerived().RebuildOMPAlignedClause(
9303       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9304       C->getColonLoc(), C->getEndLoc());
9305 }
9306 
9307 template <typename Derived>
9308 OMPClause *
9309 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9310   llvm::SmallVector<Expr *, 16> Vars;
9311   Vars.reserve(C->varlist_size());
9312   for (auto *VE : C->varlists()) {
9313     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9314     if (EVar.isInvalid())
9315       return nullptr;
9316     Vars.push_back(EVar.get());
9317   }
9318   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9319                                              C->getLParenLoc(), C->getEndLoc());
9320 }
9321 
9322 template <typename Derived>
9323 OMPClause *
9324 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9325   llvm::SmallVector<Expr *, 16> Vars;
9326   Vars.reserve(C->varlist_size());
9327   for (auto *VE : C->varlists()) {
9328     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9329     if (EVar.isInvalid())
9330       return nullptr;
9331     Vars.push_back(EVar.get());
9332   }
9333   return getDerived().RebuildOMPCopyprivateClause(
9334       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9335 }
9336 
9337 template <typename Derived>
9338 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9339   llvm::SmallVector<Expr *, 16> Vars;
9340   Vars.reserve(C->varlist_size());
9341   for (auto *VE : C->varlists()) {
9342     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9343     if (EVar.isInvalid())
9344       return nullptr;
9345     Vars.push_back(EVar.get());
9346   }
9347   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9348                                             C->getLParenLoc(), C->getEndLoc());
9349 }
9350 
9351 template <typename Derived>
9352 OMPClause *
9353 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9354   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9355   if (E.isInvalid())
9356     return nullptr;
9357   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9358                                              C->getLParenLoc(), C->getEndLoc());
9359 }
9360 
9361 template <typename Derived>
9362 OMPClause *
9363 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9364   llvm::SmallVector<Expr *, 16> Vars;
9365   Expr *DepModifier = C->getModifier();
9366   if (DepModifier) {
9367     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9368     if (DepModRes.isInvalid())
9369       return nullptr;
9370     DepModifier = DepModRes.get();
9371   }
9372   Vars.reserve(C->varlist_size());
9373   for (auto *VE : C->varlists()) {
9374     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9375     if (EVar.isInvalid())
9376       return nullptr;
9377     Vars.push_back(EVar.get());
9378   }
9379   return getDerived().RebuildOMPDependClause(
9380       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9381       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9382       C->getEndLoc());
9383 }
9384 
9385 template <typename Derived>
9386 OMPClause *
9387 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9388   ExprResult E = getDerived().TransformExpr(C->getDevice());
9389   if (E.isInvalid())
9390     return nullptr;
9391   return getDerived().RebuildOMPDeviceClause(
9392       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9393       C->getModifierLoc(), C->getEndLoc());
9394 }
9395 
9396 template <typename Derived, class T>
9397 bool transformOMPMappableExprListClause(
9398     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9399     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9400     DeclarationNameInfo &MapperIdInfo,
9401     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9402   // Transform expressions in the list.
9403   Vars.reserve(C->varlist_size());
9404   for (auto *VE : C->varlists()) {
9405     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9406     if (EVar.isInvalid())
9407       return true;
9408     Vars.push_back(EVar.get());
9409   }
9410   // Transform mapper scope specifier and identifier.
9411   NestedNameSpecifierLoc QualifierLoc;
9412   if (C->getMapperQualifierLoc()) {
9413     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9414         C->getMapperQualifierLoc());
9415     if (!QualifierLoc)
9416       return true;
9417   }
9418   MapperIdScopeSpec.Adopt(QualifierLoc);
9419   MapperIdInfo = C->getMapperIdInfo();
9420   if (MapperIdInfo.getName()) {
9421     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9422     if (!MapperIdInfo.getName())
9423       return true;
9424   }
9425   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9426   // the previous user-defined mapper lookup in dependent environment.
9427   for (auto *E : C->mapperlists()) {
9428     // Transform all the decls.
9429     if (E) {
9430       auto *ULE = cast<UnresolvedLookupExpr>(E);
9431       UnresolvedSet<8> Decls;
9432       for (auto *D : ULE->decls()) {
9433         NamedDecl *InstD =
9434             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9435         Decls.addDecl(InstD, InstD->getAccess());
9436       }
9437       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9438           TT.getSema().Context, /*NamingClass=*/nullptr,
9439           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9440           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9441           Decls.end()));
9442     } else {
9443       UnresolvedMappers.push_back(nullptr);
9444     }
9445   }
9446   return false;
9447 }
9448 
9449 template <typename Derived>
9450 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9451   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9452   llvm::SmallVector<Expr *, 16> Vars;
9453   CXXScopeSpec MapperIdScopeSpec;
9454   DeclarationNameInfo MapperIdInfo;
9455   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9456   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9457           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9458     return nullptr;
9459   return getDerived().RebuildOMPMapClause(
9460       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9461       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9462       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9463 }
9464 
9465 template <typename Derived>
9466 OMPClause *
9467 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9468   Expr *Allocator = C->getAllocator();
9469   if (Allocator) {
9470     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9471     if (AllocatorRes.isInvalid())
9472       return nullptr;
9473     Allocator = AllocatorRes.get();
9474   }
9475   llvm::SmallVector<Expr *, 16> Vars;
9476   Vars.reserve(C->varlist_size());
9477   for (auto *VE : C->varlists()) {
9478     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9479     if (EVar.isInvalid())
9480       return nullptr;
9481     Vars.push_back(EVar.get());
9482   }
9483   return getDerived().RebuildOMPAllocateClause(
9484       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9485       C->getEndLoc());
9486 }
9487 
9488 template <typename Derived>
9489 OMPClause *
9490 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9491   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9492   if (E.isInvalid())
9493     return nullptr;
9494   return getDerived().RebuildOMPNumTeamsClause(
9495       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9496 }
9497 
9498 template <typename Derived>
9499 OMPClause *
9500 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9501   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9502   if (E.isInvalid())
9503     return nullptr;
9504   return getDerived().RebuildOMPThreadLimitClause(
9505       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9506 }
9507 
9508 template <typename Derived>
9509 OMPClause *
9510 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9511   ExprResult E = getDerived().TransformExpr(C->getPriority());
9512   if (E.isInvalid())
9513     return nullptr;
9514   return getDerived().RebuildOMPPriorityClause(
9515       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9516 }
9517 
9518 template <typename Derived>
9519 OMPClause *
9520 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9521   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9522   if (E.isInvalid())
9523     return nullptr;
9524   return getDerived().RebuildOMPGrainsizeClause(
9525       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9526 }
9527 
9528 template <typename Derived>
9529 OMPClause *
9530 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9531   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9532   if (E.isInvalid())
9533     return nullptr;
9534   return getDerived().RebuildOMPNumTasksClause(
9535       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9536 }
9537 
9538 template <typename Derived>
9539 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9540   ExprResult E = getDerived().TransformExpr(C->getHint());
9541   if (E.isInvalid())
9542     return nullptr;
9543   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9544                                            C->getLParenLoc(), C->getEndLoc());
9545 }
9546 
9547 template <typename Derived>
9548 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9549     OMPDistScheduleClause *C) {
9550   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9551   if (E.isInvalid())
9552     return nullptr;
9553   return getDerived().RebuildOMPDistScheduleClause(
9554       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9555       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9556 }
9557 
9558 template <typename Derived>
9559 OMPClause *
9560 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9561   // Rebuild Defaultmap Clause since we need to invoke the checking of
9562   // defaultmap(none:variable-category) after template initialization.
9563   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9564                                                  C->getDefaultmapKind(),
9565                                                  C->getBeginLoc(),
9566                                                  C->getLParenLoc(),
9567                                                  C->getDefaultmapModifierLoc(),
9568                                                  C->getDefaultmapKindLoc(),
9569                                                  C->getEndLoc());
9570 }
9571 
9572 template <typename Derived>
9573 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9574   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9575   llvm::SmallVector<Expr *, 16> Vars;
9576   CXXScopeSpec MapperIdScopeSpec;
9577   DeclarationNameInfo MapperIdInfo;
9578   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9579   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9580           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9581     return nullptr;
9582   return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo,
9583                                          Locs, UnresolvedMappers);
9584 }
9585 
9586 template <typename Derived>
9587 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9588   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9589   llvm::SmallVector<Expr *, 16> Vars;
9590   CXXScopeSpec MapperIdScopeSpec;
9591   DeclarationNameInfo MapperIdInfo;
9592   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9593   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9594           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9595     return nullptr;
9596   return getDerived().RebuildOMPFromClause(
9597       Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers);
9598 }
9599 
9600 template <typename Derived>
9601 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9602     OMPUseDevicePtrClause *C) {
9603   llvm::SmallVector<Expr *, 16> Vars;
9604   Vars.reserve(C->varlist_size());
9605   for (auto *VE : C->varlists()) {
9606     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9607     if (EVar.isInvalid())
9608       return nullptr;
9609     Vars.push_back(EVar.get());
9610   }
9611   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9612   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9613 }
9614 
9615 template <typename Derived>
9616 OMPClause *
9617 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9618   llvm::SmallVector<Expr *, 16> Vars;
9619   Vars.reserve(C->varlist_size());
9620   for (auto *VE : C->varlists()) {
9621     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9622     if (EVar.isInvalid())
9623       return nullptr;
9624     Vars.push_back(EVar.get());
9625   }
9626   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9627   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9628 }
9629 
9630 template <typename Derived>
9631 OMPClause *
9632 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9633   llvm::SmallVector<Expr *, 16> Vars;
9634   Vars.reserve(C->varlist_size());
9635   for (auto *VE : C->varlists()) {
9636     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9637     if (EVar.isInvalid())
9638       return nullptr;
9639     Vars.push_back(EVar.get());
9640   }
9641   return getDerived().RebuildOMPNontemporalClause(
9642       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9643 }
9644 
9645 template <typename Derived>
9646 OMPClause *
9647 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
9648   llvm::SmallVector<Expr *, 16> Vars;
9649   Vars.reserve(C->varlist_size());
9650   for (auto *VE : C->varlists()) {
9651     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9652     if (EVar.isInvalid())
9653       return nullptr;
9654     Vars.push_back(EVar.get());
9655   }
9656   return getDerived().RebuildOMPInclusiveClause(
9657       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9658 }
9659 
9660 template <typename Derived>
9661 OMPClause *
9662 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
9663   llvm::SmallVector<Expr *, 16> Vars;
9664   Vars.reserve(C->varlist_size());
9665   for (auto *VE : C->varlists()) {
9666     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9667     if (EVar.isInvalid())
9668       return nullptr;
9669     Vars.push_back(EVar.get());
9670   }
9671   return getDerived().RebuildOMPExclusiveClause(
9672       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9673 }
9674 
9675 template <typename Derived>
9676 OMPClause *
9677 TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
9678   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
9679                                             C->getBeginLoc(), C->getLParenLoc(),
9680                                             C->getEndLoc());
9681 }
9682 
9683 //===----------------------------------------------------------------------===//
9684 // Expression transformation
9685 //===----------------------------------------------------------------------===//
9686 template<typename Derived>
9687 ExprResult
9688 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9689   return TransformExpr(E->getSubExpr());
9690 }
9691 
9692 template<typename Derived>
9693 ExprResult
9694 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9695   if (!E->isTypeDependent())
9696     return E;
9697 
9698   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9699                                             E->getIdentKind());
9700 }
9701 
9702 template<typename Derived>
9703 ExprResult
9704 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9705   NestedNameSpecifierLoc QualifierLoc;
9706   if (E->getQualifierLoc()) {
9707     QualifierLoc
9708       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9709     if (!QualifierLoc)
9710       return ExprError();
9711   }
9712 
9713   ValueDecl *ND
9714     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9715                                                          E->getDecl()));
9716   if (!ND)
9717     return ExprError();
9718 
9719   NamedDecl *Found = ND;
9720   if (E->getFoundDecl() != E->getDecl()) {
9721     Found = cast_or_null<NamedDecl>(
9722         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
9723     if (!Found)
9724       return ExprError();
9725   }
9726 
9727   DeclarationNameInfo NameInfo = E->getNameInfo();
9728   if (NameInfo.getName()) {
9729     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9730     if (!NameInfo.getName())
9731       return ExprError();
9732   }
9733 
9734   if (!getDerived().AlwaysRebuild() &&
9735       QualifierLoc == E->getQualifierLoc() &&
9736       ND == E->getDecl() &&
9737       Found == E->getFoundDecl() &&
9738       NameInfo.getName() == E->getDecl()->getDeclName() &&
9739       !E->hasExplicitTemplateArgs()) {
9740 
9741     // Mark it referenced in the new context regardless.
9742     // FIXME: this is a bit instantiation-specific.
9743     SemaRef.MarkDeclRefReferenced(E);
9744 
9745     return E;
9746   }
9747 
9748   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9749   if (E->hasExplicitTemplateArgs()) {
9750     TemplateArgs = &TransArgs;
9751     TransArgs.setLAngleLoc(E->getLAngleLoc());
9752     TransArgs.setRAngleLoc(E->getRAngleLoc());
9753     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9754                                                 E->getNumTemplateArgs(),
9755                                                 TransArgs))
9756       return ExprError();
9757   }
9758 
9759   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
9760                                          Found, TemplateArgs);
9761 }
9762 
9763 template<typename Derived>
9764 ExprResult
9765 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
9766   return E;
9767 }
9768 
9769 template <typename Derived>
9770 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
9771     FixedPointLiteral *E) {
9772   return E;
9773 }
9774 
9775 template<typename Derived>
9776 ExprResult
9777 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
9778   return E;
9779 }
9780 
9781 template<typename Derived>
9782 ExprResult
9783 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
9784   return E;
9785 }
9786 
9787 template<typename Derived>
9788 ExprResult
9789 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
9790   return E;
9791 }
9792 
9793 template<typename Derived>
9794 ExprResult
9795 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
9796   return E;
9797 }
9798 
9799 template<typename Derived>
9800 ExprResult
9801 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
9802   if (FunctionDecl *FD = E->getDirectCallee())
9803     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
9804   return SemaRef.MaybeBindToTemporary(E);
9805 }
9806 
9807 template<typename Derived>
9808 ExprResult
9809 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
9810   ExprResult ControllingExpr =
9811     getDerived().TransformExpr(E->getControllingExpr());
9812   if (ControllingExpr.isInvalid())
9813     return ExprError();
9814 
9815   SmallVector<Expr *, 4> AssocExprs;
9816   SmallVector<TypeSourceInfo *, 4> AssocTypes;
9817   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
9818     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
9819     if (TSI) {
9820       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
9821       if (!AssocType)
9822         return ExprError();
9823       AssocTypes.push_back(AssocType);
9824     } else {
9825       AssocTypes.push_back(nullptr);
9826     }
9827 
9828     ExprResult AssocExpr =
9829         getDerived().TransformExpr(Assoc.getAssociationExpr());
9830     if (AssocExpr.isInvalid())
9831       return ExprError();
9832     AssocExprs.push_back(AssocExpr.get());
9833   }
9834 
9835   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
9836                                                   E->getDefaultLoc(),
9837                                                   E->getRParenLoc(),
9838                                                   ControllingExpr.get(),
9839                                                   AssocTypes,
9840                                                   AssocExprs);
9841 }
9842 
9843 template<typename Derived>
9844 ExprResult
9845 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
9846   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9847   if (SubExpr.isInvalid())
9848     return ExprError();
9849 
9850   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9851     return E;
9852 
9853   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
9854                                        E->getRParen());
9855 }
9856 
9857 /// The operand of a unary address-of operator has special rules: it's
9858 /// allowed to refer to a non-static member of a class even if there's no 'this'
9859 /// object available.
9860 template<typename Derived>
9861 ExprResult
9862 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
9863   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
9864     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
9865   else
9866     return getDerived().TransformExpr(E);
9867 }
9868 
9869 template<typename Derived>
9870 ExprResult
9871 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
9872   ExprResult SubExpr;
9873   if (E->getOpcode() == UO_AddrOf)
9874     SubExpr = TransformAddressOfOperand(E->getSubExpr());
9875   else
9876     SubExpr = TransformExpr(E->getSubExpr());
9877   if (SubExpr.isInvalid())
9878     return ExprError();
9879 
9880   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9881     return E;
9882 
9883   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
9884                                            E->getOpcode(),
9885                                            SubExpr.get());
9886 }
9887 
9888 template<typename Derived>
9889 ExprResult
9890 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9891   // Transform the type.
9892   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9893   if (!Type)
9894     return ExprError();
9895 
9896   // Transform all of the components into components similar to what the
9897   // parser uses.
9898   // FIXME: It would be slightly more efficient in the non-dependent case to
9899   // just map FieldDecls, rather than requiring the rebuilder to look for
9900   // the fields again. However, __builtin_offsetof is rare enough in
9901   // template code that we don't care.
9902   bool ExprChanged = false;
9903   typedef Sema::OffsetOfComponent Component;
9904   SmallVector<Component, 4> Components;
9905   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9906     const OffsetOfNode &ON = E->getComponent(I);
9907     Component Comp;
9908     Comp.isBrackets = true;
9909     Comp.LocStart = ON.getSourceRange().getBegin();
9910     Comp.LocEnd = ON.getSourceRange().getEnd();
9911     switch (ON.getKind()) {
9912     case OffsetOfNode::Array: {
9913       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9914       ExprResult Index = getDerived().TransformExpr(FromIndex);
9915       if (Index.isInvalid())
9916         return ExprError();
9917 
9918       ExprChanged = ExprChanged || Index.get() != FromIndex;
9919       Comp.isBrackets = true;
9920       Comp.U.E = Index.get();
9921       break;
9922     }
9923 
9924     case OffsetOfNode::Field:
9925     case OffsetOfNode::Identifier:
9926       Comp.isBrackets = false;
9927       Comp.U.IdentInfo = ON.getFieldName();
9928       if (!Comp.U.IdentInfo)
9929         continue;
9930 
9931       break;
9932 
9933     case OffsetOfNode::Base:
9934       // Will be recomputed during the rebuild.
9935       continue;
9936     }
9937 
9938     Components.push_back(Comp);
9939   }
9940 
9941   // If nothing changed, retain the existing expression.
9942   if (!getDerived().AlwaysRebuild() &&
9943       Type == E->getTypeSourceInfo() &&
9944       !ExprChanged)
9945     return E;
9946 
9947   // Build a new offsetof expression.
9948   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9949                                           Components, E->getRParenLoc());
9950 }
9951 
9952 template<typename Derived>
9953 ExprResult
9954 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9955   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9956          "opaque value expression requires transformation");
9957   return E;
9958 }
9959 
9960 template<typename Derived>
9961 ExprResult
9962 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9963   return E;
9964 }
9965 
9966 template <typename Derived>
9967 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
9968   llvm::SmallVector<Expr *, 8> Children;
9969   bool Changed = false;
9970   for (Expr *C : E->subExpressions()) {
9971     ExprResult NewC = getDerived().TransformExpr(C);
9972     if (NewC.isInvalid())
9973       return ExprError();
9974     Children.push_back(NewC.get());
9975 
9976     Changed |= NewC.get() != C;
9977   }
9978   if (!getDerived().AlwaysRebuild() && !Changed)
9979     return E;
9980   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
9981                                           Children);
9982 }
9983 
9984 template<typename Derived>
9985 ExprResult
9986 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9987   // Rebuild the syntactic form.  The original syntactic form has
9988   // opaque-value expressions in it, so strip those away and rebuild
9989   // the result.  This is a really awful way of doing this, but the
9990   // better solution (rebuilding the semantic expressions and
9991   // rebinding OVEs as necessary) doesn't work; we'd need
9992   // TreeTransform to not strip away implicit conversions.
9993   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9994   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9995   if (result.isInvalid()) return ExprError();
9996 
9997   // If that gives us a pseudo-object result back, the pseudo-object
9998   // expression must have been an lvalue-to-rvalue conversion which we
9999   // should reapply.
10000   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10001     result = SemaRef.checkPseudoObjectRValue(result.get());
10002 
10003   return result;
10004 }
10005 
10006 template<typename Derived>
10007 ExprResult
10008 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10009                                                 UnaryExprOrTypeTraitExpr *E) {
10010   if (E->isArgumentType()) {
10011     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10012 
10013     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10014     if (!NewT)
10015       return ExprError();
10016 
10017     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10018       return E;
10019 
10020     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10021                                                     E->getKind(),
10022                                                     E->getSourceRange());
10023   }
10024 
10025   // C++0x [expr.sizeof]p1:
10026   //   The operand is either an expression, which is an unevaluated operand
10027   //   [...]
10028   EnterExpressionEvaluationContext Unevaluated(
10029       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10030       Sema::ReuseLambdaContextDecl);
10031 
10032   // Try to recover if we have something like sizeof(T::X) where X is a type.
10033   // Notably, there must be *exactly* one set of parens if X is a type.
10034   TypeSourceInfo *RecoveryTSI = nullptr;
10035   ExprResult SubExpr;
10036   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10037   if (auto *DRE =
10038           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10039     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10040         PE, DRE, false, &RecoveryTSI);
10041   else
10042     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10043 
10044   if (RecoveryTSI) {
10045     return getDerived().RebuildUnaryExprOrTypeTrait(
10046         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10047   } else if (SubExpr.isInvalid())
10048     return ExprError();
10049 
10050   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10051     return E;
10052 
10053   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10054                                                   E->getOperatorLoc(),
10055                                                   E->getKind(),
10056                                                   E->getSourceRange());
10057 }
10058 
10059 template<typename Derived>
10060 ExprResult
10061 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10062   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10063   if (LHS.isInvalid())
10064     return ExprError();
10065 
10066   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10067   if (RHS.isInvalid())
10068     return ExprError();
10069 
10070 
10071   if (!getDerived().AlwaysRebuild() &&
10072       LHS.get() == E->getLHS() &&
10073       RHS.get() == E->getRHS())
10074     return E;
10075 
10076   return getDerived().RebuildArraySubscriptExpr(
10077       LHS.get(),
10078       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10079 }
10080 
10081 template <typename Derived>
10082 ExprResult
10083 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10084   ExprResult Base = getDerived().TransformExpr(E->getBase());
10085   if (Base.isInvalid())
10086     return ExprError();
10087 
10088   ExprResult LowerBound;
10089   if (E->getLowerBound()) {
10090     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10091     if (LowerBound.isInvalid())
10092       return ExprError();
10093   }
10094 
10095   ExprResult Length;
10096   if (E->getLength()) {
10097     Length = getDerived().TransformExpr(E->getLength());
10098     if (Length.isInvalid())
10099       return ExprError();
10100   }
10101 
10102   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10103       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10104     return E;
10105 
10106   return getDerived().RebuildOMPArraySectionExpr(
10107       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
10108       Length.get(), E->getRBracketLoc());
10109 }
10110 
10111 template <typename Derived>
10112 ExprResult
10113 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10114   ExprResult Base = getDerived().TransformExpr(E->getBase());
10115   if (Base.isInvalid())
10116     return ExprError();
10117 
10118   SmallVector<Expr *, 4> Dims;
10119   bool ErrorFound = false;
10120   for (Expr *Dim : E->getDimensions()) {
10121     ExprResult DimRes = getDerived().TransformExpr(Dim);
10122     if (DimRes.isInvalid()) {
10123       ErrorFound = true;
10124       continue;
10125     }
10126     Dims.push_back(DimRes.get());
10127   }
10128 
10129   if (ErrorFound)
10130     return ExprError();
10131   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10132                                                  E->getRParenLoc(), Dims,
10133                                                  E->getBracketsRanges());
10134 }
10135 
10136 template <typename Derived>
10137 ExprResult
10138 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10139   unsigned NumIterators = E->numOfIterators();
10140   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10141 
10142   bool ErrorFound = false;
10143   bool NeedToRebuild = getDerived().AlwaysRebuild();
10144   for (unsigned I = 0; I < NumIterators; ++I) {
10145     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10146     Data[I].DeclIdent = D->getIdentifier();
10147     Data[I].DeclIdentLoc = D->getLocation();
10148     if (D->getLocation() == D->getBeginLoc()) {
10149       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10150              "Implicit type must be int.");
10151     } else {
10152       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10153       QualType DeclTy = getDerived().TransformType(D->getType());
10154       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10155     }
10156     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10157     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10158     ExprResult End = getDerived().TransformExpr(Range.End);
10159     ExprResult Step = getDerived().TransformExpr(Range.Step);
10160     ErrorFound = ErrorFound ||
10161                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10162                                                !Data[I].Type.get().isNull())) ||
10163                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10164     if (ErrorFound)
10165       continue;
10166     Data[I].Range.Begin = Begin.get();
10167     Data[I].Range.End = End.get();
10168     Data[I].Range.Step = Step.get();
10169     Data[I].AssignLoc = E->getAssignLoc(I);
10170     Data[I].ColonLoc = E->getColonLoc(I);
10171     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10172     NeedToRebuild =
10173         NeedToRebuild ||
10174         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10175                                        D->getType().getTypePtrOrNull()) ||
10176         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10177         Range.Step != Data[I].Range.Step;
10178   }
10179   if (ErrorFound)
10180     return ExprError();
10181   if (!NeedToRebuild)
10182     return E;
10183 
10184   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10185       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10186   if (!Res.isUsable())
10187     return Res;
10188   auto *IE = cast<OMPIteratorExpr>(Res.get());
10189   for (unsigned I = 0; I < NumIterators; ++I)
10190     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10191                                       IE->getIteratorDecl(I));
10192   return Res;
10193 }
10194 
10195 template<typename Derived>
10196 ExprResult
10197 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10198   // Transform the callee.
10199   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10200   if (Callee.isInvalid())
10201     return ExprError();
10202 
10203   // Transform arguments.
10204   bool ArgChanged = false;
10205   SmallVector<Expr*, 8> Args;
10206   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10207                                   &ArgChanged))
10208     return ExprError();
10209 
10210   if (!getDerived().AlwaysRebuild() &&
10211       Callee.get() == E->getCallee() &&
10212       !ArgChanged)
10213     return SemaRef.MaybeBindToTemporary(E);
10214 
10215   // FIXME: Wrong source location information for the '('.
10216   SourceLocation FakeLParenLoc
10217     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10218   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10219                                       Args,
10220                                       E->getRParenLoc());
10221 }
10222 
10223 template<typename Derived>
10224 ExprResult
10225 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10226   ExprResult Base = getDerived().TransformExpr(E->getBase());
10227   if (Base.isInvalid())
10228     return ExprError();
10229 
10230   NestedNameSpecifierLoc QualifierLoc;
10231   if (E->hasQualifier()) {
10232     QualifierLoc
10233       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10234 
10235     if (!QualifierLoc)
10236       return ExprError();
10237   }
10238   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10239 
10240   ValueDecl *Member
10241     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10242                                                          E->getMemberDecl()));
10243   if (!Member)
10244     return ExprError();
10245 
10246   NamedDecl *FoundDecl = E->getFoundDecl();
10247   if (FoundDecl == E->getMemberDecl()) {
10248     FoundDecl = Member;
10249   } else {
10250     FoundDecl = cast_or_null<NamedDecl>(
10251                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10252     if (!FoundDecl)
10253       return ExprError();
10254   }
10255 
10256   if (!getDerived().AlwaysRebuild() &&
10257       Base.get() == E->getBase() &&
10258       QualifierLoc == E->getQualifierLoc() &&
10259       Member == E->getMemberDecl() &&
10260       FoundDecl == E->getFoundDecl() &&
10261       !E->hasExplicitTemplateArgs()) {
10262 
10263     // Mark it referenced in the new context regardless.
10264     // FIXME: this is a bit instantiation-specific.
10265     SemaRef.MarkMemberReferenced(E);
10266 
10267     return E;
10268   }
10269 
10270   TemplateArgumentListInfo TransArgs;
10271   if (E->hasExplicitTemplateArgs()) {
10272     TransArgs.setLAngleLoc(E->getLAngleLoc());
10273     TransArgs.setRAngleLoc(E->getRAngleLoc());
10274     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10275                                                 E->getNumTemplateArgs(),
10276                                                 TransArgs))
10277       return ExprError();
10278   }
10279 
10280   // FIXME: Bogus source location for the operator
10281   SourceLocation FakeOperatorLoc =
10282       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10283 
10284   // FIXME: to do this check properly, we will need to preserve the
10285   // first-qualifier-in-scope here, just in case we had a dependent
10286   // base (and therefore couldn't do the check) and a
10287   // nested-name-qualifier (and therefore could do the lookup).
10288   NamedDecl *FirstQualifierInScope = nullptr;
10289   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10290   if (MemberNameInfo.getName()) {
10291     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10292     if (!MemberNameInfo.getName())
10293       return ExprError();
10294   }
10295 
10296   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10297                                         E->isArrow(),
10298                                         QualifierLoc,
10299                                         TemplateKWLoc,
10300                                         MemberNameInfo,
10301                                         Member,
10302                                         FoundDecl,
10303                                         (E->hasExplicitTemplateArgs()
10304                                            ? &TransArgs : nullptr),
10305                                         FirstQualifierInScope);
10306 }
10307 
10308 template<typename Derived>
10309 ExprResult
10310 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10311   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10312   if (LHS.isInvalid())
10313     return ExprError();
10314 
10315   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10316   if (RHS.isInvalid())
10317     return ExprError();
10318 
10319   if (!getDerived().AlwaysRebuild() &&
10320       LHS.get() == E->getLHS() &&
10321       RHS.get() == E->getRHS())
10322     return E;
10323 
10324   if (E->isCompoundAssignmentOp())
10325     // FPFeatures has already been established from trailing storage
10326     return getDerived().RebuildBinaryOperator(
10327         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10328   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10329   getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts());
10330 
10331   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10332                                             LHS.get(), RHS.get());
10333 }
10334 
10335 template <typename Derived>
10336 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10337     CXXRewrittenBinaryOperator *E) {
10338   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10339 
10340   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10341   if (LHS.isInvalid())
10342     return ExprError();
10343 
10344   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10345   if (RHS.isInvalid())
10346     return ExprError();
10347 
10348   if (!getDerived().AlwaysRebuild() &&
10349       LHS.get() == Decomp.LHS &&
10350       RHS.get() == Decomp.RHS)
10351     return E;
10352 
10353   // Extract the already-resolved callee declarations so that we can restrict
10354   // ourselves to using them as the unqualified lookup results when rebuilding.
10355   UnresolvedSet<2> UnqualLookups;
10356   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10357                             const_cast<Expr *>(Decomp.InnerBinOp)};
10358   for (Expr *PossibleBinOp : PossibleBinOps) {
10359     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10360     if (!Op)
10361       continue;
10362     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10363     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10364       continue;
10365 
10366     // Transform the callee in case we built a call to a local extern
10367     // declaration.
10368     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10369         E->getOperatorLoc(), Callee->getFoundDecl()));
10370     if (!Found)
10371       return ExprError();
10372     UnqualLookups.addDecl(Found);
10373   }
10374 
10375   return getDerived().RebuildCXXRewrittenBinaryOperator(
10376       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10377 }
10378 
10379 template<typename Derived>
10380 ExprResult
10381 TreeTransform<Derived>::TransformCompoundAssignOperator(
10382                                                       CompoundAssignOperator *E) {
10383   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10384   getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts());
10385   return getDerived().TransformBinaryOperator(E);
10386 }
10387 
10388 template<typename Derived>
10389 ExprResult TreeTransform<Derived>::
10390 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10391   // Just rebuild the common and RHS expressions and see whether we
10392   // get any changes.
10393 
10394   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10395   if (commonExpr.isInvalid())
10396     return ExprError();
10397 
10398   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10399   if (rhs.isInvalid())
10400     return ExprError();
10401 
10402   if (!getDerived().AlwaysRebuild() &&
10403       commonExpr.get() == e->getCommon() &&
10404       rhs.get() == e->getFalseExpr())
10405     return e;
10406 
10407   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10408                                                  e->getQuestionLoc(),
10409                                                  nullptr,
10410                                                  e->getColonLoc(),
10411                                                  rhs.get());
10412 }
10413 
10414 template<typename Derived>
10415 ExprResult
10416 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10417   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10418   if (Cond.isInvalid())
10419     return ExprError();
10420 
10421   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10422   if (LHS.isInvalid())
10423     return ExprError();
10424 
10425   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10426   if (RHS.isInvalid())
10427     return ExprError();
10428 
10429   if (!getDerived().AlwaysRebuild() &&
10430       Cond.get() == E->getCond() &&
10431       LHS.get() == E->getLHS() &&
10432       RHS.get() == E->getRHS())
10433     return E;
10434 
10435   return getDerived().RebuildConditionalOperator(Cond.get(),
10436                                                  E->getQuestionLoc(),
10437                                                  LHS.get(),
10438                                                  E->getColonLoc(),
10439                                                  RHS.get());
10440 }
10441 
10442 template<typename Derived>
10443 ExprResult
10444 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10445   // Implicit casts are eliminated during transformation, since they
10446   // will be recomputed by semantic analysis after transformation.
10447   return getDerived().TransformExpr(E->getSubExprAsWritten());
10448 }
10449 
10450 template<typename Derived>
10451 ExprResult
10452 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10453   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10454   if (!Type)
10455     return ExprError();
10456 
10457   ExprResult SubExpr
10458     = getDerived().TransformExpr(E->getSubExprAsWritten());
10459   if (SubExpr.isInvalid())
10460     return ExprError();
10461 
10462   if (!getDerived().AlwaysRebuild() &&
10463       Type == E->getTypeInfoAsWritten() &&
10464       SubExpr.get() == E->getSubExpr())
10465     return E;
10466 
10467   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10468                                             Type,
10469                                             E->getRParenLoc(),
10470                                             SubExpr.get());
10471 }
10472 
10473 template<typename Derived>
10474 ExprResult
10475 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10476   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10477   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10478   if (!NewT)
10479     return ExprError();
10480 
10481   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10482   if (Init.isInvalid())
10483     return ExprError();
10484 
10485   if (!getDerived().AlwaysRebuild() &&
10486       OldT == NewT &&
10487       Init.get() == E->getInitializer())
10488     return SemaRef.MaybeBindToTemporary(E);
10489 
10490   // Note: the expression type doesn't necessarily match the
10491   // type-as-written, but that's okay, because it should always be
10492   // derivable from the initializer.
10493 
10494   return getDerived().RebuildCompoundLiteralExpr(
10495       E->getLParenLoc(), NewT,
10496       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10497 }
10498 
10499 template<typename Derived>
10500 ExprResult
10501 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10502   ExprResult Base = getDerived().TransformExpr(E->getBase());
10503   if (Base.isInvalid())
10504     return ExprError();
10505 
10506   if (!getDerived().AlwaysRebuild() &&
10507       Base.get() == E->getBase())
10508     return E;
10509 
10510   // FIXME: Bad source location
10511   SourceLocation FakeOperatorLoc =
10512       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10513   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10514                                                   E->getAccessorLoc(),
10515                                                   E->getAccessor());
10516 }
10517 
10518 template<typename Derived>
10519 ExprResult
10520 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10521   if (InitListExpr *Syntactic = E->getSyntacticForm())
10522     E = Syntactic;
10523 
10524   bool InitChanged = false;
10525 
10526   EnterExpressionEvaluationContext Context(
10527       getSema(), EnterExpressionEvaluationContext::InitList);
10528 
10529   SmallVector<Expr*, 4> Inits;
10530   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10531                                   Inits, &InitChanged))
10532     return ExprError();
10533 
10534   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10535     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10536     // in some cases. We can't reuse it in general, because the syntactic and
10537     // semantic forms are linked, and we can't know that semantic form will
10538     // match even if the syntactic form does.
10539   }
10540 
10541   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10542                                       E->getRBraceLoc());
10543 }
10544 
10545 template<typename Derived>
10546 ExprResult
10547 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10548   Designation Desig;
10549 
10550   // transform the initializer value
10551   ExprResult Init = getDerived().TransformExpr(E->getInit());
10552   if (Init.isInvalid())
10553     return ExprError();
10554 
10555   // transform the designators.
10556   SmallVector<Expr*, 4> ArrayExprs;
10557   bool ExprChanged = false;
10558   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10559     if (D.isFieldDesignator()) {
10560       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10561                                                D.getDotLoc(),
10562                                                D.getFieldLoc()));
10563       if (D.getField()) {
10564         FieldDecl *Field = cast_or_null<FieldDecl>(
10565             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10566         if (Field != D.getField())
10567           // Rebuild the expression when the transformed FieldDecl is
10568           // different to the already assigned FieldDecl.
10569           ExprChanged = true;
10570       } else {
10571         // Ensure that the designator expression is rebuilt when there isn't
10572         // a resolved FieldDecl in the designator as we don't want to assign
10573         // a FieldDecl to a pattern designator that will be instantiated again.
10574         ExprChanged = true;
10575       }
10576       continue;
10577     }
10578 
10579     if (D.isArrayDesignator()) {
10580       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10581       if (Index.isInvalid())
10582         return ExprError();
10583 
10584       Desig.AddDesignator(
10585           Designator::getArray(Index.get(), D.getLBracketLoc()));
10586 
10587       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10588       ArrayExprs.push_back(Index.get());
10589       continue;
10590     }
10591 
10592     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10593     ExprResult Start
10594       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10595     if (Start.isInvalid())
10596       return ExprError();
10597 
10598     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10599     if (End.isInvalid())
10600       return ExprError();
10601 
10602     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10603                                                   End.get(),
10604                                                   D.getLBracketLoc(),
10605                                                   D.getEllipsisLoc()));
10606 
10607     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10608                   End.get() != E->getArrayRangeEnd(D);
10609 
10610     ArrayExprs.push_back(Start.get());
10611     ArrayExprs.push_back(End.get());
10612   }
10613 
10614   if (!getDerived().AlwaysRebuild() &&
10615       Init.get() == E->getInit() &&
10616       !ExprChanged)
10617     return E;
10618 
10619   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10620                                                 E->getEqualOrColonLoc(),
10621                                                 E->usesGNUSyntax(), Init.get());
10622 }
10623 
10624 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10625 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10626 template<typename Derived>
10627 ExprResult
10628 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10629     DesignatedInitUpdateExpr *E) {
10630   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10631                    "initializer");
10632   return ExprError();
10633 }
10634 
10635 template<typename Derived>
10636 ExprResult
10637 TreeTransform<Derived>::TransformNoInitExpr(
10638     NoInitExpr *E) {
10639   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10640   return ExprError();
10641 }
10642 
10643 template<typename Derived>
10644 ExprResult
10645 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10646   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10647   return ExprError();
10648 }
10649 
10650 template<typename Derived>
10651 ExprResult
10652 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10653   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10654   return ExprError();
10655 }
10656 
10657 template<typename Derived>
10658 ExprResult
10659 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10660                                                      ImplicitValueInitExpr *E) {
10661   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10662 
10663   // FIXME: Will we ever have proper type location here? Will we actually
10664   // need to transform the type?
10665   QualType T = getDerived().TransformType(E->getType());
10666   if (T.isNull())
10667     return ExprError();
10668 
10669   if (!getDerived().AlwaysRebuild() &&
10670       T == E->getType())
10671     return E;
10672 
10673   return getDerived().RebuildImplicitValueInitExpr(T);
10674 }
10675 
10676 template<typename Derived>
10677 ExprResult
10678 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10679   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10680   if (!TInfo)
10681     return ExprError();
10682 
10683   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10684   if (SubExpr.isInvalid())
10685     return ExprError();
10686 
10687   if (!getDerived().AlwaysRebuild() &&
10688       TInfo == E->getWrittenTypeInfo() &&
10689       SubExpr.get() == E->getSubExpr())
10690     return E;
10691 
10692   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10693                                        TInfo, E->getRParenLoc());
10694 }
10695 
10696 template<typename Derived>
10697 ExprResult
10698 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10699   bool ArgumentChanged = false;
10700   SmallVector<Expr*, 4> Inits;
10701   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10702                      &ArgumentChanged))
10703     return ExprError();
10704 
10705   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10706                                            Inits,
10707                                            E->getRParenLoc());
10708 }
10709 
10710 /// Transform an address-of-label expression.
10711 ///
10712 /// By default, the transformation of an address-of-label expression always
10713 /// rebuilds the expression, so that the label identifier can be resolved to
10714 /// the corresponding label statement by semantic analysis.
10715 template<typename Derived>
10716 ExprResult
10717 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
10718   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
10719                                         E->getLabel());
10720   if (!LD)
10721     return ExprError();
10722 
10723   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
10724                                            cast<LabelDecl>(LD));
10725 }
10726 
10727 template<typename Derived>
10728 ExprResult
10729 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
10730   SemaRef.ActOnStartStmtExpr();
10731   StmtResult SubStmt
10732     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
10733   if (SubStmt.isInvalid()) {
10734     SemaRef.ActOnStmtExprError();
10735     return ExprError();
10736   }
10737 
10738   unsigned OldDepth = E->getTemplateDepth();
10739   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
10740 
10741   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
10742       SubStmt.get() == E->getSubStmt()) {
10743     // Calling this an 'error' is unintuitive, but it does the right thing.
10744     SemaRef.ActOnStmtExprError();
10745     return SemaRef.MaybeBindToTemporary(E);
10746   }
10747 
10748   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
10749                                       E->getRParenLoc(), NewDepth);
10750 }
10751 
10752 template<typename Derived>
10753 ExprResult
10754 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
10755   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10756   if (Cond.isInvalid())
10757     return ExprError();
10758 
10759   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10760   if (LHS.isInvalid())
10761     return ExprError();
10762 
10763   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10764   if (RHS.isInvalid())
10765     return ExprError();
10766 
10767   if (!getDerived().AlwaysRebuild() &&
10768       Cond.get() == E->getCond() &&
10769       LHS.get() == E->getLHS() &&
10770       RHS.get() == E->getRHS())
10771     return E;
10772 
10773   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
10774                                         Cond.get(), LHS.get(), RHS.get(),
10775                                         E->getRParenLoc());
10776 }
10777 
10778 template<typename Derived>
10779 ExprResult
10780 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
10781   return E;
10782 }
10783 
10784 template<typename Derived>
10785 ExprResult
10786 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
10787   switch (E->getOperator()) {
10788   case OO_New:
10789   case OO_Delete:
10790   case OO_Array_New:
10791   case OO_Array_Delete:
10792     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
10793 
10794   case OO_Call: {
10795     // This is a call to an object's operator().
10796     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
10797 
10798     // Transform the object itself.
10799     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
10800     if (Object.isInvalid())
10801       return ExprError();
10802 
10803     // FIXME: Poor location information
10804     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
10805         static_cast<Expr *>(Object.get())->getEndLoc());
10806 
10807     // Transform the call arguments.
10808     SmallVector<Expr*, 8> Args;
10809     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
10810                                     Args))
10811       return ExprError();
10812 
10813     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
10814                                         E->getEndLoc());
10815   }
10816 
10817 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
10818   case OO_##Name:
10819 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
10820 #include "clang/Basic/OperatorKinds.def"
10821   case OO_Subscript:
10822     // Handled below.
10823     break;
10824 
10825   case OO_Conditional:
10826     llvm_unreachable("conditional operator is not actually overloadable");
10827 
10828   case OO_None:
10829   case NUM_OVERLOADED_OPERATORS:
10830     llvm_unreachable("not an overloaded operator?");
10831   }
10832 
10833   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10834   if (Callee.isInvalid())
10835     return ExprError();
10836 
10837   ExprResult First;
10838   if (E->getOperator() == OO_Amp)
10839     First = getDerived().TransformAddressOfOperand(E->getArg(0));
10840   else
10841     First = getDerived().TransformExpr(E->getArg(0));
10842   if (First.isInvalid())
10843     return ExprError();
10844 
10845   ExprResult Second;
10846   if (E->getNumArgs() == 2) {
10847     Second = getDerived().TransformExpr(E->getArg(1));
10848     if (Second.isInvalid())
10849       return ExprError();
10850   }
10851 
10852   if (!getDerived().AlwaysRebuild() &&
10853       Callee.get() == E->getCallee() &&
10854       First.get() == E->getArg(0) &&
10855       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
10856     return SemaRef.MaybeBindToTemporary(E);
10857 
10858   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10859   getSema().CurFPFeatures = E->getFPFeatures();
10860 
10861   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
10862                                                  E->getOperatorLoc(),
10863                                                  Callee.get(),
10864                                                  First.get(),
10865                                                  Second.get());
10866 }
10867 
10868 template<typename Derived>
10869 ExprResult
10870 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
10871   return getDerived().TransformCallExpr(E);
10872 }
10873 
10874 template <typename Derived>
10875 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
10876   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
10877                          getSema().CurContext != E->getParentContext();
10878 
10879   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
10880     return E;
10881 
10882   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
10883                                            E->getEndLoc(),
10884                                            getSema().CurContext);
10885 }
10886 
10887 template<typename Derived>
10888 ExprResult
10889 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
10890   // Transform the callee.
10891   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10892   if (Callee.isInvalid())
10893     return ExprError();
10894 
10895   // Transform exec config.
10896   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
10897   if (EC.isInvalid())
10898     return ExprError();
10899 
10900   // Transform arguments.
10901   bool ArgChanged = false;
10902   SmallVector<Expr*, 8> Args;
10903   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10904                                   &ArgChanged))
10905     return ExprError();
10906 
10907   if (!getDerived().AlwaysRebuild() &&
10908       Callee.get() == E->getCallee() &&
10909       !ArgChanged)
10910     return SemaRef.MaybeBindToTemporary(E);
10911 
10912   // FIXME: Wrong source location information for the '('.
10913   SourceLocation FakeLParenLoc
10914     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10915   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10916                                       Args,
10917                                       E->getRParenLoc(), EC.get());
10918 }
10919 
10920 template<typename Derived>
10921 ExprResult
10922 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
10923   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10924   if (!Type)
10925     return ExprError();
10926 
10927   ExprResult SubExpr
10928     = getDerived().TransformExpr(E->getSubExprAsWritten());
10929   if (SubExpr.isInvalid())
10930     return ExprError();
10931 
10932   if (!getDerived().AlwaysRebuild() &&
10933       Type == E->getTypeInfoAsWritten() &&
10934       SubExpr.get() == E->getSubExpr())
10935     return E;
10936   return getDerived().RebuildCXXNamedCastExpr(
10937       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
10938       Type, E->getAngleBrackets().getEnd(),
10939       // FIXME. this should be '(' location
10940       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
10941 }
10942 
10943 template<typename Derived>
10944 ExprResult
10945 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
10946   TypeSourceInfo *TSI =
10947       getDerived().TransformType(BCE->getTypeInfoAsWritten());
10948   if (!TSI)
10949     return ExprError();
10950 
10951   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
10952   if (Sub.isInvalid())
10953     return ExprError();
10954 
10955   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
10956                                                 Sub.get(), BCE->getEndLoc());
10957 }
10958 
10959 template<typename Derived>
10960 ExprResult
10961 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
10962   return getDerived().TransformCXXNamedCastExpr(E);
10963 }
10964 
10965 template<typename Derived>
10966 ExprResult
10967 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
10968   return getDerived().TransformCXXNamedCastExpr(E);
10969 }
10970 
10971 template<typename Derived>
10972 ExprResult
10973 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
10974                                                       CXXReinterpretCastExpr *E) {
10975   return getDerived().TransformCXXNamedCastExpr(E);
10976 }
10977 
10978 template<typename Derived>
10979 ExprResult
10980 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
10981   return getDerived().TransformCXXNamedCastExpr(E);
10982 }
10983 
10984 template<typename Derived>
10985 ExprResult
10986 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
10987                                                      CXXFunctionalCastExpr *E) {
10988   TypeSourceInfo *Type =
10989       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
10990   if (!Type)
10991     return ExprError();
10992 
10993   ExprResult SubExpr
10994     = getDerived().TransformExpr(E->getSubExprAsWritten());
10995   if (SubExpr.isInvalid())
10996     return ExprError();
10997 
10998   if (!getDerived().AlwaysRebuild() &&
10999       Type == E->getTypeInfoAsWritten() &&
11000       SubExpr.get() == E->getSubExpr())
11001     return E;
11002 
11003   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11004                                                    E->getLParenLoc(),
11005                                                    SubExpr.get(),
11006                                                    E->getRParenLoc(),
11007                                                    E->isListInitialization());
11008 }
11009 
11010 template<typename Derived>
11011 ExprResult
11012 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11013   if (E->isTypeOperand()) {
11014     TypeSourceInfo *TInfo
11015       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11016     if (!TInfo)
11017       return ExprError();
11018 
11019     if (!getDerived().AlwaysRebuild() &&
11020         TInfo == E->getTypeOperandSourceInfo())
11021       return E;
11022 
11023     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11024                                              TInfo, E->getEndLoc());
11025   }
11026 
11027   // We don't know whether the subexpression is potentially evaluated until
11028   // after we perform semantic analysis.  We speculatively assume it is
11029   // unevaluated; it will get fixed later if the subexpression is in fact
11030   // potentially evaluated.
11031   EnterExpressionEvaluationContext Unevaluated(
11032       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11033       Sema::ReuseLambdaContextDecl);
11034 
11035   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11036   if (SubExpr.isInvalid())
11037     return ExprError();
11038 
11039   if (!getDerived().AlwaysRebuild() &&
11040       SubExpr.get() == E->getExprOperand())
11041     return E;
11042 
11043   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11044                                            SubExpr.get(), E->getEndLoc());
11045 }
11046 
11047 template<typename Derived>
11048 ExprResult
11049 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11050   if (E->isTypeOperand()) {
11051     TypeSourceInfo *TInfo
11052       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11053     if (!TInfo)
11054       return ExprError();
11055 
11056     if (!getDerived().AlwaysRebuild() &&
11057         TInfo == E->getTypeOperandSourceInfo())
11058       return E;
11059 
11060     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11061                                              TInfo, E->getEndLoc());
11062   }
11063 
11064   EnterExpressionEvaluationContext Unevaluated(
11065       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11066 
11067   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11068   if (SubExpr.isInvalid())
11069     return ExprError();
11070 
11071   if (!getDerived().AlwaysRebuild() &&
11072       SubExpr.get() == E->getExprOperand())
11073     return E;
11074 
11075   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11076                                            SubExpr.get(), E->getEndLoc());
11077 }
11078 
11079 template<typename Derived>
11080 ExprResult
11081 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11082   return E;
11083 }
11084 
11085 template<typename Derived>
11086 ExprResult
11087 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11088                                                      CXXNullPtrLiteralExpr *E) {
11089   return E;
11090 }
11091 
11092 template<typename Derived>
11093 ExprResult
11094 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11095   QualType T = getSema().getCurrentThisType();
11096 
11097   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11098     // Mark it referenced in the new context regardless.
11099     // FIXME: this is a bit instantiation-specific.
11100     getSema().MarkThisReferenced(E);
11101     return E;
11102   }
11103 
11104   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11105 }
11106 
11107 template<typename Derived>
11108 ExprResult
11109 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11110   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11111   if (SubExpr.isInvalid())
11112     return ExprError();
11113 
11114   if (!getDerived().AlwaysRebuild() &&
11115       SubExpr.get() == E->getSubExpr())
11116     return E;
11117 
11118   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11119                                           E->isThrownVariableInScope());
11120 }
11121 
11122 template<typename Derived>
11123 ExprResult
11124 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11125   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11126       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11127   if (!Param)
11128     return ExprError();
11129 
11130   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11131       E->getUsedContext() == SemaRef.CurContext)
11132     return E;
11133 
11134   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11135 }
11136 
11137 template<typename Derived>
11138 ExprResult
11139 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11140   FieldDecl *Field = cast_or_null<FieldDecl>(
11141       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11142   if (!Field)
11143     return ExprError();
11144 
11145   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11146       E->getUsedContext() == SemaRef.CurContext)
11147     return E;
11148 
11149   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11150 }
11151 
11152 template<typename Derived>
11153 ExprResult
11154 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11155                                                     CXXScalarValueInitExpr *E) {
11156   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11157   if (!T)
11158     return ExprError();
11159 
11160   if (!getDerived().AlwaysRebuild() &&
11161       T == E->getTypeSourceInfo())
11162     return E;
11163 
11164   return getDerived().RebuildCXXScalarValueInitExpr(T,
11165                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11166                                                     E->getRParenLoc());
11167 }
11168 
11169 template<typename Derived>
11170 ExprResult
11171 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11172   // Transform the type that we're allocating
11173   TypeSourceInfo *AllocTypeInfo =
11174       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11175   if (!AllocTypeInfo)
11176     return ExprError();
11177 
11178   // Transform the size of the array we're allocating (if any).
11179   Optional<Expr *> ArraySize;
11180   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11181     ExprResult NewArraySize;
11182     if (*OldArraySize) {
11183       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11184       if (NewArraySize.isInvalid())
11185         return ExprError();
11186     }
11187     ArraySize = NewArraySize.get();
11188   }
11189 
11190   // Transform the placement arguments (if any).
11191   bool ArgumentChanged = false;
11192   SmallVector<Expr*, 8> PlacementArgs;
11193   if (getDerived().TransformExprs(E->getPlacementArgs(),
11194                                   E->getNumPlacementArgs(), true,
11195                                   PlacementArgs, &ArgumentChanged))
11196     return ExprError();
11197 
11198   // Transform the initializer (if any).
11199   Expr *OldInit = E->getInitializer();
11200   ExprResult NewInit;
11201   if (OldInit)
11202     NewInit = getDerived().TransformInitializer(OldInit, true);
11203   if (NewInit.isInvalid())
11204     return ExprError();
11205 
11206   // Transform new operator and delete operator.
11207   FunctionDecl *OperatorNew = nullptr;
11208   if (E->getOperatorNew()) {
11209     OperatorNew = cast_or_null<FunctionDecl>(
11210         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11211     if (!OperatorNew)
11212       return ExprError();
11213   }
11214 
11215   FunctionDecl *OperatorDelete = nullptr;
11216   if (E->getOperatorDelete()) {
11217     OperatorDelete = cast_or_null<FunctionDecl>(
11218         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11219     if (!OperatorDelete)
11220       return ExprError();
11221   }
11222 
11223   if (!getDerived().AlwaysRebuild() &&
11224       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11225       ArraySize == E->getArraySize() &&
11226       NewInit.get() == OldInit &&
11227       OperatorNew == E->getOperatorNew() &&
11228       OperatorDelete == E->getOperatorDelete() &&
11229       !ArgumentChanged) {
11230     // Mark any declarations we need as referenced.
11231     // FIXME: instantiation-specific.
11232     if (OperatorNew)
11233       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11234     if (OperatorDelete)
11235       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11236 
11237     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11238       QualType ElementType
11239         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11240       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11241         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11242         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11243           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11244         }
11245       }
11246     }
11247 
11248     return E;
11249   }
11250 
11251   QualType AllocType = AllocTypeInfo->getType();
11252   if (!ArraySize) {
11253     // If no array size was specified, but the new expression was
11254     // instantiated with an array type (e.g., "new T" where T is
11255     // instantiated with "int[4]"), extract the outer bound from the
11256     // array type as our array size. We do this with constant and
11257     // dependently-sized array types.
11258     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11259     if (!ArrayT) {
11260       // Do nothing
11261     } else if (const ConstantArrayType *ConsArrayT
11262                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11263       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11264                                          SemaRef.Context.getSizeType(),
11265                                          /*FIXME:*/ E->getBeginLoc());
11266       AllocType = ConsArrayT->getElementType();
11267     } else if (const DependentSizedArrayType *DepArrayT
11268                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11269       if (DepArrayT->getSizeExpr()) {
11270         ArraySize = DepArrayT->getSizeExpr();
11271         AllocType = DepArrayT->getElementType();
11272       }
11273     }
11274   }
11275 
11276   return getDerived().RebuildCXXNewExpr(
11277       E->getBeginLoc(), E->isGlobalNew(),
11278       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11279       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11280       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11281 }
11282 
11283 template<typename Derived>
11284 ExprResult
11285 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11286   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11287   if (Operand.isInvalid())
11288     return ExprError();
11289 
11290   // Transform the delete operator, if known.
11291   FunctionDecl *OperatorDelete = nullptr;
11292   if (E->getOperatorDelete()) {
11293     OperatorDelete = cast_or_null<FunctionDecl>(
11294         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11295     if (!OperatorDelete)
11296       return ExprError();
11297   }
11298 
11299   if (!getDerived().AlwaysRebuild() &&
11300       Operand.get() == E->getArgument() &&
11301       OperatorDelete == E->getOperatorDelete()) {
11302     // Mark any declarations we need as referenced.
11303     // FIXME: instantiation-specific.
11304     if (OperatorDelete)
11305       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11306 
11307     if (!E->getArgument()->isTypeDependent()) {
11308       QualType Destroyed = SemaRef.Context.getBaseElementType(
11309                                                          E->getDestroyedType());
11310       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11311         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11312         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11313                                        SemaRef.LookupDestructor(Record));
11314       }
11315     }
11316 
11317     return E;
11318   }
11319 
11320   return getDerived().RebuildCXXDeleteExpr(
11321       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11322 }
11323 
11324 template<typename Derived>
11325 ExprResult
11326 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11327                                                      CXXPseudoDestructorExpr *E) {
11328   ExprResult Base = getDerived().TransformExpr(E->getBase());
11329   if (Base.isInvalid())
11330     return ExprError();
11331 
11332   ParsedType ObjectTypePtr;
11333   bool MayBePseudoDestructor = false;
11334   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11335                                               E->getOperatorLoc(),
11336                                         E->isArrow()? tok::arrow : tok::period,
11337                                               ObjectTypePtr,
11338                                               MayBePseudoDestructor);
11339   if (Base.isInvalid())
11340     return ExprError();
11341 
11342   QualType ObjectType = ObjectTypePtr.get();
11343   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11344   if (QualifierLoc) {
11345     QualifierLoc
11346       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11347     if (!QualifierLoc)
11348       return ExprError();
11349   }
11350   CXXScopeSpec SS;
11351   SS.Adopt(QualifierLoc);
11352 
11353   PseudoDestructorTypeStorage Destroyed;
11354   if (E->getDestroyedTypeInfo()) {
11355     TypeSourceInfo *DestroyedTypeInfo
11356       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11357                                                 ObjectType, nullptr, SS);
11358     if (!DestroyedTypeInfo)
11359       return ExprError();
11360     Destroyed = DestroyedTypeInfo;
11361   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11362     // We aren't likely to be able to resolve the identifier down to a type
11363     // now anyway, so just retain the identifier.
11364     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11365                                             E->getDestroyedTypeLoc());
11366   } else {
11367     // Look for a destructor known with the given name.
11368     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11369                                               *E->getDestroyedTypeIdentifier(),
11370                                                 E->getDestroyedTypeLoc(),
11371                                                 /*Scope=*/nullptr,
11372                                                 SS, ObjectTypePtr,
11373                                                 false);
11374     if (!T)
11375       return ExprError();
11376 
11377     Destroyed
11378       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11379                                                  E->getDestroyedTypeLoc());
11380   }
11381 
11382   TypeSourceInfo *ScopeTypeInfo = nullptr;
11383   if (E->getScopeTypeInfo()) {
11384     CXXScopeSpec EmptySS;
11385     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11386                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11387     if (!ScopeTypeInfo)
11388       return ExprError();
11389   }
11390 
11391   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11392                                                      E->getOperatorLoc(),
11393                                                      E->isArrow(),
11394                                                      SS,
11395                                                      ScopeTypeInfo,
11396                                                      E->getColonColonLoc(),
11397                                                      E->getTildeLoc(),
11398                                                      Destroyed);
11399 }
11400 
11401 template <typename Derived>
11402 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11403                                                         bool RequiresADL,
11404                                                         LookupResult &R) {
11405   // Transform all the decls.
11406   bool AllEmptyPacks = true;
11407   for (auto *OldD : Old->decls()) {
11408     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11409     if (!InstD) {
11410       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11411       // This can happen because of dependent hiding.
11412       if (isa<UsingShadowDecl>(OldD))
11413         continue;
11414       else {
11415         R.clear();
11416         return true;
11417       }
11418     }
11419 
11420     // Expand using pack declarations.
11421     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11422     ArrayRef<NamedDecl*> Decls = SingleDecl;
11423     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11424       Decls = UPD->expansions();
11425 
11426     // Expand using declarations.
11427     for (auto *D : Decls) {
11428       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11429         for (auto *SD : UD->shadows())
11430           R.addDecl(SD);
11431       } else {
11432         R.addDecl(D);
11433       }
11434     }
11435 
11436     AllEmptyPacks &= Decls.empty();
11437   };
11438 
11439   // C++ [temp.res]/8.4.2:
11440   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11441   //   a name in the template definition found a using-declaration, but the
11442   //   lookup in the corresponding scope in the instantiation odoes not find
11443   //   any declarations because the using-declaration was a pack expansion and
11444   //   the corresponding pack is empty
11445   if (AllEmptyPacks && !RequiresADL) {
11446     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11447         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11448     return true;
11449   }
11450 
11451   // Resolve a kind, but don't do any further analysis.  If it's
11452   // ambiguous, the callee needs to deal with it.
11453   R.resolveKind();
11454   return false;
11455 }
11456 
11457 template<typename Derived>
11458 ExprResult
11459 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11460                                                   UnresolvedLookupExpr *Old) {
11461   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11462                  Sema::LookupOrdinaryName);
11463 
11464   // Transform the declaration set.
11465   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11466     return ExprError();
11467 
11468   // Rebuild the nested-name qualifier, if present.
11469   CXXScopeSpec SS;
11470   if (Old->getQualifierLoc()) {
11471     NestedNameSpecifierLoc QualifierLoc
11472       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11473     if (!QualifierLoc)
11474       return ExprError();
11475 
11476     SS.Adopt(QualifierLoc);
11477   }
11478 
11479   if (Old->getNamingClass()) {
11480     CXXRecordDecl *NamingClass
11481       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11482                                                             Old->getNameLoc(),
11483                                                         Old->getNamingClass()));
11484     if (!NamingClass) {
11485       R.clear();
11486       return ExprError();
11487     }
11488 
11489     R.setNamingClass(NamingClass);
11490   }
11491 
11492   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11493 
11494   // If we have neither explicit template arguments, nor the template keyword,
11495   // it's a normal declaration name or member reference.
11496   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11497     NamedDecl *D = R.getAsSingle<NamedDecl>();
11498     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11499     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11500     // give a good diagnostic.
11501     if (D && D->isCXXInstanceMember()) {
11502       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11503                                                      /*TemplateArgs=*/nullptr,
11504                                                      /*Scope=*/nullptr);
11505     }
11506 
11507     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11508   }
11509 
11510   // If we have template arguments, rebuild them, then rebuild the
11511   // templateid expression.
11512   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11513   if (Old->hasExplicitTemplateArgs() &&
11514       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11515                                               Old->getNumTemplateArgs(),
11516                                               TransArgs)) {
11517     R.clear();
11518     return ExprError();
11519   }
11520 
11521   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11522                                             Old->requiresADL(), &TransArgs);
11523 }
11524 
11525 template<typename Derived>
11526 ExprResult
11527 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11528   bool ArgChanged = false;
11529   SmallVector<TypeSourceInfo *, 4> Args;
11530   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11531     TypeSourceInfo *From = E->getArg(I);
11532     TypeLoc FromTL = From->getTypeLoc();
11533     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11534       TypeLocBuilder TLB;
11535       TLB.reserve(FromTL.getFullDataSize());
11536       QualType To = getDerived().TransformType(TLB, FromTL);
11537       if (To.isNull())
11538         return ExprError();
11539 
11540       if (To == From->getType())
11541         Args.push_back(From);
11542       else {
11543         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11544         ArgChanged = true;
11545       }
11546       continue;
11547     }
11548 
11549     ArgChanged = true;
11550 
11551     // We have a pack expansion. Instantiate it.
11552     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11553     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11554     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11555     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11556 
11557     // Determine whether the set of unexpanded parameter packs can and should
11558     // be expanded.
11559     bool Expand = true;
11560     bool RetainExpansion = false;
11561     Optional<unsigned> OrigNumExpansions =
11562         ExpansionTL.getTypePtr()->getNumExpansions();
11563     Optional<unsigned> NumExpansions = OrigNumExpansions;
11564     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11565                                              PatternTL.getSourceRange(),
11566                                              Unexpanded,
11567                                              Expand, RetainExpansion,
11568                                              NumExpansions))
11569       return ExprError();
11570 
11571     if (!Expand) {
11572       // The transform has determined that we should perform a simple
11573       // transformation on the pack expansion, producing another pack
11574       // expansion.
11575       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11576 
11577       TypeLocBuilder TLB;
11578       TLB.reserve(From->getTypeLoc().getFullDataSize());
11579 
11580       QualType To = getDerived().TransformType(TLB, PatternTL);
11581       if (To.isNull())
11582         return ExprError();
11583 
11584       To = getDerived().RebuildPackExpansionType(To,
11585                                                  PatternTL.getSourceRange(),
11586                                                  ExpansionTL.getEllipsisLoc(),
11587                                                  NumExpansions);
11588       if (To.isNull())
11589         return ExprError();
11590 
11591       PackExpansionTypeLoc ToExpansionTL
11592         = TLB.push<PackExpansionTypeLoc>(To);
11593       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11594       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11595       continue;
11596     }
11597 
11598     // Expand the pack expansion by substituting for each argument in the
11599     // pack(s).
11600     for (unsigned I = 0; I != *NumExpansions; ++I) {
11601       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11602       TypeLocBuilder TLB;
11603       TLB.reserve(PatternTL.getFullDataSize());
11604       QualType To = getDerived().TransformType(TLB, PatternTL);
11605       if (To.isNull())
11606         return ExprError();
11607 
11608       if (To->containsUnexpandedParameterPack()) {
11609         To = getDerived().RebuildPackExpansionType(To,
11610                                                    PatternTL.getSourceRange(),
11611                                                    ExpansionTL.getEllipsisLoc(),
11612                                                    NumExpansions);
11613         if (To.isNull())
11614           return ExprError();
11615 
11616         PackExpansionTypeLoc ToExpansionTL
11617           = TLB.push<PackExpansionTypeLoc>(To);
11618         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11619       }
11620 
11621       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11622     }
11623 
11624     if (!RetainExpansion)
11625       continue;
11626 
11627     // If we're supposed to retain a pack expansion, do so by temporarily
11628     // forgetting the partially-substituted parameter pack.
11629     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11630 
11631     TypeLocBuilder TLB;
11632     TLB.reserve(From->getTypeLoc().getFullDataSize());
11633 
11634     QualType To = getDerived().TransformType(TLB, PatternTL);
11635     if (To.isNull())
11636       return ExprError();
11637 
11638     To = getDerived().RebuildPackExpansionType(To,
11639                                                PatternTL.getSourceRange(),
11640                                                ExpansionTL.getEllipsisLoc(),
11641                                                NumExpansions);
11642     if (To.isNull())
11643       return ExprError();
11644 
11645     PackExpansionTypeLoc ToExpansionTL
11646       = TLB.push<PackExpansionTypeLoc>(To);
11647     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11648     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11649   }
11650 
11651   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11652     return E;
11653 
11654   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11655                                        E->getEndLoc());
11656 }
11657 
11658 template<typename Derived>
11659 ExprResult
11660 TreeTransform<Derived>::TransformConceptSpecializationExpr(
11661                                                  ConceptSpecializationExpr *E) {
11662   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
11663   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
11664   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11665                                               Old->NumTemplateArgs, TransArgs))
11666     return ExprError();
11667 
11668   return getDerived().RebuildConceptSpecializationExpr(
11669       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
11670       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
11671       &TransArgs);
11672 }
11673 
11674 template<typename Derived>
11675 ExprResult
11676 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
11677   SmallVector<ParmVarDecl*, 4> TransParams;
11678   SmallVector<QualType, 4> TransParamTypes;
11679   Sema::ExtParameterInfoBuilder ExtParamInfos;
11680 
11681   // C++2a [expr.prim.req]p2
11682   // Expressions appearing within a requirement-body are unevaluated operands.
11683   EnterExpressionEvaluationContext Ctx(
11684       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11685 
11686   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
11687       getSema().Context, getSema().CurContext,
11688       E->getBody()->getBeginLoc());
11689 
11690   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
11691 
11692   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
11693                                                E->getLocalParameters(),
11694                                                /*ParamTypes=*/nullptr,
11695                                                /*ParamInfos=*/nullptr,
11696                                                TransParamTypes, &TransParams,
11697                                                ExtParamInfos))
11698     return ExprError();
11699 
11700   for (ParmVarDecl *Param : TransParams)
11701     Param->setDeclContext(Body);
11702 
11703   SmallVector<concepts::Requirement *, 4> TransReqs;
11704   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
11705                                                      TransReqs))
11706     return ExprError();
11707 
11708   for (concepts::Requirement *Req : TransReqs) {
11709     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
11710       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
11711         ER->getReturnTypeRequirement()
11712                 .getTypeConstraintTemplateParameterList()->getParam(0)
11713                 ->setDeclContext(Body);
11714       }
11715     }
11716   }
11717 
11718   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
11719                                           TransParams, TransReqs,
11720                                           E->getRBraceLoc());
11721 }
11722 
11723 template<typename Derived>
11724 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
11725     ArrayRef<concepts::Requirement *> Reqs,
11726     SmallVectorImpl<concepts::Requirement *> &Transformed) {
11727   for (concepts::Requirement *Req : Reqs) {
11728     concepts::Requirement *TransReq = nullptr;
11729     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
11730       TransReq = getDerived().TransformTypeRequirement(TypeReq);
11731     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
11732       TransReq = getDerived().TransformExprRequirement(ExprReq);
11733     else
11734       TransReq = getDerived().TransformNestedRequirement(
11735                      cast<concepts::NestedRequirement>(Req));
11736     if (!TransReq)
11737       return true;
11738     Transformed.push_back(TransReq);
11739   }
11740   return false;
11741 }
11742 
11743 template<typename Derived>
11744 concepts::TypeRequirement *
11745 TreeTransform<Derived>::TransformTypeRequirement(
11746     concepts::TypeRequirement *Req) {
11747   if (Req->isSubstitutionFailure()) {
11748     if (getDerived().AlwaysRebuild())
11749       return getDerived().RebuildTypeRequirement(
11750               Req->getSubstitutionDiagnostic());
11751     return Req;
11752   }
11753   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
11754   if (!TransType)
11755     return nullptr;
11756   return getDerived().RebuildTypeRequirement(TransType);
11757 }
11758 
11759 template<typename Derived>
11760 concepts::ExprRequirement *
11761 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
11762   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
11763   if (Req->isExprSubstitutionFailure())
11764     TransExpr = Req->getExprSubstitutionDiagnostic();
11765   else {
11766     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
11767     if (TransExprRes.isInvalid())
11768       return nullptr;
11769     TransExpr = TransExprRes.get();
11770   }
11771 
11772   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
11773   const auto &RetReq = Req->getReturnTypeRequirement();
11774   if (RetReq.isEmpty())
11775     TransRetReq.emplace();
11776   else if (RetReq.isSubstitutionFailure())
11777     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
11778   else if (RetReq.isTypeConstraint()) {
11779     TemplateParameterList *OrigTPL =
11780         RetReq.getTypeConstraintTemplateParameterList();
11781     TemplateParameterList *TPL =
11782         getDerived().TransformTemplateParameterList(OrigTPL);
11783     if (!TPL)
11784       return nullptr;
11785     TransRetReq.emplace(TPL);
11786   }
11787   assert(TransRetReq.hasValue() &&
11788          "All code paths leading here must set TransRetReq");
11789   if (Expr *E = TransExpr.dyn_cast<Expr *>())
11790     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
11791                                                Req->getNoexceptLoc(),
11792                                                std::move(*TransRetReq));
11793   return getDerived().RebuildExprRequirement(
11794       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
11795       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
11796 }
11797 
11798 template<typename Derived>
11799 concepts::NestedRequirement *
11800 TreeTransform<Derived>::TransformNestedRequirement(
11801     concepts::NestedRequirement *Req) {
11802   if (Req->isSubstitutionFailure()) {
11803     if (getDerived().AlwaysRebuild())
11804       return getDerived().RebuildNestedRequirement(
11805           Req->getSubstitutionDiagnostic());
11806     return Req;
11807   }
11808   ExprResult TransConstraint =
11809       getDerived().TransformExpr(Req->getConstraintExpr());
11810   if (TransConstraint.isInvalid())
11811     return nullptr;
11812   return getDerived().RebuildNestedRequirement(TransConstraint.get());
11813 }
11814 
11815 template<typename Derived>
11816 ExprResult
11817 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
11818   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
11819   if (!T)
11820     return ExprError();
11821 
11822   if (!getDerived().AlwaysRebuild() &&
11823       T == E->getQueriedTypeSourceInfo())
11824     return E;
11825 
11826   ExprResult SubExpr;
11827   {
11828     EnterExpressionEvaluationContext Unevaluated(
11829         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11830     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
11831     if (SubExpr.isInvalid())
11832       return ExprError();
11833 
11834     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
11835       return E;
11836   }
11837 
11838   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
11839                                             SubExpr.get(), E->getEndLoc());
11840 }
11841 
11842 template<typename Derived>
11843 ExprResult
11844 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
11845   ExprResult SubExpr;
11846   {
11847     EnterExpressionEvaluationContext Unevaluated(
11848         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11849     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
11850     if (SubExpr.isInvalid())
11851       return ExprError();
11852 
11853     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
11854       return E;
11855   }
11856 
11857   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
11858                                              SubExpr.get(), E->getEndLoc());
11859 }
11860 
11861 template <typename Derived>
11862 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
11863     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
11864     TypeSourceInfo **RecoveryTSI) {
11865   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
11866       DRE, AddrTaken, RecoveryTSI);
11867 
11868   // Propagate both errors and recovered types, which return ExprEmpty.
11869   if (!NewDRE.isUsable())
11870     return NewDRE;
11871 
11872   // We got an expr, wrap it up in parens.
11873   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
11874     return PE;
11875   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
11876                                        PE->getRParen());
11877 }
11878 
11879 template <typename Derived>
11880 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11881     DependentScopeDeclRefExpr *E) {
11882   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
11883                                             nullptr);
11884 }
11885 
11886 template<typename Derived>
11887 ExprResult
11888 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11889                                                DependentScopeDeclRefExpr *E,
11890                                                bool IsAddressOfOperand,
11891                                                TypeSourceInfo **RecoveryTSI) {
11892   assert(E->getQualifierLoc());
11893   NestedNameSpecifierLoc QualifierLoc
11894   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11895   if (!QualifierLoc)
11896     return ExprError();
11897   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11898 
11899   // TODO: If this is a conversion-function-id, verify that the
11900   // destination type name (if present) resolves the same way after
11901   // instantiation as it did in the local scope.
11902 
11903   DeclarationNameInfo NameInfo
11904     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
11905   if (!NameInfo.getName())
11906     return ExprError();
11907 
11908   if (!E->hasExplicitTemplateArgs()) {
11909     if (!getDerived().AlwaysRebuild() &&
11910         QualifierLoc == E->getQualifierLoc() &&
11911         // Note: it is sufficient to compare the Name component of NameInfo:
11912         // if name has not changed, DNLoc has not changed either.
11913         NameInfo.getName() == E->getDeclName())
11914       return E;
11915 
11916     return getDerived().RebuildDependentScopeDeclRefExpr(
11917         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
11918         IsAddressOfOperand, RecoveryTSI);
11919   }
11920 
11921   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11922   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11923                                               E->getNumTemplateArgs(),
11924                                               TransArgs))
11925     return ExprError();
11926 
11927   return getDerived().RebuildDependentScopeDeclRefExpr(
11928       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
11929       RecoveryTSI);
11930 }
11931 
11932 template<typename Derived>
11933 ExprResult
11934 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
11935   // CXXConstructExprs other than for list-initialization and
11936   // CXXTemporaryObjectExpr are always implicit, so when we have
11937   // a 1-argument construction we just transform that argument.
11938   if (getDerived().AllowSkippingCXXConstructExpr() &&
11939       ((E->getNumArgs() == 1 ||
11940         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
11941        (!getDerived().DropCallArgument(E->getArg(0))) &&
11942        !E->isListInitialization()))
11943     return getDerived().TransformExpr(E->getArg(0));
11944 
11945   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
11946 
11947   QualType T = getDerived().TransformType(E->getType());
11948   if (T.isNull())
11949     return ExprError();
11950 
11951   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11952       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11953   if (!Constructor)
11954     return ExprError();
11955 
11956   bool ArgumentChanged = false;
11957   SmallVector<Expr*, 8> Args;
11958   {
11959     EnterExpressionEvaluationContext Context(
11960         getSema(), EnterExpressionEvaluationContext::InitList,
11961         E->isListInitialization());
11962     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11963                                     &ArgumentChanged))
11964       return ExprError();
11965   }
11966 
11967   if (!getDerived().AlwaysRebuild() &&
11968       T == E->getType() &&
11969       Constructor == E->getConstructor() &&
11970       !ArgumentChanged) {
11971     // Mark the constructor as referenced.
11972     // FIXME: Instantiation-specific
11973     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11974     return E;
11975   }
11976 
11977   return getDerived().RebuildCXXConstructExpr(
11978       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
11979       E->hadMultipleCandidates(), E->isListInitialization(),
11980       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
11981       E->getConstructionKind(), E->getParenOrBraceRange());
11982 }
11983 
11984 template<typename Derived>
11985 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
11986     CXXInheritedCtorInitExpr *E) {
11987   QualType T = getDerived().TransformType(E->getType());
11988   if (T.isNull())
11989     return ExprError();
11990 
11991   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11992       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11993   if (!Constructor)
11994     return ExprError();
11995 
11996   if (!getDerived().AlwaysRebuild() &&
11997       T == E->getType() &&
11998       Constructor == E->getConstructor()) {
11999     // Mark the constructor as referenced.
12000     // FIXME: Instantiation-specific
12001     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12002     return E;
12003   }
12004 
12005   return getDerived().RebuildCXXInheritedCtorInitExpr(
12006       T, E->getLocation(), Constructor,
12007       E->constructsVBase(), E->inheritedFromVBase());
12008 }
12009 
12010 /// Transform a C++ temporary-binding expression.
12011 ///
12012 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12013 /// transform the subexpression and return that.
12014 template<typename Derived>
12015 ExprResult
12016 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12017   return getDerived().TransformExpr(E->getSubExpr());
12018 }
12019 
12020 /// Transform a C++ expression that contains cleanups that should
12021 /// be run after the expression is evaluated.
12022 ///
12023 /// Since ExprWithCleanups nodes are implicitly generated, we
12024 /// just transform the subexpression and return that.
12025 template<typename Derived>
12026 ExprResult
12027 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12028   return getDerived().TransformExpr(E->getSubExpr());
12029 }
12030 
12031 template<typename Derived>
12032 ExprResult
12033 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12034                                                     CXXTemporaryObjectExpr *E) {
12035   TypeSourceInfo *T =
12036       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12037   if (!T)
12038     return ExprError();
12039 
12040   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12041       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12042   if (!Constructor)
12043     return ExprError();
12044 
12045   bool ArgumentChanged = false;
12046   SmallVector<Expr*, 8> Args;
12047   Args.reserve(E->getNumArgs());
12048   {
12049     EnterExpressionEvaluationContext Context(
12050         getSema(), EnterExpressionEvaluationContext::InitList,
12051         E->isListInitialization());
12052     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12053                        &ArgumentChanged))
12054       return ExprError();
12055   }
12056 
12057   if (!getDerived().AlwaysRebuild() &&
12058       T == E->getTypeSourceInfo() &&
12059       Constructor == E->getConstructor() &&
12060       !ArgumentChanged) {
12061     // FIXME: Instantiation-specific
12062     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12063     return SemaRef.MaybeBindToTemporary(E);
12064   }
12065 
12066   // FIXME: We should just pass E->isListInitialization(), but we're not
12067   // prepared to handle list-initialization without a child InitListExpr.
12068   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12069   return getDerived().RebuildCXXTemporaryObjectExpr(
12070       T, LParenLoc, Args, E->getEndLoc(),
12071       /*ListInitialization=*/LParenLoc.isInvalid());
12072 }
12073 
12074 template<typename Derived>
12075 ExprResult
12076 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12077   // Transform any init-capture expressions before entering the scope of the
12078   // lambda body, because they are not semantically within that scope.
12079   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12080   struct TransformedInitCapture {
12081     // The location of the ... if the result is retaining a pack expansion.
12082     SourceLocation EllipsisLoc;
12083     // Zero or more expansions of the init-capture.
12084     SmallVector<InitCaptureInfoTy, 4> Expansions;
12085   };
12086   SmallVector<TransformedInitCapture, 4> InitCaptures;
12087   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12088   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12089                                     CEnd = E->capture_end();
12090        C != CEnd; ++C) {
12091     if (!E->isInitCapture(C))
12092       continue;
12093 
12094     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12095     VarDecl *OldVD = C->getCapturedVar();
12096 
12097     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12098                                 Optional<unsigned> NumExpansions) {
12099       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12100           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12101 
12102       if (NewExprInitResult.isInvalid()) {
12103         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12104         return;
12105       }
12106       Expr *NewExprInit = NewExprInitResult.get();
12107 
12108       QualType NewInitCaptureType =
12109           getSema().buildLambdaInitCaptureInitialization(
12110               C->getLocation(), OldVD->getType()->isReferenceType(),
12111               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12112               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12113               NewExprInit);
12114       Result.Expansions.push_back(
12115           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12116     };
12117 
12118     // If this is an init-capture pack, consider expanding the pack now.
12119     if (OldVD->isParameterPack()) {
12120       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12121                                              ->getTypeLoc()
12122                                              .castAs<PackExpansionTypeLoc>();
12123       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12124       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12125 
12126       // Determine whether the set of unexpanded parameter packs can and should
12127       // be expanded.
12128       bool Expand = true;
12129       bool RetainExpansion = false;
12130       Optional<unsigned> OrigNumExpansions =
12131           ExpansionTL.getTypePtr()->getNumExpansions();
12132       Optional<unsigned> NumExpansions = OrigNumExpansions;
12133       if (getDerived().TryExpandParameterPacks(
12134               ExpansionTL.getEllipsisLoc(),
12135               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12136               RetainExpansion, NumExpansions))
12137         return ExprError();
12138       if (Expand) {
12139         for (unsigned I = 0; I != *NumExpansions; ++I) {
12140           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12141           SubstInitCapture(SourceLocation(), None);
12142         }
12143       }
12144       if (!Expand || RetainExpansion) {
12145         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12146         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12147         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12148       }
12149     } else {
12150       SubstInitCapture(SourceLocation(), None);
12151     }
12152   }
12153 
12154   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12155   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12156 
12157   // Transform the template parameters, and add them to the current
12158   // instantiation scope. The null case is handled correctly.
12159   auto TPL = getDerived().TransformTemplateParameterList(
12160       E->getTemplateParameterList());
12161   LSI->GLTemplateParameterList = TPL;
12162 
12163   // Transform the type of the original lambda's call operator.
12164   // The transformation MUST be done in the CurrentInstantiationScope since
12165   // it introduces a mapping of the original to the newly created
12166   // transformed parameters.
12167   TypeSourceInfo *NewCallOpTSI = nullptr;
12168   {
12169     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12170     FunctionProtoTypeLoc OldCallOpFPTL =
12171         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12172 
12173     TypeLocBuilder NewCallOpTLBuilder;
12174     SmallVector<QualType, 4> ExceptionStorage;
12175     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12176     QualType NewCallOpType = TransformFunctionProtoType(
12177         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12178         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12179           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12180                                               ExceptionStorage, Changed);
12181         });
12182     if (NewCallOpType.isNull())
12183       return ExprError();
12184     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12185                                                         NewCallOpType);
12186   }
12187 
12188   // Transform the trailing requires clause
12189   ExprResult NewTrailingRequiresClause;
12190   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12191     // FIXME: Concepts: Substitution into requires clause should only happen
12192     //                  when checking satisfaction.
12193     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12194 
12195   // Create the local class that will describe the lambda.
12196   // FIXME: KnownDependent below is wrong when substituting inside a templated
12197   // context that isn't a DeclContext (such as a variable template).
12198   CXXRecordDecl *OldClass = E->getLambdaClass();
12199   CXXRecordDecl *Class
12200     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12201                                         NewCallOpTSI,
12202                                         /*KnownDependent=*/false,
12203                                         E->getCaptureDefault());
12204   getDerived().transformedLocalDecl(OldClass, {Class});
12205 
12206   Optional<std::tuple<unsigned, bool, Decl *>> Mangling;
12207   if (getDerived().ReplacingOriginal())
12208     Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(),
12209                                OldClass->hasKnownLambdaInternalLinkage(),
12210                                OldClass->getLambdaContextDecl());
12211 
12212   // Build the call operator.
12213   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12214       Class, E->getIntroducerRange(), NewCallOpTSI,
12215       E->getCallOperator()->getEndLoc(),
12216       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12217       E->getCallOperator()->getConstexprKind(),
12218       NewTrailingRequiresClause.get());
12219 
12220   LSI->CallOperator = NewCallOperator;
12221 
12222   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
12223        I != NumParams; ++I) {
12224     auto *P = NewCallOperator->getParamDecl(I);
12225     if (P->hasUninstantiatedDefaultArg()) {
12226       EnterExpressionEvaluationContext Eval(
12227           getSema(),
12228           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
12229       ExprResult R = getDerived().TransformExpr(
12230           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
12231       P->setDefaultArg(R.get());
12232     }
12233   }
12234 
12235   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12236   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12237 
12238   // Number the lambda for linkage purposes if necessary.
12239   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12240 
12241   // Introduce the context of the call operator.
12242   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12243                                  /*NewThisContext*/false);
12244 
12245   // Enter the scope of the lambda.
12246   getSema().buildLambdaScope(LSI, NewCallOperator,
12247                              E->getIntroducerRange(),
12248                              E->getCaptureDefault(),
12249                              E->getCaptureDefaultLoc(),
12250                              E->hasExplicitParameters(),
12251                              E->hasExplicitResultType(),
12252                              E->isMutable());
12253 
12254   bool Invalid = false;
12255 
12256   // Transform captures.
12257   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12258                                  CEnd = E->capture_end();
12259        C != CEnd; ++C) {
12260     // When we hit the first implicit capture, tell Sema that we've finished
12261     // the list of explicit captures.
12262     if (C->isImplicit())
12263       break;
12264 
12265     // Capturing 'this' is trivial.
12266     if (C->capturesThis()) {
12267       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12268                                     /*BuildAndDiagnose*/ true, nullptr,
12269                                     C->getCaptureKind() == LCK_StarThis);
12270       continue;
12271     }
12272     // Captured expression will be recaptured during captured variables
12273     // rebuilding.
12274     if (C->capturesVLAType())
12275       continue;
12276 
12277     // Rebuild init-captures, including the implied field declaration.
12278     if (E->isInitCapture(C)) {
12279       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12280 
12281       VarDecl *OldVD = C->getCapturedVar();
12282       llvm::SmallVector<Decl*, 4> NewVDs;
12283 
12284       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12285         ExprResult Init = Info.first;
12286         QualType InitQualType = Info.second;
12287         if (Init.isInvalid() || InitQualType.isNull()) {
12288           Invalid = true;
12289           break;
12290         }
12291         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12292             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12293             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12294         if (!NewVD) {
12295           Invalid = true;
12296           break;
12297         }
12298         NewVDs.push_back(NewVD);
12299         getSema().addInitCapture(LSI, NewVD);
12300       }
12301 
12302       if (Invalid)
12303         break;
12304 
12305       getDerived().transformedLocalDecl(OldVD, NewVDs);
12306       continue;
12307     }
12308 
12309     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12310 
12311     // Determine the capture kind for Sema.
12312     Sema::TryCaptureKind Kind
12313       = C->isImplicit()? Sema::TryCapture_Implicit
12314                        : C->getCaptureKind() == LCK_ByCopy
12315                            ? Sema::TryCapture_ExplicitByVal
12316                            : Sema::TryCapture_ExplicitByRef;
12317     SourceLocation EllipsisLoc;
12318     if (C->isPackExpansion()) {
12319       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12320       bool ShouldExpand = false;
12321       bool RetainExpansion = false;
12322       Optional<unsigned> NumExpansions;
12323       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12324                                                C->getLocation(),
12325                                                Unexpanded,
12326                                                ShouldExpand, RetainExpansion,
12327                                                NumExpansions)) {
12328         Invalid = true;
12329         continue;
12330       }
12331 
12332       if (ShouldExpand) {
12333         // The transform has determined that we should perform an expansion;
12334         // transform and capture each of the arguments.
12335         // expansion of the pattern. Do so.
12336         VarDecl *Pack = C->getCapturedVar();
12337         for (unsigned I = 0; I != *NumExpansions; ++I) {
12338           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12339           VarDecl *CapturedVar
12340             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12341                                                                Pack));
12342           if (!CapturedVar) {
12343             Invalid = true;
12344             continue;
12345           }
12346 
12347           // Capture the transformed variable.
12348           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12349         }
12350 
12351         // FIXME: Retain a pack expansion if RetainExpansion is true.
12352 
12353         continue;
12354       }
12355 
12356       EllipsisLoc = C->getEllipsisLoc();
12357     }
12358 
12359     // Transform the captured variable.
12360     VarDecl *CapturedVar
12361       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12362                                                          C->getCapturedVar()));
12363     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12364       Invalid = true;
12365       continue;
12366     }
12367 
12368     // Capture the transformed variable.
12369     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12370                                  EllipsisLoc);
12371   }
12372   getSema().finishLambdaExplicitCaptures(LSI);
12373 
12374   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12375   // evaluation context even if we're not transforming the function body.
12376   getSema().PushExpressionEvaluationContext(
12377       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12378 
12379   // Instantiate the body of the lambda expression.
12380   StmtResult Body =
12381       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12382 
12383   // ActOnLambda* will pop the function scope for us.
12384   FuncScopeCleanup.disable();
12385 
12386   if (Body.isInvalid()) {
12387     SavedContext.pop();
12388     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12389                                /*IsInstantiation=*/true);
12390     return ExprError();
12391   }
12392 
12393   // Copy the LSI before ActOnFinishFunctionBody removes it.
12394   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12395   // the call operator.
12396   auto LSICopy = *LSI;
12397   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12398                                     /*IsInstantiation*/ true);
12399   SavedContext.pop();
12400 
12401   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12402                                    &LSICopy);
12403 }
12404 
12405 template<typename Derived>
12406 StmtResult
12407 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12408   return TransformStmt(S);
12409 }
12410 
12411 template<typename Derived>
12412 StmtResult
12413 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12414   // Transform captures.
12415   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12416                                  CEnd = E->capture_end();
12417        C != CEnd; ++C) {
12418     // When we hit the first implicit capture, tell Sema that we've finished
12419     // the list of explicit captures.
12420     if (!C->isImplicit())
12421       continue;
12422 
12423     // Capturing 'this' is trivial.
12424     if (C->capturesThis()) {
12425       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12426                                     /*BuildAndDiagnose*/ true, nullptr,
12427                                     C->getCaptureKind() == LCK_StarThis);
12428       continue;
12429     }
12430     // Captured expression will be recaptured during captured variables
12431     // rebuilding.
12432     if (C->capturesVLAType())
12433       continue;
12434 
12435     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12436     assert(!E->isInitCapture(C) && "implicit init-capture?");
12437 
12438     // Transform the captured variable.
12439     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12440         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12441     if (!CapturedVar || CapturedVar->isInvalidDecl())
12442       return StmtError();
12443 
12444     // Capture the transformed variable.
12445     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12446   }
12447 
12448   return S;
12449 }
12450 
12451 template<typename Derived>
12452 ExprResult
12453 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12454                                                   CXXUnresolvedConstructExpr *E) {
12455   TypeSourceInfo *T =
12456       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12457   if (!T)
12458     return ExprError();
12459 
12460   bool ArgumentChanged = false;
12461   SmallVector<Expr*, 8> Args;
12462   Args.reserve(E->arg_size());
12463   {
12464     EnterExpressionEvaluationContext Context(
12465         getSema(), EnterExpressionEvaluationContext::InitList,
12466         E->isListInitialization());
12467     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
12468                                     &ArgumentChanged))
12469       return ExprError();
12470   }
12471 
12472   if (!getDerived().AlwaysRebuild() &&
12473       T == E->getTypeSourceInfo() &&
12474       !ArgumentChanged)
12475     return E;
12476 
12477   // FIXME: we're faking the locations of the commas
12478   return getDerived().RebuildCXXUnresolvedConstructExpr(
12479       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12480 }
12481 
12482 template<typename Derived>
12483 ExprResult
12484 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12485                                              CXXDependentScopeMemberExpr *E) {
12486   // Transform the base of the expression.
12487   ExprResult Base((Expr*) nullptr);
12488   Expr *OldBase;
12489   QualType BaseType;
12490   QualType ObjectType;
12491   if (!E->isImplicitAccess()) {
12492     OldBase = E->getBase();
12493     Base = getDerived().TransformExpr(OldBase);
12494     if (Base.isInvalid())
12495       return ExprError();
12496 
12497     // Start the member reference and compute the object's type.
12498     ParsedType ObjectTy;
12499     bool MayBePseudoDestructor = false;
12500     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12501                                                 E->getOperatorLoc(),
12502                                       E->isArrow()? tok::arrow : tok::period,
12503                                                 ObjectTy,
12504                                                 MayBePseudoDestructor);
12505     if (Base.isInvalid())
12506       return ExprError();
12507 
12508     ObjectType = ObjectTy.get();
12509     BaseType = ((Expr*) Base.get())->getType();
12510   } else {
12511     OldBase = nullptr;
12512     BaseType = getDerived().TransformType(E->getBaseType());
12513     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12514   }
12515 
12516   // Transform the first part of the nested-name-specifier that qualifies
12517   // the member name.
12518   NamedDecl *FirstQualifierInScope
12519     = getDerived().TransformFirstQualifierInScope(
12520                                             E->getFirstQualifierFoundInScope(),
12521                                             E->getQualifierLoc().getBeginLoc());
12522 
12523   NestedNameSpecifierLoc QualifierLoc;
12524   if (E->getQualifier()) {
12525     QualifierLoc
12526       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12527                                                      ObjectType,
12528                                                      FirstQualifierInScope);
12529     if (!QualifierLoc)
12530       return ExprError();
12531   }
12532 
12533   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12534 
12535   // TODO: If this is a conversion-function-id, verify that the
12536   // destination type name (if present) resolves the same way after
12537   // instantiation as it did in the local scope.
12538 
12539   DeclarationNameInfo NameInfo
12540     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12541   if (!NameInfo.getName())
12542     return ExprError();
12543 
12544   if (!E->hasExplicitTemplateArgs()) {
12545     // This is a reference to a member without an explicitly-specified
12546     // template argument list. Optimize for this common case.
12547     if (!getDerived().AlwaysRebuild() &&
12548         Base.get() == OldBase &&
12549         BaseType == E->getBaseType() &&
12550         QualifierLoc == E->getQualifierLoc() &&
12551         NameInfo.getName() == E->getMember() &&
12552         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12553       return E;
12554 
12555     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12556                                                        BaseType,
12557                                                        E->isArrow(),
12558                                                        E->getOperatorLoc(),
12559                                                        QualifierLoc,
12560                                                        TemplateKWLoc,
12561                                                        FirstQualifierInScope,
12562                                                        NameInfo,
12563                                                        /*TemplateArgs*/nullptr);
12564   }
12565 
12566   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12567   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12568                                               E->getNumTemplateArgs(),
12569                                               TransArgs))
12570     return ExprError();
12571 
12572   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12573                                                      BaseType,
12574                                                      E->isArrow(),
12575                                                      E->getOperatorLoc(),
12576                                                      QualifierLoc,
12577                                                      TemplateKWLoc,
12578                                                      FirstQualifierInScope,
12579                                                      NameInfo,
12580                                                      &TransArgs);
12581 }
12582 
12583 template<typename Derived>
12584 ExprResult
12585 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12586   // Transform the base of the expression.
12587   ExprResult Base((Expr*) nullptr);
12588   QualType BaseType;
12589   if (!Old->isImplicitAccess()) {
12590     Base = getDerived().TransformExpr(Old->getBase());
12591     if (Base.isInvalid())
12592       return ExprError();
12593     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12594                                                      Old->isArrow());
12595     if (Base.isInvalid())
12596       return ExprError();
12597     BaseType = Base.get()->getType();
12598   } else {
12599     BaseType = getDerived().TransformType(Old->getBaseType());
12600   }
12601 
12602   NestedNameSpecifierLoc QualifierLoc;
12603   if (Old->getQualifierLoc()) {
12604     QualifierLoc
12605     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12606     if (!QualifierLoc)
12607       return ExprError();
12608   }
12609 
12610   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12611 
12612   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12613                  Sema::LookupOrdinaryName);
12614 
12615   // Transform the declaration set.
12616   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12617     return ExprError();
12618 
12619   // Determine the naming class.
12620   if (Old->getNamingClass()) {
12621     CXXRecordDecl *NamingClass
12622       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12623                                                           Old->getMemberLoc(),
12624                                                         Old->getNamingClass()));
12625     if (!NamingClass)
12626       return ExprError();
12627 
12628     R.setNamingClass(NamingClass);
12629   }
12630 
12631   TemplateArgumentListInfo TransArgs;
12632   if (Old->hasExplicitTemplateArgs()) {
12633     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12634     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12635     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12636                                                 Old->getNumTemplateArgs(),
12637                                                 TransArgs))
12638       return ExprError();
12639   }
12640 
12641   // FIXME: to do this check properly, we will need to preserve the
12642   // first-qualifier-in-scope here, just in case we had a dependent
12643   // base (and therefore couldn't do the check) and a
12644   // nested-name-qualifier (and therefore could do the lookup).
12645   NamedDecl *FirstQualifierInScope = nullptr;
12646 
12647   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12648                                                   BaseType,
12649                                                   Old->getOperatorLoc(),
12650                                                   Old->isArrow(),
12651                                                   QualifierLoc,
12652                                                   TemplateKWLoc,
12653                                                   FirstQualifierInScope,
12654                                                   R,
12655                                               (Old->hasExplicitTemplateArgs()
12656                                                   ? &TransArgs : nullptr));
12657 }
12658 
12659 template<typename Derived>
12660 ExprResult
12661 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12662   EnterExpressionEvaluationContext Unevaluated(
12663       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12664   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12665   if (SubExpr.isInvalid())
12666     return ExprError();
12667 
12668   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
12669     return E;
12670 
12671   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
12672 }
12673 
12674 template<typename Derived>
12675 ExprResult
12676 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
12677   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
12678   if (Pattern.isInvalid())
12679     return ExprError();
12680 
12681   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
12682     return E;
12683 
12684   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
12685                                            E->getNumExpansions());
12686 }
12687 
12688 template<typename Derived>
12689 ExprResult
12690 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
12691   // If E is not value-dependent, then nothing will change when we transform it.
12692   // Note: This is an instantiation-centric view.
12693   if (!E->isValueDependent())
12694     return E;
12695 
12696   EnterExpressionEvaluationContext Unevaluated(
12697       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
12698 
12699   ArrayRef<TemplateArgument> PackArgs;
12700   TemplateArgument ArgStorage;
12701 
12702   // Find the argument list to transform.
12703   if (E->isPartiallySubstituted()) {
12704     PackArgs = E->getPartialArguments();
12705   } else if (E->isValueDependent()) {
12706     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
12707     bool ShouldExpand = false;
12708     bool RetainExpansion = false;
12709     Optional<unsigned> NumExpansions;
12710     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
12711                                              Unexpanded,
12712                                              ShouldExpand, RetainExpansion,
12713                                              NumExpansions))
12714       return ExprError();
12715 
12716     // If we need to expand the pack, build a template argument from it and
12717     // expand that.
12718     if (ShouldExpand) {
12719       auto *Pack = E->getPack();
12720       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
12721         ArgStorage = getSema().Context.getPackExpansionType(
12722             getSema().Context.getTypeDeclType(TTPD), None);
12723       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
12724         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
12725       } else {
12726         auto *VD = cast<ValueDecl>(Pack);
12727         ExprResult DRE = getSema().BuildDeclRefExpr(
12728             VD, VD->getType().getNonLValueExprType(getSema().Context),
12729             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
12730             E->getPackLoc());
12731         if (DRE.isInvalid())
12732           return ExprError();
12733         ArgStorage = new (getSema().Context) PackExpansionExpr(
12734             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
12735       }
12736       PackArgs = ArgStorage;
12737     }
12738   }
12739 
12740   // If we're not expanding the pack, just transform the decl.
12741   if (!PackArgs.size()) {
12742     auto *Pack = cast_or_null<NamedDecl>(
12743         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
12744     if (!Pack)
12745       return ExprError();
12746     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
12747                                               E->getPackLoc(),
12748                                               E->getRParenLoc(), None, None);
12749   }
12750 
12751   // Try to compute the result without performing a partial substitution.
12752   Optional<unsigned> Result = 0;
12753   for (const TemplateArgument &Arg : PackArgs) {
12754     if (!Arg.isPackExpansion()) {
12755       Result = *Result + 1;
12756       continue;
12757     }
12758 
12759     TemplateArgumentLoc ArgLoc;
12760     InventTemplateArgumentLoc(Arg, ArgLoc);
12761 
12762     // Find the pattern of the pack expansion.
12763     SourceLocation Ellipsis;
12764     Optional<unsigned> OrigNumExpansions;
12765     TemplateArgumentLoc Pattern =
12766         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
12767                                                           OrigNumExpansions);
12768 
12769     // Substitute under the pack expansion. Do not expand the pack (yet).
12770     TemplateArgumentLoc OutPattern;
12771     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12772     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
12773                                                /*Uneval*/ true))
12774       return true;
12775 
12776     // See if we can determine the number of arguments from the result.
12777     Optional<unsigned> NumExpansions =
12778         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
12779     if (!NumExpansions) {
12780       // No: we must be in an alias template expansion, and we're going to need
12781       // to actually expand the packs.
12782       Result = None;
12783       break;
12784     }
12785 
12786     Result = *Result + *NumExpansions;
12787   }
12788 
12789   // Common case: we could determine the number of expansions without
12790   // substituting.
12791   if (Result)
12792     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12793                                               E->getPackLoc(),
12794                                               E->getRParenLoc(), *Result, None);
12795 
12796   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
12797                                                E->getPackLoc());
12798   {
12799     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
12800     typedef TemplateArgumentLocInventIterator<
12801         Derived, const TemplateArgument*> PackLocIterator;
12802     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
12803                                    PackLocIterator(*this, PackArgs.end()),
12804                                    TransformedPackArgs, /*Uneval*/true))
12805       return ExprError();
12806   }
12807 
12808   // Check whether we managed to fully-expand the pack.
12809   // FIXME: Is it possible for us to do so and not hit the early exit path?
12810   SmallVector<TemplateArgument, 8> Args;
12811   bool PartialSubstitution = false;
12812   for (auto &Loc : TransformedPackArgs.arguments()) {
12813     Args.push_back(Loc.getArgument());
12814     if (Loc.getArgument().isPackExpansion())
12815       PartialSubstitution = true;
12816   }
12817 
12818   if (PartialSubstitution)
12819     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12820                                               E->getPackLoc(),
12821                                               E->getRParenLoc(), None, Args);
12822 
12823   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12824                                             E->getPackLoc(), E->getRParenLoc(),
12825                                             Args.size(), None);
12826 }
12827 
12828 template<typename Derived>
12829 ExprResult
12830 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
12831                                           SubstNonTypeTemplateParmPackExpr *E) {
12832   // Default behavior is to do nothing with this transformation.
12833   return E;
12834 }
12835 
12836 template<typename Derived>
12837 ExprResult
12838 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
12839                                           SubstNonTypeTemplateParmExpr *E) {
12840   // Default behavior is to do nothing with this transformation.
12841   return E;
12842 }
12843 
12844 template<typename Derived>
12845 ExprResult
12846 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
12847   // Default behavior is to do nothing with this transformation.
12848   return E;
12849 }
12850 
12851 template<typename Derived>
12852 ExprResult
12853 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
12854                                                   MaterializeTemporaryExpr *E) {
12855   return getDerived().TransformExpr(E->getSubExpr());
12856 }
12857 
12858 template<typename Derived>
12859 ExprResult
12860 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
12861   Expr *Pattern = E->getPattern();
12862 
12863   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12864   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
12865   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12866 
12867   // Determine whether the set of unexpanded parameter packs can and should
12868   // be expanded.
12869   bool Expand = true;
12870   bool RetainExpansion = false;
12871   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
12872                      NumExpansions = OrigNumExpansions;
12873   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
12874                                            Pattern->getSourceRange(),
12875                                            Unexpanded,
12876                                            Expand, RetainExpansion,
12877                                            NumExpansions))
12878     return true;
12879 
12880   if (!Expand) {
12881     // Do not expand any packs here, just transform and rebuild a fold
12882     // expression.
12883     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12884 
12885     ExprResult LHS =
12886         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
12887     if (LHS.isInvalid())
12888       return true;
12889 
12890     ExprResult RHS =
12891         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
12892     if (RHS.isInvalid())
12893       return true;
12894 
12895     if (!getDerived().AlwaysRebuild() &&
12896         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
12897       return E;
12898 
12899     return getDerived().RebuildCXXFoldExpr(
12900         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
12901         RHS.get(), E->getEndLoc(), NumExpansions);
12902   }
12903 
12904   // The transform has determined that we should perform an elementwise
12905   // expansion of the pattern. Do so.
12906   ExprResult Result = getDerived().TransformExpr(E->getInit());
12907   if (Result.isInvalid())
12908     return true;
12909   bool LeftFold = E->isLeftFold();
12910 
12911   // If we're retaining an expansion for a right fold, it is the innermost
12912   // component and takes the init (if any).
12913   if (!LeftFold && RetainExpansion) {
12914     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12915 
12916     ExprResult Out = getDerived().TransformExpr(Pattern);
12917     if (Out.isInvalid())
12918       return true;
12919 
12920     Result = getDerived().RebuildCXXFoldExpr(
12921         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
12922         Result.get(), E->getEndLoc(), OrigNumExpansions);
12923     if (Result.isInvalid())
12924       return true;
12925   }
12926 
12927   for (unsigned I = 0; I != *NumExpansions; ++I) {
12928     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
12929         getSema(), LeftFold ? I : *NumExpansions - I - 1);
12930     ExprResult Out = getDerived().TransformExpr(Pattern);
12931     if (Out.isInvalid())
12932       return true;
12933 
12934     if (Out.get()->containsUnexpandedParameterPack()) {
12935       // We still have a pack; retain a pack expansion for this slice.
12936       Result = getDerived().RebuildCXXFoldExpr(
12937           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
12938           E->getOperator(), E->getEllipsisLoc(),
12939           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
12940           OrigNumExpansions);
12941     } else if (Result.isUsable()) {
12942       // We've got down to a single element; build a binary operator.
12943       Result = getDerived().RebuildBinaryOperator(
12944           E->getEllipsisLoc(), E->getOperator(),
12945           LeftFold ? Result.get() : Out.get(),
12946           LeftFold ? Out.get() : Result.get());
12947     } else
12948       Result = Out;
12949 
12950     if (Result.isInvalid())
12951       return true;
12952   }
12953 
12954   // If we're retaining an expansion for a left fold, it is the outermost
12955   // component and takes the complete expansion so far as its init (if any).
12956   if (LeftFold && RetainExpansion) {
12957     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12958 
12959     ExprResult Out = getDerived().TransformExpr(Pattern);
12960     if (Out.isInvalid())
12961       return true;
12962 
12963     Result = getDerived().RebuildCXXFoldExpr(
12964         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
12965         Out.get(), E->getEndLoc(), OrigNumExpansions);
12966     if (Result.isInvalid())
12967       return true;
12968   }
12969 
12970   // If we had no init and an empty pack, and we're not retaining an expansion,
12971   // then produce a fallback value or error.
12972   if (Result.isUnset())
12973     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
12974                                                 E->getOperator());
12975 
12976   return Result;
12977 }
12978 
12979 template<typename Derived>
12980 ExprResult
12981 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
12982     CXXStdInitializerListExpr *E) {
12983   return getDerived().TransformExpr(E->getSubExpr());
12984 }
12985 
12986 template<typename Derived>
12987 ExprResult
12988 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
12989   return SemaRef.MaybeBindToTemporary(E);
12990 }
12991 
12992 template<typename Derived>
12993 ExprResult
12994 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
12995   return E;
12996 }
12997 
12998 template<typename Derived>
12999 ExprResult
13000 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13001   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13002   if (SubExpr.isInvalid())
13003     return ExprError();
13004 
13005   if (!getDerived().AlwaysRebuild() &&
13006       SubExpr.get() == E->getSubExpr())
13007     return E;
13008 
13009   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13010 }
13011 
13012 template<typename Derived>
13013 ExprResult
13014 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13015   // Transform each of the elements.
13016   SmallVector<Expr *, 8> Elements;
13017   bool ArgChanged = false;
13018   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13019                                   /*IsCall=*/false, Elements, &ArgChanged))
13020     return ExprError();
13021 
13022   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13023     return SemaRef.MaybeBindToTemporary(E);
13024 
13025   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13026                                               Elements.data(),
13027                                               Elements.size());
13028 }
13029 
13030 template<typename Derived>
13031 ExprResult
13032 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13033                                                     ObjCDictionaryLiteral *E) {
13034   // Transform each of the elements.
13035   SmallVector<ObjCDictionaryElement, 8> Elements;
13036   bool ArgChanged = false;
13037   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13038     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13039 
13040     if (OrigElement.isPackExpansion()) {
13041       // This key/value element is a pack expansion.
13042       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13043       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13044       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13045       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13046 
13047       // Determine whether the set of unexpanded parameter packs can
13048       // and should be expanded.
13049       bool Expand = true;
13050       bool RetainExpansion = false;
13051       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13052       Optional<unsigned> NumExpansions = OrigNumExpansions;
13053       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13054                                OrigElement.Value->getEndLoc());
13055       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13056                                                PatternRange, Unexpanded, Expand,
13057                                                RetainExpansion, NumExpansions))
13058         return ExprError();
13059 
13060       if (!Expand) {
13061         // The transform has determined that we should perform a simple
13062         // transformation on the pack expansion, producing another pack
13063         // expansion.
13064         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13065         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13066         if (Key.isInvalid())
13067           return ExprError();
13068 
13069         if (Key.get() != OrigElement.Key)
13070           ArgChanged = true;
13071 
13072         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13073         if (Value.isInvalid())
13074           return ExprError();
13075 
13076         if (Value.get() != OrigElement.Value)
13077           ArgChanged = true;
13078 
13079         ObjCDictionaryElement Expansion = {
13080           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13081         };
13082         Elements.push_back(Expansion);
13083         continue;
13084       }
13085 
13086       // Record right away that the argument was changed.  This needs
13087       // to happen even if the array expands to nothing.
13088       ArgChanged = true;
13089 
13090       // The transform has determined that we should perform an elementwise
13091       // expansion of the pattern. Do so.
13092       for (unsigned I = 0; I != *NumExpansions; ++I) {
13093         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13094         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13095         if (Key.isInvalid())
13096           return ExprError();
13097 
13098         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13099         if (Value.isInvalid())
13100           return ExprError();
13101 
13102         ObjCDictionaryElement Element = {
13103           Key.get(), Value.get(), SourceLocation(), NumExpansions
13104         };
13105 
13106         // If any unexpanded parameter packs remain, we still have a
13107         // pack expansion.
13108         // FIXME: Can this really happen?
13109         if (Key.get()->containsUnexpandedParameterPack() ||
13110             Value.get()->containsUnexpandedParameterPack())
13111           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13112 
13113         Elements.push_back(Element);
13114       }
13115 
13116       // FIXME: Retain a pack expansion if RetainExpansion is true.
13117 
13118       // We've finished with this pack expansion.
13119       continue;
13120     }
13121 
13122     // Transform and check key.
13123     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13124     if (Key.isInvalid())
13125       return ExprError();
13126 
13127     if (Key.get() != OrigElement.Key)
13128       ArgChanged = true;
13129 
13130     // Transform and check value.
13131     ExprResult Value
13132       = getDerived().TransformExpr(OrigElement.Value);
13133     if (Value.isInvalid())
13134       return ExprError();
13135 
13136     if (Value.get() != OrigElement.Value)
13137       ArgChanged = true;
13138 
13139     ObjCDictionaryElement Element = {
13140       Key.get(), Value.get(), SourceLocation(), None
13141     };
13142     Elements.push_back(Element);
13143   }
13144 
13145   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13146     return SemaRef.MaybeBindToTemporary(E);
13147 
13148   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13149                                                    Elements);
13150 }
13151 
13152 template<typename Derived>
13153 ExprResult
13154 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13155   TypeSourceInfo *EncodedTypeInfo
13156     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13157   if (!EncodedTypeInfo)
13158     return ExprError();
13159 
13160   if (!getDerived().AlwaysRebuild() &&
13161       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13162     return E;
13163 
13164   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13165                                             EncodedTypeInfo,
13166                                             E->getRParenLoc());
13167 }
13168 
13169 template<typename Derived>
13170 ExprResult TreeTransform<Derived>::
13171 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13172   // This is a kind of implicit conversion, and it needs to get dropped
13173   // and recomputed for the same general reasons that ImplicitCastExprs
13174   // do, as well a more specific one: this expression is only valid when
13175   // it appears *immediately* as an argument expression.
13176   return getDerived().TransformExpr(E->getSubExpr());
13177 }
13178 
13179 template<typename Derived>
13180 ExprResult TreeTransform<Derived>::
13181 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13182   TypeSourceInfo *TSInfo
13183     = getDerived().TransformType(E->getTypeInfoAsWritten());
13184   if (!TSInfo)
13185     return ExprError();
13186 
13187   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13188   if (Result.isInvalid())
13189     return ExprError();
13190 
13191   if (!getDerived().AlwaysRebuild() &&
13192       TSInfo == E->getTypeInfoAsWritten() &&
13193       Result.get() == E->getSubExpr())
13194     return E;
13195 
13196   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13197                                       E->getBridgeKeywordLoc(), TSInfo,
13198                                       Result.get());
13199 }
13200 
13201 template <typename Derived>
13202 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13203     ObjCAvailabilityCheckExpr *E) {
13204   return E;
13205 }
13206 
13207 template<typename Derived>
13208 ExprResult
13209 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13210   // Transform arguments.
13211   bool ArgChanged = false;
13212   SmallVector<Expr*, 8> Args;
13213   Args.reserve(E->getNumArgs());
13214   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13215                                   &ArgChanged))
13216     return ExprError();
13217 
13218   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13219     // Class message: transform the receiver type.
13220     TypeSourceInfo *ReceiverTypeInfo
13221       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13222     if (!ReceiverTypeInfo)
13223       return ExprError();
13224 
13225     // If nothing changed, just retain the existing message send.
13226     if (!getDerived().AlwaysRebuild() &&
13227         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13228       return SemaRef.MaybeBindToTemporary(E);
13229 
13230     // Build a new class message send.
13231     SmallVector<SourceLocation, 16> SelLocs;
13232     E->getSelectorLocs(SelLocs);
13233     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13234                                                E->getSelector(),
13235                                                SelLocs,
13236                                                E->getMethodDecl(),
13237                                                E->getLeftLoc(),
13238                                                Args,
13239                                                E->getRightLoc());
13240   }
13241   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13242            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13243     if (!E->getMethodDecl())
13244       return ExprError();
13245 
13246     // Build a new class message send to 'super'.
13247     SmallVector<SourceLocation, 16> SelLocs;
13248     E->getSelectorLocs(SelLocs);
13249     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13250                                                E->getSelector(),
13251                                                SelLocs,
13252                                                E->getReceiverType(),
13253                                                E->getMethodDecl(),
13254                                                E->getLeftLoc(),
13255                                                Args,
13256                                                E->getRightLoc());
13257   }
13258 
13259   // Instance message: transform the receiver
13260   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13261          "Only class and instance messages may be instantiated");
13262   ExprResult Receiver
13263     = getDerived().TransformExpr(E->getInstanceReceiver());
13264   if (Receiver.isInvalid())
13265     return ExprError();
13266 
13267   // If nothing changed, just retain the existing message send.
13268   if (!getDerived().AlwaysRebuild() &&
13269       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13270     return SemaRef.MaybeBindToTemporary(E);
13271 
13272   // Build a new instance message send.
13273   SmallVector<SourceLocation, 16> SelLocs;
13274   E->getSelectorLocs(SelLocs);
13275   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13276                                              E->getSelector(),
13277                                              SelLocs,
13278                                              E->getMethodDecl(),
13279                                              E->getLeftLoc(),
13280                                              Args,
13281                                              E->getRightLoc());
13282 }
13283 
13284 template<typename Derived>
13285 ExprResult
13286 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13287   return E;
13288 }
13289 
13290 template<typename Derived>
13291 ExprResult
13292 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13293   return E;
13294 }
13295 
13296 template<typename Derived>
13297 ExprResult
13298 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13299   // Transform the base expression.
13300   ExprResult Base = getDerived().TransformExpr(E->getBase());
13301   if (Base.isInvalid())
13302     return ExprError();
13303 
13304   // We don't need to transform the ivar; it will never change.
13305 
13306   // If nothing changed, just retain the existing expression.
13307   if (!getDerived().AlwaysRebuild() &&
13308       Base.get() == E->getBase())
13309     return E;
13310 
13311   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13312                                              E->getLocation(),
13313                                              E->isArrow(), E->isFreeIvar());
13314 }
13315 
13316 template<typename Derived>
13317 ExprResult
13318 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13319   // 'super' and types never change. Property never changes. Just
13320   // retain the existing expression.
13321   if (!E->isObjectReceiver())
13322     return E;
13323 
13324   // Transform the base expression.
13325   ExprResult Base = getDerived().TransformExpr(E->getBase());
13326   if (Base.isInvalid())
13327     return ExprError();
13328 
13329   // We don't need to transform the property; it will never change.
13330 
13331   // If nothing changed, just retain the existing expression.
13332   if (!getDerived().AlwaysRebuild() &&
13333       Base.get() == E->getBase())
13334     return E;
13335 
13336   if (E->isExplicitProperty())
13337     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13338                                                    E->getExplicitProperty(),
13339                                                    E->getLocation());
13340 
13341   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13342                                                  SemaRef.Context.PseudoObjectTy,
13343                                                  E->getImplicitPropertyGetter(),
13344                                                  E->getImplicitPropertySetter(),
13345                                                  E->getLocation());
13346 }
13347 
13348 template<typename Derived>
13349 ExprResult
13350 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13351   // Transform the base expression.
13352   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13353   if (Base.isInvalid())
13354     return ExprError();
13355 
13356   // Transform the key expression.
13357   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13358   if (Key.isInvalid())
13359     return ExprError();
13360 
13361   // If nothing changed, just retain the existing expression.
13362   if (!getDerived().AlwaysRebuild() &&
13363       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13364     return E;
13365 
13366   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13367                                                   Base.get(), Key.get(),
13368                                                   E->getAtIndexMethodDecl(),
13369                                                   E->setAtIndexMethodDecl());
13370 }
13371 
13372 template<typename Derived>
13373 ExprResult
13374 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13375   // Transform the base expression.
13376   ExprResult Base = getDerived().TransformExpr(E->getBase());
13377   if (Base.isInvalid())
13378     return ExprError();
13379 
13380   // If nothing changed, just retain the existing expression.
13381   if (!getDerived().AlwaysRebuild() &&
13382       Base.get() == E->getBase())
13383     return E;
13384 
13385   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13386                                          E->getOpLoc(),
13387                                          E->isArrow());
13388 }
13389 
13390 template<typename Derived>
13391 ExprResult
13392 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13393   bool ArgumentChanged = false;
13394   SmallVector<Expr*, 8> SubExprs;
13395   SubExprs.reserve(E->getNumSubExprs());
13396   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13397                                   SubExprs, &ArgumentChanged))
13398     return ExprError();
13399 
13400   if (!getDerived().AlwaysRebuild() &&
13401       !ArgumentChanged)
13402     return E;
13403 
13404   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13405                                                SubExprs,
13406                                                E->getRParenLoc());
13407 }
13408 
13409 template<typename Derived>
13410 ExprResult
13411 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13412   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13413   if (SrcExpr.isInvalid())
13414     return ExprError();
13415 
13416   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13417   if (!Type)
13418     return ExprError();
13419 
13420   if (!getDerived().AlwaysRebuild() &&
13421       Type == E->getTypeSourceInfo() &&
13422       SrcExpr.get() == E->getSrcExpr())
13423     return E;
13424 
13425   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13426                                                SrcExpr.get(), Type,
13427                                                E->getRParenLoc());
13428 }
13429 
13430 template<typename Derived>
13431 ExprResult
13432 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13433   BlockDecl *oldBlock = E->getBlockDecl();
13434 
13435   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13436   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13437 
13438   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13439   blockScope->TheDecl->setBlockMissingReturnType(
13440                          oldBlock->blockMissingReturnType());
13441 
13442   SmallVector<ParmVarDecl*, 4> params;
13443   SmallVector<QualType, 4> paramTypes;
13444 
13445   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13446 
13447   // Parameter substitution.
13448   Sema::ExtParameterInfoBuilder extParamInfos;
13449   if (getDerived().TransformFunctionTypeParams(
13450           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13451           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13452           extParamInfos)) {
13453     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13454     return ExprError();
13455   }
13456 
13457   QualType exprResultType =
13458       getDerived().TransformType(exprFunctionType->getReturnType());
13459 
13460   auto epi = exprFunctionType->getExtProtoInfo();
13461   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13462 
13463   QualType functionType =
13464     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13465   blockScope->FunctionType = functionType;
13466 
13467   // Set the parameters on the block decl.
13468   if (!params.empty())
13469     blockScope->TheDecl->setParams(params);
13470 
13471   if (!oldBlock->blockMissingReturnType()) {
13472     blockScope->HasImplicitReturnType = false;
13473     blockScope->ReturnType = exprResultType;
13474   }
13475 
13476   // Transform the body
13477   StmtResult body = getDerived().TransformStmt(E->getBody());
13478   if (body.isInvalid()) {
13479     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13480     return ExprError();
13481   }
13482 
13483 #ifndef NDEBUG
13484   // In builds with assertions, make sure that we captured everything we
13485   // captured before.
13486   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13487     for (const auto &I : oldBlock->captures()) {
13488       VarDecl *oldCapture = I.getVariable();
13489 
13490       // Ignore parameter packs.
13491       if (oldCapture->isParameterPack())
13492         continue;
13493 
13494       VarDecl *newCapture =
13495         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13496                                                  oldCapture));
13497       assert(blockScope->CaptureMap.count(newCapture));
13498     }
13499     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13500   }
13501 #endif
13502 
13503   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13504                                     /*Scope=*/nullptr);
13505 }
13506 
13507 template<typename Derived>
13508 ExprResult
13509 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13510   llvm_unreachable("Cannot transform asType expressions yet");
13511 }
13512 
13513 template<typename Derived>
13514 ExprResult
13515 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13516   bool ArgumentChanged = false;
13517   SmallVector<Expr*, 8> SubExprs;
13518   SubExprs.reserve(E->getNumSubExprs());
13519   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13520                                   SubExprs, &ArgumentChanged))
13521     return ExprError();
13522 
13523   if (!getDerived().AlwaysRebuild() &&
13524       !ArgumentChanged)
13525     return E;
13526 
13527   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13528                                         E->getOp(), E->getRParenLoc());
13529 }
13530 
13531 //===----------------------------------------------------------------------===//
13532 // Type reconstruction
13533 //===----------------------------------------------------------------------===//
13534 
13535 template<typename Derived>
13536 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13537                                                     SourceLocation Star) {
13538   return SemaRef.BuildPointerType(PointeeType, Star,
13539                                   getDerived().getBaseEntity());
13540 }
13541 
13542 template<typename Derived>
13543 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13544                                                          SourceLocation Star) {
13545   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13546                                        getDerived().getBaseEntity());
13547 }
13548 
13549 template<typename Derived>
13550 QualType
13551 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13552                                              bool WrittenAsLValue,
13553                                              SourceLocation Sigil) {
13554   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13555                                     Sigil, getDerived().getBaseEntity());
13556 }
13557 
13558 template<typename Derived>
13559 QualType
13560 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13561                                                  QualType ClassType,
13562                                                  SourceLocation Sigil) {
13563   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13564                                         getDerived().getBaseEntity());
13565 }
13566 
13567 template<typename Derived>
13568 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13569            const ObjCTypeParamDecl *Decl,
13570            SourceLocation ProtocolLAngleLoc,
13571            ArrayRef<ObjCProtocolDecl *> Protocols,
13572            ArrayRef<SourceLocation> ProtocolLocs,
13573            SourceLocation ProtocolRAngleLoc) {
13574   return SemaRef.BuildObjCTypeParamType(Decl,
13575                                         ProtocolLAngleLoc, Protocols,
13576                                         ProtocolLocs, ProtocolRAngleLoc,
13577                                         /*FailOnError=*/true);
13578 }
13579 
13580 template<typename Derived>
13581 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13582            QualType BaseType,
13583            SourceLocation Loc,
13584            SourceLocation TypeArgsLAngleLoc,
13585            ArrayRef<TypeSourceInfo *> TypeArgs,
13586            SourceLocation TypeArgsRAngleLoc,
13587            SourceLocation ProtocolLAngleLoc,
13588            ArrayRef<ObjCProtocolDecl *> Protocols,
13589            ArrayRef<SourceLocation> ProtocolLocs,
13590            SourceLocation ProtocolRAngleLoc) {
13591   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13592                                      TypeArgs, TypeArgsRAngleLoc,
13593                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13594                                      ProtocolRAngleLoc,
13595                                      /*FailOnError=*/true);
13596 }
13597 
13598 template<typename Derived>
13599 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13600            QualType PointeeType,
13601            SourceLocation Star) {
13602   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13603 }
13604 
13605 template<typename Derived>
13606 QualType
13607 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13608                                          ArrayType::ArraySizeModifier SizeMod,
13609                                          const llvm::APInt *Size,
13610                                          Expr *SizeExpr,
13611                                          unsigned IndexTypeQuals,
13612                                          SourceRange BracketsRange) {
13613   if (SizeExpr || !Size)
13614     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13615                                   IndexTypeQuals, BracketsRange,
13616                                   getDerived().getBaseEntity());
13617 
13618   QualType Types[] = {
13619     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13620     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13621     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13622   };
13623   const unsigned NumTypes = llvm::array_lengthof(Types);
13624   QualType SizeType;
13625   for (unsigned I = 0; I != NumTypes; ++I)
13626     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13627       SizeType = Types[I];
13628       break;
13629     }
13630 
13631   // Note that we can return a VariableArrayType here in the case where
13632   // the element type was a dependent VariableArrayType.
13633   IntegerLiteral *ArraySize
13634       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13635                                /*FIXME*/BracketsRange.getBegin());
13636   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13637                                 IndexTypeQuals, BracketsRange,
13638                                 getDerived().getBaseEntity());
13639 }
13640 
13641 template<typename Derived>
13642 QualType
13643 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
13644                                                  ArrayType::ArraySizeModifier SizeMod,
13645                                                  const llvm::APInt &Size,
13646                                                  Expr *SizeExpr,
13647                                                  unsigned IndexTypeQuals,
13648                                                  SourceRange BracketsRange) {
13649   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
13650                                         IndexTypeQuals, BracketsRange);
13651 }
13652 
13653 template<typename Derived>
13654 QualType
13655 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
13656                                           ArrayType::ArraySizeModifier SizeMod,
13657                                                  unsigned IndexTypeQuals,
13658                                                    SourceRange BracketsRange) {
13659   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
13660                                        IndexTypeQuals, BracketsRange);
13661 }
13662 
13663 template<typename Derived>
13664 QualType
13665 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
13666                                           ArrayType::ArraySizeModifier SizeMod,
13667                                                  Expr *SizeExpr,
13668                                                  unsigned IndexTypeQuals,
13669                                                  SourceRange BracketsRange) {
13670   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13671                                        SizeExpr,
13672                                        IndexTypeQuals, BracketsRange);
13673 }
13674 
13675 template<typename Derived>
13676 QualType
13677 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
13678                                           ArrayType::ArraySizeModifier SizeMod,
13679                                                        Expr *SizeExpr,
13680                                                        unsigned IndexTypeQuals,
13681                                                    SourceRange BracketsRange) {
13682   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13683                                        SizeExpr,
13684                                        IndexTypeQuals, BracketsRange);
13685 }
13686 
13687 template <typename Derived>
13688 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
13689     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
13690   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
13691                                           AttributeLoc);
13692 }
13693 
13694 template <typename Derived>
13695 QualType
13696 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
13697                                           unsigned NumElements,
13698                                           VectorType::VectorKind VecKind) {
13699   // FIXME: semantic checking!
13700   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
13701 }
13702 
13703 template <typename Derived>
13704 QualType TreeTransform<Derived>::RebuildDependentVectorType(
13705     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
13706     VectorType::VectorKind VecKind) {
13707   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
13708 }
13709 
13710 template<typename Derived>
13711 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
13712                                                       unsigned NumElements,
13713                                                  SourceLocation AttributeLoc) {
13714   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
13715                           NumElements, true);
13716   IntegerLiteral *VectorSize
13717     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
13718                              AttributeLoc);
13719   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
13720 }
13721 
13722 template<typename Derived>
13723 QualType
13724 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
13725                                                            Expr *SizeExpr,
13726                                                   SourceLocation AttributeLoc) {
13727   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
13728 }
13729 
13730 template<typename Derived>
13731 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
13732     QualType T,
13733     MutableArrayRef<QualType> ParamTypes,
13734     const FunctionProtoType::ExtProtoInfo &EPI) {
13735   return SemaRef.BuildFunctionType(T, ParamTypes,
13736                                    getDerived().getBaseLocation(),
13737                                    getDerived().getBaseEntity(),
13738                                    EPI);
13739 }
13740 
13741 template<typename Derived>
13742 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
13743   return SemaRef.Context.getFunctionNoProtoType(T);
13744 }
13745 
13746 template<typename Derived>
13747 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
13748                                                             Decl *D) {
13749   assert(D && "no decl found");
13750   if (D->isInvalidDecl()) return QualType();
13751 
13752   // FIXME: Doesn't account for ObjCInterfaceDecl!
13753   TypeDecl *Ty;
13754   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
13755     // A valid resolved using typename pack expansion decl can have multiple
13756     // UsingDecls, but they must each have exactly one type, and it must be
13757     // the same type in every case. But we must have at least one expansion!
13758     if (UPD->expansions().empty()) {
13759       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
13760           << UPD->isCXXClassMember() << UPD;
13761       return QualType();
13762     }
13763 
13764     // We might still have some unresolved types. Try to pick a resolved type
13765     // if we can. The final instantiation will check that the remaining
13766     // unresolved types instantiate to the type we pick.
13767     QualType FallbackT;
13768     QualType T;
13769     for (auto *E : UPD->expansions()) {
13770       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
13771       if (ThisT.isNull())
13772         continue;
13773       else if (ThisT->getAs<UnresolvedUsingType>())
13774         FallbackT = ThisT;
13775       else if (T.isNull())
13776         T = ThisT;
13777       else
13778         assert(getSema().Context.hasSameType(ThisT, T) &&
13779                "mismatched resolved types in using pack expansion");
13780     }
13781     return T.isNull() ? FallbackT : T;
13782   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
13783     assert(Using->hasTypename() &&
13784            "UnresolvedUsingTypenameDecl transformed to non-typename using");
13785 
13786     // A valid resolved using typename decl points to exactly one type decl.
13787     assert(++Using->shadow_begin() == Using->shadow_end());
13788     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
13789   } else {
13790     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
13791            "UnresolvedUsingTypenameDecl transformed to non-using decl");
13792     Ty = cast<UnresolvedUsingTypenameDecl>(D);
13793   }
13794 
13795   return SemaRef.Context.getTypeDeclType(Ty);
13796 }
13797 
13798 template<typename Derived>
13799 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
13800                                                        SourceLocation Loc) {
13801   return SemaRef.BuildTypeofExprType(E, Loc);
13802 }
13803 
13804 template<typename Derived>
13805 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
13806   return SemaRef.Context.getTypeOfType(Underlying);
13807 }
13808 
13809 template<typename Derived>
13810 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
13811                                                      SourceLocation Loc) {
13812   return SemaRef.BuildDecltypeType(E, Loc);
13813 }
13814 
13815 template<typename Derived>
13816 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
13817                                             UnaryTransformType::UTTKind UKind,
13818                                             SourceLocation Loc) {
13819   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
13820 }
13821 
13822 template<typename Derived>
13823 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
13824                                                       TemplateName Template,
13825                                              SourceLocation TemplateNameLoc,
13826                                      TemplateArgumentListInfo &TemplateArgs) {
13827   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
13828 }
13829 
13830 template<typename Derived>
13831 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
13832                                                    SourceLocation KWLoc) {
13833   return SemaRef.BuildAtomicType(ValueType, KWLoc);
13834 }
13835 
13836 template<typename Derived>
13837 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
13838                                                  SourceLocation KWLoc,
13839                                                  bool isReadPipe) {
13840   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
13841                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
13842 }
13843 
13844 template <typename Derived>
13845 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
13846                                                    unsigned NumBits,
13847                                                    SourceLocation Loc) {
13848   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
13849                         NumBits, true);
13850   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
13851                                                 SemaRef.Context.IntTy, Loc);
13852   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
13853 }
13854 
13855 template <typename Derived>
13856 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
13857     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
13858   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
13859 }
13860 
13861 template<typename Derived>
13862 TemplateName
13863 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13864                                             bool TemplateKW,
13865                                             TemplateDecl *Template) {
13866   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
13867                                                   Template);
13868 }
13869 
13870 template<typename Derived>
13871 TemplateName
13872 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13873                                             SourceLocation TemplateKWLoc,
13874                                             const IdentifierInfo &Name,
13875                                             SourceLocation NameLoc,
13876                                             QualType ObjectType,
13877                                             NamedDecl *FirstQualifierInScope,
13878                                             bool AllowInjectedClassName) {
13879   UnqualifiedId TemplateName;
13880   TemplateName.setIdentifier(&Name, NameLoc);
13881   Sema::TemplateTy Template;
13882   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
13883                               TemplateName, ParsedType::make(ObjectType),
13884                               /*EnteringContext=*/false, Template,
13885                               AllowInjectedClassName);
13886   return Template.get();
13887 }
13888 
13889 template<typename Derived>
13890 TemplateName
13891 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13892                                             SourceLocation TemplateKWLoc,
13893                                             OverloadedOperatorKind Operator,
13894                                             SourceLocation NameLoc,
13895                                             QualType ObjectType,
13896                                             bool AllowInjectedClassName) {
13897   UnqualifiedId Name;
13898   // FIXME: Bogus location information.
13899   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
13900   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
13901   Sema::TemplateTy Template;
13902   getSema().ActOnTemplateName(
13903       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
13904       /*EnteringContext=*/false, Template, AllowInjectedClassName);
13905   return Template.get();
13906 }
13907 
13908 template<typename Derived>
13909 ExprResult
13910 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
13911                                                    SourceLocation OpLoc,
13912                                                    Expr *OrigCallee,
13913                                                    Expr *First,
13914                                                    Expr *Second) {
13915   Expr *Callee = OrigCallee->IgnoreParenCasts();
13916   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
13917 
13918   if (First->getObjectKind() == OK_ObjCProperty) {
13919     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13920     if (BinaryOperator::isAssignmentOp(Opc))
13921       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
13922                                                  First, Second);
13923     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
13924     if (Result.isInvalid())
13925       return ExprError();
13926     First = Result.get();
13927   }
13928 
13929   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
13930     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
13931     if (Result.isInvalid())
13932       return ExprError();
13933     Second = Result.get();
13934   }
13935 
13936   // Determine whether this should be a builtin operation.
13937   if (Op == OO_Subscript) {
13938     if (!First->getType()->isOverloadableType() &&
13939         !Second->getType()->isOverloadableType())
13940       return getSema().CreateBuiltinArraySubscriptExpr(
13941           First, Callee->getBeginLoc(), Second, OpLoc);
13942   } else if (Op == OO_Arrow) {
13943     // -> is never a builtin operation.
13944     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
13945   } else if (Second == nullptr || isPostIncDec) {
13946     if (!First->getType()->isOverloadableType() ||
13947         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
13948       // The argument is not of overloadable type, or this is an expression
13949       // of the form &Class::member, so try to create a built-in unary
13950       // operation.
13951       UnaryOperatorKind Opc
13952         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13953 
13954       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
13955     }
13956   } else {
13957     if (!First->getType()->isOverloadableType() &&
13958         !Second->getType()->isOverloadableType()) {
13959       // Neither of the arguments is an overloadable type, so try to
13960       // create a built-in binary operation.
13961       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13962       ExprResult Result
13963         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
13964       if (Result.isInvalid())
13965         return ExprError();
13966 
13967       return Result;
13968     }
13969   }
13970 
13971   // Compute the transformed set of functions (and function templates) to be
13972   // used during overload resolution.
13973   UnresolvedSet<16> Functions;
13974   bool RequiresADL;
13975 
13976   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
13977     Functions.append(ULE->decls_begin(), ULE->decls_end());
13978     // If the overload could not be resolved in the template definition
13979     // (because we had a dependent argument), ADL is performed as part of
13980     // template instantiation.
13981     RequiresADL = ULE->requiresADL();
13982   } else {
13983     // If we've resolved this to a particular non-member function, just call
13984     // that function. If we resolved it to a member function,
13985     // CreateOverloaded* will find that function for us.
13986     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
13987     if (!isa<CXXMethodDecl>(ND))
13988       Functions.addDecl(ND);
13989     RequiresADL = false;
13990   }
13991 
13992   // Add any functions found via argument-dependent lookup.
13993   Expr *Args[2] = { First, Second };
13994   unsigned NumArgs = 1 + (Second != nullptr);
13995 
13996   // Create the overloaded operator invocation for unary operators.
13997   if (NumArgs == 1 || isPostIncDec) {
13998     UnaryOperatorKind Opc
13999       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14000     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14001                                            RequiresADL);
14002   }
14003 
14004   if (Op == OO_Subscript) {
14005     SourceLocation LBrace;
14006     SourceLocation RBrace;
14007 
14008     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14009         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14010         LBrace = SourceLocation::getFromRawEncoding(
14011                     NameLoc.CXXOperatorName.BeginOpNameLoc);
14012         RBrace = SourceLocation::getFromRawEncoding(
14013                     NameLoc.CXXOperatorName.EndOpNameLoc);
14014     } else {
14015       LBrace = Callee->getBeginLoc();
14016       RBrace = OpLoc;
14017     }
14018 
14019     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14020                                                       First, Second);
14021   }
14022 
14023   // Create the overloaded operator invocation for binary operators.
14024   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14025   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14026       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14027   if (Result.isInvalid())
14028     return ExprError();
14029 
14030   return Result;
14031 }
14032 
14033 template<typename Derived>
14034 ExprResult
14035 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14036                                                      SourceLocation OperatorLoc,
14037                                                        bool isArrow,
14038                                                        CXXScopeSpec &SS,
14039                                                      TypeSourceInfo *ScopeType,
14040                                                        SourceLocation CCLoc,
14041                                                        SourceLocation TildeLoc,
14042                                         PseudoDestructorTypeStorage Destroyed) {
14043   QualType BaseType = Base->getType();
14044   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14045       (!isArrow && !BaseType->getAs<RecordType>()) ||
14046       (isArrow && BaseType->getAs<PointerType>() &&
14047        !BaseType->castAs<PointerType>()->getPointeeType()
14048                                               ->template getAs<RecordType>())){
14049     // This pseudo-destructor expression is still a pseudo-destructor.
14050     return SemaRef.BuildPseudoDestructorExpr(
14051         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14052         CCLoc, TildeLoc, Destroyed);
14053   }
14054 
14055   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14056   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14057                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14058   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14059   NameInfo.setNamedTypeInfo(DestroyedType);
14060 
14061   // The scope type is now known to be a valid nested name specifier
14062   // component. Tack it on to the end of the nested name specifier.
14063   if (ScopeType) {
14064     if (!ScopeType->getType()->getAs<TagType>()) {
14065       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14066                      diag::err_expected_class_or_namespace)
14067           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14068       return ExprError();
14069     }
14070     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14071               CCLoc);
14072   }
14073 
14074   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14075   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14076                                             OperatorLoc, isArrow,
14077                                             SS, TemplateKWLoc,
14078                                             /*FIXME: FirstQualifier*/ nullptr,
14079                                             NameInfo,
14080                                             /*TemplateArgs*/ nullptr,
14081                                             /*S*/nullptr);
14082 }
14083 
14084 template<typename Derived>
14085 StmtResult
14086 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14087   SourceLocation Loc = S->getBeginLoc();
14088   CapturedDecl *CD = S->getCapturedDecl();
14089   unsigned NumParams = CD->getNumParams();
14090   unsigned ContextParamPos = CD->getContextParamPosition();
14091   SmallVector<Sema::CapturedParamNameType, 4> Params;
14092   for (unsigned I = 0; I < NumParams; ++I) {
14093     if (I != ContextParamPos) {
14094       Params.push_back(
14095              std::make_pair(
14096                   CD->getParam(I)->getName(),
14097                   getDerived().TransformType(CD->getParam(I)->getType())));
14098     } else {
14099       Params.push_back(std::make_pair(StringRef(), QualType()));
14100     }
14101   }
14102   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14103                                      S->getCapturedRegionKind(), Params);
14104   StmtResult Body;
14105   {
14106     Sema::CompoundScopeRAII CompoundScope(getSema());
14107     Body = getDerived().TransformStmt(S->getCapturedStmt());
14108   }
14109 
14110   if (Body.isInvalid()) {
14111     getSema().ActOnCapturedRegionError();
14112     return StmtError();
14113   }
14114 
14115   return getSema().ActOnCapturedRegionEnd(Body.get());
14116 }
14117 
14118 } // end namespace clang
14119 
14120 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14121