1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Basic/DiagnosticParse.h"
32 #include "clang/Basic/OpenMPKinds.h"
33 #include "clang/Sema/Designator.h"
34 #include "clang/Sema/Lookup.h"
35 #include "clang/Sema/Ownership.h"
36 #include "clang/Sema/ParsedTemplate.h"
37 #include "clang/Sema/ScopeInfo.h"
38 #include "clang/Sema/SemaDiagnostic.h"
39 #include "clang/Sema/SemaInternal.h"
40 #include "llvm/ADT/ArrayRef.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include <algorithm>
43 
44 using namespace llvm::omp;
45 
46 namespace clang {
47 using namespace sema;
48 
49 /// A semantic tree transformation that allows one to transform one
50 /// abstract syntax tree into another.
51 ///
52 /// A new tree transformation is defined by creating a new subclass \c X of
53 /// \c TreeTransform<X> and then overriding certain operations to provide
54 /// behavior specific to that transformation. For example, template
55 /// instantiation is implemented as a tree transformation where the
56 /// transformation of TemplateTypeParmType nodes involves substituting the
57 /// template arguments for their corresponding template parameters; a similar
58 /// transformation is performed for non-type template parameters and
59 /// template template parameters.
60 ///
61 /// This tree-transformation template uses static polymorphism to allow
62 /// subclasses to customize any of its operations. Thus, a subclass can
63 /// override any of the transformation or rebuild operators by providing an
64 /// operation with the same signature as the default implementation. The
65 /// overriding function should not be virtual.
66 ///
67 /// Semantic tree transformations are split into two stages, either of which
68 /// can be replaced by a subclass. The "transform" step transforms an AST node
69 /// or the parts of an AST node using the various transformation functions,
70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
71 /// node of the appropriate kind from the pieces. The default transformation
72 /// routines recursively transform the operands to composite AST nodes (e.g.,
73 /// the pointee type of a PointerType node) and, if any of those operand nodes
74 /// were changed by the transformation, invokes the rebuild operation to create
75 /// a new AST node.
76 ///
77 /// Subclasses can customize the transformation at various levels. The
78 /// most coarse-grained transformations involve replacing TransformType(),
79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
81 /// new implementations.
82 ///
83 /// For more fine-grained transformations, subclasses can replace any of the
84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
86 /// replacing TransformTemplateTypeParmType() allows template instantiation
87 /// to substitute template arguments for their corresponding template
88 /// parameters. Additionally, subclasses can override the \c RebuildXXX
89 /// functions to control how AST nodes are rebuilt when their operands change.
90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
92 /// be able to use more efficient rebuild steps.
93 ///
94 /// There are a handful of other functions that can be overridden, allowing one
95 /// to avoid traversing nodes that don't need any transformation
96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
97 /// operands have not changed (\c AlwaysRebuild()), and customize the
98 /// default locations and entity names used for type-checking
99 /// (\c getBaseLocation(), \c getBaseEntity()).
100 template<typename Derived>
101 class TreeTransform {
102   /// Private RAII object that helps us forget and then re-remember
103   /// the template argument corresponding to a partially-substituted parameter
104   /// pack.
105   class ForgetPartiallySubstitutedPackRAII {
106     Derived &Self;
107     TemplateArgument Old;
108 
109   public:
110     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
111       Old = Self.ForgetPartiallySubstitutedPack();
112     }
113 
114     ~ForgetPartiallySubstitutedPackRAII() {
115       Self.RememberPartiallySubstitutedPack(Old);
116     }
117   };
118 
119 protected:
120   Sema &SemaRef;
121 
122   /// The set of local declarations that have been transformed, for
123   /// cases where we are forced to build new declarations within the transformer
124   /// rather than in the subclass (e.g., lambda closure types).
125   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
126 
127 public:
128   /// Initializes a new tree transformer.
129   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
130 
131   /// Retrieves a reference to the derived class.
132   Derived &getDerived() { return static_cast<Derived&>(*this); }
133 
134   /// Retrieves a reference to the derived class.
135   const Derived &getDerived() const {
136     return static_cast<const Derived&>(*this);
137   }
138 
139   static inline ExprResult Owned(Expr *E) { return E; }
140   static inline StmtResult Owned(Stmt *S) { return S; }
141 
142   /// Retrieves a reference to the semantic analysis object used for
143   /// this tree transform.
144   Sema &getSema() const { return SemaRef; }
145 
146   /// Whether the transformation should always rebuild AST nodes, even
147   /// if none of the children have changed.
148   ///
149   /// Subclasses may override this function to specify when the transformation
150   /// should rebuild all AST nodes.
151   ///
152   /// We must always rebuild all AST nodes when performing variadic template
153   /// pack expansion, in order to avoid violating the AST invariant that each
154   /// statement node appears at most once in its containing declaration.
155   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
156 
157   /// Whether the transformation is forming an expression or statement that
158   /// replaces the original. In this case, we'll reuse mangling numbers from
159   /// existing lambdas.
160   bool ReplacingOriginal() { return false; }
161 
162   /// Wether CXXConstructExpr can be skipped when they are implicit.
163   /// They will be reconstructed when used if needed.
164   /// This is usefull when the user that cause rebuilding of the
165   /// CXXConstructExpr is outside of the expression at which the TreeTransform
166   /// started.
167   bool AllowSkippingCXXConstructExpr() { return true; }
168 
169   /// Returns the location of the entity being transformed, if that
170   /// information was not available elsewhere in the AST.
171   ///
172   /// By default, returns no source-location information. Subclasses can
173   /// provide an alternative implementation that provides better location
174   /// information.
175   SourceLocation getBaseLocation() { return SourceLocation(); }
176 
177   /// Returns the name of the entity being transformed, if that
178   /// information was not available elsewhere in the AST.
179   ///
180   /// By default, returns an empty name. Subclasses can provide an alternative
181   /// implementation with a more precise name.
182   DeclarationName getBaseEntity() { return DeclarationName(); }
183 
184   /// Sets the "base" location and entity when that
185   /// information is known based on another transformation.
186   ///
187   /// By default, the source location and entity are ignored. Subclasses can
188   /// override this function to provide a customized implementation.
189   void setBase(SourceLocation Loc, DeclarationName Entity) { }
190 
191   /// RAII object that temporarily sets the base location and entity
192   /// used for reporting diagnostics in types.
193   class TemporaryBase {
194     TreeTransform &Self;
195     SourceLocation OldLocation;
196     DeclarationName OldEntity;
197 
198   public:
199     TemporaryBase(TreeTransform &Self, SourceLocation Location,
200                   DeclarationName Entity) : Self(Self) {
201       OldLocation = Self.getDerived().getBaseLocation();
202       OldEntity = Self.getDerived().getBaseEntity();
203 
204       if (Location.isValid())
205         Self.getDerived().setBase(Location, Entity);
206     }
207 
208     ~TemporaryBase() {
209       Self.getDerived().setBase(OldLocation, OldEntity);
210     }
211   };
212 
213   /// Determine whether the given type \p T has already been
214   /// transformed.
215   ///
216   /// Subclasses can provide an alternative implementation of this routine
217   /// to short-circuit evaluation when it is known that a given type will
218   /// not change. For example, template instantiation need not traverse
219   /// non-dependent types.
220   bool AlreadyTransformed(QualType T) {
221     return T.isNull();
222   }
223 
224   /// Transform a template parameter depth level.
225   ///
226   /// During a transformation that transforms template parameters, this maps
227   /// an old template parameter depth to a new depth.
228   unsigned TransformTemplateDepth(unsigned Depth) {
229     return Depth;
230   }
231 
232   /// Determine whether the given call argument should be dropped, e.g.,
233   /// because it is a default argument.
234   ///
235   /// Subclasses can provide an alternative implementation of this routine to
236   /// determine which kinds of call arguments get dropped. By default,
237   /// CXXDefaultArgument nodes are dropped (prior to transformation).
238   bool DropCallArgument(Expr *E) {
239     return E->isDefaultArgument();
240   }
241 
242   /// Determine whether we should expand a pack expansion with the
243   /// given set of parameter packs into separate arguments by repeatedly
244   /// transforming the pattern.
245   ///
246   /// By default, the transformer never tries to expand pack expansions.
247   /// Subclasses can override this routine to provide different behavior.
248   ///
249   /// \param EllipsisLoc The location of the ellipsis that identifies the
250   /// pack expansion.
251   ///
252   /// \param PatternRange The source range that covers the entire pattern of
253   /// the pack expansion.
254   ///
255   /// \param Unexpanded The set of unexpanded parameter packs within the
256   /// pattern.
257   ///
258   /// \param ShouldExpand Will be set to \c true if the transformer should
259   /// expand the corresponding pack expansions into separate arguments. When
260   /// set, \c NumExpansions must also be set.
261   ///
262   /// \param RetainExpansion Whether the caller should add an unexpanded
263   /// pack expansion after all of the expanded arguments. This is used
264   /// when extending explicitly-specified template argument packs per
265   /// C++0x [temp.arg.explicit]p9.
266   ///
267   /// \param NumExpansions The number of separate arguments that will be in
268   /// the expanded form of the corresponding pack expansion. This is both an
269   /// input and an output parameter, which can be set by the caller if the
270   /// number of expansions is known a priori (e.g., due to a prior substitution)
271   /// and will be set by the callee when the number of expansions is known.
272   /// The callee must set this value when \c ShouldExpand is \c true; it may
273   /// set this value in other cases.
274   ///
275   /// \returns true if an error occurred (e.g., because the parameter packs
276   /// are to be instantiated with arguments of different lengths), false
277   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
278   /// must be set.
279   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
280                                SourceRange PatternRange,
281                                ArrayRef<UnexpandedParameterPack> Unexpanded,
282                                bool &ShouldExpand,
283                                bool &RetainExpansion,
284                                Optional<unsigned> &NumExpansions) {
285     ShouldExpand = false;
286     return false;
287   }
288 
289   /// "Forget" about the partially-substituted pack template argument,
290   /// when performing an instantiation that must preserve the parameter pack
291   /// use.
292   ///
293   /// This routine is meant to be overridden by the template instantiator.
294   TemplateArgument ForgetPartiallySubstitutedPack() {
295     return TemplateArgument();
296   }
297 
298   /// "Remember" the partially-substituted pack template argument
299   /// after performing an instantiation that must preserve the parameter pack
300   /// use.
301   ///
302   /// This routine is meant to be overridden by the template instantiator.
303   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
304 
305   /// Note to the derived class when a function parameter pack is
306   /// being expanded.
307   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
308 
309   /// Transforms the given type into another type.
310   ///
311   /// By default, this routine transforms a type by creating a
312   /// TypeSourceInfo for it and delegating to the appropriate
313   /// function.  This is expensive, but we don't mind, because
314   /// this method is deprecated anyway;  all users should be
315   /// switched to storing TypeSourceInfos.
316   ///
317   /// \returns the transformed type.
318   QualType TransformType(QualType T);
319 
320   /// Transforms the given type-with-location into a new
321   /// type-with-location.
322   ///
323   /// By default, this routine transforms a type by delegating to the
324   /// appropriate TransformXXXType to build a new type.  Subclasses
325   /// may override this function (to take over all type
326   /// transformations) or some set of the TransformXXXType functions
327   /// to alter the transformation.
328   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
329 
330   /// Transform the given type-with-location into a new
331   /// type, collecting location information in the given builder
332   /// as necessary.
333   ///
334   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
335 
336   /// Transform a type that is permitted to produce a
337   /// DeducedTemplateSpecializationType.
338   ///
339   /// This is used in the (relatively rare) contexts where it is acceptable
340   /// for transformation to produce a class template type with deduced
341   /// template arguments.
342   /// @{
343   QualType TransformTypeWithDeducedTST(QualType T);
344   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
345   /// @}
346 
347   /// The reason why the value of a statement is not discarded, if any.
348   enum StmtDiscardKind {
349     SDK_Discarded,
350     SDK_NotDiscarded,
351     SDK_StmtExprResult,
352   };
353 
354   /// Transform the given statement.
355   ///
356   /// By default, this routine transforms a statement by delegating to the
357   /// appropriate TransformXXXStmt function to transform a specific kind of
358   /// statement or the TransformExpr() function to transform an expression.
359   /// Subclasses may override this function to transform statements using some
360   /// other mechanism.
361   ///
362   /// \returns the transformed statement.
363   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
364 
365   /// Transform the given statement.
366   ///
367   /// By default, this routine transforms a statement by delegating to the
368   /// appropriate TransformOMPXXXClause function to transform a specific kind
369   /// of clause. Subclasses may override this function to transform statements
370   /// using some other mechanism.
371   ///
372   /// \returns the transformed OpenMP clause.
373   OMPClause *TransformOMPClause(OMPClause *S);
374 
375   /// Transform the given attribute.
376   ///
377   /// By default, this routine transforms a statement by delegating to the
378   /// appropriate TransformXXXAttr function to transform a specific kind
379   /// of attribute. Subclasses may override this function to transform
380   /// attributed statements using some other mechanism.
381   ///
382   /// \returns the transformed attribute
383   const Attr *TransformAttr(const Attr *S);
384 
385 /// Transform the specified attribute.
386 ///
387 /// Subclasses should override the transformation of attributes with a pragma
388 /// spelling to transform expressions stored within the attribute.
389 ///
390 /// \returns the transformed attribute.
391 #define ATTR(X)
392 #define PRAGMA_SPELLING_ATTR(X)                                                \
393   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
394 #include "clang/Basic/AttrList.inc"
395 
396   /// Transform the given expression.
397   ///
398   /// By default, this routine transforms an expression by delegating to the
399   /// appropriate TransformXXXExpr function to build a new expression.
400   /// Subclasses may override this function to transform expressions using some
401   /// other mechanism.
402   ///
403   /// \returns the transformed expression.
404   ExprResult TransformExpr(Expr *E);
405 
406   /// Transform the given initializer.
407   ///
408   /// By default, this routine transforms an initializer by stripping off the
409   /// semantic nodes added by initialization, then passing the result to
410   /// TransformExpr or TransformExprs.
411   ///
412   /// \returns the transformed initializer.
413   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
414 
415   /// Transform the given list of expressions.
416   ///
417   /// This routine transforms a list of expressions by invoking
418   /// \c TransformExpr() for each subexpression. However, it also provides
419   /// support for variadic templates by expanding any pack expansions (if the
420   /// derived class permits such expansion) along the way. When pack expansions
421   /// are present, the number of outputs may not equal the number of inputs.
422   ///
423   /// \param Inputs The set of expressions to be transformed.
424   ///
425   /// \param NumInputs The number of expressions in \c Inputs.
426   ///
427   /// \param IsCall If \c true, then this transform is being performed on
428   /// function-call arguments, and any arguments that should be dropped, will
429   /// be.
430   ///
431   /// \param Outputs The transformed input expressions will be added to this
432   /// vector.
433   ///
434   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
435   /// due to transformation.
436   ///
437   /// \returns true if an error occurred, false otherwise.
438   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
439                       SmallVectorImpl<Expr *> &Outputs,
440                       bool *ArgChanged = nullptr);
441 
442   /// Transform the given declaration, which is referenced from a type
443   /// or expression.
444   ///
445   /// By default, acts as the identity function on declarations, unless the
446   /// transformer has had to transform the declaration itself. Subclasses
447   /// may override this function to provide alternate behavior.
448   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
449     llvm::DenseMap<Decl *, Decl *>::iterator Known
450       = TransformedLocalDecls.find(D);
451     if (Known != TransformedLocalDecls.end())
452       return Known->second;
453 
454     return D;
455   }
456 
457   /// Transform the specified condition.
458   ///
459   /// By default, this transforms the variable and expression and rebuilds
460   /// the condition.
461   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
462                                            Expr *Expr,
463                                            Sema::ConditionKind Kind);
464 
465   /// Transform the attributes associated with the given declaration and
466   /// place them on the new declaration.
467   ///
468   /// By default, this operation does nothing. Subclasses may override this
469   /// behavior to transform attributes.
470   void transformAttrs(Decl *Old, Decl *New) { }
471 
472   /// Note that a local declaration has been transformed by this
473   /// transformer.
474   ///
475   /// Local declarations are typically transformed via a call to
476   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
477   /// the transformer itself has to transform the declarations. This routine
478   /// can be overridden by a subclass that keeps track of such mappings.
479   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
480     assert(New.size() == 1 &&
481            "must override transformedLocalDecl if performing pack expansion");
482     TransformedLocalDecls[Old] = New.front();
483   }
484 
485   /// Transform the definition of the given declaration.
486   ///
487   /// By default, invokes TransformDecl() to transform the declaration.
488   /// Subclasses may override this function to provide alternate behavior.
489   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
490     return getDerived().TransformDecl(Loc, D);
491   }
492 
493   /// Transform the given declaration, which was the first part of a
494   /// nested-name-specifier in a member access expression.
495   ///
496   /// This specific declaration transformation only applies to the first
497   /// identifier in a nested-name-specifier of a member access expression, e.g.,
498   /// the \c T in \c x->T::member
499   ///
500   /// By default, invokes TransformDecl() to transform the declaration.
501   /// Subclasses may override this function to provide alternate behavior.
502   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
503     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
504   }
505 
506   /// Transform the set of declarations in an OverloadExpr.
507   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
508                                   LookupResult &R);
509 
510   /// Transform the given nested-name-specifier with source-location
511   /// information.
512   ///
513   /// By default, transforms all of the types and declarations within the
514   /// nested-name-specifier. Subclasses may override this function to provide
515   /// alternate behavior.
516   NestedNameSpecifierLoc
517   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
518                                   QualType ObjectType = QualType(),
519                                   NamedDecl *FirstQualifierInScope = nullptr);
520 
521   /// Transform the given declaration name.
522   ///
523   /// By default, transforms the types of conversion function, constructor,
524   /// and destructor names and then (if needed) rebuilds the declaration name.
525   /// Identifiers and selectors are returned unmodified. Sublcasses may
526   /// override this function to provide alternate behavior.
527   DeclarationNameInfo
528   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
529 
530   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
531       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
532   concepts::TypeRequirement *
533   TransformTypeRequirement(concepts::TypeRequirement *Req);
534   concepts::ExprRequirement *
535   TransformExprRequirement(concepts::ExprRequirement *Req);
536   concepts::NestedRequirement *
537   TransformNestedRequirement(concepts::NestedRequirement *Req);
538 
539   /// Transform the given template name.
540   ///
541   /// \param SS The nested-name-specifier that qualifies the template
542   /// name. This nested-name-specifier must already have been transformed.
543   ///
544   /// \param Name The template name to transform.
545   ///
546   /// \param NameLoc The source location of the template name.
547   ///
548   /// \param ObjectType If we're translating a template name within a member
549   /// access expression, this is the type of the object whose member template
550   /// is being referenced.
551   ///
552   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
553   /// also refers to a name within the current (lexical) scope, this is the
554   /// declaration it refers to.
555   ///
556   /// By default, transforms the template name by transforming the declarations
557   /// and nested-name-specifiers that occur within the template name.
558   /// Subclasses may override this function to provide alternate behavior.
559   TemplateName
560   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
561                         SourceLocation NameLoc,
562                         QualType ObjectType = QualType(),
563                         NamedDecl *FirstQualifierInScope = nullptr,
564                         bool AllowInjectedClassName = false);
565 
566   /// Transform the given template argument.
567   ///
568   /// By default, this operation transforms the type, expression, or
569   /// declaration stored within the template argument and constructs a
570   /// new template argument from the transformed result. Subclasses may
571   /// override this function to provide alternate behavior.
572   ///
573   /// Returns true if there was an error.
574   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
575                                  TemplateArgumentLoc &Output,
576                                  bool Uneval = false);
577 
578   /// Transform the given set of template arguments.
579   ///
580   /// By default, this operation transforms all of the template arguments
581   /// in the input set using \c TransformTemplateArgument(), and appends
582   /// the transformed arguments to the output list.
583   ///
584   /// Note that this overload of \c TransformTemplateArguments() is merely
585   /// a convenience function. Subclasses that wish to override this behavior
586   /// should override the iterator-based member template version.
587   ///
588   /// \param Inputs The set of template arguments to be transformed.
589   ///
590   /// \param NumInputs The number of template arguments in \p Inputs.
591   ///
592   /// \param Outputs The set of transformed template arguments output by this
593   /// routine.
594   ///
595   /// Returns true if an error occurred.
596   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
597                                   unsigned NumInputs,
598                                   TemplateArgumentListInfo &Outputs,
599                                   bool Uneval = false) {
600     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
601                                       Uneval);
602   }
603 
604   /// Transform the given set of template arguments.
605   ///
606   /// By default, this operation transforms all of the template arguments
607   /// in the input set using \c TransformTemplateArgument(), and appends
608   /// the transformed arguments to the output list.
609   ///
610   /// \param First An iterator to the first template argument.
611   ///
612   /// \param Last An iterator one step past the last template argument.
613   ///
614   /// \param Outputs The set of transformed template arguments output by this
615   /// routine.
616   ///
617   /// Returns true if an error occurred.
618   template<typename InputIterator>
619   bool TransformTemplateArguments(InputIterator First,
620                                   InputIterator Last,
621                                   TemplateArgumentListInfo &Outputs,
622                                   bool Uneval = false);
623 
624   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
625   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
626                                  TemplateArgumentLoc &ArgLoc);
627 
628   /// Fakes up a TypeSourceInfo for a type.
629   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
630     return SemaRef.Context.getTrivialTypeSourceInfo(T,
631                        getDerived().getBaseLocation());
632   }
633 
634 #define ABSTRACT_TYPELOC(CLASS, PARENT)
635 #define TYPELOC(CLASS, PARENT)                                   \
636   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
637 #include "clang/AST/TypeLocNodes.def"
638 
639   template<typename Fn>
640   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
641                                       FunctionProtoTypeLoc TL,
642                                       CXXRecordDecl *ThisContext,
643                                       Qualifiers ThisTypeQuals,
644                                       Fn TransformExceptionSpec);
645 
646   bool TransformExceptionSpec(SourceLocation Loc,
647                               FunctionProtoType::ExceptionSpecInfo &ESI,
648                               SmallVectorImpl<QualType> &Exceptions,
649                               bool &Changed);
650 
651   StmtResult TransformSEHHandler(Stmt *Handler);
652 
653   QualType
654   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
655                                       TemplateSpecializationTypeLoc TL,
656                                       TemplateName Template);
657 
658   QualType
659   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
660                                       DependentTemplateSpecializationTypeLoc TL,
661                                                TemplateName Template,
662                                                CXXScopeSpec &SS);
663 
664   QualType TransformDependentTemplateSpecializationType(
665       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
666       NestedNameSpecifierLoc QualifierLoc);
667 
668   /// Transforms the parameters of a function type into the
669   /// given vectors.
670   ///
671   /// The result vectors should be kept in sync; null entries in the
672   /// variables vector are acceptable.
673   ///
674   /// Return true on error.
675   bool TransformFunctionTypeParams(
676       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
677       const QualType *ParamTypes,
678       const FunctionProtoType::ExtParameterInfo *ParamInfos,
679       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
680       Sema::ExtParameterInfoBuilder &PInfos);
681 
682   /// Transforms a single function-type parameter.  Return null
683   /// on error.
684   ///
685   /// \param indexAdjustment - A number to add to the parameter's
686   ///   scope index;  can be negative
687   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
688                                           int indexAdjustment,
689                                           Optional<unsigned> NumExpansions,
690                                           bool ExpectParameterPack);
691 
692   /// Transform the body of a lambda-expression.
693   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
694   /// Alternative implementation of TransformLambdaBody that skips transforming
695   /// the body.
696   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
697 
698   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
699 
700   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
701   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
702 
703   TemplateParameterList *TransformTemplateParameterList(
704         TemplateParameterList *TPL) {
705     return TPL;
706   }
707 
708   ExprResult TransformAddressOfOperand(Expr *E);
709 
710   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
711                                                 bool IsAddressOfOperand,
712                                                 TypeSourceInfo **RecoveryTSI);
713 
714   ExprResult TransformParenDependentScopeDeclRefExpr(
715       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
716       TypeSourceInfo **RecoveryTSI);
717 
718   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
719 
720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
721 // amount of stack usage with clang.
722 #define STMT(Node, Parent)                        \
723   LLVM_ATTRIBUTE_NOINLINE \
724   StmtResult Transform##Node(Node *S);
725 #define VALUESTMT(Node, Parent)                   \
726   LLVM_ATTRIBUTE_NOINLINE \
727   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
728 #define EXPR(Node, Parent)                        \
729   LLVM_ATTRIBUTE_NOINLINE \
730   ExprResult Transform##Node(Node *E);
731 #define ABSTRACT_STMT(Stmt)
732 #include "clang/AST/StmtNodes.inc"
733 
734 #define OMP_CLAUSE_CLASS(Enum, Str, Class)                                           \
735   LLVM_ATTRIBUTE_NOINLINE \
736   OMPClause *Transform ## Class(Class *S);
737 #include "llvm/Frontend/OpenMP/OMPKinds.def"
738 
739   /// Build a new qualified type given its unqualified type and type location.
740   ///
741   /// By default, this routine adds type qualifiers only to types that can
742   /// have qualifiers, and silently suppresses those qualifiers that are not
743   /// permitted. Subclasses may override this routine to provide different
744   /// behavior.
745   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
746 
747   /// Build a new pointer type given its pointee type.
748   ///
749   /// By default, performs semantic analysis when building the pointer type.
750   /// Subclasses may override this routine to provide different behavior.
751   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
752 
753   /// Build a new block pointer type given its pointee type.
754   ///
755   /// By default, performs semantic analysis when building the block pointer
756   /// type. Subclasses may override this routine to provide different behavior.
757   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
758 
759   /// Build a new reference type given the type it references.
760   ///
761   /// By default, performs semantic analysis when building the
762   /// reference type. Subclasses may override this routine to provide
763   /// different behavior.
764   ///
765   /// \param LValue whether the type was written with an lvalue sigil
766   /// or an rvalue sigil.
767   QualType RebuildReferenceType(QualType ReferentType,
768                                 bool LValue,
769                                 SourceLocation Sigil);
770 
771   /// Build a new member pointer type given the pointee type and the
772   /// class type it refers into.
773   ///
774   /// By default, performs semantic analysis when building the member pointer
775   /// type. Subclasses may override this routine to provide different behavior.
776   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
777                                     SourceLocation Sigil);
778 
779   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
780                                     SourceLocation ProtocolLAngleLoc,
781                                     ArrayRef<ObjCProtocolDecl *> Protocols,
782                                     ArrayRef<SourceLocation> ProtocolLocs,
783                                     SourceLocation ProtocolRAngleLoc);
784 
785   /// Build an Objective-C object type.
786   ///
787   /// By default, performs semantic analysis when building the object type.
788   /// Subclasses may override this routine to provide different behavior.
789   QualType RebuildObjCObjectType(QualType BaseType,
790                                  SourceLocation Loc,
791                                  SourceLocation TypeArgsLAngleLoc,
792                                  ArrayRef<TypeSourceInfo *> TypeArgs,
793                                  SourceLocation TypeArgsRAngleLoc,
794                                  SourceLocation ProtocolLAngleLoc,
795                                  ArrayRef<ObjCProtocolDecl *> Protocols,
796                                  ArrayRef<SourceLocation> ProtocolLocs,
797                                  SourceLocation ProtocolRAngleLoc);
798 
799   /// Build a new Objective-C object pointer type given the pointee type.
800   ///
801   /// By default, directly builds the pointer type, with no additional semantic
802   /// analysis.
803   QualType RebuildObjCObjectPointerType(QualType PointeeType,
804                                         SourceLocation Star);
805 
806   /// Build a new array type given the element type, size
807   /// modifier, size of the array (if known), size expression, and index type
808   /// qualifiers.
809   ///
810   /// By default, performs semantic analysis when building the array type.
811   /// Subclasses may override this routine to provide different behavior.
812   /// Also by default, all of the other Rebuild*Array
813   QualType RebuildArrayType(QualType ElementType,
814                             ArrayType::ArraySizeModifier SizeMod,
815                             const llvm::APInt *Size,
816                             Expr *SizeExpr,
817                             unsigned IndexTypeQuals,
818                             SourceRange BracketsRange);
819 
820   /// Build a new constant array type given the element type, size
821   /// modifier, (known) size of the array, and index type qualifiers.
822   ///
823   /// By default, performs semantic analysis when building the array type.
824   /// Subclasses may override this routine to provide different behavior.
825   QualType RebuildConstantArrayType(QualType ElementType,
826                                     ArrayType::ArraySizeModifier SizeMod,
827                                     const llvm::APInt &Size,
828                                     Expr *SizeExpr,
829                                     unsigned IndexTypeQuals,
830                                     SourceRange BracketsRange);
831 
832   /// Build a new incomplete array type given the element type, size
833   /// modifier, and index type qualifiers.
834   ///
835   /// By default, performs semantic analysis when building the array type.
836   /// Subclasses may override this routine to provide different behavior.
837   QualType RebuildIncompleteArrayType(QualType ElementType,
838                                       ArrayType::ArraySizeModifier SizeMod,
839                                       unsigned IndexTypeQuals,
840                                       SourceRange BracketsRange);
841 
842   /// Build a new variable-length array type given the element type,
843   /// size modifier, size expression, and index type qualifiers.
844   ///
845   /// By default, performs semantic analysis when building the array type.
846   /// Subclasses may override this routine to provide different behavior.
847   QualType RebuildVariableArrayType(QualType ElementType,
848                                     ArrayType::ArraySizeModifier SizeMod,
849                                     Expr *SizeExpr,
850                                     unsigned IndexTypeQuals,
851                                     SourceRange BracketsRange);
852 
853   /// Build a new dependent-sized array type given the element type,
854   /// size modifier, size expression, and index type qualifiers.
855   ///
856   /// By default, performs semantic analysis when building the array type.
857   /// Subclasses may override this routine to provide different behavior.
858   QualType RebuildDependentSizedArrayType(QualType ElementType,
859                                           ArrayType::ArraySizeModifier SizeMod,
860                                           Expr *SizeExpr,
861                                           unsigned IndexTypeQuals,
862                                           SourceRange BracketsRange);
863 
864   /// Build a new vector type given the element type and
865   /// number of elements.
866   ///
867   /// By default, performs semantic analysis when building the vector type.
868   /// Subclasses may override this routine to provide different behavior.
869   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
870                              VectorType::VectorKind VecKind);
871 
872   /// Build a new potentially dependently-sized extended vector type
873   /// given the element type and number of elements.
874   ///
875   /// By default, performs semantic analysis when building the vector type.
876   /// Subclasses may override this routine to provide different behavior.
877   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
878                                            SourceLocation AttributeLoc,
879                                            VectorType::VectorKind);
880 
881   /// Build a new extended vector type given the element type and
882   /// number of elements.
883   ///
884   /// By default, performs semantic analysis when building the vector type.
885   /// Subclasses may override this routine to provide different behavior.
886   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
887                                 SourceLocation AttributeLoc);
888 
889   /// Build a new potentially dependently-sized extended vector type
890   /// given the element type and number of elements.
891   ///
892   /// By default, performs semantic analysis when building the vector type.
893   /// Subclasses may override this routine to provide different behavior.
894   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
895                                               Expr *SizeExpr,
896                                               SourceLocation AttributeLoc);
897 
898   /// Build a new matrix type given the element type and dimensions.
899   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
900                                      unsigned NumColumns);
901 
902   /// Build a new matrix type given the type and dependently-defined
903   /// dimensions.
904   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
905                                            Expr *ColumnExpr,
906                                            SourceLocation AttributeLoc);
907 
908   /// Build a new DependentAddressSpaceType or return the pointee
909   /// type variable with the correct address space (retrieved from
910   /// AddrSpaceExpr) applied to it. The former will be returned in cases
911   /// where the address space remains dependent.
912   ///
913   /// By default, performs semantic analysis when building the type with address
914   /// space applied. Subclasses may override this routine to provide different
915   /// behavior.
916   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
917                                             Expr *AddrSpaceExpr,
918                                             SourceLocation AttributeLoc);
919 
920   /// Build a new function type.
921   ///
922   /// By default, performs semantic analysis when building the function type.
923   /// Subclasses may override this routine to provide different behavior.
924   QualType RebuildFunctionProtoType(QualType T,
925                                     MutableArrayRef<QualType> ParamTypes,
926                                     const FunctionProtoType::ExtProtoInfo &EPI);
927 
928   /// Build a new unprototyped function type.
929   QualType RebuildFunctionNoProtoType(QualType ResultType);
930 
931   /// Rebuild an unresolved typename type, given the decl that
932   /// the UnresolvedUsingTypenameDecl was transformed to.
933   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
934 
935   /// Build a new typedef type.
936   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
937     return SemaRef.Context.getTypeDeclType(Typedef);
938   }
939 
940   /// Build a new MacroDefined type.
941   QualType RebuildMacroQualifiedType(QualType T,
942                                      const IdentifierInfo *MacroII) {
943     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
944   }
945 
946   /// Build a new class/struct/union type.
947   QualType RebuildRecordType(RecordDecl *Record) {
948     return SemaRef.Context.getTypeDeclType(Record);
949   }
950 
951   /// Build a new Enum type.
952   QualType RebuildEnumType(EnumDecl *Enum) {
953     return SemaRef.Context.getTypeDeclType(Enum);
954   }
955 
956   /// Build a new typeof(expr) type.
957   ///
958   /// By default, performs semantic analysis when building the typeof type.
959   /// Subclasses may override this routine to provide different behavior.
960   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
961 
962   /// Build a new typeof(type) type.
963   ///
964   /// By default, builds a new TypeOfType with the given underlying type.
965   QualType RebuildTypeOfType(QualType Underlying);
966 
967   /// Build a new unary transform type.
968   QualType RebuildUnaryTransformType(QualType BaseType,
969                                      UnaryTransformType::UTTKind UKind,
970                                      SourceLocation Loc);
971 
972   /// Build a new C++11 decltype type.
973   ///
974   /// By default, performs semantic analysis when building the decltype type.
975   /// Subclasses may override this routine to provide different behavior.
976   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
977 
978   /// Build a new C++11 auto type.
979   ///
980   /// By default, builds a new AutoType with the given deduced type.
981   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
982                            ConceptDecl *TypeConstraintConcept,
983                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
984     // Note, IsDependent is always false here: we implicitly convert an 'auto'
985     // which has been deduced to a dependent type into an undeduced 'auto', so
986     // that we'll retry deduction after the transformation.
987     return SemaRef.Context.getAutoType(Deduced, Keyword,
988                                        /*IsDependent*/ false, /*IsPack=*/false,
989                                        TypeConstraintConcept,
990                                        TypeConstraintArgs);
991   }
992 
993   /// By default, builds a new DeducedTemplateSpecializationType with the given
994   /// deduced type.
995   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
996       QualType Deduced) {
997     return SemaRef.Context.getDeducedTemplateSpecializationType(
998         Template, Deduced, /*IsDependent*/ false);
999   }
1000 
1001   /// Build a new template specialization type.
1002   ///
1003   /// By default, performs semantic analysis when building the template
1004   /// specialization type. Subclasses may override this routine to provide
1005   /// different behavior.
1006   QualType RebuildTemplateSpecializationType(TemplateName Template,
1007                                              SourceLocation TemplateLoc,
1008                                              TemplateArgumentListInfo &Args);
1009 
1010   /// Build a new parenthesized type.
1011   ///
1012   /// By default, builds a new ParenType type from the inner type.
1013   /// Subclasses may override this routine to provide different behavior.
1014   QualType RebuildParenType(QualType InnerType) {
1015     return SemaRef.BuildParenType(InnerType);
1016   }
1017 
1018   /// Build a new qualified name type.
1019   ///
1020   /// By default, builds a new ElaboratedType type from the keyword,
1021   /// the nested-name-specifier and the named type.
1022   /// Subclasses may override this routine to provide different behavior.
1023   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1024                                  ElaboratedTypeKeyword Keyword,
1025                                  NestedNameSpecifierLoc QualifierLoc,
1026                                  QualType Named) {
1027     return SemaRef.Context.getElaboratedType(Keyword,
1028                                          QualifierLoc.getNestedNameSpecifier(),
1029                                              Named);
1030   }
1031 
1032   /// Build a new typename type that refers to a template-id.
1033   ///
1034   /// By default, builds a new DependentNameType type from the
1035   /// nested-name-specifier and the given type. Subclasses may override
1036   /// this routine to provide different behavior.
1037   QualType RebuildDependentTemplateSpecializationType(
1038                                           ElaboratedTypeKeyword Keyword,
1039                                           NestedNameSpecifierLoc QualifierLoc,
1040                                           SourceLocation TemplateKWLoc,
1041                                           const IdentifierInfo *Name,
1042                                           SourceLocation NameLoc,
1043                                           TemplateArgumentListInfo &Args,
1044                                           bool AllowInjectedClassName) {
1045     // Rebuild the template name.
1046     // TODO: avoid TemplateName abstraction
1047     CXXScopeSpec SS;
1048     SS.Adopt(QualifierLoc);
1049     TemplateName InstName = getDerived().RebuildTemplateName(
1050         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1051         AllowInjectedClassName);
1052 
1053     if (InstName.isNull())
1054       return QualType();
1055 
1056     // If it's still dependent, make a dependent specialization.
1057     if (InstName.getAsDependentTemplateName())
1058       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1059                                           QualifierLoc.getNestedNameSpecifier(),
1060                                                                     Name,
1061                                                                     Args);
1062 
1063     // Otherwise, make an elaborated type wrapping a non-dependent
1064     // specialization.
1065     QualType T =
1066     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1067     if (T.isNull()) return QualType();
1068 
1069     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1070       return T;
1071 
1072     return SemaRef.Context.getElaboratedType(Keyword,
1073                                        QualifierLoc.getNestedNameSpecifier(),
1074                                              T);
1075   }
1076 
1077   /// Build a new typename type that refers to an identifier.
1078   ///
1079   /// By default, performs semantic analysis when building the typename type
1080   /// (or elaborated type). Subclasses may override this routine to provide
1081   /// different behavior.
1082   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1083                                     SourceLocation KeywordLoc,
1084                                     NestedNameSpecifierLoc QualifierLoc,
1085                                     const IdentifierInfo *Id,
1086                                     SourceLocation IdLoc,
1087                                     bool DeducedTSTContext) {
1088     CXXScopeSpec SS;
1089     SS.Adopt(QualifierLoc);
1090 
1091     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1092       // If the name is still dependent, just build a new dependent name type.
1093       if (!SemaRef.computeDeclContext(SS))
1094         return SemaRef.Context.getDependentNameType(Keyword,
1095                                           QualifierLoc.getNestedNameSpecifier(),
1096                                                     Id);
1097     }
1098 
1099     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1100       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1101                                        *Id, IdLoc, DeducedTSTContext);
1102     }
1103 
1104     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1105 
1106     // We had a dependent elaborated-type-specifier that has been transformed
1107     // into a non-dependent elaborated-type-specifier. Find the tag we're
1108     // referring to.
1109     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1110     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1111     if (!DC)
1112       return QualType();
1113 
1114     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1115       return QualType();
1116 
1117     TagDecl *Tag = nullptr;
1118     SemaRef.LookupQualifiedName(Result, DC);
1119     switch (Result.getResultKind()) {
1120       case LookupResult::NotFound:
1121       case LookupResult::NotFoundInCurrentInstantiation:
1122         break;
1123 
1124       case LookupResult::Found:
1125         Tag = Result.getAsSingle<TagDecl>();
1126         break;
1127 
1128       case LookupResult::FoundOverloaded:
1129       case LookupResult::FoundUnresolvedValue:
1130         llvm_unreachable("Tag lookup cannot find non-tags");
1131 
1132       case LookupResult::Ambiguous:
1133         // Let the LookupResult structure handle ambiguities.
1134         return QualType();
1135     }
1136 
1137     if (!Tag) {
1138       // Check where the name exists but isn't a tag type and use that to emit
1139       // better diagnostics.
1140       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1141       SemaRef.LookupQualifiedName(Result, DC);
1142       switch (Result.getResultKind()) {
1143         case LookupResult::Found:
1144         case LookupResult::FoundOverloaded:
1145         case LookupResult::FoundUnresolvedValue: {
1146           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1147           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1148           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1149                                                                << NTK << Kind;
1150           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1151           break;
1152         }
1153         default:
1154           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1155               << Kind << Id << DC << QualifierLoc.getSourceRange();
1156           break;
1157       }
1158       return QualType();
1159     }
1160 
1161     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1162                                               IdLoc, Id)) {
1163       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1164       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1165       return QualType();
1166     }
1167 
1168     // Build the elaborated-type-specifier type.
1169     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1170     return SemaRef.Context.getElaboratedType(Keyword,
1171                                          QualifierLoc.getNestedNameSpecifier(),
1172                                              T);
1173   }
1174 
1175   /// Build a new pack expansion type.
1176   ///
1177   /// By default, builds a new PackExpansionType type from the given pattern.
1178   /// Subclasses may override this routine to provide different behavior.
1179   QualType RebuildPackExpansionType(QualType Pattern,
1180                                     SourceRange PatternRange,
1181                                     SourceLocation EllipsisLoc,
1182                                     Optional<unsigned> NumExpansions) {
1183     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1184                                         NumExpansions);
1185   }
1186 
1187   /// Build a new atomic type given its value type.
1188   ///
1189   /// By default, performs semantic analysis when building the atomic type.
1190   /// Subclasses may override this routine to provide different behavior.
1191   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1192 
1193   /// Build a new pipe type given its value type.
1194   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1195                            bool isReadPipe);
1196 
1197    /// Build an extended int given its value type.
1198   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1199                              SourceLocation Loc);
1200 
1201   /// Build a dependent extended int given its value type.
1202   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1203                                       SourceLocation Loc);
1204 
1205   /// Build a new template name given a nested name specifier, a flag
1206   /// indicating whether the "template" keyword was provided, and the template
1207   /// that the template name refers to.
1208   ///
1209   /// By default, builds the new template name directly. Subclasses may override
1210   /// this routine to provide different behavior.
1211   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1212                                    bool TemplateKW,
1213                                    TemplateDecl *Template);
1214 
1215   /// Build a new template name given a nested name specifier and the
1216   /// name that is referred to as a template.
1217   ///
1218   /// By default, performs semantic analysis to determine whether the name can
1219   /// be resolved to a specific template, then builds the appropriate kind of
1220   /// template name. Subclasses may override this routine to provide different
1221   /// behavior.
1222   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1223                                    SourceLocation TemplateKWLoc,
1224                                    const IdentifierInfo &Name,
1225                                    SourceLocation NameLoc, QualType ObjectType,
1226                                    NamedDecl *FirstQualifierInScope,
1227                                    bool AllowInjectedClassName);
1228 
1229   /// Build a new template name given a nested name specifier and the
1230   /// overloaded operator name that is referred to as a template.
1231   ///
1232   /// By default, performs semantic analysis to determine whether the name can
1233   /// be resolved to a specific template, then builds the appropriate kind of
1234   /// template name. Subclasses may override this routine to provide different
1235   /// behavior.
1236   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1237                                    SourceLocation TemplateKWLoc,
1238                                    OverloadedOperatorKind Operator,
1239                                    SourceLocation NameLoc, QualType ObjectType,
1240                                    bool AllowInjectedClassName);
1241 
1242   /// Build a new template name given a template template parameter pack
1243   /// and the
1244   ///
1245   /// By default, performs semantic analysis to determine whether the name can
1246   /// be resolved to a specific template, then builds the appropriate kind of
1247   /// template name. Subclasses may override this routine to provide different
1248   /// behavior.
1249   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1250                                    const TemplateArgument &ArgPack) {
1251     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1252   }
1253 
1254   /// Build a new compound statement.
1255   ///
1256   /// By default, performs semantic analysis to build the new statement.
1257   /// Subclasses may override this routine to provide different behavior.
1258   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1259                                        MultiStmtArg Statements,
1260                                        SourceLocation RBraceLoc,
1261                                        bool IsStmtExpr) {
1262     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1263                                        IsStmtExpr);
1264   }
1265 
1266   /// Build a new case statement.
1267   ///
1268   /// By default, performs semantic analysis to build the new statement.
1269   /// Subclasses may override this routine to provide different behavior.
1270   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1271                                    Expr *LHS,
1272                                    SourceLocation EllipsisLoc,
1273                                    Expr *RHS,
1274                                    SourceLocation ColonLoc) {
1275     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1276                                    ColonLoc);
1277   }
1278 
1279   /// Attach the body to a new case statement.
1280   ///
1281   /// By default, performs semantic analysis to build the new statement.
1282   /// Subclasses may override this routine to provide different behavior.
1283   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1284     getSema().ActOnCaseStmtBody(S, Body);
1285     return S;
1286   }
1287 
1288   /// Build a new default statement.
1289   ///
1290   /// By default, performs semantic analysis to build the new statement.
1291   /// Subclasses may override this routine to provide different behavior.
1292   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1293                                       SourceLocation ColonLoc,
1294                                       Stmt *SubStmt) {
1295     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1296                                       /*CurScope=*/nullptr);
1297   }
1298 
1299   /// Build a new label statement.
1300   ///
1301   /// By default, performs semantic analysis to build the new statement.
1302   /// Subclasses may override this routine to provide different behavior.
1303   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1304                               SourceLocation ColonLoc, Stmt *SubStmt) {
1305     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1306   }
1307 
1308   /// Build a new label statement.
1309   ///
1310   /// By default, performs semantic analysis to build the new statement.
1311   /// Subclasses may override this routine to provide different behavior.
1312   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1313                                    ArrayRef<const Attr*> Attrs,
1314                                    Stmt *SubStmt) {
1315     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1316   }
1317 
1318   /// Build a new "if" statement.
1319   ///
1320   /// By default, performs semantic analysis to build the new statement.
1321   /// Subclasses may override this routine to provide different behavior.
1322   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1323                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1324                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1325                            SourceLocation ElseLoc, Stmt *Else) {
1326     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond,
1327                                  RParenLoc, Then, ElseLoc, Else);
1328   }
1329 
1330   /// Start building a new switch statement.
1331   ///
1332   /// By default, performs semantic analysis to build the new statement.
1333   /// Subclasses may override this routine to provide different behavior.
1334   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1335                                     SourceLocation LParenLoc, Stmt *Init,
1336                                     Sema::ConditionResult Cond,
1337                                     SourceLocation RParenLoc) {
1338     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1339                                             RParenLoc);
1340   }
1341 
1342   /// Attach the body to the switch statement.
1343   ///
1344   /// By default, performs semantic analysis to build the new statement.
1345   /// Subclasses may override this routine to provide different behavior.
1346   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1347                                    Stmt *Switch, Stmt *Body) {
1348     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1349   }
1350 
1351   /// Build a new while statement.
1352   ///
1353   /// By default, performs semantic analysis to build the new statement.
1354   /// Subclasses may override this routine to provide different behavior.
1355   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1356                               Sema::ConditionResult Cond,
1357                               SourceLocation RParenLoc, Stmt *Body) {
1358     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1359   }
1360 
1361   /// Build a new do-while statement.
1362   ///
1363   /// By default, performs semantic analysis to build the new statement.
1364   /// Subclasses may override this routine to provide different behavior.
1365   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1366                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1367                            Expr *Cond, SourceLocation RParenLoc) {
1368     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1369                                  Cond, RParenLoc);
1370   }
1371 
1372   /// Build a new for statement.
1373   ///
1374   /// By default, performs semantic analysis to build the new statement.
1375   /// Subclasses may override this routine to provide different behavior.
1376   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1377                             Stmt *Init, Sema::ConditionResult Cond,
1378                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1379                             Stmt *Body) {
1380     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1381                                   Inc, RParenLoc, Body);
1382   }
1383 
1384   /// Build a new goto statement.
1385   ///
1386   /// By default, performs semantic analysis to build the new statement.
1387   /// Subclasses may override this routine to provide different behavior.
1388   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1389                              LabelDecl *Label) {
1390     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1391   }
1392 
1393   /// Build a new indirect goto statement.
1394   ///
1395   /// By default, performs semantic analysis to build the new statement.
1396   /// Subclasses may override this routine to provide different behavior.
1397   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1398                                      SourceLocation StarLoc,
1399                                      Expr *Target) {
1400     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1401   }
1402 
1403   /// Build a new return statement.
1404   ///
1405   /// By default, performs semantic analysis to build the new statement.
1406   /// Subclasses may override this routine to provide different behavior.
1407   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1408     return getSema().BuildReturnStmt(ReturnLoc, Result);
1409   }
1410 
1411   /// Build a new declaration statement.
1412   ///
1413   /// By default, performs semantic analysis to build the new statement.
1414   /// Subclasses may override this routine to provide different behavior.
1415   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1416                              SourceLocation StartLoc, SourceLocation EndLoc) {
1417     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1418     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1419   }
1420 
1421   /// Build a new inline asm statement.
1422   ///
1423   /// By default, performs semantic analysis to build the new statement.
1424   /// Subclasses may override this routine to provide different behavior.
1425   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1426                                bool IsVolatile, unsigned NumOutputs,
1427                                unsigned NumInputs, IdentifierInfo **Names,
1428                                MultiExprArg Constraints, MultiExprArg Exprs,
1429                                Expr *AsmString, MultiExprArg Clobbers,
1430                                unsigned NumLabels,
1431                                SourceLocation RParenLoc) {
1432     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1433                                      NumInputs, Names, Constraints, Exprs,
1434                                      AsmString, Clobbers, NumLabels, RParenLoc);
1435   }
1436 
1437   /// Build a new MS style inline asm statement.
1438   ///
1439   /// By default, performs semantic analysis to build the new statement.
1440   /// Subclasses may override this routine to provide different behavior.
1441   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1442                               ArrayRef<Token> AsmToks,
1443                               StringRef AsmString,
1444                               unsigned NumOutputs, unsigned NumInputs,
1445                               ArrayRef<StringRef> Constraints,
1446                               ArrayRef<StringRef> Clobbers,
1447                               ArrayRef<Expr*> Exprs,
1448                               SourceLocation EndLoc) {
1449     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1450                                     NumOutputs, NumInputs,
1451                                     Constraints, Clobbers, Exprs, EndLoc);
1452   }
1453 
1454   /// Build a new co_return statement.
1455   ///
1456   /// By default, performs semantic analysis to build the new statement.
1457   /// Subclasses may override this routine to provide different behavior.
1458   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1459                                  bool IsImplicit) {
1460     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1461   }
1462 
1463   /// Build a new co_await expression.
1464   ///
1465   /// By default, performs semantic analysis to build the new expression.
1466   /// Subclasses may override this routine to provide different behavior.
1467   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1468                                 bool IsImplicit) {
1469     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1470   }
1471 
1472   /// Build a new co_await expression.
1473   ///
1474   /// By default, performs semantic analysis to build the new expression.
1475   /// Subclasses may override this routine to provide different behavior.
1476   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1477                                          Expr *Result,
1478                                          UnresolvedLookupExpr *Lookup) {
1479     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1480   }
1481 
1482   /// Build a new co_yield expression.
1483   ///
1484   /// By default, performs semantic analysis to build the new expression.
1485   /// Subclasses may override this routine to provide different behavior.
1486   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1487     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1488   }
1489 
1490   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1491     return getSema().BuildCoroutineBodyStmt(Args);
1492   }
1493 
1494   /// Build a new Objective-C \@try statement.
1495   ///
1496   /// By default, performs semantic analysis to build the new statement.
1497   /// Subclasses may override this routine to provide different behavior.
1498   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1499                                         Stmt *TryBody,
1500                                         MultiStmtArg CatchStmts,
1501                                         Stmt *Finally) {
1502     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1503                                         Finally);
1504   }
1505 
1506   /// Rebuild an Objective-C exception declaration.
1507   ///
1508   /// By default, performs semantic analysis to build the new declaration.
1509   /// Subclasses may override this routine to provide different behavior.
1510   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1511                                     TypeSourceInfo *TInfo, QualType T) {
1512     return getSema().BuildObjCExceptionDecl(TInfo, T,
1513                                             ExceptionDecl->getInnerLocStart(),
1514                                             ExceptionDecl->getLocation(),
1515                                             ExceptionDecl->getIdentifier());
1516   }
1517 
1518   /// Build a new Objective-C \@catch statement.
1519   ///
1520   /// By default, performs semantic analysis to build the new statement.
1521   /// Subclasses may override this routine to provide different behavior.
1522   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1523                                           SourceLocation RParenLoc,
1524                                           VarDecl *Var,
1525                                           Stmt *Body) {
1526     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1527                                           Var, Body);
1528   }
1529 
1530   /// Build a new Objective-C \@finally statement.
1531   ///
1532   /// By default, performs semantic analysis to build the new statement.
1533   /// Subclasses may override this routine to provide different behavior.
1534   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1535                                             Stmt *Body) {
1536     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1537   }
1538 
1539   /// Build a new Objective-C \@throw statement.
1540   ///
1541   /// By default, performs semantic analysis to build the new statement.
1542   /// Subclasses may override this routine to provide different behavior.
1543   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1544                                           Expr *Operand) {
1545     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1546   }
1547 
1548   /// Build a new OpenMP executable directive.
1549   ///
1550   /// By default, performs semantic analysis to build the new statement.
1551   /// Subclasses may override this routine to provide different behavior.
1552   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1553                                            DeclarationNameInfo DirName,
1554                                            OpenMPDirectiveKind CancelRegion,
1555                                            ArrayRef<OMPClause *> Clauses,
1556                                            Stmt *AStmt, SourceLocation StartLoc,
1557                                            SourceLocation EndLoc) {
1558     return getSema().ActOnOpenMPExecutableDirective(
1559         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1560   }
1561 
1562   /// Build a new OpenMP 'if' clause.
1563   ///
1564   /// By default, performs semantic analysis to build the new OpenMP clause.
1565   /// Subclasses may override this routine to provide different behavior.
1566   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1567                                 Expr *Condition, SourceLocation StartLoc,
1568                                 SourceLocation LParenLoc,
1569                                 SourceLocation NameModifierLoc,
1570                                 SourceLocation ColonLoc,
1571                                 SourceLocation EndLoc) {
1572     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1573                                          LParenLoc, NameModifierLoc, ColonLoc,
1574                                          EndLoc);
1575   }
1576 
1577   /// Build a new OpenMP 'final' clause.
1578   ///
1579   /// By default, performs semantic analysis to build the new OpenMP clause.
1580   /// Subclasses may override this routine to provide different behavior.
1581   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1582                                    SourceLocation LParenLoc,
1583                                    SourceLocation EndLoc) {
1584     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1585                                             EndLoc);
1586   }
1587 
1588   /// Build a new OpenMP 'num_threads' clause.
1589   ///
1590   /// By default, performs semantic analysis to build the new OpenMP clause.
1591   /// Subclasses may override this routine to provide different behavior.
1592   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1593                                         SourceLocation StartLoc,
1594                                         SourceLocation LParenLoc,
1595                                         SourceLocation EndLoc) {
1596     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1597                                                  LParenLoc, EndLoc);
1598   }
1599 
1600   /// Build a new OpenMP 'safelen' clause.
1601   ///
1602   /// By default, performs semantic analysis to build the new OpenMP clause.
1603   /// Subclasses may override this routine to provide different behavior.
1604   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1605                                      SourceLocation LParenLoc,
1606                                      SourceLocation EndLoc) {
1607     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1608   }
1609 
1610   /// Build a new OpenMP 'simdlen' clause.
1611   ///
1612   /// By default, performs semantic analysis to build the new OpenMP clause.
1613   /// Subclasses may override this routine to provide different behavior.
1614   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1615                                      SourceLocation LParenLoc,
1616                                      SourceLocation EndLoc) {
1617     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1618   }
1619 
1620   /// Build a new OpenMP 'allocator' clause.
1621   ///
1622   /// By default, performs semantic analysis to build the new OpenMP clause.
1623   /// Subclasses may override this routine to provide different behavior.
1624   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1625                                        SourceLocation LParenLoc,
1626                                        SourceLocation EndLoc) {
1627     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1628   }
1629 
1630   /// Build a new OpenMP 'collapse' clause.
1631   ///
1632   /// By default, performs semantic analysis to build the new OpenMP clause.
1633   /// Subclasses may override this routine to provide different behavior.
1634   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1635                                       SourceLocation LParenLoc,
1636                                       SourceLocation EndLoc) {
1637     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1638                                                EndLoc);
1639   }
1640 
1641   /// Build a new OpenMP 'default' clause.
1642   ///
1643   /// By default, performs semantic analysis to build the new OpenMP clause.
1644   /// Subclasses may override this routine to provide different behavior.
1645   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1646                                      SourceLocation StartLoc,
1647                                      SourceLocation LParenLoc,
1648                                      SourceLocation EndLoc) {
1649     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1650                                               StartLoc, LParenLoc, EndLoc);
1651   }
1652 
1653   /// Build a new OpenMP 'proc_bind' clause.
1654   ///
1655   /// By default, performs semantic analysis to build the new OpenMP clause.
1656   /// Subclasses may override this routine to provide different behavior.
1657   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1658                                       SourceLocation KindKwLoc,
1659                                       SourceLocation StartLoc,
1660                                       SourceLocation LParenLoc,
1661                                       SourceLocation EndLoc) {
1662     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1663                                                StartLoc, LParenLoc, EndLoc);
1664   }
1665 
1666   /// Build a new OpenMP 'schedule' clause.
1667   ///
1668   /// By default, performs semantic analysis to build the new OpenMP clause.
1669   /// Subclasses may override this routine to provide different behavior.
1670   OMPClause *RebuildOMPScheduleClause(
1671       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1672       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1673       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1674       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1675     return getSema().ActOnOpenMPScheduleClause(
1676         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1677         CommaLoc, EndLoc);
1678   }
1679 
1680   /// Build a new OpenMP 'ordered' clause.
1681   ///
1682   /// By default, performs semantic analysis to build the new OpenMP clause.
1683   /// Subclasses may override this routine to provide different behavior.
1684   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1685                                      SourceLocation EndLoc,
1686                                      SourceLocation LParenLoc, Expr *Num) {
1687     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1688   }
1689 
1690   /// Build a new OpenMP 'private' clause.
1691   ///
1692   /// By default, performs semantic analysis to build the new OpenMP clause.
1693   /// Subclasses may override this routine to provide different behavior.
1694   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1695                                      SourceLocation StartLoc,
1696                                      SourceLocation LParenLoc,
1697                                      SourceLocation EndLoc) {
1698     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1699                                               EndLoc);
1700   }
1701 
1702   /// Build a new OpenMP 'firstprivate' clause.
1703   ///
1704   /// By default, performs semantic analysis to build the new OpenMP clause.
1705   /// Subclasses may override this routine to provide different behavior.
1706   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1707                                           SourceLocation StartLoc,
1708                                           SourceLocation LParenLoc,
1709                                           SourceLocation EndLoc) {
1710     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1711                                                    EndLoc);
1712   }
1713 
1714   /// Build a new OpenMP 'lastprivate' clause.
1715   ///
1716   /// By default, performs semantic analysis to build the new OpenMP clause.
1717   /// Subclasses may override this routine to provide different behavior.
1718   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1719                                          OpenMPLastprivateModifier LPKind,
1720                                          SourceLocation LPKindLoc,
1721                                          SourceLocation ColonLoc,
1722                                          SourceLocation StartLoc,
1723                                          SourceLocation LParenLoc,
1724                                          SourceLocation EndLoc) {
1725     return getSema().ActOnOpenMPLastprivateClause(
1726         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1727   }
1728 
1729   /// Build a new OpenMP 'shared' clause.
1730   ///
1731   /// By default, performs semantic analysis to build the new OpenMP clause.
1732   /// Subclasses may override this routine to provide different behavior.
1733   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1734                                     SourceLocation StartLoc,
1735                                     SourceLocation LParenLoc,
1736                                     SourceLocation EndLoc) {
1737     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1738                                              EndLoc);
1739   }
1740 
1741   /// Build a new OpenMP 'reduction' clause.
1742   ///
1743   /// By default, performs semantic analysis to build the new statement.
1744   /// Subclasses may override this routine to provide different behavior.
1745   OMPClause *RebuildOMPReductionClause(
1746       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1747       SourceLocation StartLoc, SourceLocation LParenLoc,
1748       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1749       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1750       const DeclarationNameInfo &ReductionId,
1751       ArrayRef<Expr *> UnresolvedReductions) {
1752     return getSema().ActOnOpenMPReductionClause(
1753         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1754         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1755   }
1756 
1757   /// Build a new OpenMP 'task_reduction' clause.
1758   ///
1759   /// By default, performs semantic analysis to build the new statement.
1760   /// Subclasses may override this routine to provide different behavior.
1761   OMPClause *RebuildOMPTaskReductionClause(
1762       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1763       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1764       CXXScopeSpec &ReductionIdScopeSpec,
1765       const DeclarationNameInfo &ReductionId,
1766       ArrayRef<Expr *> UnresolvedReductions) {
1767     return getSema().ActOnOpenMPTaskReductionClause(
1768         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1769         ReductionId, UnresolvedReductions);
1770   }
1771 
1772   /// Build a new OpenMP 'in_reduction' clause.
1773   ///
1774   /// By default, performs semantic analysis to build the new statement.
1775   /// Subclasses may override this routine to provide different behavior.
1776   OMPClause *
1777   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1778                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1779                               SourceLocation EndLoc,
1780                               CXXScopeSpec &ReductionIdScopeSpec,
1781                               const DeclarationNameInfo &ReductionId,
1782                               ArrayRef<Expr *> UnresolvedReductions) {
1783     return getSema().ActOnOpenMPInReductionClause(
1784         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1785         ReductionId, UnresolvedReductions);
1786   }
1787 
1788   /// Build a new OpenMP 'linear' clause.
1789   ///
1790   /// By default, performs semantic analysis to build the new OpenMP clause.
1791   /// Subclasses may override this routine to provide different behavior.
1792   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1793                                     SourceLocation StartLoc,
1794                                     SourceLocation LParenLoc,
1795                                     OpenMPLinearClauseKind Modifier,
1796                                     SourceLocation ModifierLoc,
1797                                     SourceLocation ColonLoc,
1798                                     SourceLocation EndLoc) {
1799     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1800                                              Modifier, ModifierLoc, ColonLoc,
1801                                              EndLoc);
1802   }
1803 
1804   /// Build a new OpenMP 'aligned' clause.
1805   ///
1806   /// By default, performs semantic analysis to build the new OpenMP clause.
1807   /// Subclasses may override this routine to provide different behavior.
1808   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1809                                      SourceLocation StartLoc,
1810                                      SourceLocation LParenLoc,
1811                                      SourceLocation ColonLoc,
1812                                      SourceLocation EndLoc) {
1813     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1814                                               LParenLoc, ColonLoc, EndLoc);
1815   }
1816 
1817   /// Build a new OpenMP 'copyin' clause.
1818   ///
1819   /// By default, performs semantic analysis to build the new OpenMP clause.
1820   /// Subclasses may override this routine to provide different behavior.
1821   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1822                                     SourceLocation StartLoc,
1823                                     SourceLocation LParenLoc,
1824                                     SourceLocation EndLoc) {
1825     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1826                                              EndLoc);
1827   }
1828 
1829   /// Build a new OpenMP 'copyprivate' clause.
1830   ///
1831   /// By default, performs semantic analysis to build the new OpenMP clause.
1832   /// Subclasses may override this routine to provide different behavior.
1833   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1834                                          SourceLocation StartLoc,
1835                                          SourceLocation LParenLoc,
1836                                          SourceLocation EndLoc) {
1837     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1838                                                   EndLoc);
1839   }
1840 
1841   /// Build a new OpenMP 'flush' pseudo clause.
1842   ///
1843   /// By default, performs semantic analysis to build the new OpenMP clause.
1844   /// Subclasses may override this routine to provide different behavior.
1845   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1846                                    SourceLocation StartLoc,
1847                                    SourceLocation LParenLoc,
1848                                    SourceLocation EndLoc) {
1849     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1850                                             EndLoc);
1851   }
1852 
1853   /// Build a new OpenMP 'depobj' pseudo clause.
1854   ///
1855   /// By default, performs semantic analysis to build the new OpenMP clause.
1856   /// Subclasses may override this routine to provide different behavior.
1857   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1858                                     SourceLocation LParenLoc,
1859                                     SourceLocation EndLoc) {
1860     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1861                                              EndLoc);
1862   }
1863 
1864   /// Build a new OpenMP 'depend' pseudo clause.
1865   ///
1866   /// By default, performs semantic analysis to build the new OpenMP clause.
1867   /// Subclasses may override this routine to provide different behavior.
1868   OMPClause *
1869   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1870                          SourceLocation DepLoc, SourceLocation ColonLoc,
1871                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1872                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1873     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1874                                              ColonLoc, VarList, StartLoc,
1875                                              LParenLoc, EndLoc);
1876   }
1877 
1878   /// Build a new OpenMP 'device' clause.
1879   ///
1880   /// By default, performs semantic analysis to build the new statement.
1881   /// Subclasses may override this routine to provide different behavior.
1882   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1883                                     Expr *Device, SourceLocation StartLoc,
1884                                     SourceLocation LParenLoc,
1885                                     SourceLocation ModifierLoc,
1886                                     SourceLocation EndLoc) {
1887     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1888                                              LParenLoc, ModifierLoc, EndLoc);
1889   }
1890 
1891   /// Build a new OpenMP 'map' clause.
1892   ///
1893   /// By default, performs semantic analysis to build the new OpenMP clause.
1894   /// Subclasses may override this routine to provide different behavior.
1895   OMPClause *RebuildOMPMapClause(
1896       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1897       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1898       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1899       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1900       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1901       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1902     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1903                                           MapperIdScopeSpec, MapperId, MapType,
1904                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1905                                           VarList, Locs, UnresolvedMappers);
1906   }
1907 
1908   /// Build a new OpenMP 'allocate' clause.
1909   ///
1910   /// By default, performs semantic analysis to build the new OpenMP clause.
1911   /// Subclasses may override this routine to provide different behavior.
1912   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1913                                       SourceLocation StartLoc,
1914                                       SourceLocation LParenLoc,
1915                                       SourceLocation ColonLoc,
1916                                       SourceLocation EndLoc) {
1917     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1918                                                LParenLoc, ColonLoc, EndLoc);
1919   }
1920 
1921   /// Build a new OpenMP 'num_teams' clause.
1922   ///
1923   /// By default, performs semantic analysis to build the new statement.
1924   /// Subclasses may override this routine to provide different behavior.
1925   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1926                                       SourceLocation LParenLoc,
1927                                       SourceLocation EndLoc) {
1928     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1929                                                EndLoc);
1930   }
1931 
1932   /// Build a new OpenMP 'thread_limit' clause.
1933   ///
1934   /// By default, performs semantic analysis to build the new statement.
1935   /// Subclasses may override this routine to provide different behavior.
1936   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1937                                          SourceLocation StartLoc,
1938                                          SourceLocation LParenLoc,
1939                                          SourceLocation EndLoc) {
1940     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1941                                                   LParenLoc, EndLoc);
1942   }
1943 
1944   /// Build a new OpenMP 'priority' clause.
1945   ///
1946   /// By default, performs semantic analysis to build the new statement.
1947   /// Subclasses may override this routine to provide different behavior.
1948   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1949                                       SourceLocation LParenLoc,
1950                                       SourceLocation EndLoc) {
1951     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1952                                                EndLoc);
1953   }
1954 
1955   /// Build a new OpenMP 'grainsize' clause.
1956   ///
1957   /// By default, performs semantic analysis to build the new statement.
1958   /// Subclasses may override this routine to provide different behavior.
1959   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1960                                        SourceLocation LParenLoc,
1961                                        SourceLocation EndLoc) {
1962     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1963                                                 EndLoc);
1964   }
1965 
1966   /// Build a new OpenMP 'num_tasks' clause.
1967   ///
1968   /// By default, performs semantic analysis to build the new statement.
1969   /// Subclasses may override this routine to provide different behavior.
1970   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1971                                       SourceLocation LParenLoc,
1972                                       SourceLocation EndLoc) {
1973     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1974                                                EndLoc);
1975   }
1976 
1977   /// Build a new OpenMP 'hint' clause.
1978   ///
1979   /// By default, performs semantic analysis to build the new statement.
1980   /// Subclasses may override this routine to provide different behavior.
1981   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1982                                   SourceLocation LParenLoc,
1983                                   SourceLocation EndLoc) {
1984     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1985   }
1986 
1987   /// Build a new OpenMP 'detach' clause.
1988   ///
1989   /// By default, performs semantic analysis to build the new statement.
1990   /// Subclasses may override this routine to provide different behavior.
1991   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
1992                                     SourceLocation LParenLoc,
1993                                     SourceLocation EndLoc) {
1994     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
1995   }
1996 
1997   /// Build a new OpenMP 'dist_schedule' clause.
1998   ///
1999   /// By default, performs semantic analysis to build the new OpenMP clause.
2000   /// Subclasses may override this routine to provide different behavior.
2001   OMPClause *
2002   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2003                                Expr *ChunkSize, SourceLocation StartLoc,
2004                                SourceLocation LParenLoc, SourceLocation KindLoc,
2005                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2006     return getSema().ActOnOpenMPDistScheduleClause(
2007         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2008   }
2009 
2010   /// Build a new OpenMP 'to' clause.
2011   ///
2012   /// By default, performs semantic analysis to build the new statement.
2013   /// Subclasses may override this routine to provide different behavior.
2014   OMPClause *
2015   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2016                      ArrayRef<SourceLocation> MotionModifiersLoc,
2017                      CXXScopeSpec &MapperIdScopeSpec,
2018                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2019                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2020                      ArrayRef<Expr *> UnresolvedMappers) {
2021     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2022                                          MapperIdScopeSpec, MapperId, ColonLoc,
2023                                          VarList, Locs, UnresolvedMappers);
2024   }
2025 
2026   /// Build a new OpenMP 'from' clause.
2027   ///
2028   /// By default, performs semantic analysis to build the new statement.
2029   /// Subclasses may override this routine to provide different behavior.
2030   OMPClause *
2031   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2032                        ArrayRef<SourceLocation> MotionModifiersLoc,
2033                        CXXScopeSpec &MapperIdScopeSpec,
2034                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2035                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2036                        ArrayRef<Expr *> UnresolvedMappers) {
2037     return getSema().ActOnOpenMPFromClause(
2038         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2039         ColonLoc, VarList, Locs, UnresolvedMappers);
2040   }
2041 
2042   /// Build a new OpenMP 'use_device_ptr' clause.
2043   ///
2044   /// By default, performs semantic analysis to build the new OpenMP clause.
2045   /// Subclasses may override this routine to provide different behavior.
2046   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2047                                           const OMPVarListLocTy &Locs) {
2048     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2049   }
2050 
2051   /// Build a new OpenMP 'use_device_addr' clause.
2052   ///
2053   /// By default, performs semantic analysis to build the new OpenMP clause.
2054   /// Subclasses may override this routine to provide different behavior.
2055   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2056                                            const OMPVarListLocTy &Locs) {
2057     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2058   }
2059 
2060   /// Build a new OpenMP 'is_device_ptr' clause.
2061   ///
2062   /// By default, performs semantic analysis to build the new OpenMP clause.
2063   /// Subclasses may override this routine to provide different behavior.
2064   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2065                                          const OMPVarListLocTy &Locs) {
2066     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2067   }
2068 
2069   /// Build a new OpenMP 'defaultmap' clause.
2070   ///
2071   /// By default, performs semantic analysis to build the new OpenMP clause.
2072   /// Subclasses may override this routine to provide different behavior.
2073   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2074                                         OpenMPDefaultmapClauseKind Kind,
2075                                         SourceLocation StartLoc,
2076                                         SourceLocation LParenLoc,
2077                                         SourceLocation MLoc,
2078                                         SourceLocation KindLoc,
2079                                         SourceLocation EndLoc) {
2080     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2081                                                  MLoc, KindLoc, EndLoc);
2082   }
2083 
2084   /// Build a new OpenMP 'nontemporal' clause.
2085   ///
2086   /// By default, performs semantic analysis to build the new OpenMP clause.
2087   /// Subclasses may override this routine to provide different behavior.
2088   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2089                                          SourceLocation StartLoc,
2090                                          SourceLocation LParenLoc,
2091                                          SourceLocation EndLoc) {
2092     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2093                                                   EndLoc);
2094   }
2095 
2096   /// Build a new OpenMP 'inclusive' clause.
2097   ///
2098   /// By default, performs semantic analysis to build the new OpenMP clause.
2099   /// Subclasses may override this routine to provide different behavior.
2100   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2101                                        SourceLocation StartLoc,
2102                                        SourceLocation LParenLoc,
2103                                        SourceLocation EndLoc) {
2104     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2105                                                 EndLoc);
2106   }
2107 
2108   /// Build a new OpenMP 'exclusive' clause.
2109   ///
2110   /// By default, performs semantic analysis to build the new OpenMP clause.
2111   /// Subclasses may override this routine to provide different behavior.
2112   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2113                                        SourceLocation StartLoc,
2114                                        SourceLocation LParenLoc,
2115                                        SourceLocation EndLoc) {
2116     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2117                                                 EndLoc);
2118   }
2119 
2120   /// Build a new OpenMP 'uses_allocators' clause.
2121   ///
2122   /// By default, performs semantic analysis to build the new OpenMP clause.
2123   /// Subclasses may override this routine to provide different behavior.
2124   OMPClause *RebuildOMPUsesAllocatorsClause(
2125       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2126       SourceLocation LParenLoc, SourceLocation EndLoc) {
2127     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2128                                                     Data);
2129   }
2130 
2131   /// Build a new OpenMP 'affinity' clause.
2132   ///
2133   /// By default, performs semantic analysis to build the new OpenMP clause.
2134   /// Subclasses may override this routine to provide different behavior.
2135   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2136                                       SourceLocation LParenLoc,
2137                                       SourceLocation ColonLoc,
2138                                       SourceLocation EndLoc, Expr *Modifier,
2139                                       ArrayRef<Expr *> Locators) {
2140     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2141                                                EndLoc, Modifier, Locators);
2142   }
2143 
2144   /// Build a new OpenMP 'order' clause.
2145   ///
2146   /// By default, performs semantic analysis to build the new OpenMP clause.
2147   /// Subclasses may override this routine to provide different behavior.
2148   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2149                                    SourceLocation KindKwLoc,
2150                                    SourceLocation StartLoc,
2151                                    SourceLocation LParenLoc,
2152                                    SourceLocation EndLoc) {
2153     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2154                                             LParenLoc, EndLoc);
2155   }
2156 
2157   /// Rebuild the operand to an Objective-C \@synchronized statement.
2158   ///
2159   /// By default, performs semantic analysis to build the new statement.
2160   /// Subclasses may override this routine to provide different behavior.
2161   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2162                                               Expr *object) {
2163     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2164   }
2165 
2166   /// Build a new Objective-C \@synchronized statement.
2167   ///
2168   /// By default, performs semantic analysis to build the new statement.
2169   /// Subclasses may override this routine to provide different behavior.
2170   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2171                                            Expr *Object, Stmt *Body) {
2172     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2173   }
2174 
2175   /// Build a new Objective-C \@autoreleasepool statement.
2176   ///
2177   /// By default, performs semantic analysis to build the new statement.
2178   /// Subclasses may override this routine to provide different behavior.
2179   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2180                                             Stmt *Body) {
2181     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2182   }
2183 
2184   /// Build a new Objective-C fast enumeration statement.
2185   ///
2186   /// By default, performs semantic analysis to build the new statement.
2187   /// Subclasses may override this routine to provide different behavior.
2188   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2189                                           Stmt *Element,
2190                                           Expr *Collection,
2191                                           SourceLocation RParenLoc,
2192                                           Stmt *Body) {
2193     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2194                                                 Element,
2195                                                 Collection,
2196                                                 RParenLoc);
2197     if (ForEachStmt.isInvalid())
2198       return StmtError();
2199 
2200     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2201   }
2202 
2203   /// Build a new C++ exception declaration.
2204   ///
2205   /// By default, performs semantic analysis to build the new decaration.
2206   /// Subclasses may override this routine to provide different behavior.
2207   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2208                                 TypeSourceInfo *Declarator,
2209                                 SourceLocation StartLoc,
2210                                 SourceLocation IdLoc,
2211                                 IdentifierInfo *Id) {
2212     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2213                                                        StartLoc, IdLoc, Id);
2214     if (Var)
2215       getSema().CurContext->addDecl(Var);
2216     return Var;
2217   }
2218 
2219   /// Build a new C++ catch statement.
2220   ///
2221   /// By default, performs semantic analysis to build the new statement.
2222   /// Subclasses may override this routine to provide different behavior.
2223   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2224                                  VarDecl *ExceptionDecl,
2225                                  Stmt *Handler) {
2226     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2227                                                       Handler));
2228   }
2229 
2230   /// Build a new C++ try statement.
2231   ///
2232   /// By default, performs semantic analysis to build the new statement.
2233   /// Subclasses may override this routine to provide different behavior.
2234   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2235                                ArrayRef<Stmt *> Handlers) {
2236     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2237   }
2238 
2239   /// Build a new C++0x range-based for statement.
2240   ///
2241   /// By default, performs semantic analysis to build the new statement.
2242   /// Subclasses may override this routine to provide different behavior.
2243   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2244                                     SourceLocation CoawaitLoc, Stmt *Init,
2245                                     SourceLocation ColonLoc, Stmt *Range,
2246                                     Stmt *Begin, Stmt *End, Expr *Cond,
2247                                     Expr *Inc, Stmt *LoopVar,
2248                                     SourceLocation RParenLoc) {
2249     // If we've just learned that the range is actually an Objective-C
2250     // collection, treat this as an Objective-C fast enumeration loop.
2251     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2252       if (RangeStmt->isSingleDecl()) {
2253         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2254           if (RangeVar->isInvalidDecl())
2255             return StmtError();
2256 
2257           Expr *RangeExpr = RangeVar->getInit();
2258           if (!RangeExpr->isTypeDependent() &&
2259               RangeExpr->getType()->isObjCObjectPointerType()) {
2260             // FIXME: Support init-statements in Objective-C++20 ranged for
2261             // statement.
2262             if (Init) {
2263               return SemaRef.Diag(Init->getBeginLoc(),
2264                                   diag::err_objc_for_range_init_stmt)
2265                          << Init->getSourceRange();
2266             }
2267             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2268                                                         RangeExpr, RParenLoc);
2269           }
2270         }
2271       }
2272     }
2273 
2274     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2275                                           Range, Begin, End, Cond, Inc, LoopVar,
2276                                           RParenLoc, Sema::BFRK_Rebuild);
2277   }
2278 
2279   /// Build a new C++0x range-based for statement.
2280   ///
2281   /// By default, performs semantic analysis to build the new statement.
2282   /// Subclasses may override this routine to provide different behavior.
2283   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2284                                           bool IsIfExists,
2285                                           NestedNameSpecifierLoc QualifierLoc,
2286                                           DeclarationNameInfo NameInfo,
2287                                           Stmt *Nested) {
2288     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2289                                                 QualifierLoc, NameInfo, Nested);
2290   }
2291 
2292   /// Attach body to a C++0x range-based for statement.
2293   ///
2294   /// By default, performs semantic analysis to finish the new statement.
2295   /// Subclasses may override this routine to provide different behavior.
2296   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2297     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2298   }
2299 
2300   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2301                                Stmt *TryBlock, Stmt *Handler) {
2302     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2303   }
2304 
2305   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2306                                   Stmt *Block) {
2307     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2308   }
2309 
2310   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2311     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2312   }
2313 
2314   /// Build a new predefined expression.
2315   ///
2316   /// By default, performs semantic analysis to build the new expression.
2317   /// Subclasses may override this routine to provide different behavior.
2318   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2319                                    PredefinedExpr::IdentKind IK) {
2320     return getSema().BuildPredefinedExpr(Loc, IK);
2321   }
2322 
2323   /// Build a new expression that references a declaration.
2324   ///
2325   /// By default, performs semantic analysis to build the new expression.
2326   /// Subclasses may override this routine to provide different behavior.
2327   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2328                                         LookupResult &R,
2329                                         bool RequiresADL) {
2330     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2331   }
2332 
2333 
2334   /// Build a new expression that references a declaration.
2335   ///
2336   /// By default, performs semantic analysis to build the new expression.
2337   /// Subclasses may override this routine to provide different behavior.
2338   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2339                                 ValueDecl *VD,
2340                                 const DeclarationNameInfo &NameInfo,
2341                                 NamedDecl *Found,
2342                                 TemplateArgumentListInfo *TemplateArgs) {
2343     CXXScopeSpec SS;
2344     SS.Adopt(QualifierLoc);
2345     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2346                                               TemplateArgs);
2347   }
2348 
2349   /// Build a new expression in parentheses.
2350   ///
2351   /// By default, performs semantic analysis to build the new expression.
2352   /// Subclasses may override this routine to provide different behavior.
2353   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2354                                     SourceLocation RParen) {
2355     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2356   }
2357 
2358   /// Build a new pseudo-destructor expression.
2359   ///
2360   /// By default, performs semantic analysis to build the new expression.
2361   /// Subclasses may override this routine to provide different behavior.
2362   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2363                                             SourceLocation OperatorLoc,
2364                                             bool isArrow,
2365                                             CXXScopeSpec &SS,
2366                                             TypeSourceInfo *ScopeType,
2367                                             SourceLocation CCLoc,
2368                                             SourceLocation TildeLoc,
2369                                         PseudoDestructorTypeStorage Destroyed);
2370 
2371   /// Build a new unary operator expression.
2372   ///
2373   /// By default, performs semantic analysis to build the new expression.
2374   /// Subclasses may override this routine to provide different behavior.
2375   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2376                                         UnaryOperatorKind Opc,
2377                                         Expr *SubExpr) {
2378     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2379   }
2380 
2381   /// Build a new builtin offsetof expression.
2382   ///
2383   /// By default, performs semantic analysis to build the new expression.
2384   /// Subclasses may override this routine to provide different behavior.
2385   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2386                                  TypeSourceInfo *Type,
2387                                  ArrayRef<Sema::OffsetOfComponent> Components,
2388                                  SourceLocation RParenLoc) {
2389     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2390                                           RParenLoc);
2391   }
2392 
2393   /// Build a new sizeof, alignof or vec_step expression with a
2394   /// type argument.
2395   ///
2396   /// By default, performs semantic analysis to build the new expression.
2397   /// Subclasses may override this routine to provide different behavior.
2398   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2399                                          SourceLocation OpLoc,
2400                                          UnaryExprOrTypeTrait ExprKind,
2401                                          SourceRange R) {
2402     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2403   }
2404 
2405   /// Build a new sizeof, alignof or vec step expression with an
2406   /// expression argument.
2407   ///
2408   /// By default, performs semantic analysis to build the new expression.
2409   /// Subclasses may override this routine to provide different behavior.
2410   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2411                                          UnaryExprOrTypeTrait ExprKind,
2412                                          SourceRange R) {
2413     ExprResult Result
2414       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2415     if (Result.isInvalid())
2416       return ExprError();
2417 
2418     return Result;
2419   }
2420 
2421   /// Build a new array subscript expression.
2422   ///
2423   /// By default, performs semantic analysis to build the new expression.
2424   /// Subclasses may override this routine to provide different behavior.
2425   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2426                                              SourceLocation LBracketLoc,
2427                                              Expr *RHS,
2428                                              SourceLocation RBracketLoc) {
2429     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2430                                              LBracketLoc, RHS,
2431                                              RBracketLoc);
2432   }
2433 
2434   /// Build a new matrix subscript expression.
2435   ///
2436   /// By default, performs semantic analysis to build the new expression.
2437   /// Subclasses may override this routine to provide different behavior.
2438   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2439                                         Expr *ColumnIdx,
2440                                         SourceLocation RBracketLoc) {
2441     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2442                                                       RBracketLoc);
2443   }
2444 
2445   /// Build a new array section expression.
2446   ///
2447   /// By default, performs semantic analysis to build the new expression.
2448   /// Subclasses may override this routine to provide different behavior.
2449   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2450                                         Expr *LowerBound,
2451                                         SourceLocation ColonLocFirst,
2452                                         SourceLocation ColonLocSecond,
2453                                         Expr *Length, Expr *Stride,
2454                                         SourceLocation RBracketLoc) {
2455     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2456                                               ColonLocFirst, ColonLocSecond,
2457                                               Length, Stride, RBracketLoc);
2458   }
2459 
2460   /// Build a new array shaping expression.
2461   ///
2462   /// By default, performs semantic analysis to build the new expression.
2463   /// Subclasses may override this routine to provide different behavior.
2464   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2465                                         SourceLocation RParenLoc,
2466                                         ArrayRef<Expr *> Dims,
2467                                         ArrayRef<SourceRange> BracketsRanges) {
2468     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2469                                               BracketsRanges);
2470   }
2471 
2472   /// Build a new iterator expression.
2473   ///
2474   /// By default, performs semantic analysis to build the new expression.
2475   /// Subclasses may override this routine to provide different behavior.
2476   ExprResult RebuildOMPIteratorExpr(
2477       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2478       ArrayRef<Sema::OMPIteratorData> Data) {
2479     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2480                                           LLoc, RLoc, Data);
2481   }
2482 
2483   /// Build a new call expression.
2484   ///
2485   /// By default, performs semantic analysis to build the new expression.
2486   /// Subclasses may override this routine to provide different behavior.
2487   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2488                                    MultiExprArg Args,
2489                                    SourceLocation RParenLoc,
2490                                    Expr *ExecConfig = nullptr) {
2491     return getSema().ActOnCallExpr(
2492         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2493   }
2494 
2495   /// Build a new member access expression.
2496   ///
2497   /// By default, performs semantic analysis to build the new expression.
2498   /// Subclasses may override this routine to provide different behavior.
2499   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2500                                bool isArrow,
2501                                NestedNameSpecifierLoc QualifierLoc,
2502                                SourceLocation TemplateKWLoc,
2503                                const DeclarationNameInfo &MemberNameInfo,
2504                                ValueDecl *Member,
2505                                NamedDecl *FoundDecl,
2506                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2507                                NamedDecl *FirstQualifierInScope) {
2508     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2509                                                                       isArrow);
2510     if (!Member->getDeclName()) {
2511       // We have a reference to an unnamed field.  This is always the
2512       // base of an anonymous struct/union member access, i.e. the
2513       // field is always of record type.
2514       assert(Member->getType()->isRecordType() &&
2515              "unnamed member not of record type?");
2516 
2517       BaseResult =
2518         getSema().PerformObjectMemberConversion(BaseResult.get(),
2519                                                 QualifierLoc.getNestedNameSpecifier(),
2520                                                 FoundDecl, Member);
2521       if (BaseResult.isInvalid())
2522         return ExprError();
2523       Base = BaseResult.get();
2524 
2525       CXXScopeSpec EmptySS;
2526       return getSema().BuildFieldReferenceExpr(
2527           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2528           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2529     }
2530 
2531     CXXScopeSpec SS;
2532     SS.Adopt(QualifierLoc);
2533 
2534     Base = BaseResult.get();
2535     QualType BaseType = Base->getType();
2536 
2537     if (isArrow && !BaseType->isPointerType())
2538       return ExprError();
2539 
2540     // FIXME: this involves duplicating earlier analysis in a lot of
2541     // cases; we should avoid this when possible.
2542     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2543     R.addDecl(FoundDecl);
2544     R.resolveKind();
2545 
2546     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2547                                               SS, TemplateKWLoc,
2548                                               FirstQualifierInScope,
2549                                               R, ExplicitTemplateArgs,
2550                                               /*S*/nullptr);
2551   }
2552 
2553   /// Build a new binary operator expression.
2554   ///
2555   /// By default, performs semantic analysis to build the new expression.
2556   /// Subclasses may override this routine to provide different behavior.
2557   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2558                                          BinaryOperatorKind Opc,
2559                                          Expr *LHS, Expr *RHS) {
2560     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2561   }
2562 
2563   /// Build a new rewritten operator expression.
2564   ///
2565   /// By default, performs semantic analysis to build the new expression.
2566   /// Subclasses may override this routine to provide different behavior.
2567   ExprResult RebuildCXXRewrittenBinaryOperator(
2568       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2569       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2570     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2571                                            RHS, /*RequiresADL*/false);
2572   }
2573 
2574   /// Build a new conditional operator expression.
2575   ///
2576   /// By default, performs semantic analysis to build the new expression.
2577   /// Subclasses may override this routine to provide different behavior.
2578   ExprResult RebuildConditionalOperator(Expr *Cond,
2579                                         SourceLocation QuestionLoc,
2580                                         Expr *LHS,
2581                                         SourceLocation ColonLoc,
2582                                         Expr *RHS) {
2583     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2584                                         LHS, RHS);
2585   }
2586 
2587   /// Build a new C-style cast expression.
2588   ///
2589   /// By default, performs semantic analysis to build the new expression.
2590   /// Subclasses may override this routine to provide different behavior.
2591   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2592                                          TypeSourceInfo *TInfo,
2593                                          SourceLocation RParenLoc,
2594                                          Expr *SubExpr) {
2595     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2596                                          SubExpr);
2597   }
2598 
2599   /// Build a new compound literal expression.
2600   ///
2601   /// By default, performs semantic analysis to build the new expression.
2602   /// Subclasses may override this routine to provide different behavior.
2603   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2604                                               TypeSourceInfo *TInfo,
2605                                               SourceLocation RParenLoc,
2606                                               Expr *Init) {
2607     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2608                                               Init);
2609   }
2610 
2611   /// Build a new extended vector element access expression.
2612   ///
2613   /// By default, performs semantic analysis to build the new expression.
2614   /// Subclasses may override this routine to provide different behavior.
2615   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2616                                                SourceLocation OpLoc,
2617                                                SourceLocation AccessorLoc,
2618                                                IdentifierInfo &Accessor) {
2619 
2620     CXXScopeSpec SS;
2621     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2622     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2623                                               OpLoc, /*IsArrow*/ false,
2624                                               SS, SourceLocation(),
2625                                               /*FirstQualifierInScope*/ nullptr,
2626                                               NameInfo,
2627                                               /* TemplateArgs */ nullptr,
2628                                               /*S*/ nullptr);
2629   }
2630 
2631   /// Build a new initializer list expression.
2632   ///
2633   /// By default, performs semantic analysis to build the new expression.
2634   /// Subclasses may override this routine to provide different behavior.
2635   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2636                              MultiExprArg Inits,
2637                              SourceLocation RBraceLoc) {
2638     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2639   }
2640 
2641   /// Build a new designated initializer expression.
2642   ///
2643   /// By default, performs semantic analysis to build the new expression.
2644   /// Subclasses may override this routine to provide different behavior.
2645   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2646                                              MultiExprArg ArrayExprs,
2647                                              SourceLocation EqualOrColonLoc,
2648                                              bool GNUSyntax,
2649                                              Expr *Init) {
2650     ExprResult Result
2651       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2652                                            Init);
2653     if (Result.isInvalid())
2654       return ExprError();
2655 
2656     return Result;
2657   }
2658 
2659   /// Build a new value-initialized expression.
2660   ///
2661   /// By default, builds the implicit value initialization without performing
2662   /// any semantic analysis. Subclasses may override this routine to provide
2663   /// different behavior.
2664   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2665     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2666   }
2667 
2668   /// Build a new \c va_arg expression.
2669   ///
2670   /// By default, performs semantic analysis to build the new expression.
2671   /// Subclasses may override this routine to provide different behavior.
2672   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2673                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2674                                     SourceLocation RParenLoc) {
2675     return getSema().BuildVAArgExpr(BuiltinLoc,
2676                                     SubExpr, TInfo,
2677                                     RParenLoc);
2678   }
2679 
2680   /// Build a new expression list in parentheses.
2681   ///
2682   /// By default, performs semantic analysis to build the new expression.
2683   /// Subclasses may override this routine to provide different behavior.
2684   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2685                                   MultiExprArg SubExprs,
2686                                   SourceLocation RParenLoc) {
2687     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2688   }
2689 
2690   /// Build a new address-of-label expression.
2691   ///
2692   /// By default, performs semantic analysis, using the name of the label
2693   /// rather than attempting to map the label statement itself.
2694   /// Subclasses may override this routine to provide different behavior.
2695   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2696                                   SourceLocation LabelLoc, LabelDecl *Label) {
2697     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2698   }
2699 
2700   /// Build a new GNU statement expression.
2701   ///
2702   /// By default, performs semantic analysis to build the new expression.
2703   /// Subclasses may override this routine to provide different behavior.
2704   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2705                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2706     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2707                                    TemplateDepth);
2708   }
2709 
2710   /// Build a new __builtin_choose_expr expression.
2711   ///
2712   /// By default, performs semantic analysis to build the new expression.
2713   /// Subclasses may override this routine to provide different behavior.
2714   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2715                                      Expr *Cond, Expr *LHS, Expr *RHS,
2716                                      SourceLocation RParenLoc) {
2717     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2718                                    Cond, LHS, RHS,
2719                                    RParenLoc);
2720   }
2721 
2722   /// Build a new generic selection expression.
2723   ///
2724   /// By default, performs semantic analysis to build the new expression.
2725   /// Subclasses may override this routine to provide different behavior.
2726   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2727                                          SourceLocation DefaultLoc,
2728                                          SourceLocation RParenLoc,
2729                                          Expr *ControllingExpr,
2730                                          ArrayRef<TypeSourceInfo *> Types,
2731                                          ArrayRef<Expr *> Exprs) {
2732     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2733                                                 ControllingExpr, Types, Exprs);
2734   }
2735 
2736   /// Build a new overloaded operator call expression.
2737   ///
2738   /// By default, performs semantic analysis to build the new expression.
2739   /// The semantic analysis provides the behavior of template instantiation,
2740   /// copying with transformations that turn what looks like an overloaded
2741   /// operator call into a use of a builtin operator, performing
2742   /// argument-dependent lookup, etc. Subclasses may override this routine to
2743   /// provide different behavior.
2744   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2745                                               SourceLocation OpLoc,
2746                                               Expr *Callee,
2747                                               Expr *First,
2748                                               Expr *Second);
2749 
2750   /// Build a new C++ "named" cast expression, such as static_cast or
2751   /// reinterpret_cast.
2752   ///
2753   /// By default, this routine dispatches to one of the more-specific routines
2754   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2755   /// Subclasses may override this routine to provide different behavior.
2756   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2757                                            Stmt::StmtClass Class,
2758                                            SourceLocation LAngleLoc,
2759                                            TypeSourceInfo *TInfo,
2760                                            SourceLocation RAngleLoc,
2761                                            SourceLocation LParenLoc,
2762                                            Expr *SubExpr,
2763                                            SourceLocation RParenLoc) {
2764     switch (Class) {
2765     case Stmt::CXXStaticCastExprClass:
2766       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2767                                                    RAngleLoc, LParenLoc,
2768                                                    SubExpr, RParenLoc);
2769 
2770     case Stmt::CXXDynamicCastExprClass:
2771       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2772                                                     RAngleLoc, LParenLoc,
2773                                                     SubExpr, RParenLoc);
2774 
2775     case Stmt::CXXReinterpretCastExprClass:
2776       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2777                                                         RAngleLoc, LParenLoc,
2778                                                         SubExpr,
2779                                                         RParenLoc);
2780 
2781     case Stmt::CXXConstCastExprClass:
2782       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2783                                                    RAngleLoc, LParenLoc,
2784                                                    SubExpr, RParenLoc);
2785 
2786     case Stmt::CXXAddrspaceCastExprClass:
2787       return getDerived().RebuildCXXAddrspaceCastExpr(
2788           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2789 
2790     default:
2791       llvm_unreachable("Invalid C++ named cast");
2792     }
2793   }
2794 
2795   /// Build a new C++ static_cast expression.
2796   ///
2797   /// By default, performs semantic analysis to build the new expression.
2798   /// Subclasses may override this routine to provide different behavior.
2799   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2800                                             SourceLocation LAngleLoc,
2801                                             TypeSourceInfo *TInfo,
2802                                             SourceLocation RAngleLoc,
2803                                             SourceLocation LParenLoc,
2804                                             Expr *SubExpr,
2805                                             SourceLocation RParenLoc) {
2806     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2807                                        TInfo, SubExpr,
2808                                        SourceRange(LAngleLoc, RAngleLoc),
2809                                        SourceRange(LParenLoc, RParenLoc));
2810   }
2811 
2812   /// Build a new C++ dynamic_cast expression.
2813   ///
2814   /// By default, performs semantic analysis to build the new expression.
2815   /// Subclasses may override this routine to provide different behavior.
2816   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2817                                              SourceLocation LAngleLoc,
2818                                              TypeSourceInfo *TInfo,
2819                                              SourceLocation RAngleLoc,
2820                                              SourceLocation LParenLoc,
2821                                              Expr *SubExpr,
2822                                              SourceLocation RParenLoc) {
2823     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2824                                        TInfo, SubExpr,
2825                                        SourceRange(LAngleLoc, RAngleLoc),
2826                                        SourceRange(LParenLoc, RParenLoc));
2827   }
2828 
2829   /// Build a new C++ reinterpret_cast expression.
2830   ///
2831   /// By default, performs semantic analysis to build the new expression.
2832   /// Subclasses may override this routine to provide different behavior.
2833   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2834                                                  SourceLocation LAngleLoc,
2835                                                  TypeSourceInfo *TInfo,
2836                                                  SourceLocation RAngleLoc,
2837                                                  SourceLocation LParenLoc,
2838                                                  Expr *SubExpr,
2839                                                  SourceLocation RParenLoc) {
2840     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2841                                        TInfo, SubExpr,
2842                                        SourceRange(LAngleLoc, RAngleLoc),
2843                                        SourceRange(LParenLoc, RParenLoc));
2844   }
2845 
2846   /// Build a new C++ const_cast expression.
2847   ///
2848   /// By default, performs semantic analysis to build the new expression.
2849   /// Subclasses may override this routine to provide different behavior.
2850   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2851                                            SourceLocation LAngleLoc,
2852                                            TypeSourceInfo *TInfo,
2853                                            SourceLocation RAngleLoc,
2854                                            SourceLocation LParenLoc,
2855                                            Expr *SubExpr,
2856                                            SourceLocation RParenLoc) {
2857     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2858                                        TInfo, SubExpr,
2859                                        SourceRange(LAngleLoc, RAngleLoc),
2860                                        SourceRange(LParenLoc, RParenLoc));
2861   }
2862 
2863   ExprResult
2864   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2865                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2866                               SourceLocation LParenLoc, Expr *SubExpr,
2867                               SourceLocation RParenLoc) {
2868     return getSema().BuildCXXNamedCast(
2869         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2870         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2871   }
2872 
2873   /// Build a new C++ functional-style cast expression.
2874   ///
2875   /// By default, performs semantic analysis to build the new expression.
2876   /// Subclasses may override this routine to provide different behavior.
2877   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2878                                           SourceLocation LParenLoc,
2879                                           Expr *Sub,
2880                                           SourceLocation RParenLoc,
2881                                           bool ListInitialization) {
2882     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2883                                                MultiExprArg(&Sub, 1), RParenLoc,
2884                                                ListInitialization);
2885   }
2886 
2887   /// Build a new C++ __builtin_bit_cast expression.
2888   ///
2889   /// By default, performs semantic analysis to build the new expression.
2890   /// Subclasses may override this routine to provide different behavior.
2891   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2892                                        TypeSourceInfo *TSI, Expr *Sub,
2893                                        SourceLocation RParenLoc) {
2894     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2895   }
2896 
2897   /// Build a new C++ typeid(type) expression.
2898   ///
2899   /// By default, performs semantic analysis to build the new expression.
2900   /// Subclasses may override this routine to provide different behavior.
2901   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2902                                         SourceLocation TypeidLoc,
2903                                         TypeSourceInfo *Operand,
2904                                         SourceLocation RParenLoc) {
2905     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2906                                     RParenLoc);
2907   }
2908 
2909 
2910   /// Build a new C++ typeid(expr) expression.
2911   ///
2912   /// By default, performs semantic analysis to build the new expression.
2913   /// Subclasses may override this routine to provide different behavior.
2914   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2915                                         SourceLocation TypeidLoc,
2916                                         Expr *Operand,
2917                                         SourceLocation RParenLoc) {
2918     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2919                                     RParenLoc);
2920   }
2921 
2922   /// Build a new C++ __uuidof(type) expression.
2923   ///
2924   /// By default, performs semantic analysis to build the new expression.
2925   /// Subclasses may override this routine to provide different behavior.
2926   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2927                                   TypeSourceInfo *Operand,
2928                                   SourceLocation RParenLoc) {
2929     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2930   }
2931 
2932   /// Build a new C++ __uuidof(expr) expression.
2933   ///
2934   /// By default, performs semantic analysis to build the new expression.
2935   /// Subclasses may override this routine to provide different behavior.
2936   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2937                                   Expr *Operand, SourceLocation RParenLoc) {
2938     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2939   }
2940 
2941   /// Build a new C++ "this" expression.
2942   ///
2943   /// By default, builds a new "this" expression without performing any
2944   /// semantic analysis. Subclasses may override this routine to provide
2945   /// different behavior.
2946   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2947                                 QualType ThisType,
2948                                 bool isImplicit) {
2949     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2950   }
2951 
2952   /// Build a new C++ throw expression.
2953   ///
2954   /// By default, performs semantic analysis to build the new expression.
2955   /// Subclasses may override this routine to provide different behavior.
2956   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2957                                  bool IsThrownVariableInScope) {
2958     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2959   }
2960 
2961   /// Build a new C++ default-argument expression.
2962   ///
2963   /// By default, builds a new default-argument expression, which does not
2964   /// require any semantic analysis. Subclasses may override this routine to
2965   /// provide different behavior.
2966   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2967     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2968                                      getSema().CurContext);
2969   }
2970 
2971   /// Build a new C++11 default-initialization expression.
2972   ///
2973   /// By default, builds a new default field initialization expression, which
2974   /// does not require any semantic analysis. Subclasses may override this
2975   /// routine to provide different behavior.
2976   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2977                                        FieldDecl *Field) {
2978     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2979                                       getSema().CurContext);
2980   }
2981 
2982   /// Build a new C++ zero-initialization expression.
2983   ///
2984   /// By default, performs semantic analysis to build the new expression.
2985   /// Subclasses may override this routine to provide different behavior.
2986   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2987                                            SourceLocation LParenLoc,
2988                                            SourceLocation RParenLoc) {
2989     return getSema().BuildCXXTypeConstructExpr(
2990         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2991   }
2992 
2993   /// Build a new C++ "new" expression.
2994   ///
2995   /// By default, performs semantic analysis to build the new expression.
2996   /// Subclasses may override this routine to provide different behavior.
2997   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2998                                bool UseGlobal,
2999                                SourceLocation PlacementLParen,
3000                                MultiExprArg PlacementArgs,
3001                                SourceLocation PlacementRParen,
3002                                SourceRange TypeIdParens,
3003                                QualType AllocatedType,
3004                                TypeSourceInfo *AllocatedTypeInfo,
3005                                Optional<Expr *> ArraySize,
3006                                SourceRange DirectInitRange,
3007                                Expr *Initializer) {
3008     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3009                                  PlacementLParen,
3010                                  PlacementArgs,
3011                                  PlacementRParen,
3012                                  TypeIdParens,
3013                                  AllocatedType,
3014                                  AllocatedTypeInfo,
3015                                  ArraySize,
3016                                  DirectInitRange,
3017                                  Initializer);
3018   }
3019 
3020   /// Build a new C++ "delete" expression.
3021   ///
3022   /// By default, performs semantic analysis to build the new expression.
3023   /// Subclasses may override this routine to provide different behavior.
3024   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3025                                         bool IsGlobalDelete,
3026                                         bool IsArrayForm,
3027                                         Expr *Operand) {
3028     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3029                                     Operand);
3030   }
3031 
3032   /// Build a new type trait expression.
3033   ///
3034   /// By default, performs semantic analysis to build the new expression.
3035   /// Subclasses may override this routine to provide different behavior.
3036   ExprResult RebuildTypeTrait(TypeTrait Trait,
3037                               SourceLocation StartLoc,
3038                               ArrayRef<TypeSourceInfo *> Args,
3039                               SourceLocation RParenLoc) {
3040     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3041   }
3042 
3043   /// Build a new array type trait expression.
3044   ///
3045   /// By default, performs semantic analysis to build the new expression.
3046   /// Subclasses may override this routine to provide different behavior.
3047   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3048                                    SourceLocation StartLoc,
3049                                    TypeSourceInfo *TSInfo,
3050                                    Expr *DimExpr,
3051                                    SourceLocation RParenLoc) {
3052     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3053   }
3054 
3055   /// Build a new expression trait expression.
3056   ///
3057   /// By default, performs semantic analysis to build the new expression.
3058   /// Subclasses may override this routine to provide different behavior.
3059   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3060                                    SourceLocation StartLoc,
3061                                    Expr *Queried,
3062                                    SourceLocation RParenLoc) {
3063     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3064   }
3065 
3066   /// Build a new (previously unresolved) declaration reference
3067   /// expression.
3068   ///
3069   /// By default, performs semantic analysis to build the new expression.
3070   /// Subclasses may override this routine to provide different behavior.
3071   ExprResult RebuildDependentScopeDeclRefExpr(
3072                                           NestedNameSpecifierLoc QualifierLoc,
3073                                           SourceLocation TemplateKWLoc,
3074                                        const DeclarationNameInfo &NameInfo,
3075                               const TemplateArgumentListInfo *TemplateArgs,
3076                                           bool IsAddressOfOperand,
3077                                           TypeSourceInfo **RecoveryTSI) {
3078     CXXScopeSpec SS;
3079     SS.Adopt(QualifierLoc);
3080 
3081     if (TemplateArgs || TemplateKWLoc.isValid())
3082       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3083                                                     TemplateArgs);
3084 
3085     return getSema().BuildQualifiedDeclarationNameExpr(
3086         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3087   }
3088 
3089   /// Build a new template-id expression.
3090   ///
3091   /// By default, performs semantic analysis to build the new expression.
3092   /// Subclasses may override this routine to provide different behavior.
3093   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3094                                    SourceLocation TemplateKWLoc,
3095                                    LookupResult &R,
3096                                    bool RequiresADL,
3097                               const TemplateArgumentListInfo *TemplateArgs) {
3098     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3099                                          TemplateArgs);
3100   }
3101 
3102   /// Build a new object-construction expression.
3103   ///
3104   /// By default, performs semantic analysis to build the new expression.
3105   /// Subclasses may override this routine to provide different behavior.
3106   ExprResult RebuildCXXConstructExpr(QualType T,
3107                                      SourceLocation Loc,
3108                                      CXXConstructorDecl *Constructor,
3109                                      bool IsElidable,
3110                                      MultiExprArg Args,
3111                                      bool HadMultipleCandidates,
3112                                      bool ListInitialization,
3113                                      bool StdInitListInitialization,
3114                                      bool RequiresZeroInit,
3115                              CXXConstructExpr::ConstructionKind ConstructKind,
3116                                      SourceRange ParenRange) {
3117     // Reconstruct the constructor we originally found, which might be
3118     // different if this is a call to an inherited constructor.
3119     CXXConstructorDecl *FoundCtor = Constructor;
3120     if (Constructor->isInheritingConstructor())
3121       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3122 
3123     SmallVector<Expr*, 8> ConvertedArgs;
3124     if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs))
3125       return ExprError();
3126 
3127     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3128                                            IsElidable,
3129                                            ConvertedArgs,
3130                                            HadMultipleCandidates,
3131                                            ListInitialization,
3132                                            StdInitListInitialization,
3133                                            RequiresZeroInit, ConstructKind,
3134                                            ParenRange);
3135   }
3136 
3137   /// Build a new implicit construction via inherited constructor
3138   /// expression.
3139   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3140                                              CXXConstructorDecl *Constructor,
3141                                              bool ConstructsVBase,
3142                                              bool InheritedFromVBase) {
3143     return new (getSema().Context) CXXInheritedCtorInitExpr(
3144         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3145   }
3146 
3147   /// Build a new object-construction expression.
3148   ///
3149   /// By default, performs semantic analysis to build the new expression.
3150   /// Subclasses may override this routine to provide different behavior.
3151   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3152                                            SourceLocation LParenOrBraceLoc,
3153                                            MultiExprArg Args,
3154                                            SourceLocation RParenOrBraceLoc,
3155                                            bool ListInitialization) {
3156     return getSema().BuildCXXTypeConstructExpr(
3157         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3158   }
3159 
3160   /// Build a new object-construction expression.
3161   ///
3162   /// By default, performs semantic analysis to build the new expression.
3163   /// Subclasses may override this routine to provide different behavior.
3164   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3165                                                SourceLocation LParenLoc,
3166                                                MultiExprArg Args,
3167                                                SourceLocation RParenLoc,
3168                                                bool ListInitialization) {
3169     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3170                                                RParenLoc, ListInitialization);
3171   }
3172 
3173   /// Build a new member reference expression.
3174   ///
3175   /// By default, performs semantic analysis to build the new expression.
3176   /// Subclasses may override this routine to provide different behavior.
3177   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3178                                                 QualType BaseType,
3179                                                 bool IsArrow,
3180                                                 SourceLocation OperatorLoc,
3181                                           NestedNameSpecifierLoc QualifierLoc,
3182                                                 SourceLocation TemplateKWLoc,
3183                                             NamedDecl *FirstQualifierInScope,
3184                                    const DeclarationNameInfo &MemberNameInfo,
3185                               const TemplateArgumentListInfo *TemplateArgs) {
3186     CXXScopeSpec SS;
3187     SS.Adopt(QualifierLoc);
3188 
3189     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3190                                             OperatorLoc, IsArrow,
3191                                             SS, TemplateKWLoc,
3192                                             FirstQualifierInScope,
3193                                             MemberNameInfo,
3194                                             TemplateArgs, /*S*/nullptr);
3195   }
3196 
3197   /// Build a new member reference expression.
3198   ///
3199   /// By default, performs semantic analysis to build the new expression.
3200   /// Subclasses may override this routine to provide different behavior.
3201   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3202                                          SourceLocation OperatorLoc,
3203                                          bool IsArrow,
3204                                          NestedNameSpecifierLoc QualifierLoc,
3205                                          SourceLocation TemplateKWLoc,
3206                                          NamedDecl *FirstQualifierInScope,
3207                                          LookupResult &R,
3208                                 const TemplateArgumentListInfo *TemplateArgs) {
3209     CXXScopeSpec SS;
3210     SS.Adopt(QualifierLoc);
3211 
3212     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3213                                             OperatorLoc, IsArrow,
3214                                             SS, TemplateKWLoc,
3215                                             FirstQualifierInScope,
3216                                             R, TemplateArgs, /*S*/nullptr);
3217   }
3218 
3219   /// Build a new noexcept expression.
3220   ///
3221   /// By default, performs semantic analysis to build the new expression.
3222   /// Subclasses may override this routine to provide different behavior.
3223   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3224     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3225   }
3226 
3227   /// Build a new expression to compute the length of a parameter pack.
3228   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3229                                    NamedDecl *Pack,
3230                                    SourceLocation PackLoc,
3231                                    SourceLocation RParenLoc,
3232                                    Optional<unsigned> Length,
3233                                    ArrayRef<TemplateArgument> PartialArgs) {
3234     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3235                                   RParenLoc, Length, PartialArgs);
3236   }
3237 
3238   /// Build a new expression representing a call to a source location
3239   ///  builtin.
3240   ///
3241   /// By default, performs semantic analysis to build the new expression.
3242   /// Subclasses may override this routine to provide different behavior.
3243   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3244                                   SourceLocation BuiltinLoc,
3245                                   SourceLocation RPLoc,
3246                                   DeclContext *ParentContext) {
3247     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3248   }
3249 
3250   /// Build a new Objective-C boxed expression.
3251   ///
3252   /// By default, performs semantic analysis to build the new expression.
3253   /// Subclasses may override this routine to provide different behavior.
3254   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3255       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3256       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3257       TemplateArgumentListInfo *TALI) {
3258     CXXScopeSpec SS;
3259     SS.Adopt(NNS);
3260     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3261                                                          ConceptNameInfo,
3262                                                          FoundDecl,
3263                                                          NamedConcept, TALI);
3264     if (Result.isInvalid())
3265       return ExprError();
3266     return Result;
3267   }
3268 
3269   /// \brief Build a new requires expression.
3270   ///
3271   /// By default, performs semantic analysis to build the new expression.
3272   /// Subclasses may override this routine to provide different behavior.
3273   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3274                                  RequiresExprBodyDecl *Body,
3275                                  ArrayRef<ParmVarDecl *> LocalParameters,
3276                                  ArrayRef<concepts::Requirement *> Requirements,
3277                                  SourceLocation ClosingBraceLoc) {
3278     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3279                                 LocalParameters, Requirements, ClosingBraceLoc);
3280   }
3281 
3282   concepts::TypeRequirement *
3283   RebuildTypeRequirement(
3284       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3285     return SemaRef.BuildTypeRequirement(SubstDiag);
3286   }
3287 
3288   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3289     return SemaRef.BuildTypeRequirement(T);
3290   }
3291 
3292   concepts::ExprRequirement *
3293   RebuildExprRequirement(
3294       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3295       SourceLocation NoexceptLoc,
3296       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3297     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3298                                         std::move(Ret));
3299   }
3300 
3301   concepts::ExprRequirement *
3302   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3303                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3304     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3305                                         std::move(Ret));
3306   }
3307 
3308   concepts::NestedRequirement *
3309   RebuildNestedRequirement(
3310       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3311     return SemaRef.BuildNestedRequirement(SubstDiag);
3312   }
3313 
3314   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3315     return SemaRef.BuildNestedRequirement(Constraint);
3316   }
3317 
3318   /// \brief Build a new Objective-C boxed expression.
3319   ///
3320   /// By default, performs semantic analysis to build the new expression.
3321   /// Subclasses may override this routine to provide different behavior.
3322   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3323     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3324   }
3325 
3326   /// Build a new Objective-C array literal.
3327   ///
3328   /// By default, performs semantic analysis to build the new expression.
3329   /// Subclasses may override this routine to provide different behavior.
3330   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3331                                      Expr **Elements, unsigned NumElements) {
3332     return getSema().BuildObjCArrayLiteral(Range,
3333                                            MultiExprArg(Elements, NumElements));
3334   }
3335 
3336   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3337                                          Expr *Base, Expr *Key,
3338                                          ObjCMethodDecl *getterMethod,
3339                                          ObjCMethodDecl *setterMethod) {
3340     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3341                                                    getterMethod, setterMethod);
3342   }
3343 
3344   /// Build a new Objective-C dictionary literal.
3345   ///
3346   /// By default, performs semantic analysis to build the new expression.
3347   /// Subclasses may override this routine to provide different behavior.
3348   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3349                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3350     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3351   }
3352 
3353   /// Build a new Objective-C \@encode expression.
3354   ///
3355   /// By default, performs semantic analysis to build the new expression.
3356   /// Subclasses may override this routine to provide different behavior.
3357   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3358                                          TypeSourceInfo *EncodeTypeInfo,
3359                                          SourceLocation RParenLoc) {
3360     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3361   }
3362 
3363   /// Build a new Objective-C class message.
3364   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3365                                           Selector Sel,
3366                                           ArrayRef<SourceLocation> SelectorLocs,
3367                                           ObjCMethodDecl *Method,
3368                                           SourceLocation LBracLoc,
3369                                           MultiExprArg Args,
3370                                           SourceLocation RBracLoc) {
3371     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3372                                      ReceiverTypeInfo->getType(),
3373                                      /*SuperLoc=*/SourceLocation(),
3374                                      Sel, Method, LBracLoc, SelectorLocs,
3375                                      RBracLoc, Args);
3376   }
3377 
3378   /// Build a new Objective-C instance message.
3379   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3380                                           Selector Sel,
3381                                           ArrayRef<SourceLocation> SelectorLocs,
3382                                           ObjCMethodDecl *Method,
3383                                           SourceLocation LBracLoc,
3384                                           MultiExprArg Args,
3385                                           SourceLocation RBracLoc) {
3386     return SemaRef.BuildInstanceMessage(Receiver,
3387                                         Receiver->getType(),
3388                                         /*SuperLoc=*/SourceLocation(),
3389                                         Sel, Method, LBracLoc, SelectorLocs,
3390                                         RBracLoc, Args);
3391   }
3392 
3393   /// Build a new Objective-C instance/class message to 'super'.
3394   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3395                                     Selector Sel,
3396                                     ArrayRef<SourceLocation> SelectorLocs,
3397                                     QualType SuperType,
3398                                     ObjCMethodDecl *Method,
3399                                     SourceLocation LBracLoc,
3400                                     MultiExprArg Args,
3401                                     SourceLocation RBracLoc) {
3402     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3403                                           SuperType,
3404                                           SuperLoc,
3405                                           Sel, Method, LBracLoc, SelectorLocs,
3406                                           RBracLoc, Args)
3407                                       : SemaRef.BuildClassMessage(nullptr,
3408                                           SuperType,
3409                                           SuperLoc,
3410                                           Sel, Method, LBracLoc, SelectorLocs,
3411                                           RBracLoc, Args);
3412 
3413 
3414   }
3415 
3416   /// Build a new Objective-C ivar reference expression.
3417   ///
3418   /// By default, performs semantic analysis to build the new expression.
3419   /// Subclasses may override this routine to provide different behavior.
3420   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3421                                           SourceLocation IvarLoc,
3422                                           bool IsArrow, bool IsFreeIvar) {
3423     CXXScopeSpec SS;
3424     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3425     ExprResult Result = getSema().BuildMemberReferenceExpr(
3426         BaseArg, BaseArg->getType(),
3427         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3428         /*FirstQualifierInScope=*/nullptr, NameInfo,
3429         /*TemplateArgs=*/nullptr,
3430         /*S=*/nullptr);
3431     if (IsFreeIvar && Result.isUsable())
3432       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3433     return Result;
3434   }
3435 
3436   /// Build a new Objective-C property reference expression.
3437   ///
3438   /// By default, performs semantic analysis to build the new expression.
3439   /// Subclasses may override this routine to provide different behavior.
3440   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3441                                         ObjCPropertyDecl *Property,
3442                                         SourceLocation PropertyLoc) {
3443     CXXScopeSpec SS;
3444     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3445     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3446                                               /*FIXME:*/PropertyLoc,
3447                                               /*IsArrow=*/false,
3448                                               SS, SourceLocation(),
3449                                               /*FirstQualifierInScope=*/nullptr,
3450                                               NameInfo,
3451                                               /*TemplateArgs=*/nullptr,
3452                                               /*S=*/nullptr);
3453   }
3454 
3455   /// Build a new Objective-C property reference expression.
3456   ///
3457   /// By default, performs semantic analysis to build the new expression.
3458   /// Subclasses may override this routine to provide different behavior.
3459   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3460                                         ObjCMethodDecl *Getter,
3461                                         ObjCMethodDecl *Setter,
3462                                         SourceLocation PropertyLoc) {
3463     // Since these expressions can only be value-dependent, we do not
3464     // need to perform semantic analysis again.
3465     return Owned(
3466       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3467                                                   VK_LValue, OK_ObjCProperty,
3468                                                   PropertyLoc, Base));
3469   }
3470 
3471   /// Build a new Objective-C "isa" expression.
3472   ///
3473   /// By default, performs semantic analysis to build the new expression.
3474   /// Subclasses may override this routine to provide different behavior.
3475   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3476                                 SourceLocation OpLoc, bool IsArrow) {
3477     CXXScopeSpec SS;
3478     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3479     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3480                                               OpLoc, IsArrow,
3481                                               SS, SourceLocation(),
3482                                               /*FirstQualifierInScope=*/nullptr,
3483                                               NameInfo,
3484                                               /*TemplateArgs=*/nullptr,
3485                                               /*S=*/nullptr);
3486   }
3487 
3488   /// Build a new shuffle vector expression.
3489   ///
3490   /// By default, performs semantic analysis to build the new expression.
3491   /// Subclasses may override this routine to provide different behavior.
3492   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3493                                       MultiExprArg SubExprs,
3494                                       SourceLocation RParenLoc) {
3495     // Find the declaration for __builtin_shufflevector
3496     const IdentifierInfo &Name
3497       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3498     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3499     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3500     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3501 
3502     // Build a reference to the __builtin_shufflevector builtin
3503     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3504     Expr *Callee = new (SemaRef.Context)
3505         DeclRefExpr(SemaRef.Context, Builtin, false,
3506                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3507     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3508     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3509                                        CK_BuiltinFnToFnPtr).get();
3510 
3511     // Build the CallExpr
3512     ExprResult TheCall = CallExpr::Create(
3513         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3514         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3515         FPOptionsOverride());
3516 
3517     // Type-check the __builtin_shufflevector expression.
3518     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3519   }
3520 
3521   /// Build a new convert vector expression.
3522   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3523                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3524                                       SourceLocation RParenLoc) {
3525     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3526                                          BuiltinLoc, RParenLoc);
3527   }
3528 
3529   /// Build a new template argument pack expansion.
3530   ///
3531   /// By default, performs semantic analysis to build a new pack expansion
3532   /// for a template argument. Subclasses may override this routine to provide
3533   /// different behavior.
3534   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3535                                            SourceLocation EllipsisLoc,
3536                                            Optional<unsigned> NumExpansions) {
3537     switch (Pattern.getArgument().getKind()) {
3538     case TemplateArgument::Expression: {
3539       ExprResult Result
3540         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3541                                        EllipsisLoc, NumExpansions);
3542       if (Result.isInvalid())
3543         return TemplateArgumentLoc();
3544 
3545       return TemplateArgumentLoc(Result.get(), Result.get());
3546     }
3547 
3548     case TemplateArgument::Template:
3549       return TemplateArgumentLoc(
3550           SemaRef.Context,
3551           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3552                            NumExpansions),
3553           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3554           EllipsisLoc);
3555 
3556     case TemplateArgument::Null:
3557     case TemplateArgument::Integral:
3558     case TemplateArgument::Declaration:
3559     case TemplateArgument::Pack:
3560     case TemplateArgument::TemplateExpansion:
3561     case TemplateArgument::NullPtr:
3562       llvm_unreachable("Pack expansion pattern has no parameter packs");
3563 
3564     case TemplateArgument::Type:
3565       if (TypeSourceInfo *Expansion
3566             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3567                                            EllipsisLoc,
3568                                            NumExpansions))
3569         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3570                                    Expansion);
3571       break;
3572     }
3573 
3574     return TemplateArgumentLoc();
3575   }
3576 
3577   /// Build a new expression pack expansion.
3578   ///
3579   /// By default, performs semantic analysis to build a new pack expansion
3580   /// for an expression. Subclasses may override this routine to provide
3581   /// different behavior.
3582   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3583                                   Optional<unsigned> NumExpansions) {
3584     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3585   }
3586 
3587   /// Build a new C++1z fold-expression.
3588   ///
3589   /// By default, performs semantic analysis in order to build a new fold
3590   /// expression.
3591   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3592                                 SourceLocation LParenLoc, Expr *LHS,
3593                                 BinaryOperatorKind Operator,
3594                                 SourceLocation EllipsisLoc, Expr *RHS,
3595                                 SourceLocation RParenLoc,
3596                                 Optional<unsigned> NumExpansions) {
3597     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3598                                       EllipsisLoc, RHS, RParenLoc,
3599                                       NumExpansions);
3600   }
3601 
3602   /// Build an empty C++1z fold-expression with the given operator.
3603   ///
3604   /// By default, produces the fallback value for the fold-expression, or
3605   /// produce an error if there is no fallback value.
3606   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3607                                      BinaryOperatorKind Operator) {
3608     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3609   }
3610 
3611   /// Build a new atomic operation expression.
3612   ///
3613   /// By default, performs semantic analysis to build the new expression.
3614   /// Subclasses may override this routine to provide different behavior.
3615   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3616                                AtomicExpr::AtomicOp Op,
3617                                SourceLocation RParenLoc) {
3618     // Use this for all of the locations, since we don't know the difference
3619     // between the call and the expr at this point.
3620     SourceRange Range{BuiltinLoc, RParenLoc};
3621     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3622                                      Sema::AtomicArgumentOrder::AST);
3623   }
3624 
3625   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3626                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3627     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3628   }
3629 
3630 private:
3631   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3632                                      QualType ObjectType,
3633                                      NamedDecl *FirstQualifierInScope,
3634                                      CXXScopeSpec &SS);
3635 
3636   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3637                                              QualType ObjectType,
3638                                              NamedDecl *FirstQualifierInScope,
3639                                              CXXScopeSpec &SS);
3640 
3641   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3642                                             NamedDecl *FirstQualifierInScope,
3643                                             CXXScopeSpec &SS);
3644 
3645   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3646                                       DependentNameTypeLoc TL,
3647                                       bool DeducibleTSTContext);
3648 };
3649 
3650 template <typename Derived>
3651 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3652   if (!S)
3653     return S;
3654 
3655   switch (S->getStmtClass()) {
3656   case Stmt::NoStmtClass: break;
3657 
3658   // Transform individual statement nodes
3659   // Pass SDK into statements that can produce a value
3660 #define STMT(Node, Parent)                                              \
3661   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3662 #define VALUESTMT(Node, Parent)                                         \
3663   case Stmt::Node##Class:                                               \
3664     return getDerived().Transform##Node(cast<Node>(S), SDK);
3665 #define ABSTRACT_STMT(Node)
3666 #define EXPR(Node, Parent)
3667 #include "clang/AST/StmtNodes.inc"
3668 
3669   // Transform expressions by calling TransformExpr.
3670 #define STMT(Node, Parent)
3671 #define ABSTRACT_STMT(Stmt)
3672 #define EXPR(Node, Parent) case Stmt::Node##Class:
3673 #include "clang/AST/StmtNodes.inc"
3674     {
3675       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3676 
3677       if (SDK == SDK_StmtExprResult)
3678         E = getSema().ActOnStmtExprResult(E);
3679       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3680     }
3681   }
3682 
3683   return S;
3684 }
3685 
3686 template<typename Derived>
3687 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3688   if (!S)
3689     return S;
3690 
3691   switch (S->getClauseKind()) {
3692   default: break;
3693   // Transform individual clause nodes
3694 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \
3695   case Enum:                                                                   \
3696     return getDerived().Transform ## Class(cast<Class>(S));
3697 #include "llvm/Frontend/OpenMP/OMPKinds.def"
3698   }
3699 
3700   return S;
3701 }
3702 
3703 
3704 template<typename Derived>
3705 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3706   if (!E)
3707     return E;
3708 
3709   switch (E->getStmtClass()) {
3710     case Stmt::NoStmtClass: break;
3711 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3712 #define ABSTRACT_STMT(Stmt)
3713 #define EXPR(Node, Parent)                                              \
3714     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3715 #include "clang/AST/StmtNodes.inc"
3716   }
3717 
3718   return E;
3719 }
3720 
3721 template<typename Derived>
3722 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3723                                                         bool NotCopyInit) {
3724   // Initializers are instantiated like expressions, except that various outer
3725   // layers are stripped.
3726   if (!Init)
3727     return Init;
3728 
3729   if (auto *FE = dyn_cast<FullExpr>(Init))
3730     Init = FE->getSubExpr();
3731 
3732   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3733     Init = AIL->getCommonExpr();
3734 
3735   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3736     Init = MTE->getSubExpr();
3737 
3738   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3739     Init = Binder->getSubExpr();
3740 
3741   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3742     Init = ICE->getSubExprAsWritten();
3743 
3744   if (CXXStdInitializerListExpr *ILE =
3745           dyn_cast<CXXStdInitializerListExpr>(Init))
3746     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3747 
3748   // If this is copy-initialization, we only need to reconstruct
3749   // InitListExprs. Other forms of copy-initialization will be a no-op if
3750   // the initializer is already the right type.
3751   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3752   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3753     return getDerived().TransformExpr(Init);
3754 
3755   // Revert value-initialization back to empty parens.
3756   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3757     SourceRange Parens = VIE->getSourceRange();
3758     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3759                                              Parens.getEnd());
3760   }
3761 
3762   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3763   if (isa<ImplicitValueInitExpr>(Init))
3764     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3765                                              SourceLocation());
3766 
3767   // Revert initialization by constructor back to a parenthesized or braced list
3768   // of expressions. Any other form of initializer can just be reused directly.
3769   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3770     return getDerived().TransformExpr(Init);
3771 
3772   // If the initialization implicitly converted an initializer list to a
3773   // std::initializer_list object, unwrap the std::initializer_list too.
3774   if (Construct && Construct->isStdInitListInitialization())
3775     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3776 
3777   // Enter a list-init context if this was list initialization.
3778   EnterExpressionEvaluationContext Context(
3779       getSema(), EnterExpressionEvaluationContext::InitList,
3780       Construct->isListInitialization());
3781 
3782   SmallVector<Expr*, 8> NewArgs;
3783   bool ArgChanged = false;
3784   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3785                                   /*IsCall*/true, NewArgs, &ArgChanged))
3786     return ExprError();
3787 
3788   // If this was list initialization, revert to syntactic list form.
3789   if (Construct->isListInitialization())
3790     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3791                                         Construct->getEndLoc());
3792 
3793   // Build a ParenListExpr to represent anything else.
3794   SourceRange Parens = Construct->getParenOrBraceRange();
3795   if (Parens.isInvalid()) {
3796     // This was a variable declaration's initialization for which no initializer
3797     // was specified.
3798     assert(NewArgs.empty() &&
3799            "no parens or braces but have direct init with arguments?");
3800     return ExprEmpty();
3801   }
3802   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3803                                            Parens.getEnd());
3804 }
3805 
3806 template<typename Derived>
3807 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3808                                             unsigned NumInputs,
3809                                             bool IsCall,
3810                                       SmallVectorImpl<Expr *> &Outputs,
3811                                             bool *ArgChanged) {
3812   for (unsigned I = 0; I != NumInputs; ++I) {
3813     // If requested, drop call arguments that need to be dropped.
3814     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3815       if (ArgChanged)
3816         *ArgChanged = true;
3817 
3818       break;
3819     }
3820 
3821     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3822       Expr *Pattern = Expansion->getPattern();
3823 
3824       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3825       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3826       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3827 
3828       // Determine whether the set of unexpanded parameter packs can and should
3829       // be expanded.
3830       bool Expand = true;
3831       bool RetainExpansion = false;
3832       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3833       Optional<unsigned> NumExpansions = OrigNumExpansions;
3834       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3835                                                Pattern->getSourceRange(),
3836                                                Unexpanded,
3837                                                Expand, RetainExpansion,
3838                                                NumExpansions))
3839         return true;
3840 
3841       if (!Expand) {
3842         // The transform has determined that we should perform a simple
3843         // transformation on the pack expansion, producing another pack
3844         // expansion.
3845         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3846         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3847         if (OutPattern.isInvalid())
3848           return true;
3849 
3850         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3851                                                 Expansion->getEllipsisLoc(),
3852                                                            NumExpansions);
3853         if (Out.isInvalid())
3854           return true;
3855 
3856         if (ArgChanged)
3857           *ArgChanged = true;
3858         Outputs.push_back(Out.get());
3859         continue;
3860       }
3861 
3862       // Record right away that the argument was changed.  This needs
3863       // to happen even if the array expands to nothing.
3864       if (ArgChanged) *ArgChanged = true;
3865 
3866       // The transform has determined that we should perform an elementwise
3867       // expansion of the pattern. Do so.
3868       for (unsigned I = 0; I != *NumExpansions; ++I) {
3869         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3870         ExprResult Out = getDerived().TransformExpr(Pattern);
3871         if (Out.isInvalid())
3872           return true;
3873 
3874         if (Out.get()->containsUnexpandedParameterPack()) {
3875           Out = getDerived().RebuildPackExpansion(
3876               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3877           if (Out.isInvalid())
3878             return true;
3879         }
3880 
3881         Outputs.push_back(Out.get());
3882       }
3883 
3884       // If we're supposed to retain a pack expansion, do so by temporarily
3885       // forgetting the partially-substituted parameter pack.
3886       if (RetainExpansion) {
3887         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3888 
3889         ExprResult Out = getDerived().TransformExpr(Pattern);
3890         if (Out.isInvalid())
3891           return true;
3892 
3893         Out = getDerived().RebuildPackExpansion(
3894             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3895         if (Out.isInvalid())
3896           return true;
3897 
3898         Outputs.push_back(Out.get());
3899       }
3900 
3901       continue;
3902     }
3903 
3904     ExprResult Result =
3905       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3906              : getDerived().TransformExpr(Inputs[I]);
3907     if (Result.isInvalid())
3908       return true;
3909 
3910     if (Result.get() != Inputs[I] && ArgChanged)
3911       *ArgChanged = true;
3912 
3913     Outputs.push_back(Result.get());
3914   }
3915 
3916   return false;
3917 }
3918 
3919 template <typename Derived>
3920 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3921     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3922   if (Var) {
3923     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3924         getDerived().TransformDefinition(Var->getLocation(), Var));
3925 
3926     if (!ConditionVar)
3927       return Sema::ConditionError();
3928 
3929     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3930   }
3931 
3932   if (Expr) {
3933     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3934 
3935     if (CondExpr.isInvalid())
3936       return Sema::ConditionError();
3937 
3938     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3939   }
3940 
3941   return Sema::ConditionResult();
3942 }
3943 
3944 template<typename Derived>
3945 NestedNameSpecifierLoc
3946 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3947                                                     NestedNameSpecifierLoc NNS,
3948                                                      QualType ObjectType,
3949                                              NamedDecl *FirstQualifierInScope) {
3950   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3951   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3952        Qualifier = Qualifier.getPrefix())
3953     Qualifiers.push_back(Qualifier);
3954 
3955   CXXScopeSpec SS;
3956   while (!Qualifiers.empty()) {
3957     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3958     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3959 
3960     switch (QNNS->getKind()) {
3961     case NestedNameSpecifier::Identifier: {
3962       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3963                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3964       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3965                                               SS, FirstQualifierInScope, false))
3966         return NestedNameSpecifierLoc();
3967     }
3968       break;
3969 
3970     case NestedNameSpecifier::Namespace: {
3971       NamespaceDecl *NS
3972         = cast_or_null<NamespaceDecl>(
3973                                     getDerived().TransformDecl(
3974                                                           Q.getLocalBeginLoc(),
3975                                                        QNNS->getAsNamespace()));
3976       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3977       break;
3978     }
3979 
3980     case NestedNameSpecifier::NamespaceAlias: {
3981       NamespaceAliasDecl *Alias
3982         = cast_or_null<NamespaceAliasDecl>(
3983                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3984                                                  QNNS->getAsNamespaceAlias()));
3985       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3986                 Q.getLocalEndLoc());
3987       break;
3988     }
3989 
3990     case NestedNameSpecifier::Global:
3991       // There is no meaningful transformation that one could perform on the
3992       // global scope.
3993       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3994       break;
3995 
3996     case NestedNameSpecifier::Super: {
3997       CXXRecordDecl *RD =
3998           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3999               SourceLocation(), QNNS->getAsRecordDecl()));
4000       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4001       break;
4002     }
4003 
4004     case NestedNameSpecifier::TypeSpecWithTemplate:
4005     case NestedNameSpecifier::TypeSpec: {
4006       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4007                                               FirstQualifierInScope, SS);
4008 
4009       if (!TL)
4010         return NestedNameSpecifierLoc();
4011 
4012       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4013           (SemaRef.getLangOpts().CPlusPlus11 &&
4014            TL.getType()->isEnumeralType())) {
4015         assert(!TL.getType().hasLocalQualifiers() &&
4016                "Can't get cv-qualifiers here");
4017         if (TL.getType()->isEnumeralType())
4018           SemaRef.Diag(TL.getBeginLoc(),
4019                        diag::warn_cxx98_compat_enum_nested_name_spec);
4020         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
4021                   Q.getLocalEndLoc());
4022         break;
4023       }
4024       // If the nested-name-specifier is an invalid type def, don't emit an
4025       // error because a previous error should have already been emitted.
4026       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4027       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4028         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4029           << TL.getType() << SS.getRange();
4030       }
4031       return NestedNameSpecifierLoc();
4032     }
4033     }
4034 
4035     // The qualifier-in-scope and object type only apply to the leftmost entity.
4036     FirstQualifierInScope = nullptr;
4037     ObjectType = QualType();
4038   }
4039 
4040   // Don't rebuild the nested-name-specifier if we don't have to.
4041   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4042       !getDerived().AlwaysRebuild())
4043     return NNS;
4044 
4045   // If we can re-use the source-location data from the original
4046   // nested-name-specifier, do so.
4047   if (SS.location_size() == NNS.getDataLength() &&
4048       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4049     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4050 
4051   // Allocate new nested-name-specifier location information.
4052   return SS.getWithLocInContext(SemaRef.Context);
4053 }
4054 
4055 template<typename Derived>
4056 DeclarationNameInfo
4057 TreeTransform<Derived>
4058 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4059   DeclarationName Name = NameInfo.getName();
4060   if (!Name)
4061     return DeclarationNameInfo();
4062 
4063   switch (Name.getNameKind()) {
4064   case DeclarationName::Identifier:
4065   case DeclarationName::ObjCZeroArgSelector:
4066   case DeclarationName::ObjCOneArgSelector:
4067   case DeclarationName::ObjCMultiArgSelector:
4068   case DeclarationName::CXXOperatorName:
4069   case DeclarationName::CXXLiteralOperatorName:
4070   case DeclarationName::CXXUsingDirective:
4071     return NameInfo;
4072 
4073   case DeclarationName::CXXDeductionGuideName: {
4074     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4075     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4076         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4077     if (!NewTemplate)
4078       return DeclarationNameInfo();
4079 
4080     DeclarationNameInfo NewNameInfo(NameInfo);
4081     NewNameInfo.setName(
4082         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4083     return NewNameInfo;
4084   }
4085 
4086   case DeclarationName::CXXConstructorName:
4087   case DeclarationName::CXXDestructorName:
4088   case DeclarationName::CXXConversionFunctionName: {
4089     TypeSourceInfo *NewTInfo;
4090     CanQualType NewCanTy;
4091     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4092       NewTInfo = getDerived().TransformType(OldTInfo);
4093       if (!NewTInfo)
4094         return DeclarationNameInfo();
4095       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4096     }
4097     else {
4098       NewTInfo = nullptr;
4099       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4100       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4101       if (NewT.isNull())
4102         return DeclarationNameInfo();
4103       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4104     }
4105 
4106     DeclarationName NewName
4107       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4108                                                            NewCanTy);
4109     DeclarationNameInfo NewNameInfo(NameInfo);
4110     NewNameInfo.setName(NewName);
4111     NewNameInfo.setNamedTypeInfo(NewTInfo);
4112     return NewNameInfo;
4113   }
4114   }
4115 
4116   llvm_unreachable("Unknown name kind.");
4117 }
4118 
4119 template<typename Derived>
4120 TemplateName
4121 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4122                                               TemplateName Name,
4123                                               SourceLocation NameLoc,
4124                                               QualType ObjectType,
4125                                               NamedDecl *FirstQualifierInScope,
4126                                               bool AllowInjectedClassName) {
4127   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4128     TemplateDecl *Template = QTN->getTemplateDecl();
4129     assert(Template && "qualified template name must refer to a template");
4130 
4131     TemplateDecl *TransTemplate
4132       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4133                                                               Template));
4134     if (!TransTemplate)
4135       return TemplateName();
4136 
4137     if (!getDerived().AlwaysRebuild() &&
4138         SS.getScopeRep() == QTN->getQualifier() &&
4139         TransTemplate == Template)
4140       return Name;
4141 
4142     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4143                                             TransTemplate);
4144   }
4145 
4146   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4147     if (SS.getScopeRep()) {
4148       // These apply to the scope specifier, not the template.
4149       ObjectType = QualType();
4150       FirstQualifierInScope = nullptr;
4151     }
4152 
4153     if (!getDerived().AlwaysRebuild() &&
4154         SS.getScopeRep() == DTN->getQualifier() &&
4155         ObjectType.isNull())
4156       return Name;
4157 
4158     // FIXME: Preserve the location of the "template" keyword.
4159     SourceLocation TemplateKWLoc = NameLoc;
4160 
4161     if (DTN->isIdentifier()) {
4162       return getDerived().RebuildTemplateName(SS,
4163                                               TemplateKWLoc,
4164                                               *DTN->getIdentifier(),
4165                                               NameLoc,
4166                                               ObjectType,
4167                                               FirstQualifierInScope,
4168                                               AllowInjectedClassName);
4169     }
4170 
4171     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4172                                             DTN->getOperator(), NameLoc,
4173                                             ObjectType, AllowInjectedClassName);
4174   }
4175 
4176   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4177     TemplateDecl *TransTemplate
4178       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4179                                                               Template));
4180     if (!TransTemplate)
4181       return TemplateName();
4182 
4183     if (!getDerived().AlwaysRebuild() &&
4184         TransTemplate == Template)
4185       return Name;
4186 
4187     return TemplateName(TransTemplate);
4188   }
4189 
4190   if (SubstTemplateTemplateParmPackStorage *SubstPack
4191       = Name.getAsSubstTemplateTemplateParmPack()) {
4192     TemplateTemplateParmDecl *TransParam
4193     = cast_or_null<TemplateTemplateParmDecl>(
4194             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4195     if (!TransParam)
4196       return TemplateName();
4197 
4198     if (!getDerived().AlwaysRebuild() &&
4199         TransParam == SubstPack->getParameterPack())
4200       return Name;
4201 
4202     return getDerived().RebuildTemplateName(TransParam,
4203                                             SubstPack->getArgumentPack());
4204   }
4205 
4206   // These should be getting filtered out before they reach the AST.
4207   llvm_unreachable("overloaded function decl survived to here");
4208 }
4209 
4210 template<typename Derived>
4211 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4212                                          const TemplateArgument &Arg,
4213                                          TemplateArgumentLoc &Output) {
4214   Output = getSema().getTrivialTemplateArgumentLoc(
4215       Arg, QualType(), getDerived().getBaseLocation());
4216 }
4217 
4218 template<typename Derived>
4219 bool TreeTransform<Derived>::TransformTemplateArgument(
4220                                          const TemplateArgumentLoc &Input,
4221                                          TemplateArgumentLoc &Output, bool Uneval) {
4222   const TemplateArgument &Arg = Input.getArgument();
4223   switch (Arg.getKind()) {
4224   case TemplateArgument::Null:
4225   case TemplateArgument::Pack:
4226     llvm_unreachable("Unexpected TemplateArgument");
4227 
4228   case TemplateArgument::Integral:
4229   case TemplateArgument::NullPtr:
4230   case TemplateArgument::Declaration: {
4231     // Transform a resolved template argument straight to a resolved template
4232     // argument. We get here when substituting into an already-substituted
4233     // template type argument during concept satisfaction checking.
4234     QualType T = Arg.getNonTypeTemplateArgumentType();
4235     QualType NewT = getDerived().TransformType(T);
4236     if (NewT.isNull())
4237       return true;
4238 
4239     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4240                        ? Arg.getAsDecl()
4241                        : nullptr;
4242     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4243                               getDerived().getBaseLocation(), D))
4244                         : nullptr;
4245     if (D && !NewD)
4246       return true;
4247 
4248     if (NewT == T && D == NewD)
4249       Output = Input;
4250     else if (Arg.getKind() == TemplateArgument::Integral)
4251       Output = TemplateArgumentLoc(
4252           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4253           TemplateArgumentLocInfo());
4254     else if (Arg.getKind() == TemplateArgument::NullPtr)
4255       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4256                                    TemplateArgumentLocInfo());
4257     else
4258       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4259                                    TemplateArgumentLocInfo());
4260 
4261     return false;
4262   }
4263 
4264   case TemplateArgument::Type: {
4265     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4266     if (!DI)
4267       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4268 
4269     DI = getDerived().TransformType(DI);
4270     if (!DI) return true;
4271 
4272     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4273     return false;
4274   }
4275 
4276   case TemplateArgument::Template: {
4277     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4278     if (QualifierLoc) {
4279       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4280       if (!QualifierLoc)
4281         return true;
4282     }
4283 
4284     CXXScopeSpec SS;
4285     SS.Adopt(QualifierLoc);
4286     TemplateName Template
4287       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4288                                            Input.getTemplateNameLoc());
4289     if (Template.isNull())
4290       return true;
4291 
4292     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4293                                  QualifierLoc, Input.getTemplateNameLoc());
4294     return false;
4295   }
4296 
4297   case TemplateArgument::TemplateExpansion:
4298     llvm_unreachable("Caller should expand pack expansions");
4299 
4300   case TemplateArgument::Expression: {
4301     // Template argument expressions are constant expressions.
4302     EnterExpressionEvaluationContext Unevaluated(
4303         getSema(),
4304         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4305                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4306         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4307         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4308 
4309     Expr *InputExpr = Input.getSourceExpression();
4310     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4311 
4312     ExprResult E = getDerived().TransformExpr(InputExpr);
4313     E = SemaRef.ActOnConstantExpression(E);
4314     if (E.isInvalid()) return true;
4315     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4316     return false;
4317   }
4318   }
4319 
4320   // Work around bogus GCC warning
4321   return true;
4322 }
4323 
4324 /// Iterator adaptor that invents template argument location information
4325 /// for each of the template arguments in its underlying iterator.
4326 template<typename Derived, typename InputIterator>
4327 class TemplateArgumentLocInventIterator {
4328   TreeTransform<Derived> &Self;
4329   InputIterator Iter;
4330 
4331 public:
4332   typedef TemplateArgumentLoc value_type;
4333   typedef TemplateArgumentLoc reference;
4334   typedef typename std::iterator_traits<InputIterator>::difference_type
4335     difference_type;
4336   typedef std::input_iterator_tag iterator_category;
4337 
4338   class pointer {
4339     TemplateArgumentLoc Arg;
4340 
4341   public:
4342     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4343 
4344     const TemplateArgumentLoc *operator->() const { return &Arg; }
4345   };
4346 
4347   TemplateArgumentLocInventIterator() { }
4348 
4349   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4350                                              InputIterator Iter)
4351     : Self(Self), Iter(Iter) { }
4352 
4353   TemplateArgumentLocInventIterator &operator++() {
4354     ++Iter;
4355     return *this;
4356   }
4357 
4358   TemplateArgumentLocInventIterator operator++(int) {
4359     TemplateArgumentLocInventIterator Old(*this);
4360     ++(*this);
4361     return Old;
4362   }
4363 
4364   reference operator*() const {
4365     TemplateArgumentLoc Result;
4366     Self.InventTemplateArgumentLoc(*Iter, Result);
4367     return Result;
4368   }
4369 
4370   pointer operator->() const { return pointer(**this); }
4371 
4372   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4373                          const TemplateArgumentLocInventIterator &Y) {
4374     return X.Iter == Y.Iter;
4375   }
4376 
4377   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4378                          const TemplateArgumentLocInventIterator &Y) {
4379     return X.Iter != Y.Iter;
4380   }
4381 };
4382 
4383 template<typename Derived>
4384 template<typename InputIterator>
4385 bool TreeTransform<Derived>::TransformTemplateArguments(
4386     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4387     bool Uneval) {
4388   for (; First != Last; ++First) {
4389     TemplateArgumentLoc Out;
4390     TemplateArgumentLoc In = *First;
4391 
4392     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4393       // Unpack argument packs, which we translate them into separate
4394       // arguments.
4395       // FIXME: We could do much better if we could guarantee that the
4396       // TemplateArgumentLocInfo for the pack expansion would be usable for
4397       // all of the template arguments in the argument pack.
4398       typedef TemplateArgumentLocInventIterator<Derived,
4399                                                 TemplateArgument::pack_iterator>
4400         PackLocIterator;
4401       if (TransformTemplateArguments(PackLocIterator(*this,
4402                                                  In.getArgument().pack_begin()),
4403                                      PackLocIterator(*this,
4404                                                    In.getArgument().pack_end()),
4405                                      Outputs, Uneval))
4406         return true;
4407 
4408       continue;
4409     }
4410 
4411     if (In.getArgument().isPackExpansion()) {
4412       // We have a pack expansion, for which we will be substituting into
4413       // the pattern.
4414       SourceLocation Ellipsis;
4415       Optional<unsigned> OrigNumExpansions;
4416       TemplateArgumentLoc Pattern
4417         = getSema().getTemplateArgumentPackExpansionPattern(
4418               In, Ellipsis, OrigNumExpansions);
4419 
4420       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4421       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4422       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4423 
4424       // Determine whether the set of unexpanded parameter packs can and should
4425       // be expanded.
4426       bool Expand = true;
4427       bool RetainExpansion = false;
4428       Optional<unsigned> NumExpansions = OrigNumExpansions;
4429       if (getDerived().TryExpandParameterPacks(Ellipsis,
4430                                                Pattern.getSourceRange(),
4431                                                Unexpanded,
4432                                                Expand,
4433                                                RetainExpansion,
4434                                                NumExpansions))
4435         return true;
4436 
4437       if (!Expand) {
4438         // The transform has determined that we should perform a simple
4439         // transformation on the pack expansion, producing another pack
4440         // expansion.
4441         TemplateArgumentLoc OutPattern;
4442         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4443         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4444           return true;
4445 
4446         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4447                                                 NumExpansions);
4448         if (Out.getArgument().isNull())
4449           return true;
4450 
4451         Outputs.addArgument(Out);
4452         continue;
4453       }
4454 
4455       // The transform has determined that we should perform an elementwise
4456       // expansion of the pattern. Do so.
4457       for (unsigned I = 0; I != *NumExpansions; ++I) {
4458         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4459 
4460         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4461           return true;
4462 
4463         if (Out.getArgument().containsUnexpandedParameterPack()) {
4464           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4465                                                   OrigNumExpansions);
4466           if (Out.getArgument().isNull())
4467             return true;
4468         }
4469 
4470         Outputs.addArgument(Out);
4471       }
4472 
4473       // If we're supposed to retain a pack expansion, do so by temporarily
4474       // forgetting the partially-substituted parameter pack.
4475       if (RetainExpansion) {
4476         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4477 
4478         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4479           return true;
4480 
4481         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4482                                                 OrigNumExpansions);
4483         if (Out.getArgument().isNull())
4484           return true;
4485 
4486         Outputs.addArgument(Out);
4487       }
4488 
4489       continue;
4490     }
4491 
4492     // The simple case:
4493     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4494       return true;
4495 
4496     Outputs.addArgument(Out);
4497   }
4498 
4499   return false;
4500 
4501 }
4502 
4503 //===----------------------------------------------------------------------===//
4504 // Type transformation
4505 //===----------------------------------------------------------------------===//
4506 
4507 template<typename Derived>
4508 QualType TreeTransform<Derived>::TransformType(QualType T) {
4509   if (getDerived().AlreadyTransformed(T))
4510     return T;
4511 
4512   // Temporary workaround.  All of these transformations should
4513   // eventually turn into transformations on TypeLocs.
4514   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4515                                                 getDerived().getBaseLocation());
4516 
4517   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4518 
4519   if (!NewDI)
4520     return QualType();
4521 
4522   return NewDI->getType();
4523 }
4524 
4525 template<typename Derived>
4526 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4527   // Refine the base location to the type's location.
4528   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4529                        getDerived().getBaseEntity());
4530   if (getDerived().AlreadyTransformed(DI->getType()))
4531     return DI;
4532 
4533   TypeLocBuilder TLB;
4534 
4535   TypeLoc TL = DI->getTypeLoc();
4536   TLB.reserve(TL.getFullDataSize());
4537 
4538   QualType Result = getDerived().TransformType(TLB, TL);
4539   if (Result.isNull())
4540     return nullptr;
4541 
4542   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4543 }
4544 
4545 template<typename Derived>
4546 QualType
4547 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4548   switch (T.getTypeLocClass()) {
4549 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4550 #define TYPELOC(CLASS, PARENT)                                                 \
4551   case TypeLoc::CLASS:                                                         \
4552     return getDerived().Transform##CLASS##Type(TLB,                            \
4553                                                T.castAs<CLASS##TypeLoc>());
4554 #include "clang/AST/TypeLocNodes.def"
4555   }
4556 
4557   llvm_unreachable("unhandled type loc!");
4558 }
4559 
4560 template<typename Derived>
4561 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4562   if (!isa<DependentNameType>(T))
4563     return TransformType(T);
4564 
4565   if (getDerived().AlreadyTransformed(T))
4566     return T;
4567   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4568                                                 getDerived().getBaseLocation());
4569   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4570   return NewDI ? NewDI->getType() : QualType();
4571 }
4572 
4573 template<typename Derived>
4574 TypeSourceInfo *
4575 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4576   if (!isa<DependentNameType>(DI->getType()))
4577     return TransformType(DI);
4578 
4579   // Refine the base location to the type's location.
4580   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4581                        getDerived().getBaseEntity());
4582   if (getDerived().AlreadyTransformed(DI->getType()))
4583     return DI;
4584 
4585   TypeLocBuilder TLB;
4586 
4587   TypeLoc TL = DI->getTypeLoc();
4588   TLB.reserve(TL.getFullDataSize());
4589 
4590   auto QTL = TL.getAs<QualifiedTypeLoc>();
4591   if (QTL)
4592     TL = QTL.getUnqualifiedLoc();
4593 
4594   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4595 
4596   QualType Result = getDerived().TransformDependentNameType(
4597       TLB, DNTL, /*DeducedTSTContext*/true);
4598   if (Result.isNull())
4599     return nullptr;
4600 
4601   if (QTL) {
4602     Result = getDerived().RebuildQualifiedType(Result, QTL);
4603     if (Result.isNull())
4604       return nullptr;
4605     TLB.TypeWasModifiedSafely(Result);
4606   }
4607 
4608   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4609 }
4610 
4611 template<typename Derived>
4612 QualType
4613 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4614                                                QualifiedTypeLoc T) {
4615   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4616   if (Result.isNull())
4617     return QualType();
4618 
4619   Result = getDerived().RebuildQualifiedType(Result, T);
4620 
4621   if (Result.isNull())
4622     return QualType();
4623 
4624   // RebuildQualifiedType might have updated the type, but not in a way
4625   // that invalidates the TypeLoc. (There's no location information for
4626   // qualifiers.)
4627   TLB.TypeWasModifiedSafely(Result);
4628 
4629   return Result;
4630 }
4631 
4632 template <typename Derived>
4633 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4634                                                       QualifiedTypeLoc TL) {
4635 
4636   SourceLocation Loc = TL.getBeginLoc();
4637   Qualifiers Quals = TL.getType().getLocalQualifiers();
4638 
4639   if (((T.getAddressSpace() != LangAS::Default &&
4640         Quals.getAddressSpace() != LangAS::Default)) &&
4641       T.getAddressSpace() != Quals.getAddressSpace()) {
4642     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4643         << TL.getType() << T;
4644     return QualType();
4645   }
4646 
4647   // C++ [dcl.fct]p7:
4648   //   [When] adding cv-qualifications on top of the function type [...] the
4649   //   cv-qualifiers are ignored.
4650   if (T->isFunctionType()) {
4651     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4652                                                      Quals.getAddressSpace());
4653     return T;
4654   }
4655 
4656   // C++ [dcl.ref]p1:
4657   //   when the cv-qualifiers are introduced through the use of a typedef-name
4658   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4659   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4660   // applied to a reference type.
4661   if (T->isReferenceType()) {
4662     // The only qualifier that applies to a reference type is restrict.
4663     if (!Quals.hasRestrict())
4664       return T;
4665     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4666   }
4667 
4668   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4669   // resulting type.
4670   if (Quals.hasObjCLifetime()) {
4671     if (!T->isObjCLifetimeType() && !T->isDependentType())
4672       Quals.removeObjCLifetime();
4673     else if (T.getObjCLifetime()) {
4674       // Objective-C ARC:
4675       //   A lifetime qualifier applied to a substituted template parameter
4676       //   overrides the lifetime qualifier from the template argument.
4677       const AutoType *AutoTy;
4678       if (const SubstTemplateTypeParmType *SubstTypeParam
4679                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4680         QualType Replacement = SubstTypeParam->getReplacementType();
4681         Qualifiers Qs = Replacement.getQualifiers();
4682         Qs.removeObjCLifetime();
4683         Replacement = SemaRef.Context.getQualifiedType(
4684             Replacement.getUnqualifiedType(), Qs);
4685         T = SemaRef.Context.getSubstTemplateTypeParmType(
4686             SubstTypeParam->getReplacedParameter(), Replacement);
4687       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4688         // 'auto' types behave the same way as template parameters.
4689         QualType Deduced = AutoTy->getDeducedType();
4690         Qualifiers Qs = Deduced.getQualifiers();
4691         Qs.removeObjCLifetime();
4692         Deduced =
4693             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4694         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4695                                         AutoTy->isDependentType(),
4696                                         /*isPack=*/false,
4697                                         AutoTy->getTypeConstraintConcept(),
4698                                         AutoTy->getTypeConstraintArguments());
4699       } else {
4700         // Otherwise, complain about the addition of a qualifier to an
4701         // already-qualified type.
4702         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4703         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4704         Quals.removeObjCLifetime();
4705       }
4706     }
4707   }
4708 
4709   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4710 }
4711 
4712 template<typename Derived>
4713 TypeLoc
4714 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4715                                                    QualType ObjectType,
4716                                                    NamedDecl *UnqualLookup,
4717                                                    CXXScopeSpec &SS) {
4718   if (getDerived().AlreadyTransformed(TL.getType()))
4719     return TL;
4720 
4721   TypeSourceInfo *TSI =
4722       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4723   if (TSI)
4724     return TSI->getTypeLoc();
4725   return TypeLoc();
4726 }
4727 
4728 template<typename Derived>
4729 TypeSourceInfo *
4730 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4731                                                    QualType ObjectType,
4732                                                    NamedDecl *UnqualLookup,
4733                                                    CXXScopeSpec &SS) {
4734   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4735     return TSInfo;
4736 
4737   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4738                                    UnqualLookup, SS);
4739 }
4740 
4741 template <typename Derived>
4742 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4743     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4744     CXXScopeSpec &SS) {
4745   QualType T = TL.getType();
4746   assert(!getDerived().AlreadyTransformed(T));
4747 
4748   TypeLocBuilder TLB;
4749   QualType Result;
4750 
4751   if (isa<TemplateSpecializationType>(T)) {
4752     TemplateSpecializationTypeLoc SpecTL =
4753         TL.castAs<TemplateSpecializationTypeLoc>();
4754 
4755     TemplateName Template = getDerived().TransformTemplateName(
4756         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4757         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4758     if (Template.isNull())
4759       return nullptr;
4760 
4761     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4762                                                               Template);
4763   } else if (isa<DependentTemplateSpecializationType>(T)) {
4764     DependentTemplateSpecializationTypeLoc SpecTL =
4765         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4766 
4767     TemplateName Template
4768       = getDerived().RebuildTemplateName(SS,
4769                                          SpecTL.getTemplateKeywordLoc(),
4770                                          *SpecTL.getTypePtr()->getIdentifier(),
4771                                          SpecTL.getTemplateNameLoc(),
4772                                          ObjectType, UnqualLookup,
4773                                          /*AllowInjectedClassName*/true);
4774     if (Template.isNull())
4775       return nullptr;
4776 
4777     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4778                                                                        SpecTL,
4779                                                                        Template,
4780                                                                        SS);
4781   } else {
4782     // Nothing special needs to be done for these.
4783     Result = getDerived().TransformType(TLB, TL);
4784   }
4785 
4786   if (Result.isNull())
4787     return nullptr;
4788 
4789   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4790 }
4791 
4792 template <class TyLoc> static inline
4793 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4794   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4795   NewT.setNameLoc(T.getNameLoc());
4796   return T.getType();
4797 }
4798 
4799 template<typename Derived>
4800 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4801                                                       BuiltinTypeLoc T) {
4802   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4803   NewT.setBuiltinLoc(T.getBuiltinLoc());
4804   if (T.needsExtraLocalData())
4805     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4806   return T.getType();
4807 }
4808 
4809 template<typename Derived>
4810 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4811                                                       ComplexTypeLoc T) {
4812   // FIXME: recurse?
4813   return TransformTypeSpecType(TLB, T);
4814 }
4815 
4816 template <typename Derived>
4817 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4818                                                        AdjustedTypeLoc TL) {
4819   // Adjustments applied during transformation are handled elsewhere.
4820   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4821 }
4822 
4823 template<typename Derived>
4824 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4825                                                       DecayedTypeLoc TL) {
4826   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4827   if (OriginalType.isNull())
4828     return QualType();
4829 
4830   QualType Result = TL.getType();
4831   if (getDerived().AlwaysRebuild() ||
4832       OriginalType != TL.getOriginalLoc().getType())
4833     Result = SemaRef.Context.getDecayedType(OriginalType);
4834   TLB.push<DecayedTypeLoc>(Result);
4835   // Nothing to set for DecayedTypeLoc.
4836   return Result;
4837 }
4838 
4839 template<typename Derived>
4840 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4841                                                       PointerTypeLoc TL) {
4842   QualType PointeeType
4843     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4844   if (PointeeType.isNull())
4845     return QualType();
4846 
4847   QualType Result = TL.getType();
4848   if (PointeeType->getAs<ObjCObjectType>()) {
4849     // A dependent pointer type 'T *' has is being transformed such
4850     // that an Objective-C class type is being replaced for 'T'. The
4851     // resulting pointer type is an ObjCObjectPointerType, not a
4852     // PointerType.
4853     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4854 
4855     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4856     NewT.setStarLoc(TL.getStarLoc());
4857     return Result;
4858   }
4859 
4860   if (getDerived().AlwaysRebuild() ||
4861       PointeeType != TL.getPointeeLoc().getType()) {
4862     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4863     if (Result.isNull())
4864       return QualType();
4865   }
4866 
4867   // Objective-C ARC can add lifetime qualifiers to the type that we're
4868   // pointing to.
4869   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4870 
4871   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4872   NewT.setSigilLoc(TL.getSigilLoc());
4873   return Result;
4874 }
4875 
4876 template<typename Derived>
4877 QualType
4878 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4879                                                   BlockPointerTypeLoc TL) {
4880   QualType PointeeType
4881     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4882   if (PointeeType.isNull())
4883     return QualType();
4884 
4885   QualType Result = TL.getType();
4886   if (getDerived().AlwaysRebuild() ||
4887       PointeeType != TL.getPointeeLoc().getType()) {
4888     Result = getDerived().RebuildBlockPointerType(PointeeType,
4889                                                   TL.getSigilLoc());
4890     if (Result.isNull())
4891       return QualType();
4892   }
4893 
4894   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4895   NewT.setSigilLoc(TL.getSigilLoc());
4896   return Result;
4897 }
4898 
4899 /// Transforms a reference type.  Note that somewhat paradoxically we
4900 /// don't care whether the type itself is an l-value type or an r-value
4901 /// type;  we only care if the type was *written* as an l-value type
4902 /// or an r-value type.
4903 template<typename Derived>
4904 QualType
4905 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4906                                                ReferenceTypeLoc TL) {
4907   const ReferenceType *T = TL.getTypePtr();
4908 
4909   // Note that this works with the pointee-as-written.
4910   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4911   if (PointeeType.isNull())
4912     return QualType();
4913 
4914   QualType Result = TL.getType();
4915   if (getDerived().AlwaysRebuild() ||
4916       PointeeType != T->getPointeeTypeAsWritten()) {
4917     Result = getDerived().RebuildReferenceType(PointeeType,
4918                                                T->isSpelledAsLValue(),
4919                                                TL.getSigilLoc());
4920     if (Result.isNull())
4921       return QualType();
4922   }
4923 
4924   // Objective-C ARC can add lifetime qualifiers to the type that we're
4925   // referring to.
4926   TLB.TypeWasModifiedSafely(
4927       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4928 
4929   // r-value references can be rebuilt as l-value references.
4930   ReferenceTypeLoc NewTL;
4931   if (isa<LValueReferenceType>(Result))
4932     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4933   else
4934     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4935   NewTL.setSigilLoc(TL.getSigilLoc());
4936 
4937   return Result;
4938 }
4939 
4940 template<typename Derived>
4941 QualType
4942 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4943                                                  LValueReferenceTypeLoc TL) {
4944   return TransformReferenceType(TLB, TL);
4945 }
4946 
4947 template<typename Derived>
4948 QualType
4949 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4950                                                  RValueReferenceTypeLoc TL) {
4951   return TransformReferenceType(TLB, TL);
4952 }
4953 
4954 template<typename Derived>
4955 QualType
4956 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4957                                                    MemberPointerTypeLoc TL) {
4958   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4959   if (PointeeType.isNull())
4960     return QualType();
4961 
4962   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4963   TypeSourceInfo *NewClsTInfo = nullptr;
4964   if (OldClsTInfo) {
4965     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4966     if (!NewClsTInfo)
4967       return QualType();
4968   }
4969 
4970   const MemberPointerType *T = TL.getTypePtr();
4971   QualType OldClsType = QualType(T->getClass(), 0);
4972   QualType NewClsType;
4973   if (NewClsTInfo)
4974     NewClsType = NewClsTInfo->getType();
4975   else {
4976     NewClsType = getDerived().TransformType(OldClsType);
4977     if (NewClsType.isNull())
4978       return QualType();
4979   }
4980 
4981   QualType Result = TL.getType();
4982   if (getDerived().AlwaysRebuild() ||
4983       PointeeType != T->getPointeeType() ||
4984       NewClsType != OldClsType) {
4985     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4986                                                    TL.getStarLoc());
4987     if (Result.isNull())
4988       return QualType();
4989   }
4990 
4991   // If we had to adjust the pointee type when building a member pointer, make
4992   // sure to push TypeLoc info for it.
4993   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4994   if (MPT && PointeeType != MPT->getPointeeType()) {
4995     assert(isa<AdjustedType>(MPT->getPointeeType()));
4996     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4997   }
4998 
4999   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5000   NewTL.setSigilLoc(TL.getSigilLoc());
5001   NewTL.setClassTInfo(NewClsTInfo);
5002 
5003   return Result;
5004 }
5005 
5006 template<typename Derived>
5007 QualType
5008 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5009                                                    ConstantArrayTypeLoc TL) {
5010   const ConstantArrayType *T = TL.getTypePtr();
5011   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5012   if (ElementType.isNull())
5013     return QualType();
5014 
5015   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5016   Expr *OldSize = TL.getSizeExpr();
5017   if (!OldSize)
5018     OldSize = const_cast<Expr*>(T->getSizeExpr());
5019   Expr *NewSize = nullptr;
5020   if (OldSize) {
5021     EnterExpressionEvaluationContext Unevaluated(
5022         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5023     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5024     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5025   }
5026 
5027   QualType Result = TL.getType();
5028   if (getDerived().AlwaysRebuild() ||
5029       ElementType != T->getElementType() ||
5030       (T->getSizeExpr() && NewSize != OldSize)) {
5031     Result = getDerived().RebuildConstantArrayType(ElementType,
5032                                                    T->getSizeModifier(),
5033                                                    T->getSize(), NewSize,
5034                                              T->getIndexTypeCVRQualifiers(),
5035                                                    TL.getBracketsRange());
5036     if (Result.isNull())
5037       return QualType();
5038   }
5039 
5040   // We might have either a ConstantArrayType or a VariableArrayType now:
5041   // a ConstantArrayType is allowed to have an element type which is a
5042   // VariableArrayType if the type is dependent.  Fortunately, all array
5043   // types have the same location layout.
5044   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5045   NewTL.setLBracketLoc(TL.getLBracketLoc());
5046   NewTL.setRBracketLoc(TL.getRBracketLoc());
5047   NewTL.setSizeExpr(NewSize);
5048 
5049   return Result;
5050 }
5051 
5052 template<typename Derived>
5053 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5054                                               TypeLocBuilder &TLB,
5055                                               IncompleteArrayTypeLoc TL) {
5056   const IncompleteArrayType *T = TL.getTypePtr();
5057   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5058   if (ElementType.isNull())
5059     return QualType();
5060 
5061   QualType Result = TL.getType();
5062   if (getDerived().AlwaysRebuild() ||
5063       ElementType != T->getElementType()) {
5064     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5065                                                      T->getSizeModifier(),
5066                                            T->getIndexTypeCVRQualifiers(),
5067                                                      TL.getBracketsRange());
5068     if (Result.isNull())
5069       return QualType();
5070   }
5071 
5072   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5073   NewTL.setLBracketLoc(TL.getLBracketLoc());
5074   NewTL.setRBracketLoc(TL.getRBracketLoc());
5075   NewTL.setSizeExpr(nullptr);
5076 
5077   return Result;
5078 }
5079 
5080 template<typename Derived>
5081 QualType
5082 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5083                                                    VariableArrayTypeLoc TL) {
5084   const VariableArrayType *T = TL.getTypePtr();
5085   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5086   if (ElementType.isNull())
5087     return QualType();
5088 
5089   ExprResult SizeResult;
5090   {
5091     EnterExpressionEvaluationContext Context(
5092         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5093     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5094   }
5095   if (SizeResult.isInvalid())
5096     return QualType();
5097   SizeResult =
5098       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5099   if (SizeResult.isInvalid())
5100     return QualType();
5101 
5102   Expr *Size = SizeResult.get();
5103 
5104   QualType Result = TL.getType();
5105   if (getDerived().AlwaysRebuild() ||
5106       ElementType != T->getElementType() ||
5107       Size != T->getSizeExpr()) {
5108     Result = getDerived().RebuildVariableArrayType(ElementType,
5109                                                    T->getSizeModifier(),
5110                                                    Size,
5111                                              T->getIndexTypeCVRQualifiers(),
5112                                                    TL.getBracketsRange());
5113     if (Result.isNull())
5114       return QualType();
5115   }
5116 
5117   // We might have constant size array now, but fortunately it has the same
5118   // location layout.
5119   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5120   NewTL.setLBracketLoc(TL.getLBracketLoc());
5121   NewTL.setRBracketLoc(TL.getRBracketLoc());
5122   NewTL.setSizeExpr(Size);
5123 
5124   return Result;
5125 }
5126 
5127 template<typename Derived>
5128 QualType
5129 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5130                                              DependentSizedArrayTypeLoc TL) {
5131   const DependentSizedArrayType *T = TL.getTypePtr();
5132   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5133   if (ElementType.isNull())
5134     return QualType();
5135 
5136   // Array bounds are constant expressions.
5137   EnterExpressionEvaluationContext Unevaluated(
5138       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5139 
5140   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5141   Expr *origSize = TL.getSizeExpr();
5142   if (!origSize) origSize = T->getSizeExpr();
5143 
5144   ExprResult sizeResult
5145     = getDerived().TransformExpr(origSize);
5146   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5147   if (sizeResult.isInvalid())
5148     return QualType();
5149 
5150   Expr *size = sizeResult.get();
5151 
5152   QualType Result = TL.getType();
5153   if (getDerived().AlwaysRebuild() ||
5154       ElementType != T->getElementType() ||
5155       size != origSize) {
5156     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5157                                                          T->getSizeModifier(),
5158                                                          size,
5159                                                 T->getIndexTypeCVRQualifiers(),
5160                                                         TL.getBracketsRange());
5161     if (Result.isNull())
5162       return QualType();
5163   }
5164 
5165   // We might have any sort of array type now, but fortunately they
5166   // all have the same location layout.
5167   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5168   NewTL.setLBracketLoc(TL.getLBracketLoc());
5169   NewTL.setRBracketLoc(TL.getRBracketLoc());
5170   NewTL.setSizeExpr(size);
5171 
5172   return Result;
5173 }
5174 
5175 template <typename Derived>
5176 QualType TreeTransform<Derived>::TransformDependentVectorType(
5177     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5178   const DependentVectorType *T = TL.getTypePtr();
5179   QualType ElementType = getDerived().TransformType(T->getElementType());
5180   if (ElementType.isNull())
5181     return QualType();
5182 
5183   EnterExpressionEvaluationContext Unevaluated(
5184       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5185 
5186   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5187   Size = SemaRef.ActOnConstantExpression(Size);
5188   if (Size.isInvalid())
5189     return QualType();
5190 
5191   QualType Result = TL.getType();
5192   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5193       Size.get() != T->getSizeExpr()) {
5194     Result = getDerived().RebuildDependentVectorType(
5195         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5196     if (Result.isNull())
5197       return QualType();
5198   }
5199 
5200   // Result might be dependent or not.
5201   if (isa<DependentVectorType>(Result)) {
5202     DependentVectorTypeLoc NewTL =
5203         TLB.push<DependentVectorTypeLoc>(Result);
5204     NewTL.setNameLoc(TL.getNameLoc());
5205   } else {
5206     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5207     NewTL.setNameLoc(TL.getNameLoc());
5208   }
5209 
5210   return Result;
5211 }
5212 
5213 template<typename Derived>
5214 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5215                                       TypeLocBuilder &TLB,
5216                                       DependentSizedExtVectorTypeLoc TL) {
5217   const DependentSizedExtVectorType *T = TL.getTypePtr();
5218 
5219   // FIXME: ext vector locs should be nested
5220   QualType ElementType = getDerived().TransformType(T->getElementType());
5221   if (ElementType.isNull())
5222     return QualType();
5223 
5224   // Vector sizes are constant expressions.
5225   EnterExpressionEvaluationContext Unevaluated(
5226       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5227 
5228   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5229   Size = SemaRef.ActOnConstantExpression(Size);
5230   if (Size.isInvalid())
5231     return QualType();
5232 
5233   QualType Result = TL.getType();
5234   if (getDerived().AlwaysRebuild() ||
5235       ElementType != T->getElementType() ||
5236       Size.get() != T->getSizeExpr()) {
5237     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5238                                                              Size.get(),
5239                                                          T->getAttributeLoc());
5240     if (Result.isNull())
5241       return QualType();
5242   }
5243 
5244   // Result might be dependent or not.
5245   if (isa<DependentSizedExtVectorType>(Result)) {
5246     DependentSizedExtVectorTypeLoc NewTL
5247       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5248     NewTL.setNameLoc(TL.getNameLoc());
5249   } else {
5250     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5251     NewTL.setNameLoc(TL.getNameLoc());
5252   }
5253 
5254   return Result;
5255 }
5256 
5257 template <typename Derived>
5258 QualType
5259 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5260                                                     ConstantMatrixTypeLoc TL) {
5261   const ConstantMatrixType *T = TL.getTypePtr();
5262   QualType ElementType = getDerived().TransformType(T->getElementType());
5263   if (ElementType.isNull())
5264     return QualType();
5265 
5266   QualType Result = TL.getType();
5267   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5268     Result = getDerived().RebuildConstantMatrixType(
5269         ElementType, T->getNumRows(), T->getNumColumns());
5270     if (Result.isNull())
5271       return QualType();
5272   }
5273 
5274   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5275   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5276   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5277   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5278   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5279 
5280   return Result;
5281 }
5282 
5283 template <typename Derived>
5284 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5285     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5286   const DependentSizedMatrixType *T = TL.getTypePtr();
5287 
5288   QualType ElementType = getDerived().TransformType(T->getElementType());
5289   if (ElementType.isNull()) {
5290     return QualType();
5291   }
5292 
5293   // Matrix dimensions are constant expressions.
5294   EnterExpressionEvaluationContext Unevaluated(
5295       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5296 
5297   Expr *origRows = TL.getAttrRowOperand();
5298   if (!origRows)
5299     origRows = T->getRowExpr();
5300   Expr *origColumns = TL.getAttrColumnOperand();
5301   if (!origColumns)
5302     origColumns = T->getColumnExpr();
5303 
5304   ExprResult rowResult = getDerived().TransformExpr(origRows);
5305   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5306   if (rowResult.isInvalid())
5307     return QualType();
5308 
5309   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5310   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5311   if (columnResult.isInvalid())
5312     return QualType();
5313 
5314   Expr *rows = rowResult.get();
5315   Expr *columns = columnResult.get();
5316 
5317   QualType Result = TL.getType();
5318   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5319       rows != origRows || columns != origColumns) {
5320     Result = getDerived().RebuildDependentSizedMatrixType(
5321         ElementType, rows, columns, T->getAttributeLoc());
5322 
5323     if (Result.isNull())
5324       return QualType();
5325   }
5326 
5327   // We might have any sort of matrix type now, but fortunately they
5328   // all have the same location layout.
5329   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5330   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5331   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5332   NewTL.setAttrRowOperand(rows);
5333   NewTL.setAttrColumnOperand(columns);
5334   return Result;
5335 }
5336 
5337 template <typename Derived>
5338 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5339     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5340   const DependentAddressSpaceType *T = TL.getTypePtr();
5341 
5342   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5343 
5344   if (pointeeType.isNull())
5345     return QualType();
5346 
5347   // Address spaces are constant expressions.
5348   EnterExpressionEvaluationContext Unevaluated(
5349       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5350 
5351   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5352   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5353   if (AddrSpace.isInvalid())
5354     return QualType();
5355 
5356   QualType Result = TL.getType();
5357   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5358       AddrSpace.get() != T->getAddrSpaceExpr()) {
5359     Result = getDerived().RebuildDependentAddressSpaceType(
5360         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5361     if (Result.isNull())
5362       return QualType();
5363   }
5364 
5365   // Result might be dependent or not.
5366   if (isa<DependentAddressSpaceType>(Result)) {
5367     DependentAddressSpaceTypeLoc NewTL =
5368         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5369 
5370     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5371     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5372     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5373 
5374   } else {
5375     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5376         Result, getDerived().getBaseLocation());
5377     TransformType(TLB, DI->getTypeLoc());
5378   }
5379 
5380   return Result;
5381 }
5382 
5383 template <typename Derived>
5384 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5385                                                      VectorTypeLoc TL) {
5386   const VectorType *T = TL.getTypePtr();
5387   QualType ElementType = getDerived().TransformType(T->getElementType());
5388   if (ElementType.isNull())
5389     return QualType();
5390 
5391   QualType Result = TL.getType();
5392   if (getDerived().AlwaysRebuild() ||
5393       ElementType != T->getElementType()) {
5394     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5395                                             T->getVectorKind());
5396     if (Result.isNull())
5397       return QualType();
5398   }
5399 
5400   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5401   NewTL.setNameLoc(TL.getNameLoc());
5402 
5403   return Result;
5404 }
5405 
5406 template<typename Derived>
5407 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5408                                                         ExtVectorTypeLoc TL) {
5409   const VectorType *T = TL.getTypePtr();
5410   QualType ElementType = getDerived().TransformType(T->getElementType());
5411   if (ElementType.isNull())
5412     return QualType();
5413 
5414   QualType Result = TL.getType();
5415   if (getDerived().AlwaysRebuild() ||
5416       ElementType != T->getElementType()) {
5417     Result = getDerived().RebuildExtVectorType(ElementType,
5418                                                T->getNumElements(),
5419                                                /*FIXME*/ SourceLocation());
5420     if (Result.isNull())
5421       return QualType();
5422   }
5423 
5424   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5425   NewTL.setNameLoc(TL.getNameLoc());
5426 
5427   return Result;
5428 }
5429 
5430 template <typename Derived>
5431 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5432     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5433     bool ExpectParameterPack) {
5434   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5435   TypeSourceInfo *NewDI = nullptr;
5436 
5437   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5438     // If we're substituting into a pack expansion type and we know the
5439     // length we want to expand to, just substitute for the pattern.
5440     TypeLoc OldTL = OldDI->getTypeLoc();
5441     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5442 
5443     TypeLocBuilder TLB;
5444     TypeLoc NewTL = OldDI->getTypeLoc();
5445     TLB.reserve(NewTL.getFullDataSize());
5446 
5447     QualType Result = getDerived().TransformType(TLB,
5448                                                OldExpansionTL.getPatternLoc());
5449     if (Result.isNull())
5450       return nullptr;
5451 
5452     Result = RebuildPackExpansionType(Result,
5453                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5454                                       OldExpansionTL.getEllipsisLoc(),
5455                                       NumExpansions);
5456     if (Result.isNull())
5457       return nullptr;
5458 
5459     PackExpansionTypeLoc NewExpansionTL
5460       = TLB.push<PackExpansionTypeLoc>(Result);
5461     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5462     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5463   } else
5464     NewDI = getDerived().TransformType(OldDI);
5465   if (!NewDI)
5466     return nullptr;
5467 
5468   if (NewDI == OldDI && indexAdjustment == 0)
5469     return OldParm;
5470 
5471   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5472                                              OldParm->getDeclContext(),
5473                                              OldParm->getInnerLocStart(),
5474                                              OldParm->getLocation(),
5475                                              OldParm->getIdentifier(),
5476                                              NewDI->getType(),
5477                                              NewDI,
5478                                              OldParm->getStorageClass(),
5479                                              /* DefArg */ nullptr);
5480   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5481                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5482   return newParm;
5483 }
5484 
5485 template <typename Derived>
5486 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5487     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5488     const QualType *ParamTypes,
5489     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5490     SmallVectorImpl<QualType> &OutParamTypes,
5491     SmallVectorImpl<ParmVarDecl *> *PVars,
5492     Sema::ExtParameterInfoBuilder &PInfos) {
5493   int indexAdjustment = 0;
5494 
5495   unsigned NumParams = Params.size();
5496   for (unsigned i = 0; i != NumParams; ++i) {
5497     if (ParmVarDecl *OldParm = Params[i]) {
5498       assert(OldParm->getFunctionScopeIndex() == i);
5499 
5500       Optional<unsigned> NumExpansions;
5501       ParmVarDecl *NewParm = nullptr;
5502       if (OldParm->isParameterPack()) {
5503         // We have a function parameter pack that may need to be expanded.
5504         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5505 
5506         // Find the parameter packs that could be expanded.
5507         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5508         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5509         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5510         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5511 
5512         // Determine whether we should expand the parameter packs.
5513         bool ShouldExpand = false;
5514         bool RetainExpansion = false;
5515         Optional<unsigned> OrigNumExpansions;
5516         if (Unexpanded.size() > 0) {
5517           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5518           NumExpansions = OrigNumExpansions;
5519           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5520                                                    Pattern.getSourceRange(),
5521                                                    Unexpanded,
5522                                                    ShouldExpand,
5523                                                    RetainExpansion,
5524                                                    NumExpansions)) {
5525             return true;
5526           }
5527         } else {
5528 #ifndef NDEBUG
5529           const AutoType *AT =
5530               Pattern.getType().getTypePtr()->getContainedAutoType();
5531           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5532                  "Could not find parameter packs or undeduced auto type!");
5533 #endif
5534         }
5535 
5536         if (ShouldExpand) {
5537           // Expand the function parameter pack into multiple, separate
5538           // parameters.
5539           getDerived().ExpandingFunctionParameterPack(OldParm);
5540           for (unsigned I = 0; I != *NumExpansions; ++I) {
5541             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5542             ParmVarDecl *NewParm
5543               = getDerived().TransformFunctionTypeParam(OldParm,
5544                                                         indexAdjustment++,
5545                                                         OrigNumExpansions,
5546                                                 /*ExpectParameterPack=*/false);
5547             if (!NewParm)
5548               return true;
5549 
5550             if (ParamInfos)
5551               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5552             OutParamTypes.push_back(NewParm->getType());
5553             if (PVars)
5554               PVars->push_back(NewParm);
5555           }
5556 
5557           // If we're supposed to retain a pack expansion, do so by temporarily
5558           // forgetting the partially-substituted parameter pack.
5559           if (RetainExpansion) {
5560             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5561             ParmVarDecl *NewParm
5562               = getDerived().TransformFunctionTypeParam(OldParm,
5563                                                         indexAdjustment++,
5564                                                         OrigNumExpansions,
5565                                                 /*ExpectParameterPack=*/false);
5566             if (!NewParm)
5567               return true;
5568 
5569             if (ParamInfos)
5570               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5571             OutParamTypes.push_back(NewParm->getType());
5572             if (PVars)
5573               PVars->push_back(NewParm);
5574           }
5575 
5576           // The next parameter should have the same adjustment as the
5577           // last thing we pushed, but we post-incremented indexAdjustment
5578           // on every push.  Also, if we push nothing, the adjustment should
5579           // go down by one.
5580           indexAdjustment--;
5581 
5582           // We're done with the pack expansion.
5583           continue;
5584         }
5585 
5586         // We'll substitute the parameter now without expanding the pack
5587         // expansion.
5588         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5589         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5590                                                           indexAdjustment,
5591                                                           NumExpansions,
5592                                                   /*ExpectParameterPack=*/true);
5593         assert(NewParm->isParameterPack() &&
5594                "Parameter pack no longer a parameter pack after "
5595                "transformation.");
5596       } else {
5597         NewParm = getDerived().TransformFunctionTypeParam(
5598             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5599       }
5600 
5601       if (!NewParm)
5602         return true;
5603 
5604       if (ParamInfos)
5605         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5606       OutParamTypes.push_back(NewParm->getType());
5607       if (PVars)
5608         PVars->push_back(NewParm);
5609       continue;
5610     }
5611 
5612     // Deal with the possibility that we don't have a parameter
5613     // declaration for this parameter.
5614     QualType OldType = ParamTypes[i];
5615     bool IsPackExpansion = false;
5616     Optional<unsigned> NumExpansions;
5617     QualType NewType;
5618     if (const PackExpansionType *Expansion
5619                                        = dyn_cast<PackExpansionType>(OldType)) {
5620       // We have a function parameter pack that may need to be expanded.
5621       QualType Pattern = Expansion->getPattern();
5622       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5623       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5624 
5625       // Determine whether we should expand the parameter packs.
5626       bool ShouldExpand = false;
5627       bool RetainExpansion = false;
5628       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5629                                                Unexpanded,
5630                                                ShouldExpand,
5631                                                RetainExpansion,
5632                                                NumExpansions)) {
5633         return true;
5634       }
5635 
5636       if (ShouldExpand) {
5637         // Expand the function parameter pack into multiple, separate
5638         // parameters.
5639         for (unsigned I = 0; I != *NumExpansions; ++I) {
5640           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5641           QualType NewType = getDerived().TransformType(Pattern);
5642           if (NewType.isNull())
5643             return true;
5644 
5645           if (NewType->containsUnexpandedParameterPack()) {
5646             NewType =
5647                 getSema().getASTContext().getPackExpansionType(NewType, None);
5648 
5649             if (NewType.isNull())
5650               return true;
5651           }
5652 
5653           if (ParamInfos)
5654             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5655           OutParamTypes.push_back(NewType);
5656           if (PVars)
5657             PVars->push_back(nullptr);
5658         }
5659 
5660         // We're done with the pack expansion.
5661         continue;
5662       }
5663 
5664       // If we're supposed to retain a pack expansion, do so by temporarily
5665       // forgetting the partially-substituted parameter pack.
5666       if (RetainExpansion) {
5667         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5668         QualType NewType = getDerived().TransformType(Pattern);
5669         if (NewType.isNull())
5670           return true;
5671 
5672         if (ParamInfos)
5673           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5674         OutParamTypes.push_back(NewType);
5675         if (PVars)
5676           PVars->push_back(nullptr);
5677       }
5678 
5679       // We'll substitute the parameter now without expanding the pack
5680       // expansion.
5681       OldType = Expansion->getPattern();
5682       IsPackExpansion = true;
5683       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5684       NewType = getDerived().TransformType(OldType);
5685     } else {
5686       NewType = getDerived().TransformType(OldType);
5687     }
5688 
5689     if (NewType.isNull())
5690       return true;
5691 
5692     if (IsPackExpansion)
5693       NewType = getSema().Context.getPackExpansionType(NewType,
5694                                                        NumExpansions);
5695 
5696     if (ParamInfos)
5697       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5698     OutParamTypes.push_back(NewType);
5699     if (PVars)
5700       PVars->push_back(nullptr);
5701   }
5702 
5703 #ifndef NDEBUG
5704   if (PVars) {
5705     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5706       if (ParmVarDecl *parm = (*PVars)[i])
5707         assert(parm->getFunctionScopeIndex() == i);
5708   }
5709 #endif
5710 
5711   return false;
5712 }
5713 
5714 template<typename Derived>
5715 QualType
5716 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5717                                                    FunctionProtoTypeLoc TL) {
5718   SmallVector<QualType, 4> ExceptionStorage;
5719   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5720   return getDerived().TransformFunctionProtoType(
5721       TLB, TL, nullptr, Qualifiers(),
5722       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5723         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5724                                             ExceptionStorage, Changed);
5725       });
5726 }
5727 
5728 template<typename Derived> template<typename Fn>
5729 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5730     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5731     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5732 
5733   // Transform the parameters and return type.
5734   //
5735   // We are required to instantiate the params and return type in source order.
5736   // When the function has a trailing return type, we instantiate the
5737   // parameters before the return type,  since the return type can then refer
5738   // to the parameters themselves (via decltype, sizeof, etc.).
5739   //
5740   SmallVector<QualType, 4> ParamTypes;
5741   SmallVector<ParmVarDecl*, 4> ParamDecls;
5742   Sema::ExtParameterInfoBuilder ExtParamInfos;
5743   const FunctionProtoType *T = TL.getTypePtr();
5744 
5745   QualType ResultType;
5746 
5747   if (T->hasTrailingReturn()) {
5748     if (getDerived().TransformFunctionTypeParams(
5749             TL.getBeginLoc(), TL.getParams(),
5750             TL.getTypePtr()->param_type_begin(),
5751             T->getExtParameterInfosOrNull(),
5752             ParamTypes, &ParamDecls, ExtParamInfos))
5753       return QualType();
5754 
5755     {
5756       // C++11 [expr.prim.general]p3:
5757       //   If a declaration declares a member function or member function
5758       //   template of a class X, the expression this is a prvalue of type
5759       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5760       //   and the end of the function-definition, member-declarator, or
5761       //   declarator.
5762       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5763 
5764       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5765       if (ResultType.isNull())
5766         return QualType();
5767     }
5768   }
5769   else {
5770     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5771     if (ResultType.isNull())
5772       return QualType();
5773 
5774     if (getDerived().TransformFunctionTypeParams(
5775             TL.getBeginLoc(), TL.getParams(),
5776             TL.getTypePtr()->param_type_begin(),
5777             T->getExtParameterInfosOrNull(),
5778             ParamTypes, &ParamDecls, ExtParamInfos))
5779       return QualType();
5780   }
5781 
5782   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5783 
5784   bool EPIChanged = false;
5785   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5786     return QualType();
5787 
5788   // Handle extended parameter information.
5789   if (auto NewExtParamInfos =
5790         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5791     if (!EPI.ExtParameterInfos ||
5792         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5793           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5794       EPIChanged = true;
5795     }
5796     EPI.ExtParameterInfos = NewExtParamInfos;
5797   } else if (EPI.ExtParameterInfos) {
5798     EPIChanged = true;
5799     EPI.ExtParameterInfos = nullptr;
5800   }
5801 
5802   QualType Result = TL.getType();
5803   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5804       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5805     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5806     if (Result.isNull())
5807       return QualType();
5808   }
5809 
5810   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5811   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5812   NewTL.setLParenLoc(TL.getLParenLoc());
5813   NewTL.setRParenLoc(TL.getRParenLoc());
5814   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5815   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5816   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5817     NewTL.setParam(i, ParamDecls[i]);
5818 
5819   return Result;
5820 }
5821 
5822 template<typename Derived>
5823 bool TreeTransform<Derived>::TransformExceptionSpec(
5824     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5825     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5826   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5827 
5828   // Instantiate a dynamic noexcept expression, if any.
5829   if (isComputedNoexcept(ESI.Type)) {
5830     EnterExpressionEvaluationContext Unevaluated(
5831         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5832     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5833     if (NoexceptExpr.isInvalid())
5834       return true;
5835 
5836     ExceptionSpecificationType EST = ESI.Type;
5837     NoexceptExpr =
5838         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5839     if (NoexceptExpr.isInvalid())
5840       return true;
5841 
5842     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5843       Changed = true;
5844     ESI.NoexceptExpr = NoexceptExpr.get();
5845     ESI.Type = EST;
5846   }
5847 
5848   if (ESI.Type != EST_Dynamic)
5849     return false;
5850 
5851   // Instantiate a dynamic exception specification's type.
5852   for (QualType T : ESI.Exceptions) {
5853     if (const PackExpansionType *PackExpansion =
5854             T->getAs<PackExpansionType>()) {
5855       Changed = true;
5856 
5857       // We have a pack expansion. Instantiate it.
5858       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5859       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5860                                               Unexpanded);
5861       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5862 
5863       // Determine whether the set of unexpanded parameter packs can and
5864       // should
5865       // be expanded.
5866       bool Expand = false;
5867       bool RetainExpansion = false;
5868       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5869       // FIXME: Track the location of the ellipsis (and track source location
5870       // information for the types in the exception specification in general).
5871       if (getDerived().TryExpandParameterPacks(
5872               Loc, SourceRange(), Unexpanded, Expand,
5873               RetainExpansion, NumExpansions))
5874         return true;
5875 
5876       if (!Expand) {
5877         // We can't expand this pack expansion into separate arguments yet;
5878         // just substitute into the pattern and create a new pack expansion
5879         // type.
5880         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5881         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5882         if (U.isNull())
5883           return true;
5884 
5885         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5886         Exceptions.push_back(U);
5887         continue;
5888       }
5889 
5890       // Substitute into the pack expansion pattern for each slice of the
5891       // pack.
5892       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5893         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5894 
5895         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5896         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5897           return true;
5898 
5899         Exceptions.push_back(U);
5900       }
5901     } else {
5902       QualType U = getDerived().TransformType(T);
5903       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5904         return true;
5905       if (T != U)
5906         Changed = true;
5907 
5908       Exceptions.push_back(U);
5909     }
5910   }
5911 
5912   ESI.Exceptions = Exceptions;
5913   if (ESI.Exceptions.empty())
5914     ESI.Type = EST_DynamicNone;
5915   return false;
5916 }
5917 
5918 template<typename Derived>
5919 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5920                                                  TypeLocBuilder &TLB,
5921                                                  FunctionNoProtoTypeLoc TL) {
5922   const FunctionNoProtoType *T = TL.getTypePtr();
5923   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5924   if (ResultType.isNull())
5925     return QualType();
5926 
5927   QualType Result = TL.getType();
5928   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5929     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5930 
5931   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5932   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5933   NewTL.setLParenLoc(TL.getLParenLoc());
5934   NewTL.setRParenLoc(TL.getRParenLoc());
5935   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5936 
5937   return Result;
5938 }
5939 
5940 template<typename Derived> QualType
5941 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5942                                                  UnresolvedUsingTypeLoc TL) {
5943   const UnresolvedUsingType *T = TL.getTypePtr();
5944   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5945   if (!D)
5946     return QualType();
5947 
5948   QualType Result = TL.getType();
5949   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5950     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5951     if (Result.isNull())
5952       return QualType();
5953   }
5954 
5955   // We might get an arbitrary type spec type back.  We should at
5956   // least always get a type spec type, though.
5957   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5958   NewTL.setNameLoc(TL.getNameLoc());
5959 
5960   return Result;
5961 }
5962 
5963 template<typename Derived>
5964 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5965                                                       TypedefTypeLoc TL) {
5966   const TypedefType *T = TL.getTypePtr();
5967   TypedefNameDecl *Typedef
5968     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5969                                                                T->getDecl()));
5970   if (!Typedef)
5971     return QualType();
5972 
5973   QualType Result = TL.getType();
5974   if (getDerived().AlwaysRebuild() ||
5975       Typedef != T->getDecl()) {
5976     Result = getDerived().RebuildTypedefType(Typedef);
5977     if (Result.isNull())
5978       return QualType();
5979   }
5980 
5981   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5982   NewTL.setNameLoc(TL.getNameLoc());
5983 
5984   return Result;
5985 }
5986 
5987 template<typename Derived>
5988 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5989                                                       TypeOfExprTypeLoc TL) {
5990   // typeof expressions are not potentially evaluated contexts
5991   EnterExpressionEvaluationContext Unevaluated(
5992       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5993       Sema::ReuseLambdaContextDecl);
5994 
5995   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5996   if (E.isInvalid())
5997     return QualType();
5998 
5999   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6000   if (E.isInvalid())
6001     return QualType();
6002 
6003   QualType Result = TL.getType();
6004   if (getDerived().AlwaysRebuild() ||
6005       E.get() != TL.getUnderlyingExpr()) {
6006     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6007     if (Result.isNull())
6008       return QualType();
6009   }
6010   else E.get();
6011 
6012   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6013   NewTL.setTypeofLoc(TL.getTypeofLoc());
6014   NewTL.setLParenLoc(TL.getLParenLoc());
6015   NewTL.setRParenLoc(TL.getRParenLoc());
6016 
6017   return Result;
6018 }
6019 
6020 template<typename Derived>
6021 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6022                                                      TypeOfTypeLoc TL) {
6023   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6024   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6025   if (!New_Under_TI)
6026     return QualType();
6027 
6028   QualType Result = TL.getType();
6029   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6030     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6031     if (Result.isNull())
6032       return QualType();
6033   }
6034 
6035   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6036   NewTL.setTypeofLoc(TL.getTypeofLoc());
6037   NewTL.setLParenLoc(TL.getLParenLoc());
6038   NewTL.setRParenLoc(TL.getRParenLoc());
6039   NewTL.setUnderlyingTInfo(New_Under_TI);
6040 
6041   return Result;
6042 }
6043 
6044 template<typename Derived>
6045 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6046                                                        DecltypeTypeLoc TL) {
6047   const DecltypeType *T = TL.getTypePtr();
6048 
6049   // decltype expressions are not potentially evaluated contexts
6050   EnterExpressionEvaluationContext Unevaluated(
6051       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6052       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6053 
6054   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6055   if (E.isInvalid())
6056     return QualType();
6057 
6058   E = getSema().ActOnDecltypeExpression(E.get());
6059   if (E.isInvalid())
6060     return QualType();
6061 
6062   QualType Result = TL.getType();
6063   if (getDerived().AlwaysRebuild() ||
6064       E.get() != T->getUnderlyingExpr()) {
6065     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6066     if (Result.isNull())
6067       return QualType();
6068   }
6069   else E.get();
6070 
6071   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6072   NewTL.setNameLoc(TL.getNameLoc());
6073 
6074   return Result;
6075 }
6076 
6077 template<typename Derived>
6078 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6079                                                             TypeLocBuilder &TLB,
6080                                                      UnaryTransformTypeLoc TL) {
6081   QualType Result = TL.getType();
6082   if (Result->isDependentType()) {
6083     const UnaryTransformType *T = TL.getTypePtr();
6084     QualType NewBase =
6085       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6086     Result = getDerived().RebuildUnaryTransformType(NewBase,
6087                                                     T->getUTTKind(),
6088                                                     TL.getKWLoc());
6089     if (Result.isNull())
6090       return QualType();
6091   }
6092 
6093   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6094   NewTL.setKWLoc(TL.getKWLoc());
6095   NewTL.setParensRange(TL.getParensRange());
6096   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6097   return Result;
6098 }
6099 
6100 template<typename Derived>
6101 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6102     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6103   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6104 
6105   CXXScopeSpec SS;
6106   TemplateName TemplateName = getDerived().TransformTemplateName(
6107       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6108   if (TemplateName.isNull())
6109     return QualType();
6110 
6111   QualType OldDeduced = T->getDeducedType();
6112   QualType NewDeduced;
6113   if (!OldDeduced.isNull()) {
6114     NewDeduced = getDerived().TransformType(OldDeduced);
6115     if (NewDeduced.isNull())
6116       return QualType();
6117   }
6118 
6119   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6120       TemplateName, NewDeduced);
6121   if (Result.isNull())
6122     return QualType();
6123 
6124   DeducedTemplateSpecializationTypeLoc NewTL =
6125       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6126   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6127 
6128   return Result;
6129 }
6130 
6131 template<typename Derived>
6132 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6133                                                      RecordTypeLoc TL) {
6134   const RecordType *T = TL.getTypePtr();
6135   RecordDecl *Record
6136     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6137                                                           T->getDecl()));
6138   if (!Record)
6139     return QualType();
6140 
6141   QualType Result = TL.getType();
6142   if (getDerived().AlwaysRebuild() ||
6143       Record != T->getDecl()) {
6144     Result = getDerived().RebuildRecordType(Record);
6145     if (Result.isNull())
6146       return QualType();
6147   }
6148 
6149   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6150   NewTL.setNameLoc(TL.getNameLoc());
6151 
6152   return Result;
6153 }
6154 
6155 template<typename Derived>
6156 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6157                                                    EnumTypeLoc TL) {
6158   const EnumType *T = TL.getTypePtr();
6159   EnumDecl *Enum
6160     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6161                                                         T->getDecl()));
6162   if (!Enum)
6163     return QualType();
6164 
6165   QualType Result = TL.getType();
6166   if (getDerived().AlwaysRebuild() ||
6167       Enum != T->getDecl()) {
6168     Result = getDerived().RebuildEnumType(Enum);
6169     if (Result.isNull())
6170       return QualType();
6171   }
6172 
6173   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6174   NewTL.setNameLoc(TL.getNameLoc());
6175 
6176   return Result;
6177 }
6178 
6179 template<typename Derived>
6180 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6181                                          TypeLocBuilder &TLB,
6182                                          InjectedClassNameTypeLoc TL) {
6183   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6184                                        TL.getTypePtr()->getDecl());
6185   if (!D) return QualType();
6186 
6187   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6188   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6189   return T;
6190 }
6191 
6192 template<typename Derived>
6193 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6194                                                 TypeLocBuilder &TLB,
6195                                                 TemplateTypeParmTypeLoc TL) {
6196   return TransformTypeSpecType(TLB, TL);
6197 }
6198 
6199 template<typename Derived>
6200 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6201                                          TypeLocBuilder &TLB,
6202                                          SubstTemplateTypeParmTypeLoc TL) {
6203   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6204 
6205   // Substitute into the replacement type, which itself might involve something
6206   // that needs to be transformed. This only tends to occur with default
6207   // template arguments of template template parameters.
6208   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6209   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6210   if (Replacement.isNull())
6211     return QualType();
6212 
6213   // Always canonicalize the replacement type.
6214   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6215   QualType Result
6216     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6217                                                    Replacement);
6218 
6219   // Propagate type-source information.
6220   SubstTemplateTypeParmTypeLoc NewTL
6221     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6222   NewTL.setNameLoc(TL.getNameLoc());
6223   return Result;
6224 
6225 }
6226 
6227 template<typename Derived>
6228 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6229                                           TypeLocBuilder &TLB,
6230                                           SubstTemplateTypeParmPackTypeLoc TL) {
6231   return TransformTypeSpecType(TLB, TL);
6232 }
6233 
6234 template<typename Derived>
6235 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6236                                                         TypeLocBuilder &TLB,
6237                                            TemplateSpecializationTypeLoc TL) {
6238   const TemplateSpecializationType *T = TL.getTypePtr();
6239 
6240   // The nested-name-specifier never matters in a TemplateSpecializationType,
6241   // because we can't have a dependent nested-name-specifier anyway.
6242   CXXScopeSpec SS;
6243   TemplateName Template
6244     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6245                                          TL.getTemplateNameLoc());
6246   if (Template.isNull())
6247     return QualType();
6248 
6249   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6250 }
6251 
6252 template<typename Derived>
6253 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6254                                                      AtomicTypeLoc TL) {
6255   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6256   if (ValueType.isNull())
6257     return QualType();
6258 
6259   QualType Result = TL.getType();
6260   if (getDerived().AlwaysRebuild() ||
6261       ValueType != TL.getValueLoc().getType()) {
6262     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6263     if (Result.isNull())
6264       return QualType();
6265   }
6266 
6267   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6268   NewTL.setKWLoc(TL.getKWLoc());
6269   NewTL.setLParenLoc(TL.getLParenLoc());
6270   NewTL.setRParenLoc(TL.getRParenLoc());
6271 
6272   return Result;
6273 }
6274 
6275 template <typename Derived>
6276 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6277                                                    PipeTypeLoc TL) {
6278   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6279   if (ValueType.isNull())
6280     return QualType();
6281 
6282   QualType Result = TL.getType();
6283   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6284     const PipeType *PT = Result->castAs<PipeType>();
6285     bool isReadPipe = PT->isReadOnly();
6286     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6287     if (Result.isNull())
6288       return QualType();
6289   }
6290 
6291   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6292   NewTL.setKWLoc(TL.getKWLoc());
6293 
6294   return Result;
6295 }
6296 
6297 template <typename Derived>
6298 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6299                                                      ExtIntTypeLoc TL) {
6300   const ExtIntType *EIT = TL.getTypePtr();
6301   QualType Result = TL.getType();
6302 
6303   if (getDerived().AlwaysRebuild()) {
6304     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6305                                             EIT->getNumBits(), TL.getNameLoc());
6306     if (Result.isNull())
6307       return QualType();
6308   }
6309 
6310   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6311   NewTL.setNameLoc(TL.getNameLoc());
6312   return Result;
6313 }
6314 
6315 template <typename Derived>
6316 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6317     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6318   const DependentExtIntType *EIT = TL.getTypePtr();
6319 
6320   EnterExpressionEvaluationContext Unevaluated(
6321       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6322   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6323   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6324 
6325   if (BitsExpr.isInvalid())
6326     return QualType();
6327 
6328   QualType Result = TL.getType();
6329 
6330   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6331     Result = getDerived().RebuildDependentExtIntType(
6332         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6333 
6334     if (Result.isNull())
6335       return QualType();
6336   }
6337 
6338   if (isa<DependentExtIntType>(Result)) {
6339     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6340     NewTL.setNameLoc(TL.getNameLoc());
6341   } else {
6342     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6343     NewTL.setNameLoc(TL.getNameLoc());
6344   }
6345   return Result;
6346 }
6347 
6348   /// Simple iterator that traverses the template arguments in a
6349   /// container that provides a \c getArgLoc() member function.
6350   ///
6351   /// This iterator is intended to be used with the iterator form of
6352   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6353   template<typename ArgLocContainer>
6354   class TemplateArgumentLocContainerIterator {
6355     ArgLocContainer *Container;
6356     unsigned Index;
6357 
6358   public:
6359     typedef TemplateArgumentLoc value_type;
6360     typedef TemplateArgumentLoc reference;
6361     typedef int difference_type;
6362     typedef std::input_iterator_tag iterator_category;
6363 
6364     class pointer {
6365       TemplateArgumentLoc Arg;
6366 
6367     public:
6368       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6369 
6370       const TemplateArgumentLoc *operator->() const {
6371         return &Arg;
6372       }
6373     };
6374 
6375 
6376     TemplateArgumentLocContainerIterator() {}
6377 
6378     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6379                                  unsigned Index)
6380       : Container(&Container), Index(Index) { }
6381 
6382     TemplateArgumentLocContainerIterator &operator++() {
6383       ++Index;
6384       return *this;
6385     }
6386 
6387     TemplateArgumentLocContainerIterator operator++(int) {
6388       TemplateArgumentLocContainerIterator Old(*this);
6389       ++(*this);
6390       return Old;
6391     }
6392 
6393     TemplateArgumentLoc operator*() const {
6394       return Container->getArgLoc(Index);
6395     }
6396 
6397     pointer operator->() const {
6398       return pointer(Container->getArgLoc(Index));
6399     }
6400 
6401     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6402                            const TemplateArgumentLocContainerIterator &Y) {
6403       return X.Container == Y.Container && X.Index == Y.Index;
6404     }
6405 
6406     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6407                            const TemplateArgumentLocContainerIterator &Y) {
6408       return !(X == Y);
6409     }
6410   };
6411 
6412 template<typename Derived>
6413 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6414                                                    AutoTypeLoc TL) {
6415   const AutoType *T = TL.getTypePtr();
6416   QualType OldDeduced = T->getDeducedType();
6417   QualType NewDeduced;
6418   if (!OldDeduced.isNull()) {
6419     NewDeduced = getDerived().TransformType(OldDeduced);
6420     if (NewDeduced.isNull())
6421       return QualType();
6422   }
6423 
6424   ConceptDecl *NewCD = nullptr;
6425   TemplateArgumentListInfo NewTemplateArgs;
6426   NestedNameSpecifierLoc NewNestedNameSpec;
6427   if (TL.getTypePtr()->isConstrained()) {
6428     NewCD = cast_or_null<ConceptDecl>(
6429         getDerived().TransformDecl(
6430             TL.getConceptNameLoc(),
6431             TL.getTypePtr()->getTypeConstraintConcept()));
6432 
6433     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6434     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6435     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6436     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6437                                                 ArgIterator(TL,
6438                                                             TL.getNumArgs()),
6439                                                 NewTemplateArgs))
6440       return QualType();
6441 
6442     if (TL.getNestedNameSpecifierLoc()) {
6443       NewNestedNameSpec
6444         = getDerived().TransformNestedNameSpecifierLoc(
6445             TL.getNestedNameSpecifierLoc());
6446       if (!NewNestedNameSpec)
6447         return QualType();
6448     }
6449   }
6450 
6451   QualType Result = TL.getType();
6452   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6453       T->isDependentType()) {
6454     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6455     NewArgList.reserve(NewArgList.size());
6456     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6457       NewArgList.push_back(ArgLoc.getArgument());
6458     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6459                                           NewArgList);
6460     if (Result.isNull())
6461       return QualType();
6462   }
6463 
6464   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6465   NewTL.setNameLoc(TL.getNameLoc());
6466   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6467   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6468   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6469   NewTL.setFoundDecl(TL.getFoundDecl());
6470   NewTL.setLAngleLoc(TL.getLAngleLoc());
6471   NewTL.setRAngleLoc(TL.getRAngleLoc());
6472   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6473     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6474 
6475   return Result;
6476 }
6477 
6478 template <typename Derived>
6479 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6480                                                         TypeLocBuilder &TLB,
6481                                            TemplateSpecializationTypeLoc TL,
6482                                                       TemplateName Template) {
6483   TemplateArgumentListInfo NewTemplateArgs;
6484   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6485   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6486   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6487     ArgIterator;
6488   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6489                                               ArgIterator(TL, TL.getNumArgs()),
6490                                               NewTemplateArgs))
6491     return QualType();
6492 
6493   // FIXME: maybe don't rebuild if all the template arguments are the same.
6494 
6495   QualType Result =
6496     getDerived().RebuildTemplateSpecializationType(Template,
6497                                                    TL.getTemplateNameLoc(),
6498                                                    NewTemplateArgs);
6499 
6500   if (!Result.isNull()) {
6501     // Specializations of template template parameters are represented as
6502     // TemplateSpecializationTypes, and substitution of type alias templates
6503     // within a dependent context can transform them into
6504     // DependentTemplateSpecializationTypes.
6505     if (isa<DependentTemplateSpecializationType>(Result)) {
6506       DependentTemplateSpecializationTypeLoc NewTL
6507         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6508       NewTL.setElaboratedKeywordLoc(SourceLocation());
6509       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6510       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6511       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6512       NewTL.setLAngleLoc(TL.getLAngleLoc());
6513       NewTL.setRAngleLoc(TL.getRAngleLoc());
6514       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6515         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6516       return Result;
6517     }
6518 
6519     TemplateSpecializationTypeLoc NewTL
6520       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6521     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6522     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6523     NewTL.setLAngleLoc(TL.getLAngleLoc());
6524     NewTL.setRAngleLoc(TL.getRAngleLoc());
6525     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6526       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6527   }
6528 
6529   return Result;
6530 }
6531 
6532 template <typename Derived>
6533 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6534                                      TypeLocBuilder &TLB,
6535                                      DependentTemplateSpecializationTypeLoc TL,
6536                                      TemplateName Template,
6537                                      CXXScopeSpec &SS) {
6538   TemplateArgumentListInfo NewTemplateArgs;
6539   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6540   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6541   typedef TemplateArgumentLocContainerIterator<
6542             DependentTemplateSpecializationTypeLoc> ArgIterator;
6543   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6544                                               ArgIterator(TL, TL.getNumArgs()),
6545                                               NewTemplateArgs))
6546     return QualType();
6547 
6548   // FIXME: maybe don't rebuild if all the template arguments are the same.
6549 
6550   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6551     QualType Result
6552       = getSema().Context.getDependentTemplateSpecializationType(
6553                                                 TL.getTypePtr()->getKeyword(),
6554                                                          DTN->getQualifier(),
6555                                                          DTN->getIdentifier(),
6556                                                                NewTemplateArgs);
6557 
6558     DependentTemplateSpecializationTypeLoc NewTL
6559       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6560     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6561     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6562     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6563     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6564     NewTL.setLAngleLoc(TL.getLAngleLoc());
6565     NewTL.setRAngleLoc(TL.getRAngleLoc());
6566     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6567       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6568     return Result;
6569   }
6570 
6571   QualType Result
6572     = getDerived().RebuildTemplateSpecializationType(Template,
6573                                                      TL.getTemplateNameLoc(),
6574                                                      NewTemplateArgs);
6575 
6576   if (!Result.isNull()) {
6577     /// FIXME: Wrap this in an elaborated-type-specifier?
6578     TemplateSpecializationTypeLoc NewTL
6579       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6580     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6581     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6582     NewTL.setLAngleLoc(TL.getLAngleLoc());
6583     NewTL.setRAngleLoc(TL.getRAngleLoc());
6584     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6585       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6586   }
6587 
6588   return Result;
6589 }
6590 
6591 template<typename Derived>
6592 QualType
6593 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6594                                                 ElaboratedTypeLoc TL) {
6595   const ElaboratedType *T = TL.getTypePtr();
6596 
6597   NestedNameSpecifierLoc QualifierLoc;
6598   // NOTE: the qualifier in an ElaboratedType is optional.
6599   if (TL.getQualifierLoc()) {
6600     QualifierLoc
6601       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6602     if (!QualifierLoc)
6603       return QualType();
6604   }
6605 
6606   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6607   if (NamedT.isNull())
6608     return QualType();
6609 
6610   // C++0x [dcl.type.elab]p2:
6611   //   If the identifier resolves to a typedef-name or the simple-template-id
6612   //   resolves to an alias template specialization, the
6613   //   elaborated-type-specifier is ill-formed.
6614   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6615     if (const TemplateSpecializationType *TST =
6616           NamedT->getAs<TemplateSpecializationType>()) {
6617       TemplateName Template = TST->getTemplateName();
6618       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6619               Template.getAsTemplateDecl())) {
6620         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6621                      diag::err_tag_reference_non_tag)
6622             << TAT << Sema::NTK_TypeAliasTemplate
6623             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6624         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6625       }
6626     }
6627   }
6628 
6629   QualType Result = TL.getType();
6630   if (getDerived().AlwaysRebuild() ||
6631       QualifierLoc != TL.getQualifierLoc() ||
6632       NamedT != T->getNamedType()) {
6633     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6634                                                 T->getKeyword(),
6635                                                 QualifierLoc, NamedT);
6636     if (Result.isNull())
6637       return QualType();
6638   }
6639 
6640   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6641   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6642   NewTL.setQualifierLoc(QualifierLoc);
6643   return Result;
6644 }
6645 
6646 template<typename Derived>
6647 QualType TreeTransform<Derived>::TransformAttributedType(
6648                                                 TypeLocBuilder &TLB,
6649                                                 AttributedTypeLoc TL) {
6650   const AttributedType *oldType = TL.getTypePtr();
6651   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6652   if (modifiedType.isNull())
6653     return QualType();
6654 
6655   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6656   const Attr *oldAttr = TL.getAttr();
6657   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6658   if (oldAttr && !newAttr)
6659     return QualType();
6660 
6661   QualType result = TL.getType();
6662 
6663   // FIXME: dependent operand expressions?
6664   if (getDerived().AlwaysRebuild() ||
6665       modifiedType != oldType->getModifiedType()) {
6666     // TODO: this is really lame; we should really be rebuilding the
6667     // equivalent type from first principles.
6668     QualType equivalentType
6669       = getDerived().TransformType(oldType->getEquivalentType());
6670     if (equivalentType.isNull())
6671       return QualType();
6672 
6673     // Check whether we can add nullability; it is only represented as
6674     // type sugar, and therefore cannot be diagnosed in any other way.
6675     if (auto nullability = oldType->getImmediateNullability()) {
6676       if (!modifiedType->canHaveNullability()) {
6677         SemaRef.Diag(TL.getAttr()->getLocation(),
6678                      diag::err_nullability_nonpointer)
6679             << DiagNullabilityKind(*nullability, false) << modifiedType;
6680         return QualType();
6681       }
6682     }
6683 
6684     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6685                                                modifiedType,
6686                                                equivalentType);
6687   }
6688 
6689   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6690   newTL.setAttr(newAttr);
6691   return result;
6692 }
6693 
6694 template<typename Derived>
6695 QualType
6696 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6697                                            ParenTypeLoc TL) {
6698   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6699   if (Inner.isNull())
6700     return QualType();
6701 
6702   QualType Result = TL.getType();
6703   if (getDerived().AlwaysRebuild() ||
6704       Inner != TL.getInnerLoc().getType()) {
6705     Result = getDerived().RebuildParenType(Inner);
6706     if (Result.isNull())
6707       return QualType();
6708   }
6709 
6710   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6711   NewTL.setLParenLoc(TL.getLParenLoc());
6712   NewTL.setRParenLoc(TL.getRParenLoc());
6713   return Result;
6714 }
6715 
6716 template <typename Derived>
6717 QualType
6718 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6719                                                     MacroQualifiedTypeLoc TL) {
6720   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6721   if (Inner.isNull())
6722     return QualType();
6723 
6724   QualType Result = TL.getType();
6725   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6726     Result =
6727         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6728     if (Result.isNull())
6729       return QualType();
6730   }
6731 
6732   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6733   NewTL.setExpansionLoc(TL.getExpansionLoc());
6734   return Result;
6735 }
6736 
6737 template<typename Derived>
6738 QualType TreeTransform<Derived>::TransformDependentNameType(
6739     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6740   return TransformDependentNameType(TLB, TL, false);
6741 }
6742 
6743 template<typename Derived>
6744 QualType TreeTransform<Derived>::TransformDependentNameType(
6745     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6746   const DependentNameType *T = TL.getTypePtr();
6747 
6748   NestedNameSpecifierLoc QualifierLoc
6749     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6750   if (!QualifierLoc)
6751     return QualType();
6752 
6753   QualType Result
6754     = getDerived().RebuildDependentNameType(T->getKeyword(),
6755                                             TL.getElaboratedKeywordLoc(),
6756                                             QualifierLoc,
6757                                             T->getIdentifier(),
6758                                             TL.getNameLoc(),
6759                                             DeducedTSTContext);
6760   if (Result.isNull())
6761     return QualType();
6762 
6763   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6764     QualType NamedT = ElabT->getNamedType();
6765     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6766 
6767     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6768     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6769     NewTL.setQualifierLoc(QualifierLoc);
6770   } else {
6771     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6772     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6773     NewTL.setQualifierLoc(QualifierLoc);
6774     NewTL.setNameLoc(TL.getNameLoc());
6775   }
6776   return Result;
6777 }
6778 
6779 template<typename Derived>
6780 QualType TreeTransform<Derived>::
6781           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6782                                  DependentTemplateSpecializationTypeLoc TL) {
6783   NestedNameSpecifierLoc QualifierLoc;
6784   if (TL.getQualifierLoc()) {
6785     QualifierLoc
6786       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6787     if (!QualifierLoc)
6788       return QualType();
6789   }
6790 
6791   return getDerived()
6792            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6793 }
6794 
6795 template<typename Derived>
6796 QualType TreeTransform<Derived>::
6797 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6798                                    DependentTemplateSpecializationTypeLoc TL,
6799                                        NestedNameSpecifierLoc QualifierLoc) {
6800   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6801 
6802   TemplateArgumentListInfo NewTemplateArgs;
6803   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6804   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6805 
6806   typedef TemplateArgumentLocContainerIterator<
6807   DependentTemplateSpecializationTypeLoc> ArgIterator;
6808   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6809                                               ArgIterator(TL, TL.getNumArgs()),
6810                                               NewTemplateArgs))
6811     return QualType();
6812 
6813   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6814       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6815       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6816       /*AllowInjectedClassName*/ false);
6817   if (Result.isNull())
6818     return QualType();
6819 
6820   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6821     QualType NamedT = ElabT->getNamedType();
6822 
6823     // Copy information relevant to the template specialization.
6824     TemplateSpecializationTypeLoc NamedTL
6825       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6826     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6827     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6828     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6829     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6830     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6831       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6832 
6833     // Copy information relevant to the elaborated type.
6834     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6835     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6836     NewTL.setQualifierLoc(QualifierLoc);
6837   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6838     DependentTemplateSpecializationTypeLoc SpecTL
6839       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6840     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6841     SpecTL.setQualifierLoc(QualifierLoc);
6842     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6843     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6844     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6845     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6846     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6847       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6848   } else {
6849     TemplateSpecializationTypeLoc SpecTL
6850       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6851     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6852     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6853     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6854     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6855     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6856       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6857   }
6858   return Result;
6859 }
6860 
6861 template<typename Derived>
6862 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6863                                                       PackExpansionTypeLoc TL) {
6864   QualType Pattern
6865     = getDerived().TransformType(TLB, TL.getPatternLoc());
6866   if (Pattern.isNull())
6867     return QualType();
6868 
6869   QualType Result = TL.getType();
6870   if (getDerived().AlwaysRebuild() ||
6871       Pattern != TL.getPatternLoc().getType()) {
6872     Result = getDerived().RebuildPackExpansionType(Pattern,
6873                                            TL.getPatternLoc().getSourceRange(),
6874                                                    TL.getEllipsisLoc(),
6875                                            TL.getTypePtr()->getNumExpansions());
6876     if (Result.isNull())
6877       return QualType();
6878   }
6879 
6880   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6881   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6882   return Result;
6883 }
6884 
6885 template<typename Derived>
6886 QualType
6887 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6888                                                    ObjCInterfaceTypeLoc TL) {
6889   // ObjCInterfaceType is never dependent.
6890   TLB.pushFullCopy(TL);
6891   return TL.getType();
6892 }
6893 
6894 template<typename Derived>
6895 QualType
6896 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6897                                                    ObjCTypeParamTypeLoc TL) {
6898   const ObjCTypeParamType *T = TL.getTypePtr();
6899   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6900       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6901   if (!OTP)
6902     return QualType();
6903 
6904   QualType Result = TL.getType();
6905   if (getDerived().AlwaysRebuild() ||
6906       OTP != T->getDecl()) {
6907     Result = getDerived().RebuildObjCTypeParamType(OTP,
6908                  TL.getProtocolLAngleLoc(),
6909                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6910                                     TL.getNumProtocols()),
6911                  TL.getProtocolLocs(),
6912                  TL.getProtocolRAngleLoc());
6913     if (Result.isNull())
6914       return QualType();
6915   }
6916 
6917   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6918   if (TL.getNumProtocols()) {
6919     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6920     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6921       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6922     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6923   }
6924   return Result;
6925 }
6926 
6927 template<typename Derived>
6928 QualType
6929 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6930                                                 ObjCObjectTypeLoc TL) {
6931   // Transform base type.
6932   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6933   if (BaseType.isNull())
6934     return QualType();
6935 
6936   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6937 
6938   // Transform type arguments.
6939   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6940   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6941     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6942     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6943     QualType TypeArg = TypeArgInfo->getType();
6944     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6945       AnyChanged = true;
6946 
6947       // We have a pack expansion. Instantiate it.
6948       const auto *PackExpansion = PackExpansionLoc.getType()
6949                                     ->castAs<PackExpansionType>();
6950       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6951       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6952                                               Unexpanded);
6953       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6954 
6955       // Determine whether the set of unexpanded parameter packs can
6956       // and should be expanded.
6957       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6958       bool Expand = false;
6959       bool RetainExpansion = false;
6960       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6961       if (getDerived().TryExpandParameterPacks(
6962             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6963             Unexpanded, Expand, RetainExpansion, NumExpansions))
6964         return QualType();
6965 
6966       if (!Expand) {
6967         // We can't expand this pack expansion into separate arguments yet;
6968         // just substitute into the pattern and create a new pack expansion
6969         // type.
6970         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6971 
6972         TypeLocBuilder TypeArgBuilder;
6973         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6974         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6975                                                              PatternLoc);
6976         if (NewPatternType.isNull())
6977           return QualType();
6978 
6979         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6980                                       NewPatternType, NumExpansions);
6981         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6982         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6983         NewTypeArgInfos.push_back(
6984           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6985         continue;
6986       }
6987 
6988       // Substitute into the pack expansion pattern for each slice of the
6989       // pack.
6990       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6991         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6992 
6993         TypeLocBuilder TypeArgBuilder;
6994         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6995 
6996         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6997                                                          PatternLoc);
6998         if (NewTypeArg.isNull())
6999           return QualType();
7000 
7001         NewTypeArgInfos.push_back(
7002           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7003       }
7004 
7005       continue;
7006     }
7007 
7008     TypeLocBuilder TypeArgBuilder;
7009     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7010     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7011     if (NewTypeArg.isNull())
7012       return QualType();
7013 
7014     // If nothing changed, just keep the old TypeSourceInfo.
7015     if (NewTypeArg == TypeArg) {
7016       NewTypeArgInfos.push_back(TypeArgInfo);
7017       continue;
7018     }
7019 
7020     NewTypeArgInfos.push_back(
7021       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7022     AnyChanged = true;
7023   }
7024 
7025   QualType Result = TL.getType();
7026   if (getDerived().AlwaysRebuild() || AnyChanged) {
7027     // Rebuild the type.
7028     Result = getDerived().RebuildObjCObjectType(
7029         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7030         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7031         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7032         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7033 
7034     if (Result.isNull())
7035       return QualType();
7036   }
7037 
7038   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7039   NewT.setHasBaseTypeAsWritten(true);
7040   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7041   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7042     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7043   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7044   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7045   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7046     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7047   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7048   return Result;
7049 }
7050 
7051 template<typename Derived>
7052 QualType
7053 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7054                                                ObjCObjectPointerTypeLoc TL) {
7055   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7056   if (PointeeType.isNull())
7057     return QualType();
7058 
7059   QualType Result = TL.getType();
7060   if (getDerived().AlwaysRebuild() ||
7061       PointeeType != TL.getPointeeLoc().getType()) {
7062     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7063                                                        TL.getStarLoc());
7064     if (Result.isNull())
7065       return QualType();
7066   }
7067 
7068   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7069   NewT.setStarLoc(TL.getStarLoc());
7070   return Result;
7071 }
7072 
7073 //===----------------------------------------------------------------------===//
7074 // Statement transformation
7075 //===----------------------------------------------------------------------===//
7076 template<typename Derived>
7077 StmtResult
7078 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7079   return S;
7080 }
7081 
7082 template<typename Derived>
7083 StmtResult
7084 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7085   return getDerived().TransformCompoundStmt(S, false);
7086 }
7087 
7088 template<typename Derived>
7089 StmtResult
7090 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7091                                               bool IsStmtExpr) {
7092   Sema::CompoundScopeRAII CompoundScope(getSema());
7093 
7094   const Stmt *ExprResult = S->getStmtExprResult();
7095   bool SubStmtInvalid = false;
7096   bool SubStmtChanged = false;
7097   SmallVector<Stmt*, 8> Statements;
7098   for (auto *B : S->body()) {
7099     StmtResult Result = getDerived().TransformStmt(
7100         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7101 
7102     if (Result.isInvalid()) {
7103       // Immediately fail if this was a DeclStmt, since it's very
7104       // likely that this will cause problems for future statements.
7105       if (isa<DeclStmt>(B))
7106         return StmtError();
7107 
7108       // Otherwise, just keep processing substatements and fail later.
7109       SubStmtInvalid = true;
7110       continue;
7111     }
7112 
7113     SubStmtChanged = SubStmtChanged || Result.get() != B;
7114     Statements.push_back(Result.getAs<Stmt>());
7115   }
7116 
7117   if (SubStmtInvalid)
7118     return StmtError();
7119 
7120   if (!getDerived().AlwaysRebuild() &&
7121       !SubStmtChanged)
7122     return S;
7123 
7124   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7125                                           Statements,
7126                                           S->getRBracLoc(),
7127                                           IsStmtExpr);
7128 }
7129 
7130 template<typename Derived>
7131 StmtResult
7132 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7133   ExprResult LHS, RHS;
7134   {
7135     EnterExpressionEvaluationContext Unevaluated(
7136         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7137 
7138     // Transform the left-hand case value.
7139     LHS = getDerived().TransformExpr(S->getLHS());
7140     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7141     if (LHS.isInvalid())
7142       return StmtError();
7143 
7144     // Transform the right-hand case value (for the GNU case-range extension).
7145     RHS = getDerived().TransformExpr(S->getRHS());
7146     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7147     if (RHS.isInvalid())
7148       return StmtError();
7149   }
7150 
7151   // Build the case statement.
7152   // Case statements are always rebuilt so that they will attached to their
7153   // transformed switch statement.
7154   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7155                                                        LHS.get(),
7156                                                        S->getEllipsisLoc(),
7157                                                        RHS.get(),
7158                                                        S->getColonLoc());
7159   if (Case.isInvalid())
7160     return StmtError();
7161 
7162   // Transform the statement following the case
7163   StmtResult SubStmt =
7164       getDerived().TransformStmt(S->getSubStmt());
7165   if (SubStmt.isInvalid())
7166     return StmtError();
7167 
7168   // Attach the body to the case statement
7169   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7170 }
7171 
7172 template <typename Derived>
7173 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7174   // Transform the statement following the default case
7175   StmtResult SubStmt =
7176       getDerived().TransformStmt(S->getSubStmt());
7177   if (SubStmt.isInvalid())
7178     return StmtError();
7179 
7180   // Default statements are always rebuilt
7181   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7182                                          SubStmt.get());
7183 }
7184 
7185 template<typename Derived>
7186 StmtResult
7187 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7188   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7189   if (SubStmt.isInvalid())
7190     return StmtError();
7191 
7192   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7193                                         S->getDecl());
7194   if (!LD)
7195     return StmtError();
7196 
7197   // If we're transforming "in-place" (we're not creating new local
7198   // declarations), assume we're replacing the old label statement
7199   // and clear out the reference to it.
7200   if (LD == S->getDecl())
7201     S->getDecl()->setStmt(nullptr);
7202 
7203   // FIXME: Pass the real colon location in.
7204   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7205                                        cast<LabelDecl>(LD), SourceLocation(),
7206                                        SubStmt.get());
7207 }
7208 
7209 template <typename Derived>
7210 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7211   if (!R)
7212     return R;
7213 
7214   switch (R->getKind()) {
7215 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7216 #define ATTR(X)
7217 #define PRAGMA_SPELLING_ATTR(X)                                                \
7218   case attr::X:                                                                \
7219     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7220 #include "clang/Basic/AttrList.inc"
7221   default:
7222     return R;
7223   }
7224 }
7225 
7226 template <typename Derived>
7227 StmtResult
7228 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7229                                                 StmtDiscardKind SDK) {
7230   bool AttrsChanged = false;
7231   SmallVector<const Attr *, 1> Attrs;
7232 
7233   // Visit attributes and keep track if any are transformed.
7234   for (const auto *I : S->getAttrs()) {
7235     const Attr *R = getDerived().TransformAttr(I);
7236     AttrsChanged |= (I != R);
7237     Attrs.push_back(R);
7238   }
7239 
7240   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7241   if (SubStmt.isInvalid())
7242     return StmtError();
7243 
7244   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7245     return S;
7246 
7247   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7248                                             SubStmt.get());
7249 }
7250 
7251 template<typename Derived>
7252 StmtResult
7253 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7254   // Transform the initialization statement
7255   StmtResult Init = getDerived().TransformStmt(S->getInit());
7256   if (Init.isInvalid())
7257     return StmtError();
7258 
7259   // Transform the condition
7260   Sema::ConditionResult Cond = getDerived().TransformCondition(
7261       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7262       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7263                        : Sema::ConditionKind::Boolean);
7264   if (Cond.isInvalid())
7265     return StmtError();
7266 
7267   // If this is a constexpr if, determine which arm we should instantiate.
7268   llvm::Optional<bool> ConstexprConditionValue;
7269   if (S->isConstexpr())
7270     ConstexprConditionValue = Cond.getKnownValue();
7271 
7272   // Transform the "then" branch.
7273   StmtResult Then;
7274   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7275     Then = getDerived().TransformStmt(S->getThen());
7276     if (Then.isInvalid())
7277       return StmtError();
7278   } else {
7279     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7280   }
7281 
7282   // Transform the "else" branch.
7283   StmtResult Else;
7284   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7285     Else = getDerived().TransformStmt(S->getElse());
7286     if (Else.isInvalid())
7287       return StmtError();
7288   }
7289 
7290   if (!getDerived().AlwaysRebuild() &&
7291       Init.get() == S->getInit() &&
7292       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7293       Then.get() == S->getThen() &&
7294       Else.get() == S->getElse())
7295     return S;
7296 
7297   return getDerived().RebuildIfStmt(
7298       S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond,
7299       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7300 }
7301 
7302 template<typename Derived>
7303 StmtResult
7304 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7305   // Transform the initialization statement
7306   StmtResult Init = getDerived().TransformStmt(S->getInit());
7307   if (Init.isInvalid())
7308     return StmtError();
7309 
7310   // Transform the condition.
7311   Sema::ConditionResult Cond = getDerived().TransformCondition(
7312       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7313       Sema::ConditionKind::Switch);
7314   if (Cond.isInvalid())
7315     return StmtError();
7316 
7317   // Rebuild the switch statement.
7318   StmtResult Switch =
7319       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7320                                           Init.get(), Cond, S->getRParenLoc());
7321   if (Switch.isInvalid())
7322     return StmtError();
7323 
7324   // Transform the body of the switch statement.
7325   StmtResult Body = getDerived().TransformStmt(S->getBody());
7326   if (Body.isInvalid())
7327     return StmtError();
7328 
7329   // Complete the switch statement.
7330   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7331                                             Body.get());
7332 }
7333 
7334 template<typename Derived>
7335 StmtResult
7336 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7337   // Transform the condition
7338   Sema::ConditionResult Cond = getDerived().TransformCondition(
7339       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7340       Sema::ConditionKind::Boolean);
7341   if (Cond.isInvalid())
7342     return StmtError();
7343 
7344   // Transform the body
7345   StmtResult Body = getDerived().TransformStmt(S->getBody());
7346   if (Body.isInvalid())
7347     return StmtError();
7348 
7349   if (!getDerived().AlwaysRebuild() &&
7350       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7351       Body.get() == S->getBody())
7352     return Owned(S);
7353 
7354   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7355                                        Cond, S->getRParenLoc(), Body.get());
7356 }
7357 
7358 template<typename Derived>
7359 StmtResult
7360 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7361   // Transform the body
7362   StmtResult Body = getDerived().TransformStmt(S->getBody());
7363   if (Body.isInvalid())
7364     return StmtError();
7365 
7366   // Transform the condition
7367   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7368   if (Cond.isInvalid())
7369     return StmtError();
7370 
7371   if (!getDerived().AlwaysRebuild() &&
7372       Cond.get() == S->getCond() &&
7373       Body.get() == S->getBody())
7374     return S;
7375 
7376   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7377                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7378                                     S->getRParenLoc());
7379 }
7380 
7381 template<typename Derived>
7382 StmtResult
7383 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7384   if (getSema().getLangOpts().OpenMP)
7385     getSema().startOpenMPLoop();
7386 
7387   // Transform the initialization statement
7388   StmtResult Init = getDerived().TransformStmt(S->getInit());
7389   if (Init.isInvalid())
7390     return StmtError();
7391 
7392   // In OpenMP loop region loop control variable must be captured and be
7393   // private. Perform analysis of first part (if any).
7394   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7395     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7396 
7397   // Transform the condition
7398   Sema::ConditionResult Cond = getDerived().TransformCondition(
7399       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7400       Sema::ConditionKind::Boolean);
7401   if (Cond.isInvalid())
7402     return StmtError();
7403 
7404   // Transform the increment
7405   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7406   if (Inc.isInvalid())
7407     return StmtError();
7408 
7409   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7410   if (S->getInc() && !FullInc.get())
7411     return StmtError();
7412 
7413   // Transform the body
7414   StmtResult Body = getDerived().TransformStmt(S->getBody());
7415   if (Body.isInvalid())
7416     return StmtError();
7417 
7418   if (!getDerived().AlwaysRebuild() &&
7419       Init.get() == S->getInit() &&
7420       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7421       Inc.get() == S->getInc() &&
7422       Body.get() == S->getBody())
7423     return S;
7424 
7425   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7426                                      Init.get(), Cond, FullInc,
7427                                      S->getRParenLoc(), Body.get());
7428 }
7429 
7430 template<typename Derived>
7431 StmtResult
7432 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7433   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7434                                         S->getLabel());
7435   if (!LD)
7436     return StmtError();
7437 
7438   // Goto statements must always be rebuilt, to resolve the label.
7439   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7440                                       cast<LabelDecl>(LD));
7441 }
7442 
7443 template<typename Derived>
7444 StmtResult
7445 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7446   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7447   if (Target.isInvalid())
7448     return StmtError();
7449   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7450 
7451   if (!getDerived().AlwaysRebuild() &&
7452       Target.get() == S->getTarget())
7453     return S;
7454 
7455   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7456                                               Target.get());
7457 }
7458 
7459 template<typename Derived>
7460 StmtResult
7461 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7462   return S;
7463 }
7464 
7465 template<typename Derived>
7466 StmtResult
7467 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7468   return S;
7469 }
7470 
7471 template<typename Derived>
7472 StmtResult
7473 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7474   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7475                                                         /*NotCopyInit*/false);
7476   if (Result.isInvalid())
7477     return StmtError();
7478 
7479   // FIXME: We always rebuild the return statement because there is no way
7480   // to tell whether the return type of the function has changed.
7481   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7482 }
7483 
7484 template<typename Derived>
7485 StmtResult
7486 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7487   bool DeclChanged = false;
7488   SmallVector<Decl *, 4> Decls;
7489   for (auto *D : S->decls()) {
7490     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7491     if (!Transformed)
7492       return StmtError();
7493 
7494     if (Transformed != D)
7495       DeclChanged = true;
7496 
7497     Decls.push_back(Transformed);
7498   }
7499 
7500   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7501     return S;
7502 
7503   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7504 }
7505 
7506 template<typename Derived>
7507 StmtResult
7508 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7509 
7510   SmallVector<Expr*, 8> Constraints;
7511   SmallVector<Expr*, 8> Exprs;
7512   SmallVector<IdentifierInfo *, 4> Names;
7513 
7514   ExprResult AsmString;
7515   SmallVector<Expr*, 8> Clobbers;
7516 
7517   bool ExprsChanged = false;
7518 
7519   // Go through the outputs.
7520   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7521     Names.push_back(S->getOutputIdentifier(I));
7522 
7523     // No need to transform the constraint literal.
7524     Constraints.push_back(S->getOutputConstraintLiteral(I));
7525 
7526     // Transform the output expr.
7527     Expr *OutputExpr = S->getOutputExpr(I);
7528     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7529     if (Result.isInvalid())
7530       return StmtError();
7531 
7532     ExprsChanged |= Result.get() != OutputExpr;
7533 
7534     Exprs.push_back(Result.get());
7535   }
7536 
7537   // Go through the inputs.
7538   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7539     Names.push_back(S->getInputIdentifier(I));
7540 
7541     // No need to transform the constraint literal.
7542     Constraints.push_back(S->getInputConstraintLiteral(I));
7543 
7544     // Transform the input expr.
7545     Expr *InputExpr = S->getInputExpr(I);
7546     ExprResult Result = getDerived().TransformExpr(InputExpr);
7547     if (Result.isInvalid())
7548       return StmtError();
7549 
7550     ExprsChanged |= Result.get() != InputExpr;
7551 
7552     Exprs.push_back(Result.get());
7553   }
7554 
7555   // Go through the Labels.
7556   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7557     Names.push_back(S->getLabelIdentifier(I));
7558 
7559     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7560     if (Result.isInvalid())
7561       return StmtError();
7562     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7563     Exprs.push_back(Result.get());
7564   }
7565   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7566     return S;
7567 
7568   // Go through the clobbers.
7569   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7570     Clobbers.push_back(S->getClobberStringLiteral(I));
7571 
7572   // No need to transform the asm string literal.
7573   AsmString = S->getAsmString();
7574   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7575                                         S->isVolatile(), S->getNumOutputs(),
7576                                         S->getNumInputs(), Names.data(),
7577                                         Constraints, Exprs, AsmString.get(),
7578                                         Clobbers, S->getNumLabels(),
7579                                         S->getRParenLoc());
7580 }
7581 
7582 template<typename Derived>
7583 StmtResult
7584 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7585   ArrayRef<Token> AsmToks =
7586     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7587 
7588   bool HadError = false, HadChange = false;
7589 
7590   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7591   SmallVector<Expr*, 8> TransformedExprs;
7592   TransformedExprs.reserve(SrcExprs.size());
7593   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7594     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7595     if (!Result.isUsable()) {
7596       HadError = true;
7597     } else {
7598       HadChange |= (Result.get() != SrcExprs[i]);
7599       TransformedExprs.push_back(Result.get());
7600     }
7601   }
7602 
7603   if (HadError) return StmtError();
7604   if (!HadChange && !getDerived().AlwaysRebuild())
7605     return Owned(S);
7606 
7607   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7608                                        AsmToks, S->getAsmString(),
7609                                        S->getNumOutputs(), S->getNumInputs(),
7610                                        S->getAllConstraints(), S->getClobbers(),
7611                                        TransformedExprs, S->getEndLoc());
7612 }
7613 
7614 // C++ Coroutines TS
7615 
7616 template<typename Derived>
7617 StmtResult
7618 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7619   auto *ScopeInfo = SemaRef.getCurFunction();
7620   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7621   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7622          ScopeInfo->NeedsCoroutineSuspends &&
7623          ScopeInfo->CoroutineSuspends.first == nullptr &&
7624          ScopeInfo->CoroutineSuspends.second == nullptr &&
7625          "expected clean scope info");
7626 
7627   // Set that we have (possibly-invalid) suspend points before we do anything
7628   // that may fail.
7629   ScopeInfo->setNeedsCoroutineSuspends(false);
7630 
7631   // We re-build the coroutine promise object (and the coroutine parameters its
7632   // type and constructor depend on) based on the types used in our current
7633   // function. We must do so, and set it on the current FunctionScopeInfo,
7634   // before attempting to transform the other parts of the coroutine body
7635   // statement, such as the implicit suspend statements (because those
7636   // statements reference the FunctionScopeInfo::CoroutinePromise).
7637   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7638     return StmtError();
7639   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7640   if (!Promise)
7641     return StmtError();
7642   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7643   ScopeInfo->CoroutinePromise = Promise;
7644 
7645   // Transform the implicit coroutine statements constructed using dependent
7646   // types during the previous parse: initial and final suspensions, the return
7647   // object, and others. We also transform the coroutine function's body.
7648   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7649   if (InitSuspend.isInvalid())
7650     return StmtError();
7651   StmtResult FinalSuspend =
7652       getDerived().TransformStmt(S->getFinalSuspendStmt());
7653   if (FinalSuspend.isInvalid() ||
7654       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7655     return StmtError();
7656   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7657   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7658 
7659   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7660   if (BodyRes.isInvalid())
7661     return StmtError();
7662 
7663   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7664   if (Builder.isInvalid())
7665     return StmtError();
7666 
7667   Expr *ReturnObject = S->getReturnValueInit();
7668   assert(ReturnObject && "the return object is expected to be valid");
7669   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7670                                                      /*NoCopyInit*/ false);
7671   if (Res.isInvalid())
7672     return StmtError();
7673   Builder.ReturnValue = Res.get();
7674 
7675   // If during the previous parse the coroutine still had a dependent promise
7676   // statement, we may need to build some implicit coroutine statements
7677   // (such as exception and fallthrough handlers) for the first time.
7678   if (S->hasDependentPromiseType()) {
7679     // We can only build these statements, however, if the current promise type
7680     // is not dependent.
7681     if (!Promise->getType()->isDependentType()) {
7682       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7683              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7684              "these nodes should not have been built yet");
7685       if (!Builder.buildDependentStatements())
7686         return StmtError();
7687     }
7688   } else {
7689     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7690       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7691       if (Res.isInvalid())
7692         return StmtError();
7693       Builder.OnFallthrough = Res.get();
7694     }
7695 
7696     if (auto *OnException = S->getExceptionHandler()) {
7697       StmtResult Res = getDerived().TransformStmt(OnException);
7698       if (Res.isInvalid())
7699         return StmtError();
7700       Builder.OnException = Res.get();
7701     }
7702 
7703     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7704       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7705       if (Res.isInvalid())
7706         return StmtError();
7707       Builder.ReturnStmtOnAllocFailure = Res.get();
7708     }
7709 
7710     // Transform any additional statements we may have already built
7711     assert(S->getAllocate() && S->getDeallocate() &&
7712            "allocation and deallocation calls must already be built");
7713     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7714     if (AllocRes.isInvalid())
7715       return StmtError();
7716     Builder.Allocate = AllocRes.get();
7717 
7718     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7719     if (DeallocRes.isInvalid())
7720       return StmtError();
7721     Builder.Deallocate = DeallocRes.get();
7722 
7723     assert(S->getResultDecl() && "ResultDecl must already be built");
7724     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7725     if (ResultDecl.isInvalid())
7726       return StmtError();
7727     Builder.ResultDecl = ResultDecl.get();
7728 
7729     if (auto *ReturnStmt = S->getReturnStmt()) {
7730       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7731       if (Res.isInvalid())
7732         return StmtError();
7733       Builder.ReturnStmt = Res.get();
7734     }
7735   }
7736 
7737   return getDerived().RebuildCoroutineBodyStmt(Builder);
7738 }
7739 
7740 template<typename Derived>
7741 StmtResult
7742 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7743   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7744                                                         /*NotCopyInit*/false);
7745   if (Result.isInvalid())
7746     return StmtError();
7747 
7748   // Always rebuild; we don't know if this needs to be injected into a new
7749   // context or if the promise type has changed.
7750   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7751                                           S->isImplicit());
7752 }
7753 
7754 template<typename Derived>
7755 ExprResult
7756 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7757   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7758                                                         /*NotCopyInit*/false);
7759   if (Result.isInvalid())
7760     return ExprError();
7761 
7762   // Always rebuild; we don't know if this needs to be injected into a new
7763   // context or if the promise type has changed.
7764   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7765                                          E->isImplicit());
7766 }
7767 
7768 template <typename Derived>
7769 ExprResult
7770 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7771   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7772                                                         /*NotCopyInit*/ false);
7773   if (OperandResult.isInvalid())
7774     return ExprError();
7775 
7776   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7777           E->getOperatorCoawaitLookup());
7778 
7779   if (LookupResult.isInvalid())
7780     return ExprError();
7781 
7782   // Always rebuild; we don't know if this needs to be injected into a new
7783   // context or if the promise type has changed.
7784   return getDerived().RebuildDependentCoawaitExpr(
7785       E->getKeywordLoc(), OperandResult.get(),
7786       cast<UnresolvedLookupExpr>(LookupResult.get()));
7787 }
7788 
7789 template<typename Derived>
7790 ExprResult
7791 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7792   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7793                                                         /*NotCopyInit*/false);
7794   if (Result.isInvalid())
7795     return ExprError();
7796 
7797   // Always rebuild; we don't know if this needs to be injected into a new
7798   // context or if the promise type has changed.
7799   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7800 }
7801 
7802 // Objective-C Statements.
7803 
7804 template<typename Derived>
7805 StmtResult
7806 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7807   // Transform the body of the @try.
7808   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7809   if (TryBody.isInvalid())
7810     return StmtError();
7811 
7812   // Transform the @catch statements (if present).
7813   bool AnyCatchChanged = false;
7814   SmallVector<Stmt*, 8> CatchStmts;
7815   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7816     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7817     if (Catch.isInvalid())
7818       return StmtError();
7819     if (Catch.get() != S->getCatchStmt(I))
7820       AnyCatchChanged = true;
7821     CatchStmts.push_back(Catch.get());
7822   }
7823 
7824   // Transform the @finally statement (if present).
7825   StmtResult Finally;
7826   if (S->getFinallyStmt()) {
7827     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7828     if (Finally.isInvalid())
7829       return StmtError();
7830   }
7831 
7832   // If nothing changed, just retain this statement.
7833   if (!getDerived().AlwaysRebuild() &&
7834       TryBody.get() == S->getTryBody() &&
7835       !AnyCatchChanged &&
7836       Finally.get() == S->getFinallyStmt())
7837     return S;
7838 
7839   // Build a new statement.
7840   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7841                                            CatchStmts, Finally.get());
7842 }
7843 
7844 template<typename Derived>
7845 StmtResult
7846 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7847   // Transform the @catch parameter, if there is one.
7848   VarDecl *Var = nullptr;
7849   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7850     TypeSourceInfo *TSInfo = nullptr;
7851     if (FromVar->getTypeSourceInfo()) {
7852       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7853       if (!TSInfo)
7854         return StmtError();
7855     }
7856 
7857     QualType T;
7858     if (TSInfo)
7859       T = TSInfo->getType();
7860     else {
7861       T = getDerived().TransformType(FromVar->getType());
7862       if (T.isNull())
7863         return StmtError();
7864     }
7865 
7866     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7867     if (!Var)
7868       return StmtError();
7869   }
7870 
7871   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7872   if (Body.isInvalid())
7873     return StmtError();
7874 
7875   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7876                                              S->getRParenLoc(),
7877                                              Var, Body.get());
7878 }
7879 
7880 template<typename Derived>
7881 StmtResult
7882 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7883   // Transform the body.
7884   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7885   if (Body.isInvalid())
7886     return StmtError();
7887 
7888   // If nothing changed, just retain this statement.
7889   if (!getDerived().AlwaysRebuild() &&
7890       Body.get() == S->getFinallyBody())
7891     return S;
7892 
7893   // Build a new statement.
7894   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7895                                                Body.get());
7896 }
7897 
7898 template<typename Derived>
7899 StmtResult
7900 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7901   ExprResult Operand;
7902   if (S->getThrowExpr()) {
7903     Operand = getDerived().TransformExpr(S->getThrowExpr());
7904     if (Operand.isInvalid())
7905       return StmtError();
7906   }
7907 
7908   if (!getDerived().AlwaysRebuild() &&
7909       Operand.get() == S->getThrowExpr())
7910     return S;
7911 
7912   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7913 }
7914 
7915 template<typename Derived>
7916 StmtResult
7917 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7918                                                   ObjCAtSynchronizedStmt *S) {
7919   // Transform the object we are locking.
7920   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7921   if (Object.isInvalid())
7922     return StmtError();
7923   Object =
7924     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7925                                                   Object.get());
7926   if (Object.isInvalid())
7927     return StmtError();
7928 
7929   // Transform the body.
7930   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7931   if (Body.isInvalid())
7932     return StmtError();
7933 
7934   // If nothing change, just retain the current statement.
7935   if (!getDerived().AlwaysRebuild() &&
7936       Object.get() == S->getSynchExpr() &&
7937       Body.get() == S->getSynchBody())
7938     return S;
7939 
7940   // Build a new statement.
7941   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7942                                                     Object.get(), Body.get());
7943 }
7944 
7945 template<typename Derived>
7946 StmtResult
7947 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7948                                               ObjCAutoreleasePoolStmt *S) {
7949   // Transform the body.
7950   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7951   if (Body.isInvalid())
7952     return StmtError();
7953 
7954   // If nothing changed, just retain this statement.
7955   if (!getDerived().AlwaysRebuild() &&
7956       Body.get() == S->getSubStmt())
7957     return S;
7958 
7959   // Build a new statement.
7960   return getDerived().RebuildObjCAutoreleasePoolStmt(
7961                         S->getAtLoc(), Body.get());
7962 }
7963 
7964 template<typename Derived>
7965 StmtResult
7966 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7967                                                   ObjCForCollectionStmt *S) {
7968   // Transform the element statement.
7969   StmtResult Element =
7970       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7971   if (Element.isInvalid())
7972     return StmtError();
7973 
7974   // Transform the collection expression.
7975   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7976   if (Collection.isInvalid())
7977     return StmtError();
7978 
7979   // Transform the body.
7980   StmtResult Body = getDerived().TransformStmt(S->getBody());
7981   if (Body.isInvalid())
7982     return StmtError();
7983 
7984   // If nothing changed, just retain this statement.
7985   if (!getDerived().AlwaysRebuild() &&
7986       Element.get() == S->getElement() &&
7987       Collection.get() == S->getCollection() &&
7988       Body.get() == S->getBody())
7989     return S;
7990 
7991   // Build a new statement.
7992   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7993                                                    Element.get(),
7994                                                    Collection.get(),
7995                                                    S->getRParenLoc(),
7996                                                    Body.get());
7997 }
7998 
7999 template <typename Derived>
8000 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8001   // Transform the exception declaration, if any.
8002   VarDecl *Var = nullptr;
8003   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8004     TypeSourceInfo *T =
8005         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8006     if (!T)
8007       return StmtError();
8008 
8009     Var = getDerived().RebuildExceptionDecl(
8010         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8011         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8012     if (!Var || Var->isInvalidDecl())
8013       return StmtError();
8014   }
8015 
8016   // Transform the actual exception handler.
8017   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8018   if (Handler.isInvalid())
8019     return StmtError();
8020 
8021   if (!getDerived().AlwaysRebuild() && !Var &&
8022       Handler.get() == S->getHandlerBlock())
8023     return S;
8024 
8025   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8026 }
8027 
8028 template <typename Derived>
8029 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8030   // Transform the try block itself.
8031   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8032   if (TryBlock.isInvalid())
8033     return StmtError();
8034 
8035   // Transform the handlers.
8036   bool HandlerChanged = false;
8037   SmallVector<Stmt *, 8> Handlers;
8038   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8039     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8040     if (Handler.isInvalid())
8041       return StmtError();
8042 
8043     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8044     Handlers.push_back(Handler.getAs<Stmt>());
8045   }
8046 
8047   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8048       !HandlerChanged)
8049     return S;
8050 
8051   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8052                                         Handlers);
8053 }
8054 
8055 template<typename Derived>
8056 StmtResult
8057 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8058   StmtResult Init =
8059       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8060   if (Init.isInvalid())
8061     return StmtError();
8062 
8063   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8064   if (Range.isInvalid())
8065     return StmtError();
8066 
8067   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8068   if (Begin.isInvalid())
8069     return StmtError();
8070   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8071   if (End.isInvalid())
8072     return StmtError();
8073 
8074   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8075   if (Cond.isInvalid())
8076     return StmtError();
8077   if (Cond.get())
8078     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8079   if (Cond.isInvalid())
8080     return StmtError();
8081   if (Cond.get())
8082     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8083 
8084   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8085   if (Inc.isInvalid())
8086     return StmtError();
8087   if (Inc.get())
8088     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8089 
8090   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8091   if (LoopVar.isInvalid())
8092     return StmtError();
8093 
8094   StmtResult NewStmt = S;
8095   if (getDerived().AlwaysRebuild() ||
8096       Init.get() != S->getInit() ||
8097       Range.get() != S->getRangeStmt() ||
8098       Begin.get() != S->getBeginStmt() ||
8099       End.get() != S->getEndStmt() ||
8100       Cond.get() != S->getCond() ||
8101       Inc.get() != S->getInc() ||
8102       LoopVar.get() != S->getLoopVarStmt()) {
8103     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8104                                                   S->getCoawaitLoc(), Init.get(),
8105                                                   S->getColonLoc(), Range.get(),
8106                                                   Begin.get(), End.get(),
8107                                                   Cond.get(),
8108                                                   Inc.get(), LoopVar.get(),
8109                                                   S->getRParenLoc());
8110     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8111       // Might not have attached any initializer to the loop variable.
8112       getSema().ActOnInitializerError(
8113           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8114       return StmtError();
8115     }
8116   }
8117 
8118   StmtResult Body = getDerived().TransformStmt(S->getBody());
8119   if (Body.isInvalid())
8120     return StmtError();
8121 
8122   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8123   // it now so we have a new statement to attach the body to.
8124   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8125     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8126                                                   S->getCoawaitLoc(), Init.get(),
8127                                                   S->getColonLoc(), Range.get(),
8128                                                   Begin.get(), End.get(),
8129                                                   Cond.get(),
8130                                                   Inc.get(), LoopVar.get(),
8131                                                   S->getRParenLoc());
8132     if (NewStmt.isInvalid())
8133       return StmtError();
8134   }
8135 
8136   if (NewStmt.get() == S)
8137     return S;
8138 
8139   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8140 }
8141 
8142 template<typename Derived>
8143 StmtResult
8144 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8145                                                     MSDependentExistsStmt *S) {
8146   // Transform the nested-name-specifier, if any.
8147   NestedNameSpecifierLoc QualifierLoc;
8148   if (S->getQualifierLoc()) {
8149     QualifierLoc
8150       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8151     if (!QualifierLoc)
8152       return StmtError();
8153   }
8154 
8155   // Transform the declaration name.
8156   DeclarationNameInfo NameInfo = S->getNameInfo();
8157   if (NameInfo.getName()) {
8158     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8159     if (!NameInfo.getName())
8160       return StmtError();
8161   }
8162 
8163   // Check whether anything changed.
8164   if (!getDerived().AlwaysRebuild() &&
8165       QualifierLoc == S->getQualifierLoc() &&
8166       NameInfo.getName() == S->getNameInfo().getName())
8167     return S;
8168 
8169   // Determine whether this name exists, if we can.
8170   CXXScopeSpec SS;
8171   SS.Adopt(QualifierLoc);
8172   bool Dependent = false;
8173   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8174   case Sema::IER_Exists:
8175     if (S->isIfExists())
8176       break;
8177 
8178     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8179 
8180   case Sema::IER_DoesNotExist:
8181     if (S->isIfNotExists())
8182       break;
8183 
8184     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8185 
8186   case Sema::IER_Dependent:
8187     Dependent = true;
8188     break;
8189 
8190   case Sema::IER_Error:
8191     return StmtError();
8192   }
8193 
8194   // We need to continue with the instantiation, so do so now.
8195   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8196   if (SubStmt.isInvalid())
8197     return StmtError();
8198 
8199   // If we have resolved the name, just transform to the substatement.
8200   if (!Dependent)
8201     return SubStmt;
8202 
8203   // The name is still dependent, so build a dependent expression again.
8204   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8205                                                    S->isIfExists(),
8206                                                    QualifierLoc,
8207                                                    NameInfo,
8208                                                    SubStmt.get());
8209 }
8210 
8211 template<typename Derived>
8212 ExprResult
8213 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8214   NestedNameSpecifierLoc QualifierLoc;
8215   if (E->getQualifierLoc()) {
8216     QualifierLoc
8217     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8218     if (!QualifierLoc)
8219       return ExprError();
8220   }
8221 
8222   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8223     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8224   if (!PD)
8225     return ExprError();
8226 
8227   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8228   if (Base.isInvalid())
8229     return ExprError();
8230 
8231   return new (SemaRef.getASTContext())
8232       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8233                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8234                         QualifierLoc, E->getMemberLoc());
8235 }
8236 
8237 template <typename Derived>
8238 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8239     MSPropertySubscriptExpr *E) {
8240   auto BaseRes = getDerived().TransformExpr(E->getBase());
8241   if (BaseRes.isInvalid())
8242     return ExprError();
8243   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8244   if (IdxRes.isInvalid())
8245     return ExprError();
8246 
8247   if (!getDerived().AlwaysRebuild() &&
8248       BaseRes.get() == E->getBase() &&
8249       IdxRes.get() == E->getIdx())
8250     return E;
8251 
8252   return getDerived().RebuildArraySubscriptExpr(
8253       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8254 }
8255 
8256 template <typename Derived>
8257 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8258   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8259   if (TryBlock.isInvalid())
8260     return StmtError();
8261 
8262   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8263   if (Handler.isInvalid())
8264     return StmtError();
8265 
8266   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8267       Handler.get() == S->getHandler())
8268     return S;
8269 
8270   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8271                                         TryBlock.get(), Handler.get());
8272 }
8273 
8274 template <typename Derived>
8275 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8276   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8277   if (Block.isInvalid())
8278     return StmtError();
8279 
8280   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8281 }
8282 
8283 template <typename Derived>
8284 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8285   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8286   if (FilterExpr.isInvalid())
8287     return StmtError();
8288 
8289   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8290   if (Block.isInvalid())
8291     return StmtError();
8292 
8293   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8294                                            Block.get());
8295 }
8296 
8297 template <typename Derived>
8298 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8299   if (isa<SEHFinallyStmt>(Handler))
8300     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8301   else
8302     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8303 }
8304 
8305 template<typename Derived>
8306 StmtResult
8307 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8308   return S;
8309 }
8310 
8311 //===----------------------------------------------------------------------===//
8312 // OpenMP directive transformation
8313 //===----------------------------------------------------------------------===//
8314 template <typename Derived>
8315 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8316     OMPExecutableDirective *D) {
8317 
8318   // Transform the clauses
8319   llvm::SmallVector<OMPClause *, 16> TClauses;
8320   ArrayRef<OMPClause *> Clauses = D->clauses();
8321   TClauses.reserve(Clauses.size());
8322   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8323        I != E; ++I) {
8324     if (*I) {
8325       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8326       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8327       getDerived().getSema().EndOpenMPClause();
8328       if (Clause)
8329         TClauses.push_back(Clause);
8330     } else {
8331       TClauses.push_back(nullptr);
8332     }
8333   }
8334   StmtResult AssociatedStmt;
8335   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8336     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8337                                                   /*CurScope=*/nullptr);
8338     StmtResult Body;
8339     {
8340       Sema::CompoundScopeRAII CompoundScope(getSema());
8341       Stmt *CS;
8342       if (D->getDirectiveKind() == OMPD_atomic ||
8343           D->getDirectiveKind() == OMPD_critical ||
8344           D->getDirectiveKind() == OMPD_section ||
8345           D->getDirectiveKind() == OMPD_master)
8346         CS = D->getAssociatedStmt();
8347       else
8348         CS = D->getInnermostCapturedStmt()->getCapturedStmt();
8349       Body = getDerived().TransformStmt(CS);
8350     }
8351     AssociatedStmt =
8352         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8353     if (AssociatedStmt.isInvalid()) {
8354       return StmtError();
8355     }
8356   }
8357   if (TClauses.size() != Clauses.size()) {
8358     return StmtError();
8359   }
8360 
8361   // Transform directive name for 'omp critical' directive.
8362   DeclarationNameInfo DirName;
8363   if (D->getDirectiveKind() == OMPD_critical) {
8364     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8365     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8366   }
8367   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8368   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8369     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8370   } else if (D->getDirectiveKind() == OMPD_cancel) {
8371     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8372   }
8373 
8374   return getDerived().RebuildOMPExecutableDirective(
8375       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8376       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8377 }
8378 
8379 template <typename Derived>
8380 StmtResult
8381 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8382   DeclarationNameInfo DirName;
8383   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8384                                              D->getBeginLoc());
8385   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8386   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8387   return Res;
8388 }
8389 
8390 template <typename Derived>
8391 StmtResult
8392 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8393   DeclarationNameInfo DirName;
8394   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8395                                              D->getBeginLoc());
8396   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8397   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8398   return Res;
8399 }
8400 
8401 template <typename Derived>
8402 StmtResult
8403 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8404   DeclarationNameInfo DirName;
8405   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8406                                              D->getBeginLoc());
8407   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8408   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8409   return Res;
8410 }
8411 
8412 template <typename Derived>
8413 StmtResult
8414 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8415   DeclarationNameInfo DirName;
8416   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8417                                              D->getBeginLoc());
8418   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8419   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8420   return Res;
8421 }
8422 
8423 template <typename Derived>
8424 StmtResult
8425 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8426   DeclarationNameInfo DirName;
8427   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8428                                              D->getBeginLoc());
8429   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8430   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8431   return Res;
8432 }
8433 
8434 template <typename Derived>
8435 StmtResult
8436 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8437   DeclarationNameInfo DirName;
8438   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8439                                              D->getBeginLoc());
8440   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8441   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8442   return Res;
8443 }
8444 
8445 template <typename Derived>
8446 StmtResult
8447 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8448   DeclarationNameInfo DirName;
8449   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8450                                              D->getBeginLoc());
8451   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8452   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8453   return Res;
8454 }
8455 
8456 template <typename Derived>
8457 StmtResult
8458 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8459   DeclarationNameInfo DirName;
8460   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8461                                              D->getBeginLoc());
8462   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8463   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8464   return Res;
8465 }
8466 
8467 template <typename Derived>
8468 StmtResult
8469 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8470   getDerived().getSema().StartOpenMPDSABlock(
8471       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8472   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8473   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8474   return Res;
8475 }
8476 
8477 template <typename Derived>
8478 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8479     OMPParallelForDirective *D) {
8480   DeclarationNameInfo DirName;
8481   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8482                                              nullptr, D->getBeginLoc());
8483   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8484   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8485   return Res;
8486 }
8487 
8488 template <typename Derived>
8489 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8490     OMPParallelForSimdDirective *D) {
8491   DeclarationNameInfo DirName;
8492   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8493                                              nullptr, D->getBeginLoc());
8494   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8495   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8496   return Res;
8497 }
8498 
8499 template <typename Derived>
8500 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8501     OMPParallelMasterDirective *D) {
8502   DeclarationNameInfo DirName;
8503   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8504                                              nullptr, D->getBeginLoc());
8505   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8506   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8507   return Res;
8508 }
8509 
8510 template <typename Derived>
8511 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8512     OMPParallelSectionsDirective *D) {
8513   DeclarationNameInfo DirName;
8514   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8515                                              nullptr, D->getBeginLoc());
8516   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8517   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8518   return Res;
8519 }
8520 
8521 template <typename Derived>
8522 StmtResult
8523 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8524   DeclarationNameInfo DirName;
8525   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8526                                              D->getBeginLoc());
8527   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8528   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8529   return Res;
8530 }
8531 
8532 template <typename Derived>
8533 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8534     OMPTaskyieldDirective *D) {
8535   DeclarationNameInfo DirName;
8536   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8537                                              D->getBeginLoc());
8538   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8539   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8540   return Res;
8541 }
8542 
8543 template <typename Derived>
8544 StmtResult
8545 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8546   DeclarationNameInfo DirName;
8547   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8548                                              D->getBeginLoc());
8549   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8550   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8551   return Res;
8552 }
8553 
8554 template <typename Derived>
8555 StmtResult
8556 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8557   DeclarationNameInfo DirName;
8558   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8559                                              D->getBeginLoc());
8560   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8561   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8562   return Res;
8563 }
8564 
8565 template <typename Derived>
8566 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8567     OMPTaskgroupDirective *D) {
8568   DeclarationNameInfo DirName;
8569   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8570                                              D->getBeginLoc());
8571   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8572   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8573   return Res;
8574 }
8575 
8576 template <typename Derived>
8577 StmtResult
8578 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8579   DeclarationNameInfo DirName;
8580   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8581                                              D->getBeginLoc());
8582   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8583   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8584   return Res;
8585 }
8586 
8587 template <typename Derived>
8588 StmtResult
8589 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8590   DeclarationNameInfo DirName;
8591   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8592                                              D->getBeginLoc());
8593   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8594   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8595   return Res;
8596 }
8597 
8598 template <typename Derived>
8599 StmtResult
8600 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8601   DeclarationNameInfo DirName;
8602   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8603                                              D->getBeginLoc());
8604   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8605   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8606   return Res;
8607 }
8608 
8609 template <typename Derived>
8610 StmtResult
8611 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8612   DeclarationNameInfo DirName;
8613   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8614                                              D->getBeginLoc());
8615   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8616   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8617   return Res;
8618 }
8619 
8620 template <typename Derived>
8621 StmtResult
8622 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8623   DeclarationNameInfo DirName;
8624   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8625                                              D->getBeginLoc());
8626   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8627   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8628   return Res;
8629 }
8630 
8631 template <typename Derived>
8632 StmtResult
8633 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8634   DeclarationNameInfo DirName;
8635   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8636                                              D->getBeginLoc());
8637   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8638   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8639   return Res;
8640 }
8641 
8642 template <typename Derived>
8643 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8644     OMPTargetDataDirective *D) {
8645   DeclarationNameInfo DirName;
8646   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8647                                              D->getBeginLoc());
8648   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8649   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8650   return Res;
8651 }
8652 
8653 template <typename Derived>
8654 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8655     OMPTargetEnterDataDirective *D) {
8656   DeclarationNameInfo DirName;
8657   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8658                                              nullptr, D->getBeginLoc());
8659   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8660   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8661   return Res;
8662 }
8663 
8664 template <typename Derived>
8665 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8666     OMPTargetExitDataDirective *D) {
8667   DeclarationNameInfo DirName;
8668   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8669                                              nullptr, D->getBeginLoc());
8670   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8671   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8672   return Res;
8673 }
8674 
8675 template <typename Derived>
8676 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8677     OMPTargetParallelDirective *D) {
8678   DeclarationNameInfo DirName;
8679   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8680                                              nullptr, D->getBeginLoc());
8681   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8682   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8683   return Res;
8684 }
8685 
8686 template <typename Derived>
8687 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8688     OMPTargetParallelForDirective *D) {
8689   DeclarationNameInfo DirName;
8690   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8691                                              nullptr, D->getBeginLoc());
8692   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8693   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8694   return Res;
8695 }
8696 
8697 template <typename Derived>
8698 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8699     OMPTargetUpdateDirective *D) {
8700   DeclarationNameInfo DirName;
8701   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8702                                              nullptr, D->getBeginLoc());
8703   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8704   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8705   return Res;
8706 }
8707 
8708 template <typename Derived>
8709 StmtResult
8710 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8711   DeclarationNameInfo DirName;
8712   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8713                                              D->getBeginLoc());
8714   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8715   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8716   return Res;
8717 }
8718 
8719 template <typename Derived>
8720 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8721     OMPCancellationPointDirective *D) {
8722   DeclarationNameInfo DirName;
8723   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8724                                              nullptr, D->getBeginLoc());
8725   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8726   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8727   return Res;
8728 }
8729 
8730 template <typename Derived>
8731 StmtResult
8732 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8733   DeclarationNameInfo DirName;
8734   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8735                                              D->getBeginLoc());
8736   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8737   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8738   return Res;
8739 }
8740 
8741 template <typename Derived>
8742 StmtResult
8743 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8744   DeclarationNameInfo DirName;
8745   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8746                                              D->getBeginLoc());
8747   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8748   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8749   return Res;
8750 }
8751 
8752 template <typename Derived>
8753 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8754     OMPTaskLoopSimdDirective *D) {
8755   DeclarationNameInfo DirName;
8756   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8757                                              nullptr, D->getBeginLoc());
8758   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8759   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8760   return Res;
8761 }
8762 
8763 template <typename Derived>
8764 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8765     OMPMasterTaskLoopDirective *D) {
8766   DeclarationNameInfo DirName;
8767   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8768                                              nullptr, D->getBeginLoc());
8769   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8770   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8771   return Res;
8772 }
8773 
8774 template <typename Derived>
8775 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8776     OMPMasterTaskLoopSimdDirective *D) {
8777   DeclarationNameInfo DirName;
8778   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8779                                              nullptr, D->getBeginLoc());
8780   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8781   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8782   return Res;
8783 }
8784 
8785 template <typename Derived>
8786 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8787     OMPParallelMasterTaskLoopDirective *D) {
8788   DeclarationNameInfo DirName;
8789   getDerived().getSema().StartOpenMPDSABlock(
8790       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8791   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8792   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8793   return Res;
8794 }
8795 
8796 template <typename Derived>
8797 StmtResult
8798 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8799     OMPParallelMasterTaskLoopSimdDirective *D) {
8800   DeclarationNameInfo DirName;
8801   getDerived().getSema().StartOpenMPDSABlock(
8802       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8803   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8804   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8805   return Res;
8806 }
8807 
8808 template <typename Derived>
8809 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8810     OMPDistributeDirective *D) {
8811   DeclarationNameInfo DirName;
8812   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8813                                              D->getBeginLoc());
8814   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8815   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8816   return Res;
8817 }
8818 
8819 template <typename Derived>
8820 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8821     OMPDistributeParallelForDirective *D) {
8822   DeclarationNameInfo DirName;
8823   getDerived().getSema().StartOpenMPDSABlock(
8824       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8825   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8826   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8827   return Res;
8828 }
8829 
8830 template <typename Derived>
8831 StmtResult
8832 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8833     OMPDistributeParallelForSimdDirective *D) {
8834   DeclarationNameInfo DirName;
8835   getDerived().getSema().StartOpenMPDSABlock(
8836       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8837   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8838   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8839   return Res;
8840 }
8841 
8842 template <typename Derived>
8843 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8844     OMPDistributeSimdDirective *D) {
8845   DeclarationNameInfo DirName;
8846   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8847                                              nullptr, D->getBeginLoc());
8848   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8849   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8850   return Res;
8851 }
8852 
8853 template <typename Derived>
8854 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8855     OMPTargetParallelForSimdDirective *D) {
8856   DeclarationNameInfo DirName;
8857   getDerived().getSema().StartOpenMPDSABlock(
8858       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8859   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8860   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8861   return Res;
8862 }
8863 
8864 template <typename Derived>
8865 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8866     OMPTargetSimdDirective *D) {
8867   DeclarationNameInfo DirName;
8868   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8869                                              D->getBeginLoc());
8870   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8871   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8872   return Res;
8873 }
8874 
8875 template <typename Derived>
8876 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8877     OMPTeamsDistributeDirective *D) {
8878   DeclarationNameInfo DirName;
8879   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8880                                              nullptr, D->getBeginLoc());
8881   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8882   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8883   return Res;
8884 }
8885 
8886 template <typename Derived>
8887 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8888     OMPTeamsDistributeSimdDirective *D) {
8889   DeclarationNameInfo DirName;
8890   getDerived().getSema().StartOpenMPDSABlock(
8891       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8892   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8893   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8894   return Res;
8895 }
8896 
8897 template <typename Derived>
8898 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8899     OMPTeamsDistributeParallelForSimdDirective *D) {
8900   DeclarationNameInfo DirName;
8901   getDerived().getSema().StartOpenMPDSABlock(
8902       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8903       D->getBeginLoc());
8904   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8905   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8906   return Res;
8907 }
8908 
8909 template <typename Derived>
8910 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8911     OMPTeamsDistributeParallelForDirective *D) {
8912   DeclarationNameInfo DirName;
8913   getDerived().getSema().StartOpenMPDSABlock(
8914       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8915   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8916   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8917   return Res;
8918 }
8919 
8920 template <typename Derived>
8921 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8922     OMPTargetTeamsDirective *D) {
8923   DeclarationNameInfo DirName;
8924   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8925                                              nullptr, D->getBeginLoc());
8926   auto Res = getDerived().TransformOMPExecutableDirective(D);
8927   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8928   return Res;
8929 }
8930 
8931 template <typename Derived>
8932 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8933     OMPTargetTeamsDistributeDirective *D) {
8934   DeclarationNameInfo DirName;
8935   getDerived().getSema().StartOpenMPDSABlock(
8936       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8937   auto Res = getDerived().TransformOMPExecutableDirective(D);
8938   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8939   return Res;
8940 }
8941 
8942 template <typename Derived>
8943 StmtResult
8944 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8945     OMPTargetTeamsDistributeParallelForDirective *D) {
8946   DeclarationNameInfo DirName;
8947   getDerived().getSema().StartOpenMPDSABlock(
8948       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8949       D->getBeginLoc());
8950   auto Res = getDerived().TransformOMPExecutableDirective(D);
8951   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8952   return Res;
8953 }
8954 
8955 template <typename Derived>
8956 StmtResult TreeTransform<Derived>::
8957     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8958         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8959   DeclarationNameInfo DirName;
8960   getDerived().getSema().StartOpenMPDSABlock(
8961       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8962       D->getBeginLoc());
8963   auto Res = getDerived().TransformOMPExecutableDirective(D);
8964   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8965   return Res;
8966 }
8967 
8968 template <typename Derived>
8969 StmtResult
8970 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8971     OMPTargetTeamsDistributeSimdDirective *D) {
8972   DeclarationNameInfo DirName;
8973   getDerived().getSema().StartOpenMPDSABlock(
8974       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8975   auto Res = getDerived().TransformOMPExecutableDirective(D);
8976   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8977   return Res;
8978 }
8979 
8980 
8981 //===----------------------------------------------------------------------===//
8982 // OpenMP clause transformation
8983 //===----------------------------------------------------------------------===//
8984 template <typename Derived>
8985 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8986   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8987   if (Cond.isInvalid())
8988     return nullptr;
8989   return getDerived().RebuildOMPIfClause(
8990       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8991       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8992 }
8993 
8994 template <typename Derived>
8995 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8996   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8997   if (Cond.isInvalid())
8998     return nullptr;
8999   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9000                                             C->getLParenLoc(), C->getEndLoc());
9001 }
9002 
9003 template <typename Derived>
9004 OMPClause *
9005 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9006   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9007   if (NumThreads.isInvalid())
9008     return nullptr;
9009   return getDerived().RebuildOMPNumThreadsClause(
9010       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9011 }
9012 
9013 template <typename Derived>
9014 OMPClause *
9015 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9016   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9017   if (E.isInvalid())
9018     return nullptr;
9019   return getDerived().RebuildOMPSafelenClause(
9020       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9021 }
9022 
9023 template <typename Derived>
9024 OMPClause *
9025 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9026   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9027   if (E.isInvalid())
9028     return nullptr;
9029   return getDerived().RebuildOMPAllocatorClause(
9030       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9031 }
9032 
9033 template <typename Derived>
9034 OMPClause *
9035 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9036   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9037   if (E.isInvalid())
9038     return nullptr;
9039   return getDerived().RebuildOMPSimdlenClause(
9040       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9041 }
9042 
9043 template <typename Derived>
9044 OMPClause *
9045 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9046   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9047   if (E.isInvalid())
9048     return nullptr;
9049   return getDerived().RebuildOMPCollapseClause(
9050       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9051 }
9052 
9053 template <typename Derived>
9054 OMPClause *
9055 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9056   return getDerived().RebuildOMPDefaultClause(
9057       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9058       C->getLParenLoc(), C->getEndLoc());
9059 }
9060 
9061 template <typename Derived>
9062 OMPClause *
9063 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9064   return getDerived().RebuildOMPProcBindClause(
9065       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9066       C->getLParenLoc(), C->getEndLoc());
9067 }
9068 
9069 template <typename Derived>
9070 OMPClause *
9071 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9072   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9073   if (E.isInvalid())
9074     return nullptr;
9075   return getDerived().RebuildOMPScheduleClause(
9076       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9077       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9078       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9079       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9080 }
9081 
9082 template <typename Derived>
9083 OMPClause *
9084 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9085   ExprResult E;
9086   if (auto *Num = C->getNumForLoops()) {
9087     E = getDerived().TransformExpr(Num);
9088     if (E.isInvalid())
9089       return nullptr;
9090   }
9091   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9092                                               C->getLParenLoc(), E.get());
9093 }
9094 
9095 template <typename Derived>
9096 OMPClause *
9097 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9098   ExprResult E;
9099   if (Expr *Evt = C->getEventHandler()) {
9100     E = getDerived().TransformExpr(Evt);
9101     if (E.isInvalid())
9102       return nullptr;
9103   }
9104   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9105                                              C->getLParenLoc(), C->getEndLoc());
9106 }
9107 
9108 template <typename Derived>
9109 OMPClause *
9110 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9111   // No need to rebuild this clause, no template-dependent parameters.
9112   return C;
9113 }
9114 
9115 template <typename Derived>
9116 OMPClause *
9117 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9118   // No need to rebuild this clause, no template-dependent parameters.
9119   return C;
9120 }
9121 
9122 template <typename Derived>
9123 OMPClause *
9124 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9125   // No need to rebuild this clause, no template-dependent parameters.
9126   return C;
9127 }
9128 
9129 template <typename Derived>
9130 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9131   // No need to rebuild this clause, no template-dependent parameters.
9132   return C;
9133 }
9134 
9135 template <typename Derived>
9136 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9137   // No need to rebuild this clause, no template-dependent parameters.
9138   return C;
9139 }
9140 
9141 template <typename Derived>
9142 OMPClause *
9143 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9144   // No need to rebuild this clause, no template-dependent parameters.
9145   return C;
9146 }
9147 
9148 template <typename Derived>
9149 OMPClause *
9150 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9151   // No need to rebuild this clause, no template-dependent parameters.
9152   return C;
9153 }
9154 
9155 template <typename Derived>
9156 OMPClause *
9157 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9158   // No need to rebuild this clause, no template-dependent parameters.
9159   return C;
9160 }
9161 
9162 template <typename Derived>
9163 OMPClause *
9164 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9165   // No need to rebuild this clause, no template-dependent parameters.
9166   return C;
9167 }
9168 
9169 template <typename Derived>
9170 OMPClause *
9171 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9172   // No need to rebuild this clause, no template-dependent parameters.
9173   return C;
9174 }
9175 
9176 template <typename Derived>
9177 OMPClause *
9178 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9179   // No need to rebuild this clause, no template-dependent parameters.
9180   return C;
9181 }
9182 
9183 template <typename Derived>
9184 OMPClause *
9185 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9186   // No need to rebuild this clause, no template-dependent parameters.
9187   return C;
9188 }
9189 
9190 template <typename Derived>
9191 OMPClause *
9192 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9193   // No need to rebuild this clause, no template-dependent parameters.
9194   return C;
9195 }
9196 
9197 template <typename Derived>
9198 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9199   // No need to rebuild this clause, no template-dependent parameters.
9200   return C;
9201 }
9202 
9203 template <typename Derived>
9204 OMPClause *
9205 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9206   // No need to rebuild this clause, no template-dependent parameters.
9207   return C;
9208 }
9209 
9210 template <typename Derived>
9211 OMPClause *
9212 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9213   // No need to rebuild this clause, no template-dependent parameters.
9214   return C;
9215 }
9216 
9217 template <typename Derived>
9218 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9219     OMPUnifiedAddressClause *C) {
9220   llvm_unreachable("unified_address clause cannot appear in dependent context");
9221 }
9222 
9223 template <typename Derived>
9224 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9225     OMPUnifiedSharedMemoryClause *C) {
9226   llvm_unreachable(
9227       "unified_shared_memory clause cannot appear in dependent context");
9228 }
9229 
9230 template <typename Derived>
9231 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9232     OMPReverseOffloadClause *C) {
9233   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9234 }
9235 
9236 template <typename Derived>
9237 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9238     OMPDynamicAllocatorsClause *C) {
9239   llvm_unreachable(
9240       "dynamic_allocators clause cannot appear in dependent context");
9241 }
9242 
9243 template <typename Derived>
9244 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9245     OMPAtomicDefaultMemOrderClause *C) {
9246   llvm_unreachable(
9247       "atomic_default_mem_order clause cannot appear in dependent context");
9248 }
9249 
9250 template <typename Derived>
9251 OMPClause *
9252 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9253   llvm::SmallVector<Expr *, 16> Vars;
9254   Vars.reserve(C->varlist_size());
9255   for (auto *VE : C->varlists()) {
9256     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9257     if (EVar.isInvalid())
9258       return nullptr;
9259     Vars.push_back(EVar.get());
9260   }
9261   return getDerived().RebuildOMPPrivateClause(
9262       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9263 }
9264 
9265 template <typename Derived>
9266 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9267     OMPFirstprivateClause *C) {
9268   llvm::SmallVector<Expr *, 16> Vars;
9269   Vars.reserve(C->varlist_size());
9270   for (auto *VE : C->varlists()) {
9271     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9272     if (EVar.isInvalid())
9273       return nullptr;
9274     Vars.push_back(EVar.get());
9275   }
9276   return getDerived().RebuildOMPFirstprivateClause(
9277       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9278 }
9279 
9280 template <typename Derived>
9281 OMPClause *
9282 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9283   llvm::SmallVector<Expr *, 16> Vars;
9284   Vars.reserve(C->varlist_size());
9285   for (auto *VE : C->varlists()) {
9286     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9287     if (EVar.isInvalid())
9288       return nullptr;
9289     Vars.push_back(EVar.get());
9290   }
9291   return getDerived().RebuildOMPLastprivateClause(
9292       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9293       C->getLParenLoc(), C->getEndLoc());
9294 }
9295 
9296 template <typename Derived>
9297 OMPClause *
9298 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9299   llvm::SmallVector<Expr *, 16> Vars;
9300   Vars.reserve(C->varlist_size());
9301   for (auto *VE : C->varlists()) {
9302     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9303     if (EVar.isInvalid())
9304       return nullptr;
9305     Vars.push_back(EVar.get());
9306   }
9307   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9308                                              C->getLParenLoc(), C->getEndLoc());
9309 }
9310 
9311 template <typename Derived>
9312 OMPClause *
9313 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9314   llvm::SmallVector<Expr *, 16> Vars;
9315   Vars.reserve(C->varlist_size());
9316   for (auto *VE : C->varlists()) {
9317     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9318     if (EVar.isInvalid())
9319       return nullptr;
9320     Vars.push_back(EVar.get());
9321   }
9322   CXXScopeSpec ReductionIdScopeSpec;
9323   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9324 
9325   DeclarationNameInfo NameInfo = C->getNameInfo();
9326   if (NameInfo.getName()) {
9327     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9328     if (!NameInfo.getName())
9329       return nullptr;
9330   }
9331   // Build a list of all UDR decls with the same names ranged by the Scopes.
9332   // The Scope boundary is a duplication of the previous decl.
9333   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9334   for (auto *E : C->reduction_ops()) {
9335     // Transform all the decls.
9336     if (E) {
9337       auto *ULE = cast<UnresolvedLookupExpr>(E);
9338       UnresolvedSet<8> Decls;
9339       for (auto *D : ULE->decls()) {
9340         NamedDecl *InstD =
9341             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9342         Decls.addDecl(InstD, InstD->getAccess());
9343       }
9344       UnresolvedReductions.push_back(
9345        UnresolvedLookupExpr::Create(
9346           SemaRef.Context, /*NamingClass=*/nullptr,
9347           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9348           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9349           Decls.begin(), Decls.end()));
9350     } else
9351       UnresolvedReductions.push_back(nullptr);
9352   }
9353   return getDerived().RebuildOMPReductionClause(
9354       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9355       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9356       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9357 }
9358 
9359 template <typename Derived>
9360 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9361     OMPTaskReductionClause *C) {
9362   llvm::SmallVector<Expr *, 16> Vars;
9363   Vars.reserve(C->varlist_size());
9364   for (auto *VE : C->varlists()) {
9365     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9366     if (EVar.isInvalid())
9367       return nullptr;
9368     Vars.push_back(EVar.get());
9369   }
9370   CXXScopeSpec ReductionIdScopeSpec;
9371   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9372 
9373   DeclarationNameInfo NameInfo = C->getNameInfo();
9374   if (NameInfo.getName()) {
9375     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9376     if (!NameInfo.getName())
9377       return nullptr;
9378   }
9379   // Build a list of all UDR decls with the same names ranged by the Scopes.
9380   // The Scope boundary is a duplication of the previous decl.
9381   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9382   for (auto *E : C->reduction_ops()) {
9383     // Transform all the decls.
9384     if (E) {
9385       auto *ULE = cast<UnresolvedLookupExpr>(E);
9386       UnresolvedSet<8> Decls;
9387       for (auto *D : ULE->decls()) {
9388         NamedDecl *InstD =
9389             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9390         Decls.addDecl(InstD, InstD->getAccess());
9391       }
9392       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9393           SemaRef.Context, /*NamingClass=*/nullptr,
9394           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9395           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9396     } else
9397       UnresolvedReductions.push_back(nullptr);
9398   }
9399   return getDerived().RebuildOMPTaskReductionClause(
9400       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9401       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9402 }
9403 
9404 template <typename Derived>
9405 OMPClause *
9406 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9407   llvm::SmallVector<Expr *, 16> Vars;
9408   Vars.reserve(C->varlist_size());
9409   for (auto *VE : C->varlists()) {
9410     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9411     if (EVar.isInvalid())
9412       return nullptr;
9413     Vars.push_back(EVar.get());
9414   }
9415   CXXScopeSpec ReductionIdScopeSpec;
9416   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9417 
9418   DeclarationNameInfo NameInfo = C->getNameInfo();
9419   if (NameInfo.getName()) {
9420     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9421     if (!NameInfo.getName())
9422       return nullptr;
9423   }
9424   // Build a list of all UDR decls with the same names ranged by the Scopes.
9425   // The Scope boundary is a duplication of the previous decl.
9426   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9427   for (auto *E : C->reduction_ops()) {
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>(getDerived().TransformDecl(E->getExprLoc(), D));
9435         Decls.addDecl(InstD, InstD->getAccess());
9436       }
9437       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9438           SemaRef.Context, /*NamingClass=*/nullptr,
9439           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9440           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9441     } else
9442       UnresolvedReductions.push_back(nullptr);
9443   }
9444   return getDerived().RebuildOMPInReductionClause(
9445       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9446       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9447 }
9448 
9449 template <typename Derived>
9450 OMPClause *
9451 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9452   llvm::SmallVector<Expr *, 16> Vars;
9453   Vars.reserve(C->varlist_size());
9454   for (auto *VE : C->varlists()) {
9455     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9456     if (EVar.isInvalid())
9457       return nullptr;
9458     Vars.push_back(EVar.get());
9459   }
9460   ExprResult Step = getDerived().TransformExpr(C->getStep());
9461   if (Step.isInvalid())
9462     return nullptr;
9463   return getDerived().RebuildOMPLinearClause(
9464       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9465       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9466 }
9467 
9468 template <typename Derived>
9469 OMPClause *
9470 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9471   llvm::SmallVector<Expr *, 16> Vars;
9472   Vars.reserve(C->varlist_size());
9473   for (auto *VE : C->varlists()) {
9474     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9475     if (EVar.isInvalid())
9476       return nullptr;
9477     Vars.push_back(EVar.get());
9478   }
9479   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9480   if (Alignment.isInvalid())
9481     return nullptr;
9482   return getDerived().RebuildOMPAlignedClause(
9483       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9484       C->getColonLoc(), C->getEndLoc());
9485 }
9486 
9487 template <typename Derived>
9488 OMPClause *
9489 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9490   llvm::SmallVector<Expr *, 16> Vars;
9491   Vars.reserve(C->varlist_size());
9492   for (auto *VE : C->varlists()) {
9493     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9494     if (EVar.isInvalid())
9495       return nullptr;
9496     Vars.push_back(EVar.get());
9497   }
9498   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9499                                              C->getLParenLoc(), C->getEndLoc());
9500 }
9501 
9502 template <typename Derived>
9503 OMPClause *
9504 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9505   llvm::SmallVector<Expr *, 16> Vars;
9506   Vars.reserve(C->varlist_size());
9507   for (auto *VE : C->varlists()) {
9508     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9509     if (EVar.isInvalid())
9510       return nullptr;
9511     Vars.push_back(EVar.get());
9512   }
9513   return getDerived().RebuildOMPCopyprivateClause(
9514       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9515 }
9516 
9517 template <typename Derived>
9518 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9519   llvm::SmallVector<Expr *, 16> Vars;
9520   Vars.reserve(C->varlist_size());
9521   for (auto *VE : C->varlists()) {
9522     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9523     if (EVar.isInvalid())
9524       return nullptr;
9525     Vars.push_back(EVar.get());
9526   }
9527   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9528                                             C->getLParenLoc(), C->getEndLoc());
9529 }
9530 
9531 template <typename Derived>
9532 OMPClause *
9533 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9534   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9535   if (E.isInvalid())
9536     return nullptr;
9537   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9538                                              C->getLParenLoc(), C->getEndLoc());
9539 }
9540 
9541 template <typename Derived>
9542 OMPClause *
9543 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9544   llvm::SmallVector<Expr *, 16> Vars;
9545   Expr *DepModifier = C->getModifier();
9546   if (DepModifier) {
9547     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9548     if (DepModRes.isInvalid())
9549       return nullptr;
9550     DepModifier = DepModRes.get();
9551   }
9552   Vars.reserve(C->varlist_size());
9553   for (auto *VE : C->varlists()) {
9554     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9555     if (EVar.isInvalid())
9556       return nullptr;
9557     Vars.push_back(EVar.get());
9558   }
9559   return getDerived().RebuildOMPDependClause(
9560       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9561       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9562       C->getEndLoc());
9563 }
9564 
9565 template <typename Derived>
9566 OMPClause *
9567 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9568   ExprResult E = getDerived().TransformExpr(C->getDevice());
9569   if (E.isInvalid())
9570     return nullptr;
9571   return getDerived().RebuildOMPDeviceClause(
9572       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9573       C->getModifierLoc(), C->getEndLoc());
9574 }
9575 
9576 template <typename Derived, class T>
9577 bool transformOMPMappableExprListClause(
9578     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9579     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9580     DeclarationNameInfo &MapperIdInfo,
9581     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9582   // Transform expressions in the list.
9583   Vars.reserve(C->varlist_size());
9584   for (auto *VE : C->varlists()) {
9585     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9586     if (EVar.isInvalid())
9587       return true;
9588     Vars.push_back(EVar.get());
9589   }
9590   // Transform mapper scope specifier and identifier.
9591   NestedNameSpecifierLoc QualifierLoc;
9592   if (C->getMapperQualifierLoc()) {
9593     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9594         C->getMapperQualifierLoc());
9595     if (!QualifierLoc)
9596       return true;
9597   }
9598   MapperIdScopeSpec.Adopt(QualifierLoc);
9599   MapperIdInfo = C->getMapperIdInfo();
9600   if (MapperIdInfo.getName()) {
9601     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9602     if (!MapperIdInfo.getName())
9603       return true;
9604   }
9605   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9606   // the previous user-defined mapper lookup in dependent environment.
9607   for (auto *E : C->mapperlists()) {
9608     // Transform all the decls.
9609     if (E) {
9610       auto *ULE = cast<UnresolvedLookupExpr>(E);
9611       UnresolvedSet<8> Decls;
9612       for (auto *D : ULE->decls()) {
9613         NamedDecl *InstD =
9614             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9615         Decls.addDecl(InstD, InstD->getAccess());
9616       }
9617       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9618           TT.getSema().Context, /*NamingClass=*/nullptr,
9619           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9620           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9621           Decls.end()));
9622     } else {
9623       UnresolvedMappers.push_back(nullptr);
9624     }
9625   }
9626   return false;
9627 }
9628 
9629 template <typename Derived>
9630 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9631   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9632   llvm::SmallVector<Expr *, 16> Vars;
9633   CXXScopeSpec MapperIdScopeSpec;
9634   DeclarationNameInfo MapperIdInfo;
9635   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9636   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9637           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9638     return nullptr;
9639   return getDerived().RebuildOMPMapClause(
9640       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9641       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9642       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9643 }
9644 
9645 template <typename Derived>
9646 OMPClause *
9647 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9648   Expr *Allocator = C->getAllocator();
9649   if (Allocator) {
9650     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9651     if (AllocatorRes.isInvalid())
9652       return nullptr;
9653     Allocator = AllocatorRes.get();
9654   }
9655   llvm::SmallVector<Expr *, 16> Vars;
9656   Vars.reserve(C->varlist_size());
9657   for (auto *VE : C->varlists()) {
9658     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9659     if (EVar.isInvalid())
9660       return nullptr;
9661     Vars.push_back(EVar.get());
9662   }
9663   return getDerived().RebuildOMPAllocateClause(
9664       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9665       C->getEndLoc());
9666 }
9667 
9668 template <typename Derived>
9669 OMPClause *
9670 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9671   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9672   if (E.isInvalid())
9673     return nullptr;
9674   return getDerived().RebuildOMPNumTeamsClause(
9675       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9676 }
9677 
9678 template <typename Derived>
9679 OMPClause *
9680 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9681   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9682   if (E.isInvalid())
9683     return nullptr;
9684   return getDerived().RebuildOMPThreadLimitClause(
9685       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9686 }
9687 
9688 template <typename Derived>
9689 OMPClause *
9690 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9691   ExprResult E = getDerived().TransformExpr(C->getPriority());
9692   if (E.isInvalid())
9693     return nullptr;
9694   return getDerived().RebuildOMPPriorityClause(
9695       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9696 }
9697 
9698 template <typename Derived>
9699 OMPClause *
9700 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9701   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9702   if (E.isInvalid())
9703     return nullptr;
9704   return getDerived().RebuildOMPGrainsizeClause(
9705       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9706 }
9707 
9708 template <typename Derived>
9709 OMPClause *
9710 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9711   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9712   if (E.isInvalid())
9713     return nullptr;
9714   return getDerived().RebuildOMPNumTasksClause(
9715       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9716 }
9717 
9718 template <typename Derived>
9719 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9720   ExprResult E = getDerived().TransformExpr(C->getHint());
9721   if (E.isInvalid())
9722     return nullptr;
9723   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9724                                            C->getLParenLoc(), C->getEndLoc());
9725 }
9726 
9727 template <typename Derived>
9728 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9729     OMPDistScheduleClause *C) {
9730   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9731   if (E.isInvalid())
9732     return nullptr;
9733   return getDerived().RebuildOMPDistScheduleClause(
9734       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9735       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9736 }
9737 
9738 template <typename Derived>
9739 OMPClause *
9740 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9741   // Rebuild Defaultmap Clause since we need to invoke the checking of
9742   // defaultmap(none:variable-category) after template initialization.
9743   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9744                                                  C->getDefaultmapKind(),
9745                                                  C->getBeginLoc(),
9746                                                  C->getLParenLoc(),
9747                                                  C->getDefaultmapModifierLoc(),
9748                                                  C->getDefaultmapKindLoc(),
9749                                                  C->getEndLoc());
9750 }
9751 
9752 template <typename Derived>
9753 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9754   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9755   llvm::SmallVector<Expr *, 16> Vars;
9756   CXXScopeSpec MapperIdScopeSpec;
9757   DeclarationNameInfo MapperIdInfo;
9758   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9759   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9760           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9761     return nullptr;
9762   return getDerived().RebuildOMPToClause(
9763       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9764       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9765 }
9766 
9767 template <typename Derived>
9768 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9769   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9770   llvm::SmallVector<Expr *, 16> Vars;
9771   CXXScopeSpec MapperIdScopeSpec;
9772   DeclarationNameInfo MapperIdInfo;
9773   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9774   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9775           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9776     return nullptr;
9777   return getDerived().RebuildOMPFromClause(
9778       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9779       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9780 }
9781 
9782 template <typename Derived>
9783 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9784     OMPUseDevicePtrClause *C) {
9785   llvm::SmallVector<Expr *, 16> Vars;
9786   Vars.reserve(C->varlist_size());
9787   for (auto *VE : C->varlists()) {
9788     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9789     if (EVar.isInvalid())
9790       return nullptr;
9791     Vars.push_back(EVar.get());
9792   }
9793   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9794   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9795 }
9796 
9797 template <typename Derived>
9798 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
9799     OMPUseDeviceAddrClause *C) {
9800   llvm::SmallVector<Expr *, 16> Vars;
9801   Vars.reserve(C->varlist_size());
9802   for (auto *VE : C->varlists()) {
9803     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9804     if (EVar.isInvalid())
9805       return nullptr;
9806     Vars.push_back(EVar.get());
9807   }
9808   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9809   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
9810 }
9811 
9812 template <typename Derived>
9813 OMPClause *
9814 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9815   llvm::SmallVector<Expr *, 16> Vars;
9816   Vars.reserve(C->varlist_size());
9817   for (auto *VE : C->varlists()) {
9818     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9819     if (EVar.isInvalid())
9820       return nullptr;
9821     Vars.push_back(EVar.get());
9822   }
9823   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9824   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9825 }
9826 
9827 template <typename Derived>
9828 OMPClause *
9829 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9830   llvm::SmallVector<Expr *, 16> Vars;
9831   Vars.reserve(C->varlist_size());
9832   for (auto *VE : C->varlists()) {
9833     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9834     if (EVar.isInvalid())
9835       return nullptr;
9836     Vars.push_back(EVar.get());
9837   }
9838   return getDerived().RebuildOMPNontemporalClause(
9839       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9840 }
9841 
9842 template <typename Derived>
9843 OMPClause *
9844 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
9845   llvm::SmallVector<Expr *, 16> Vars;
9846   Vars.reserve(C->varlist_size());
9847   for (auto *VE : C->varlists()) {
9848     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9849     if (EVar.isInvalid())
9850       return nullptr;
9851     Vars.push_back(EVar.get());
9852   }
9853   return getDerived().RebuildOMPInclusiveClause(
9854       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9855 }
9856 
9857 template <typename Derived>
9858 OMPClause *
9859 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
9860   llvm::SmallVector<Expr *, 16> Vars;
9861   Vars.reserve(C->varlist_size());
9862   for (auto *VE : C->varlists()) {
9863     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9864     if (EVar.isInvalid())
9865       return nullptr;
9866     Vars.push_back(EVar.get());
9867   }
9868   return getDerived().RebuildOMPExclusiveClause(
9869       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9870 }
9871 
9872 template <typename Derived>
9873 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
9874     OMPUsesAllocatorsClause *C) {
9875   SmallVector<Sema::UsesAllocatorsData, 16> Data;
9876   Data.reserve(C->getNumberOfAllocators());
9877   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
9878     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
9879     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
9880     if (Allocator.isInvalid())
9881       continue;
9882     ExprResult AllocatorTraits;
9883     if (Expr *AT = D.AllocatorTraits) {
9884       AllocatorTraits = getDerived().TransformExpr(AT);
9885       if (AllocatorTraits.isInvalid())
9886         continue;
9887     }
9888     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
9889     NewD.Allocator = Allocator.get();
9890     NewD.AllocatorTraits = AllocatorTraits.get();
9891     NewD.LParenLoc = D.LParenLoc;
9892     NewD.RParenLoc = D.RParenLoc;
9893   }
9894   return getDerived().RebuildOMPUsesAllocatorsClause(
9895       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9896 }
9897 
9898 template <typename Derived>
9899 OMPClause *
9900 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
9901   SmallVector<Expr *, 4> Locators;
9902   Locators.reserve(C->varlist_size());
9903   ExprResult ModifierRes;
9904   if (Expr *Modifier = C->getModifier()) {
9905     ModifierRes = getDerived().TransformExpr(Modifier);
9906     if (ModifierRes.isInvalid())
9907       return nullptr;
9908   }
9909   for (Expr *E : C->varlists()) {
9910     ExprResult Locator = getDerived().TransformExpr(E);
9911     if (Locator.isInvalid())
9912       continue;
9913     Locators.push_back(Locator.get());
9914   }
9915   return getDerived().RebuildOMPAffinityClause(
9916       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
9917       ModifierRes.get(), Locators);
9918 }
9919 
9920 template <typename Derived>
9921 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
9922   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
9923                                             C->getBeginLoc(), C->getLParenLoc(),
9924                                             C->getEndLoc());
9925 }
9926 
9927 //===----------------------------------------------------------------------===//
9928 // Expression transformation
9929 //===----------------------------------------------------------------------===//
9930 template<typename Derived>
9931 ExprResult
9932 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9933   return TransformExpr(E->getSubExpr());
9934 }
9935 
9936 template<typename Derived>
9937 ExprResult
9938 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9939   if (!E->isTypeDependent())
9940     return E;
9941 
9942   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9943                                             E->getIdentKind());
9944 }
9945 
9946 template<typename Derived>
9947 ExprResult
9948 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9949   NestedNameSpecifierLoc QualifierLoc;
9950   if (E->getQualifierLoc()) {
9951     QualifierLoc
9952       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9953     if (!QualifierLoc)
9954       return ExprError();
9955   }
9956 
9957   ValueDecl *ND
9958     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9959                                                          E->getDecl()));
9960   if (!ND)
9961     return ExprError();
9962 
9963   NamedDecl *Found = ND;
9964   if (E->getFoundDecl() != E->getDecl()) {
9965     Found = cast_or_null<NamedDecl>(
9966         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
9967     if (!Found)
9968       return ExprError();
9969   }
9970 
9971   DeclarationNameInfo NameInfo = E->getNameInfo();
9972   if (NameInfo.getName()) {
9973     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9974     if (!NameInfo.getName())
9975       return ExprError();
9976   }
9977 
9978   if (!getDerived().AlwaysRebuild() &&
9979       QualifierLoc == E->getQualifierLoc() &&
9980       ND == E->getDecl() &&
9981       Found == E->getFoundDecl() &&
9982       NameInfo.getName() == E->getDecl()->getDeclName() &&
9983       !E->hasExplicitTemplateArgs()) {
9984 
9985     // Mark it referenced in the new context regardless.
9986     // FIXME: this is a bit instantiation-specific.
9987     SemaRef.MarkDeclRefReferenced(E);
9988 
9989     return E;
9990   }
9991 
9992   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9993   if (E->hasExplicitTemplateArgs()) {
9994     TemplateArgs = &TransArgs;
9995     TransArgs.setLAngleLoc(E->getLAngleLoc());
9996     TransArgs.setRAngleLoc(E->getRAngleLoc());
9997     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9998                                                 E->getNumTemplateArgs(),
9999                                                 TransArgs))
10000       return ExprError();
10001   }
10002 
10003   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10004                                          Found, TemplateArgs);
10005 }
10006 
10007 template<typename Derived>
10008 ExprResult
10009 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10010   return E;
10011 }
10012 
10013 template <typename Derived>
10014 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10015     FixedPointLiteral *E) {
10016   return E;
10017 }
10018 
10019 template<typename Derived>
10020 ExprResult
10021 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10022   return E;
10023 }
10024 
10025 template<typename Derived>
10026 ExprResult
10027 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10028   return E;
10029 }
10030 
10031 template<typename Derived>
10032 ExprResult
10033 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10034   return E;
10035 }
10036 
10037 template<typename Derived>
10038 ExprResult
10039 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10040   return E;
10041 }
10042 
10043 template<typename Derived>
10044 ExprResult
10045 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10046   if (FunctionDecl *FD = E->getDirectCallee())
10047     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10048   return SemaRef.MaybeBindToTemporary(E);
10049 }
10050 
10051 template<typename Derived>
10052 ExprResult
10053 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10054   ExprResult ControllingExpr =
10055     getDerived().TransformExpr(E->getControllingExpr());
10056   if (ControllingExpr.isInvalid())
10057     return ExprError();
10058 
10059   SmallVector<Expr *, 4> AssocExprs;
10060   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10061   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10062     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10063     if (TSI) {
10064       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10065       if (!AssocType)
10066         return ExprError();
10067       AssocTypes.push_back(AssocType);
10068     } else {
10069       AssocTypes.push_back(nullptr);
10070     }
10071 
10072     ExprResult AssocExpr =
10073         getDerived().TransformExpr(Assoc.getAssociationExpr());
10074     if (AssocExpr.isInvalid())
10075       return ExprError();
10076     AssocExprs.push_back(AssocExpr.get());
10077   }
10078 
10079   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10080                                                   E->getDefaultLoc(),
10081                                                   E->getRParenLoc(),
10082                                                   ControllingExpr.get(),
10083                                                   AssocTypes,
10084                                                   AssocExprs);
10085 }
10086 
10087 template<typename Derived>
10088 ExprResult
10089 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10090   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10091   if (SubExpr.isInvalid())
10092     return ExprError();
10093 
10094   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10095     return E;
10096 
10097   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10098                                        E->getRParen());
10099 }
10100 
10101 /// The operand of a unary address-of operator has special rules: it's
10102 /// allowed to refer to a non-static member of a class even if there's no 'this'
10103 /// object available.
10104 template<typename Derived>
10105 ExprResult
10106 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10107   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10108     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10109   else
10110     return getDerived().TransformExpr(E);
10111 }
10112 
10113 template<typename Derived>
10114 ExprResult
10115 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10116   ExprResult SubExpr;
10117   if (E->getOpcode() == UO_AddrOf)
10118     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10119   else
10120     SubExpr = TransformExpr(E->getSubExpr());
10121   if (SubExpr.isInvalid())
10122     return ExprError();
10123 
10124   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10125     return E;
10126 
10127   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10128                                            E->getOpcode(),
10129                                            SubExpr.get());
10130 }
10131 
10132 template<typename Derived>
10133 ExprResult
10134 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10135   // Transform the type.
10136   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10137   if (!Type)
10138     return ExprError();
10139 
10140   // Transform all of the components into components similar to what the
10141   // parser uses.
10142   // FIXME: It would be slightly more efficient in the non-dependent case to
10143   // just map FieldDecls, rather than requiring the rebuilder to look for
10144   // the fields again. However, __builtin_offsetof is rare enough in
10145   // template code that we don't care.
10146   bool ExprChanged = false;
10147   typedef Sema::OffsetOfComponent Component;
10148   SmallVector<Component, 4> Components;
10149   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10150     const OffsetOfNode &ON = E->getComponent(I);
10151     Component Comp;
10152     Comp.isBrackets = true;
10153     Comp.LocStart = ON.getSourceRange().getBegin();
10154     Comp.LocEnd = ON.getSourceRange().getEnd();
10155     switch (ON.getKind()) {
10156     case OffsetOfNode::Array: {
10157       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10158       ExprResult Index = getDerived().TransformExpr(FromIndex);
10159       if (Index.isInvalid())
10160         return ExprError();
10161 
10162       ExprChanged = ExprChanged || Index.get() != FromIndex;
10163       Comp.isBrackets = true;
10164       Comp.U.E = Index.get();
10165       break;
10166     }
10167 
10168     case OffsetOfNode::Field:
10169     case OffsetOfNode::Identifier:
10170       Comp.isBrackets = false;
10171       Comp.U.IdentInfo = ON.getFieldName();
10172       if (!Comp.U.IdentInfo)
10173         continue;
10174 
10175       break;
10176 
10177     case OffsetOfNode::Base:
10178       // Will be recomputed during the rebuild.
10179       continue;
10180     }
10181 
10182     Components.push_back(Comp);
10183   }
10184 
10185   // If nothing changed, retain the existing expression.
10186   if (!getDerived().AlwaysRebuild() &&
10187       Type == E->getTypeSourceInfo() &&
10188       !ExprChanged)
10189     return E;
10190 
10191   // Build a new offsetof expression.
10192   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10193                                           Components, E->getRParenLoc());
10194 }
10195 
10196 template<typename Derived>
10197 ExprResult
10198 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10199   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10200          "opaque value expression requires transformation");
10201   return E;
10202 }
10203 
10204 template<typename Derived>
10205 ExprResult
10206 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10207   return E;
10208 }
10209 
10210 template <typename Derived>
10211 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10212   llvm::SmallVector<Expr *, 8> Children;
10213   bool Changed = false;
10214   for (Expr *C : E->subExpressions()) {
10215     ExprResult NewC = getDerived().TransformExpr(C);
10216     if (NewC.isInvalid())
10217       return ExprError();
10218     Children.push_back(NewC.get());
10219 
10220     Changed |= NewC.get() != C;
10221   }
10222   if (!getDerived().AlwaysRebuild() && !Changed)
10223     return E;
10224   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10225                                           Children, E->getType());
10226 }
10227 
10228 template<typename Derived>
10229 ExprResult
10230 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10231   // Rebuild the syntactic form.  The original syntactic form has
10232   // opaque-value expressions in it, so strip those away and rebuild
10233   // the result.  This is a really awful way of doing this, but the
10234   // better solution (rebuilding the semantic expressions and
10235   // rebinding OVEs as necessary) doesn't work; we'd need
10236   // TreeTransform to not strip away implicit conversions.
10237   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10238   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10239   if (result.isInvalid()) return ExprError();
10240 
10241   // If that gives us a pseudo-object result back, the pseudo-object
10242   // expression must have been an lvalue-to-rvalue conversion which we
10243   // should reapply.
10244   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10245     result = SemaRef.checkPseudoObjectRValue(result.get());
10246 
10247   return result;
10248 }
10249 
10250 template<typename Derived>
10251 ExprResult
10252 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10253                                                 UnaryExprOrTypeTraitExpr *E) {
10254   if (E->isArgumentType()) {
10255     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10256 
10257     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10258     if (!NewT)
10259       return ExprError();
10260 
10261     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10262       return E;
10263 
10264     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10265                                                     E->getKind(),
10266                                                     E->getSourceRange());
10267   }
10268 
10269   // C++0x [expr.sizeof]p1:
10270   //   The operand is either an expression, which is an unevaluated operand
10271   //   [...]
10272   EnterExpressionEvaluationContext Unevaluated(
10273       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10274       Sema::ReuseLambdaContextDecl);
10275 
10276   // Try to recover if we have something like sizeof(T::X) where X is a type.
10277   // Notably, there must be *exactly* one set of parens if X is a type.
10278   TypeSourceInfo *RecoveryTSI = nullptr;
10279   ExprResult SubExpr;
10280   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10281   if (auto *DRE =
10282           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10283     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10284         PE, DRE, false, &RecoveryTSI);
10285   else
10286     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10287 
10288   if (RecoveryTSI) {
10289     return getDerived().RebuildUnaryExprOrTypeTrait(
10290         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10291   } else if (SubExpr.isInvalid())
10292     return ExprError();
10293 
10294   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10295     return E;
10296 
10297   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10298                                                   E->getOperatorLoc(),
10299                                                   E->getKind(),
10300                                                   E->getSourceRange());
10301 }
10302 
10303 template<typename Derived>
10304 ExprResult
10305 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10306   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10307   if (LHS.isInvalid())
10308     return ExprError();
10309 
10310   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10311   if (RHS.isInvalid())
10312     return ExprError();
10313 
10314 
10315   if (!getDerived().AlwaysRebuild() &&
10316       LHS.get() == E->getLHS() &&
10317       RHS.get() == E->getRHS())
10318     return E;
10319 
10320   return getDerived().RebuildArraySubscriptExpr(
10321       LHS.get(),
10322       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10323 }
10324 
10325 template <typename Derived>
10326 ExprResult
10327 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10328   ExprResult Base = getDerived().TransformExpr(E->getBase());
10329   if (Base.isInvalid())
10330     return ExprError();
10331 
10332   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10333   if (RowIdx.isInvalid())
10334     return ExprError();
10335 
10336   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10337   if (ColumnIdx.isInvalid())
10338     return ExprError();
10339 
10340   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10341       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10342     return E;
10343 
10344   return getDerived().RebuildMatrixSubscriptExpr(
10345       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10346 }
10347 
10348 template <typename Derived>
10349 ExprResult
10350 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10351   ExprResult Base = getDerived().TransformExpr(E->getBase());
10352   if (Base.isInvalid())
10353     return ExprError();
10354 
10355   ExprResult LowerBound;
10356   if (E->getLowerBound()) {
10357     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10358     if (LowerBound.isInvalid())
10359       return ExprError();
10360   }
10361 
10362   ExprResult Length;
10363   if (E->getLength()) {
10364     Length = getDerived().TransformExpr(E->getLength());
10365     if (Length.isInvalid())
10366       return ExprError();
10367   }
10368 
10369   ExprResult Stride;
10370   if (Expr *Str = E->getStride()) {
10371     Stride = getDerived().TransformExpr(Str);
10372     if (Stride.isInvalid())
10373       return ExprError();
10374   }
10375 
10376   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10377       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10378     return E;
10379 
10380   return getDerived().RebuildOMPArraySectionExpr(
10381       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10382       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10383       E->getRBracketLoc());
10384 }
10385 
10386 template <typename Derived>
10387 ExprResult
10388 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10389   ExprResult Base = getDerived().TransformExpr(E->getBase());
10390   if (Base.isInvalid())
10391     return ExprError();
10392 
10393   SmallVector<Expr *, 4> Dims;
10394   bool ErrorFound = false;
10395   for (Expr *Dim : E->getDimensions()) {
10396     ExprResult DimRes = getDerived().TransformExpr(Dim);
10397     if (DimRes.isInvalid()) {
10398       ErrorFound = true;
10399       continue;
10400     }
10401     Dims.push_back(DimRes.get());
10402   }
10403 
10404   if (ErrorFound)
10405     return ExprError();
10406   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10407                                                  E->getRParenLoc(), Dims,
10408                                                  E->getBracketsRanges());
10409 }
10410 
10411 template <typename Derived>
10412 ExprResult
10413 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10414   unsigned NumIterators = E->numOfIterators();
10415   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10416 
10417   bool ErrorFound = false;
10418   bool NeedToRebuild = getDerived().AlwaysRebuild();
10419   for (unsigned I = 0; I < NumIterators; ++I) {
10420     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10421     Data[I].DeclIdent = D->getIdentifier();
10422     Data[I].DeclIdentLoc = D->getLocation();
10423     if (D->getLocation() == D->getBeginLoc()) {
10424       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10425              "Implicit type must be int.");
10426     } else {
10427       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10428       QualType DeclTy = getDerived().TransformType(D->getType());
10429       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10430     }
10431     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10432     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10433     ExprResult End = getDerived().TransformExpr(Range.End);
10434     ExprResult Step = getDerived().TransformExpr(Range.Step);
10435     ErrorFound = ErrorFound ||
10436                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10437                                                !Data[I].Type.get().isNull())) ||
10438                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10439     if (ErrorFound)
10440       continue;
10441     Data[I].Range.Begin = Begin.get();
10442     Data[I].Range.End = End.get();
10443     Data[I].Range.Step = Step.get();
10444     Data[I].AssignLoc = E->getAssignLoc(I);
10445     Data[I].ColonLoc = E->getColonLoc(I);
10446     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10447     NeedToRebuild =
10448         NeedToRebuild ||
10449         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10450                                        D->getType().getTypePtrOrNull()) ||
10451         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10452         Range.Step != Data[I].Range.Step;
10453   }
10454   if (ErrorFound)
10455     return ExprError();
10456   if (!NeedToRebuild)
10457     return E;
10458 
10459   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10460       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10461   if (!Res.isUsable())
10462     return Res;
10463   auto *IE = cast<OMPIteratorExpr>(Res.get());
10464   for (unsigned I = 0; I < NumIterators; ++I)
10465     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10466                                       IE->getIteratorDecl(I));
10467   return Res;
10468 }
10469 
10470 template<typename Derived>
10471 ExprResult
10472 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10473   // Transform the callee.
10474   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10475   if (Callee.isInvalid())
10476     return ExprError();
10477 
10478   // Transform arguments.
10479   bool ArgChanged = false;
10480   SmallVector<Expr*, 8> Args;
10481   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10482                                   &ArgChanged))
10483     return ExprError();
10484 
10485   if (!getDerived().AlwaysRebuild() &&
10486       Callee.get() == E->getCallee() &&
10487       !ArgChanged)
10488     return SemaRef.MaybeBindToTemporary(E);
10489 
10490   // FIXME: Wrong source location information for the '('.
10491   SourceLocation FakeLParenLoc
10492     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10493 
10494   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10495   if (E->hasStoredFPFeatures()) {
10496     FPOptionsOverride NewOverrides = E->getFPFeatures();
10497     getSema().CurFPFeatures =
10498         NewOverrides.applyOverrides(getSema().getLangOpts());
10499     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10500   }
10501 
10502   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10503                                       Args,
10504                                       E->getRParenLoc());
10505 }
10506 
10507 template<typename Derived>
10508 ExprResult
10509 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10510   ExprResult Base = getDerived().TransformExpr(E->getBase());
10511   if (Base.isInvalid())
10512     return ExprError();
10513 
10514   NestedNameSpecifierLoc QualifierLoc;
10515   if (E->hasQualifier()) {
10516     QualifierLoc
10517       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10518 
10519     if (!QualifierLoc)
10520       return ExprError();
10521   }
10522   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10523 
10524   ValueDecl *Member
10525     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10526                                                          E->getMemberDecl()));
10527   if (!Member)
10528     return ExprError();
10529 
10530   NamedDecl *FoundDecl = E->getFoundDecl();
10531   if (FoundDecl == E->getMemberDecl()) {
10532     FoundDecl = Member;
10533   } else {
10534     FoundDecl = cast_or_null<NamedDecl>(
10535                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10536     if (!FoundDecl)
10537       return ExprError();
10538   }
10539 
10540   if (!getDerived().AlwaysRebuild() &&
10541       Base.get() == E->getBase() &&
10542       QualifierLoc == E->getQualifierLoc() &&
10543       Member == E->getMemberDecl() &&
10544       FoundDecl == E->getFoundDecl() &&
10545       !E->hasExplicitTemplateArgs()) {
10546 
10547     // Mark it referenced in the new context regardless.
10548     // FIXME: this is a bit instantiation-specific.
10549     SemaRef.MarkMemberReferenced(E);
10550 
10551     return E;
10552   }
10553 
10554   TemplateArgumentListInfo TransArgs;
10555   if (E->hasExplicitTemplateArgs()) {
10556     TransArgs.setLAngleLoc(E->getLAngleLoc());
10557     TransArgs.setRAngleLoc(E->getRAngleLoc());
10558     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10559                                                 E->getNumTemplateArgs(),
10560                                                 TransArgs))
10561       return ExprError();
10562   }
10563 
10564   // FIXME: Bogus source location for the operator
10565   SourceLocation FakeOperatorLoc =
10566       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10567 
10568   // FIXME: to do this check properly, we will need to preserve the
10569   // first-qualifier-in-scope here, just in case we had a dependent
10570   // base (and therefore couldn't do the check) and a
10571   // nested-name-qualifier (and therefore could do the lookup).
10572   NamedDecl *FirstQualifierInScope = nullptr;
10573   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10574   if (MemberNameInfo.getName()) {
10575     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10576     if (!MemberNameInfo.getName())
10577       return ExprError();
10578   }
10579 
10580   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10581                                         E->isArrow(),
10582                                         QualifierLoc,
10583                                         TemplateKWLoc,
10584                                         MemberNameInfo,
10585                                         Member,
10586                                         FoundDecl,
10587                                         (E->hasExplicitTemplateArgs()
10588                                            ? &TransArgs : nullptr),
10589                                         FirstQualifierInScope);
10590 }
10591 
10592 template<typename Derived>
10593 ExprResult
10594 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10595   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10596   if (LHS.isInvalid())
10597     return ExprError();
10598 
10599   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10600   if (RHS.isInvalid())
10601     return ExprError();
10602 
10603   if (!getDerived().AlwaysRebuild() &&
10604       LHS.get() == E->getLHS() &&
10605       RHS.get() == E->getRHS())
10606     return E;
10607 
10608   if (E->isCompoundAssignmentOp())
10609     // FPFeatures has already been established from trailing storage
10610     return getDerived().RebuildBinaryOperator(
10611         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10612   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10613   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10614   getSema().CurFPFeatures =
10615       NewOverrides.applyOverrides(getSema().getLangOpts());
10616   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10617   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10618                                             LHS.get(), RHS.get());
10619 }
10620 
10621 template <typename Derived>
10622 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10623     CXXRewrittenBinaryOperator *E) {
10624   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10625 
10626   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10627   if (LHS.isInvalid())
10628     return ExprError();
10629 
10630   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10631   if (RHS.isInvalid())
10632     return ExprError();
10633 
10634   if (!getDerived().AlwaysRebuild() &&
10635       LHS.get() == Decomp.LHS &&
10636       RHS.get() == Decomp.RHS)
10637     return E;
10638 
10639   // Extract the already-resolved callee declarations so that we can restrict
10640   // ourselves to using them as the unqualified lookup results when rebuilding.
10641   UnresolvedSet<2> UnqualLookups;
10642   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10643                             const_cast<Expr *>(Decomp.InnerBinOp)};
10644   for (Expr *PossibleBinOp : PossibleBinOps) {
10645     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10646     if (!Op)
10647       continue;
10648     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10649     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10650       continue;
10651 
10652     // Transform the callee in case we built a call to a local extern
10653     // declaration.
10654     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10655         E->getOperatorLoc(), Callee->getFoundDecl()));
10656     if (!Found)
10657       return ExprError();
10658     UnqualLookups.addDecl(Found);
10659   }
10660 
10661   return getDerived().RebuildCXXRewrittenBinaryOperator(
10662       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10663 }
10664 
10665 template<typename Derived>
10666 ExprResult
10667 TreeTransform<Derived>::TransformCompoundAssignOperator(
10668                                                       CompoundAssignOperator *E) {
10669   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10670   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10671   getSema().CurFPFeatures =
10672       NewOverrides.applyOverrides(getSema().getLangOpts());
10673   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10674   return getDerived().TransformBinaryOperator(E);
10675 }
10676 
10677 template<typename Derived>
10678 ExprResult TreeTransform<Derived>::
10679 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10680   // Just rebuild the common and RHS expressions and see whether we
10681   // get any changes.
10682 
10683   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10684   if (commonExpr.isInvalid())
10685     return ExprError();
10686 
10687   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10688   if (rhs.isInvalid())
10689     return ExprError();
10690 
10691   if (!getDerived().AlwaysRebuild() &&
10692       commonExpr.get() == e->getCommon() &&
10693       rhs.get() == e->getFalseExpr())
10694     return e;
10695 
10696   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10697                                                  e->getQuestionLoc(),
10698                                                  nullptr,
10699                                                  e->getColonLoc(),
10700                                                  rhs.get());
10701 }
10702 
10703 template<typename Derived>
10704 ExprResult
10705 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10706   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10707   if (Cond.isInvalid())
10708     return ExprError();
10709 
10710   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10711   if (LHS.isInvalid())
10712     return ExprError();
10713 
10714   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10715   if (RHS.isInvalid())
10716     return ExprError();
10717 
10718   if (!getDerived().AlwaysRebuild() &&
10719       Cond.get() == E->getCond() &&
10720       LHS.get() == E->getLHS() &&
10721       RHS.get() == E->getRHS())
10722     return E;
10723 
10724   return getDerived().RebuildConditionalOperator(Cond.get(),
10725                                                  E->getQuestionLoc(),
10726                                                  LHS.get(),
10727                                                  E->getColonLoc(),
10728                                                  RHS.get());
10729 }
10730 
10731 template<typename Derived>
10732 ExprResult
10733 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10734   // Implicit casts are eliminated during transformation, since they
10735   // will be recomputed by semantic analysis after transformation.
10736   return getDerived().TransformExpr(E->getSubExprAsWritten());
10737 }
10738 
10739 template<typename Derived>
10740 ExprResult
10741 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10742   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10743   if (!Type)
10744     return ExprError();
10745 
10746   ExprResult SubExpr
10747     = getDerived().TransformExpr(E->getSubExprAsWritten());
10748   if (SubExpr.isInvalid())
10749     return ExprError();
10750 
10751   if (!getDerived().AlwaysRebuild() &&
10752       Type == E->getTypeInfoAsWritten() &&
10753       SubExpr.get() == E->getSubExpr())
10754     return E;
10755 
10756   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10757                                             Type,
10758                                             E->getRParenLoc(),
10759                                             SubExpr.get());
10760 }
10761 
10762 template<typename Derived>
10763 ExprResult
10764 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10765   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10766   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10767   if (!NewT)
10768     return ExprError();
10769 
10770   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10771   if (Init.isInvalid())
10772     return ExprError();
10773 
10774   if (!getDerived().AlwaysRebuild() &&
10775       OldT == NewT &&
10776       Init.get() == E->getInitializer())
10777     return SemaRef.MaybeBindToTemporary(E);
10778 
10779   // Note: the expression type doesn't necessarily match the
10780   // type-as-written, but that's okay, because it should always be
10781   // derivable from the initializer.
10782 
10783   return getDerived().RebuildCompoundLiteralExpr(
10784       E->getLParenLoc(), NewT,
10785       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10786 }
10787 
10788 template<typename Derived>
10789 ExprResult
10790 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10791   ExprResult Base = getDerived().TransformExpr(E->getBase());
10792   if (Base.isInvalid())
10793     return ExprError();
10794 
10795   if (!getDerived().AlwaysRebuild() &&
10796       Base.get() == E->getBase())
10797     return E;
10798 
10799   // FIXME: Bad source location
10800   SourceLocation FakeOperatorLoc =
10801       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10802   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10803                                                   E->getAccessorLoc(),
10804                                                   E->getAccessor());
10805 }
10806 
10807 template<typename Derived>
10808 ExprResult
10809 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10810   if (InitListExpr *Syntactic = E->getSyntacticForm())
10811     E = Syntactic;
10812 
10813   bool InitChanged = false;
10814 
10815   EnterExpressionEvaluationContext Context(
10816       getSema(), EnterExpressionEvaluationContext::InitList);
10817 
10818   SmallVector<Expr*, 4> Inits;
10819   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10820                                   Inits, &InitChanged))
10821     return ExprError();
10822 
10823   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10824     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10825     // in some cases. We can't reuse it in general, because the syntactic and
10826     // semantic forms are linked, and we can't know that semantic form will
10827     // match even if the syntactic form does.
10828   }
10829 
10830   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10831                                       E->getRBraceLoc());
10832 }
10833 
10834 template<typename Derived>
10835 ExprResult
10836 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10837   Designation Desig;
10838 
10839   // transform the initializer value
10840   ExprResult Init = getDerived().TransformExpr(E->getInit());
10841   if (Init.isInvalid())
10842     return ExprError();
10843 
10844   // transform the designators.
10845   SmallVector<Expr*, 4> ArrayExprs;
10846   bool ExprChanged = false;
10847   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10848     if (D.isFieldDesignator()) {
10849       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10850                                                D.getDotLoc(),
10851                                                D.getFieldLoc()));
10852       if (D.getField()) {
10853         FieldDecl *Field = cast_or_null<FieldDecl>(
10854             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10855         if (Field != D.getField())
10856           // Rebuild the expression when the transformed FieldDecl is
10857           // different to the already assigned FieldDecl.
10858           ExprChanged = true;
10859       } else {
10860         // Ensure that the designator expression is rebuilt when there isn't
10861         // a resolved FieldDecl in the designator as we don't want to assign
10862         // a FieldDecl to a pattern designator that will be instantiated again.
10863         ExprChanged = true;
10864       }
10865       continue;
10866     }
10867 
10868     if (D.isArrayDesignator()) {
10869       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10870       if (Index.isInvalid())
10871         return ExprError();
10872 
10873       Desig.AddDesignator(
10874           Designator::getArray(Index.get(), D.getLBracketLoc()));
10875 
10876       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10877       ArrayExprs.push_back(Index.get());
10878       continue;
10879     }
10880 
10881     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10882     ExprResult Start
10883       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10884     if (Start.isInvalid())
10885       return ExprError();
10886 
10887     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10888     if (End.isInvalid())
10889       return ExprError();
10890 
10891     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10892                                                   End.get(),
10893                                                   D.getLBracketLoc(),
10894                                                   D.getEllipsisLoc()));
10895 
10896     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10897                   End.get() != E->getArrayRangeEnd(D);
10898 
10899     ArrayExprs.push_back(Start.get());
10900     ArrayExprs.push_back(End.get());
10901   }
10902 
10903   if (!getDerived().AlwaysRebuild() &&
10904       Init.get() == E->getInit() &&
10905       !ExprChanged)
10906     return E;
10907 
10908   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10909                                                 E->getEqualOrColonLoc(),
10910                                                 E->usesGNUSyntax(), Init.get());
10911 }
10912 
10913 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10914 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10915 template<typename Derived>
10916 ExprResult
10917 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10918     DesignatedInitUpdateExpr *E) {
10919   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10920                    "initializer");
10921   return ExprError();
10922 }
10923 
10924 template<typename Derived>
10925 ExprResult
10926 TreeTransform<Derived>::TransformNoInitExpr(
10927     NoInitExpr *E) {
10928   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10929   return ExprError();
10930 }
10931 
10932 template<typename Derived>
10933 ExprResult
10934 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10935   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10936   return ExprError();
10937 }
10938 
10939 template<typename Derived>
10940 ExprResult
10941 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10942   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10943   return ExprError();
10944 }
10945 
10946 template<typename Derived>
10947 ExprResult
10948 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10949                                                      ImplicitValueInitExpr *E) {
10950   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10951 
10952   // FIXME: Will we ever have proper type location here? Will we actually
10953   // need to transform the type?
10954   QualType T = getDerived().TransformType(E->getType());
10955   if (T.isNull())
10956     return ExprError();
10957 
10958   if (!getDerived().AlwaysRebuild() &&
10959       T == E->getType())
10960     return E;
10961 
10962   return getDerived().RebuildImplicitValueInitExpr(T);
10963 }
10964 
10965 template<typename Derived>
10966 ExprResult
10967 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10968   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10969   if (!TInfo)
10970     return ExprError();
10971 
10972   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10973   if (SubExpr.isInvalid())
10974     return ExprError();
10975 
10976   if (!getDerived().AlwaysRebuild() &&
10977       TInfo == E->getWrittenTypeInfo() &&
10978       SubExpr.get() == E->getSubExpr())
10979     return E;
10980 
10981   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10982                                        TInfo, E->getRParenLoc());
10983 }
10984 
10985 template<typename Derived>
10986 ExprResult
10987 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10988   bool ArgumentChanged = false;
10989   SmallVector<Expr*, 4> Inits;
10990   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10991                      &ArgumentChanged))
10992     return ExprError();
10993 
10994   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10995                                            Inits,
10996                                            E->getRParenLoc());
10997 }
10998 
10999 /// Transform an address-of-label expression.
11000 ///
11001 /// By default, the transformation of an address-of-label expression always
11002 /// rebuilds the expression, so that the label identifier can be resolved to
11003 /// the corresponding label statement by semantic analysis.
11004 template<typename Derived>
11005 ExprResult
11006 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11007   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11008                                         E->getLabel());
11009   if (!LD)
11010     return ExprError();
11011 
11012   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11013                                            cast<LabelDecl>(LD));
11014 }
11015 
11016 template<typename Derived>
11017 ExprResult
11018 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11019   SemaRef.ActOnStartStmtExpr();
11020   StmtResult SubStmt
11021     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11022   if (SubStmt.isInvalid()) {
11023     SemaRef.ActOnStmtExprError();
11024     return ExprError();
11025   }
11026 
11027   unsigned OldDepth = E->getTemplateDepth();
11028   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11029 
11030   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11031       SubStmt.get() == E->getSubStmt()) {
11032     // Calling this an 'error' is unintuitive, but it does the right thing.
11033     SemaRef.ActOnStmtExprError();
11034     return SemaRef.MaybeBindToTemporary(E);
11035   }
11036 
11037   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11038                                       E->getRParenLoc(), NewDepth);
11039 }
11040 
11041 template<typename Derived>
11042 ExprResult
11043 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11044   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11045   if (Cond.isInvalid())
11046     return ExprError();
11047 
11048   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11049   if (LHS.isInvalid())
11050     return ExprError();
11051 
11052   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11053   if (RHS.isInvalid())
11054     return ExprError();
11055 
11056   if (!getDerived().AlwaysRebuild() &&
11057       Cond.get() == E->getCond() &&
11058       LHS.get() == E->getLHS() &&
11059       RHS.get() == E->getRHS())
11060     return E;
11061 
11062   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11063                                         Cond.get(), LHS.get(), RHS.get(),
11064                                         E->getRParenLoc());
11065 }
11066 
11067 template<typename Derived>
11068 ExprResult
11069 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11070   return E;
11071 }
11072 
11073 template<typename Derived>
11074 ExprResult
11075 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11076   switch (E->getOperator()) {
11077   case OO_New:
11078   case OO_Delete:
11079   case OO_Array_New:
11080   case OO_Array_Delete:
11081     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11082 
11083   case OO_Call: {
11084     // This is a call to an object's operator().
11085     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11086 
11087     // Transform the object itself.
11088     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11089     if (Object.isInvalid())
11090       return ExprError();
11091 
11092     // FIXME: Poor location information
11093     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11094         static_cast<Expr *>(Object.get())->getEndLoc());
11095 
11096     // Transform the call arguments.
11097     SmallVector<Expr*, 8> Args;
11098     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11099                                     Args))
11100       return ExprError();
11101 
11102     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11103                                         E->getEndLoc());
11104   }
11105 
11106 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11107   case OO_##Name:
11108 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11109 #include "clang/Basic/OperatorKinds.def"
11110   case OO_Subscript:
11111     // Handled below.
11112     break;
11113 
11114   case OO_Conditional:
11115     llvm_unreachable("conditional operator is not actually overloadable");
11116 
11117   case OO_None:
11118   case NUM_OVERLOADED_OPERATORS:
11119     llvm_unreachable("not an overloaded operator?");
11120   }
11121 
11122   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11123   if (Callee.isInvalid())
11124     return ExprError();
11125 
11126   ExprResult First;
11127   if (E->getOperator() == OO_Amp)
11128     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11129   else
11130     First = getDerived().TransformExpr(E->getArg(0));
11131   if (First.isInvalid())
11132     return ExprError();
11133 
11134   ExprResult Second;
11135   if (E->getNumArgs() == 2) {
11136     Second = getDerived().TransformExpr(E->getArg(1));
11137     if (Second.isInvalid())
11138       return ExprError();
11139   }
11140 
11141   if (!getDerived().AlwaysRebuild() &&
11142       Callee.get() == E->getCallee() &&
11143       First.get() == E->getArg(0) &&
11144       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11145     return SemaRef.MaybeBindToTemporary(E);
11146 
11147   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11148   FPOptionsOverride NewOverrides(E->getFPFeatures());
11149   getSema().CurFPFeatures =
11150       NewOverrides.applyOverrides(getSema().getLangOpts());
11151   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11152 
11153   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11154                                                  E->getOperatorLoc(),
11155                                                  Callee.get(),
11156                                                  First.get(),
11157                                                  Second.get());
11158 }
11159 
11160 template<typename Derived>
11161 ExprResult
11162 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11163   return getDerived().TransformCallExpr(E);
11164 }
11165 
11166 template <typename Derived>
11167 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11168   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11169                          getSema().CurContext != E->getParentContext();
11170 
11171   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11172     return E;
11173 
11174   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11175                                            E->getEndLoc(),
11176                                            getSema().CurContext);
11177 }
11178 
11179 template<typename Derived>
11180 ExprResult
11181 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11182   // Transform the callee.
11183   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11184   if (Callee.isInvalid())
11185     return ExprError();
11186 
11187   // Transform exec config.
11188   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11189   if (EC.isInvalid())
11190     return ExprError();
11191 
11192   // Transform arguments.
11193   bool ArgChanged = false;
11194   SmallVector<Expr*, 8> Args;
11195   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11196                                   &ArgChanged))
11197     return ExprError();
11198 
11199   if (!getDerived().AlwaysRebuild() &&
11200       Callee.get() == E->getCallee() &&
11201       !ArgChanged)
11202     return SemaRef.MaybeBindToTemporary(E);
11203 
11204   // FIXME: Wrong source location information for the '('.
11205   SourceLocation FakeLParenLoc
11206     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11207   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11208                                       Args,
11209                                       E->getRParenLoc(), EC.get());
11210 }
11211 
11212 template<typename Derived>
11213 ExprResult
11214 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11215   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11216   if (!Type)
11217     return ExprError();
11218 
11219   ExprResult SubExpr
11220     = getDerived().TransformExpr(E->getSubExprAsWritten());
11221   if (SubExpr.isInvalid())
11222     return ExprError();
11223 
11224   if (!getDerived().AlwaysRebuild() &&
11225       Type == E->getTypeInfoAsWritten() &&
11226       SubExpr.get() == E->getSubExpr())
11227     return E;
11228   return getDerived().RebuildCXXNamedCastExpr(
11229       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11230       Type, E->getAngleBrackets().getEnd(),
11231       // FIXME. this should be '(' location
11232       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11233 }
11234 
11235 template<typename Derived>
11236 ExprResult
11237 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11238   TypeSourceInfo *TSI =
11239       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11240   if (!TSI)
11241     return ExprError();
11242 
11243   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11244   if (Sub.isInvalid())
11245     return ExprError();
11246 
11247   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11248                                                 Sub.get(), BCE->getEndLoc());
11249 }
11250 
11251 template<typename Derived>
11252 ExprResult
11253 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11254   return getDerived().TransformCXXNamedCastExpr(E);
11255 }
11256 
11257 template<typename Derived>
11258 ExprResult
11259 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11260   return getDerived().TransformCXXNamedCastExpr(E);
11261 }
11262 
11263 template<typename Derived>
11264 ExprResult
11265 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11266                                                       CXXReinterpretCastExpr *E) {
11267   return getDerived().TransformCXXNamedCastExpr(E);
11268 }
11269 
11270 template<typename Derived>
11271 ExprResult
11272 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11273   return getDerived().TransformCXXNamedCastExpr(E);
11274 }
11275 
11276 template<typename Derived>
11277 ExprResult
11278 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11279   return getDerived().TransformCXXNamedCastExpr(E);
11280 }
11281 
11282 template<typename Derived>
11283 ExprResult
11284 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11285                                                      CXXFunctionalCastExpr *E) {
11286   TypeSourceInfo *Type =
11287       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11288   if (!Type)
11289     return ExprError();
11290 
11291   ExprResult SubExpr
11292     = getDerived().TransformExpr(E->getSubExprAsWritten());
11293   if (SubExpr.isInvalid())
11294     return ExprError();
11295 
11296   if (!getDerived().AlwaysRebuild() &&
11297       Type == E->getTypeInfoAsWritten() &&
11298       SubExpr.get() == E->getSubExpr())
11299     return E;
11300 
11301   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11302                                                    E->getLParenLoc(),
11303                                                    SubExpr.get(),
11304                                                    E->getRParenLoc(),
11305                                                    E->isListInitialization());
11306 }
11307 
11308 template<typename Derived>
11309 ExprResult
11310 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11311   if (E->isTypeOperand()) {
11312     TypeSourceInfo *TInfo
11313       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11314     if (!TInfo)
11315       return ExprError();
11316 
11317     if (!getDerived().AlwaysRebuild() &&
11318         TInfo == E->getTypeOperandSourceInfo())
11319       return E;
11320 
11321     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11322                                              TInfo, E->getEndLoc());
11323   }
11324 
11325   // We don't know whether the subexpression is potentially evaluated until
11326   // after we perform semantic analysis.  We speculatively assume it is
11327   // unevaluated; it will get fixed later if the subexpression is in fact
11328   // potentially evaluated.
11329   EnterExpressionEvaluationContext Unevaluated(
11330       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11331       Sema::ReuseLambdaContextDecl);
11332 
11333   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11334   if (SubExpr.isInvalid())
11335     return ExprError();
11336 
11337   if (!getDerived().AlwaysRebuild() &&
11338       SubExpr.get() == E->getExprOperand())
11339     return E;
11340 
11341   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11342                                            SubExpr.get(), E->getEndLoc());
11343 }
11344 
11345 template<typename Derived>
11346 ExprResult
11347 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11348   if (E->isTypeOperand()) {
11349     TypeSourceInfo *TInfo
11350       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11351     if (!TInfo)
11352       return ExprError();
11353 
11354     if (!getDerived().AlwaysRebuild() &&
11355         TInfo == E->getTypeOperandSourceInfo())
11356       return E;
11357 
11358     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11359                                              TInfo, E->getEndLoc());
11360   }
11361 
11362   EnterExpressionEvaluationContext Unevaluated(
11363       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11364 
11365   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11366   if (SubExpr.isInvalid())
11367     return ExprError();
11368 
11369   if (!getDerived().AlwaysRebuild() &&
11370       SubExpr.get() == E->getExprOperand())
11371     return E;
11372 
11373   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11374                                            SubExpr.get(), E->getEndLoc());
11375 }
11376 
11377 template<typename Derived>
11378 ExprResult
11379 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11380   return E;
11381 }
11382 
11383 template<typename Derived>
11384 ExprResult
11385 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11386                                                      CXXNullPtrLiteralExpr *E) {
11387   return E;
11388 }
11389 
11390 template<typename Derived>
11391 ExprResult
11392 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11393   QualType T = getSema().getCurrentThisType();
11394 
11395   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11396     // Mark it referenced in the new context regardless.
11397     // FIXME: this is a bit instantiation-specific.
11398     getSema().MarkThisReferenced(E);
11399     return E;
11400   }
11401 
11402   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11403 }
11404 
11405 template<typename Derived>
11406 ExprResult
11407 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11408   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11409   if (SubExpr.isInvalid())
11410     return ExprError();
11411 
11412   if (!getDerived().AlwaysRebuild() &&
11413       SubExpr.get() == E->getSubExpr())
11414     return E;
11415 
11416   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11417                                           E->isThrownVariableInScope());
11418 }
11419 
11420 template<typename Derived>
11421 ExprResult
11422 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11423   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11424       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11425   if (!Param)
11426     return ExprError();
11427 
11428   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11429       E->getUsedContext() == SemaRef.CurContext)
11430     return E;
11431 
11432   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11433 }
11434 
11435 template<typename Derived>
11436 ExprResult
11437 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11438   FieldDecl *Field = cast_or_null<FieldDecl>(
11439       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11440   if (!Field)
11441     return ExprError();
11442 
11443   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11444       E->getUsedContext() == SemaRef.CurContext)
11445     return E;
11446 
11447   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11448 }
11449 
11450 template<typename Derived>
11451 ExprResult
11452 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11453                                                     CXXScalarValueInitExpr *E) {
11454   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11455   if (!T)
11456     return ExprError();
11457 
11458   if (!getDerived().AlwaysRebuild() &&
11459       T == E->getTypeSourceInfo())
11460     return E;
11461 
11462   return getDerived().RebuildCXXScalarValueInitExpr(T,
11463                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11464                                                     E->getRParenLoc());
11465 }
11466 
11467 template<typename Derived>
11468 ExprResult
11469 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11470   // Transform the type that we're allocating
11471   TypeSourceInfo *AllocTypeInfo =
11472       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11473   if (!AllocTypeInfo)
11474     return ExprError();
11475 
11476   // Transform the size of the array we're allocating (if any).
11477   Optional<Expr *> ArraySize;
11478   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11479     ExprResult NewArraySize;
11480     if (*OldArraySize) {
11481       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11482       if (NewArraySize.isInvalid())
11483         return ExprError();
11484     }
11485     ArraySize = NewArraySize.get();
11486   }
11487 
11488   // Transform the placement arguments (if any).
11489   bool ArgumentChanged = false;
11490   SmallVector<Expr*, 8> PlacementArgs;
11491   if (getDerived().TransformExprs(E->getPlacementArgs(),
11492                                   E->getNumPlacementArgs(), true,
11493                                   PlacementArgs, &ArgumentChanged))
11494     return ExprError();
11495 
11496   // Transform the initializer (if any).
11497   Expr *OldInit = E->getInitializer();
11498   ExprResult NewInit;
11499   if (OldInit)
11500     NewInit = getDerived().TransformInitializer(OldInit, true);
11501   if (NewInit.isInvalid())
11502     return ExprError();
11503 
11504   // Transform new operator and delete operator.
11505   FunctionDecl *OperatorNew = nullptr;
11506   if (E->getOperatorNew()) {
11507     OperatorNew = cast_or_null<FunctionDecl>(
11508         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11509     if (!OperatorNew)
11510       return ExprError();
11511   }
11512 
11513   FunctionDecl *OperatorDelete = nullptr;
11514   if (E->getOperatorDelete()) {
11515     OperatorDelete = cast_or_null<FunctionDecl>(
11516         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11517     if (!OperatorDelete)
11518       return ExprError();
11519   }
11520 
11521   if (!getDerived().AlwaysRebuild() &&
11522       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11523       ArraySize == E->getArraySize() &&
11524       NewInit.get() == OldInit &&
11525       OperatorNew == E->getOperatorNew() &&
11526       OperatorDelete == E->getOperatorDelete() &&
11527       !ArgumentChanged) {
11528     // Mark any declarations we need as referenced.
11529     // FIXME: instantiation-specific.
11530     if (OperatorNew)
11531       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11532     if (OperatorDelete)
11533       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11534 
11535     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11536       QualType ElementType
11537         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11538       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11539         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11540         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11541           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11542         }
11543       }
11544     }
11545 
11546     return E;
11547   }
11548 
11549   QualType AllocType = AllocTypeInfo->getType();
11550   if (!ArraySize) {
11551     // If no array size was specified, but the new expression was
11552     // instantiated with an array type (e.g., "new T" where T is
11553     // instantiated with "int[4]"), extract the outer bound from the
11554     // array type as our array size. We do this with constant and
11555     // dependently-sized array types.
11556     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11557     if (!ArrayT) {
11558       // Do nothing
11559     } else if (const ConstantArrayType *ConsArrayT
11560                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11561       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11562                                          SemaRef.Context.getSizeType(),
11563                                          /*FIXME:*/ E->getBeginLoc());
11564       AllocType = ConsArrayT->getElementType();
11565     } else if (const DependentSizedArrayType *DepArrayT
11566                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11567       if (DepArrayT->getSizeExpr()) {
11568         ArraySize = DepArrayT->getSizeExpr();
11569         AllocType = DepArrayT->getElementType();
11570       }
11571     }
11572   }
11573 
11574   return getDerived().RebuildCXXNewExpr(
11575       E->getBeginLoc(), E->isGlobalNew(),
11576       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11577       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11578       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11579 }
11580 
11581 template<typename Derived>
11582 ExprResult
11583 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11584   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11585   if (Operand.isInvalid())
11586     return ExprError();
11587 
11588   // Transform the delete operator, if known.
11589   FunctionDecl *OperatorDelete = nullptr;
11590   if (E->getOperatorDelete()) {
11591     OperatorDelete = cast_or_null<FunctionDecl>(
11592         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11593     if (!OperatorDelete)
11594       return ExprError();
11595   }
11596 
11597   if (!getDerived().AlwaysRebuild() &&
11598       Operand.get() == E->getArgument() &&
11599       OperatorDelete == E->getOperatorDelete()) {
11600     // Mark any declarations we need as referenced.
11601     // FIXME: instantiation-specific.
11602     if (OperatorDelete)
11603       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11604 
11605     if (!E->getArgument()->isTypeDependent()) {
11606       QualType Destroyed = SemaRef.Context.getBaseElementType(
11607                                                          E->getDestroyedType());
11608       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11609         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11610         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11611                                        SemaRef.LookupDestructor(Record));
11612       }
11613     }
11614 
11615     return E;
11616   }
11617 
11618   return getDerived().RebuildCXXDeleteExpr(
11619       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11620 }
11621 
11622 template<typename Derived>
11623 ExprResult
11624 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11625                                                      CXXPseudoDestructorExpr *E) {
11626   ExprResult Base = getDerived().TransformExpr(E->getBase());
11627   if (Base.isInvalid())
11628     return ExprError();
11629 
11630   ParsedType ObjectTypePtr;
11631   bool MayBePseudoDestructor = false;
11632   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11633                                               E->getOperatorLoc(),
11634                                         E->isArrow()? tok::arrow : tok::period,
11635                                               ObjectTypePtr,
11636                                               MayBePseudoDestructor);
11637   if (Base.isInvalid())
11638     return ExprError();
11639 
11640   QualType ObjectType = ObjectTypePtr.get();
11641   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11642   if (QualifierLoc) {
11643     QualifierLoc
11644       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11645     if (!QualifierLoc)
11646       return ExprError();
11647   }
11648   CXXScopeSpec SS;
11649   SS.Adopt(QualifierLoc);
11650 
11651   PseudoDestructorTypeStorage Destroyed;
11652   if (E->getDestroyedTypeInfo()) {
11653     TypeSourceInfo *DestroyedTypeInfo
11654       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11655                                                 ObjectType, nullptr, SS);
11656     if (!DestroyedTypeInfo)
11657       return ExprError();
11658     Destroyed = DestroyedTypeInfo;
11659   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11660     // We aren't likely to be able to resolve the identifier down to a type
11661     // now anyway, so just retain the identifier.
11662     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11663                                             E->getDestroyedTypeLoc());
11664   } else {
11665     // Look for a destructor known with the given name.
11666     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11667                                               *E->getDestroyedTypeIdentifier(),
11668                                                 E->getDestroyedTypeLoc(),
11669                                                 /*Scope=*/nullptr,
11670                                                 SS, ObjectTypePtr,
11671                                                 false);
11672     if (!T)
11673       return ExprError();
11674 
11675     Destroyed
11676       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11677                                                  E->getDestroyedTypeLoc());
11678   }
11679 
11680   TypeSourceInfo *ScopeTypeInfo = nullptr;
11681   if (E->getScopeTypeInfo()) {
11682     CXXScopeSpec EmptySS;
11683     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11684                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11685     if (!ScopeTypeInfo)
11686       return ExprError();
11687   }
11688 
11689   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11690                                                      E->getOperatorLoc(),
11691                                                      E->isArrow(),
11692                                                      SS,
11693                                                      ScopeTypeInfo,
11694                                                      E->getColonColonLoc(),
11695                                                      E->getTildeLoc(),
11696                                                      Destroyed);
11697 }
11698 
11699 template <typename Derived>
11700 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11701                                                         bool RequiresADL,
11702                                                         LookupResult &R) {
11703   // Transform all the decls.
11704   bool AllEmptyPacks = true;
11705   for (auto *OldD : Old->decls()) {
11706     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11707     if (!InstD) {
11708       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11709       // This can happen because of dependent hiding.
11710       if (isa<UsingShadowDecl>(OldD))
11711         continue;
11712       else {
11713         R.clear();
11714         return true;
11715       }
11716     }
11717 
11718     // Expand using pack declarations.
11719     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11720     ArrayRef<NamedDecl*> Decls = SingleDecl;
11721     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11722       Decls = UPD->expansions();
11723 
11724     // Expand using declarations.
11725     for (auto *D : Decls) {
11726       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11727         for (auto *SD : UD->shadows())
11728           R.addDecl(SD);
11729       } else {
11730         R.addDecl(D);
11731       }
11732     }
11733 
11734     AllEmptyPacks &= Decls.empty();
11735   };
11736 
11737   // C++ [temp.res]/8.4.2:
11738   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11739   //   a name in the template definition found a using-declaration, but the
11740   //   lookup in the corresponding scope in the instantiation odoes not find
11741   //   any declarations because the using-declaration was a pack expansion and
11742   //   the corresponding pack is empty
11743   if (AllEmptyPacks && !RequiresADL) {
11744     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11745         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11746     return true;
11747   }
11748 
11749   // Resolve a kind, but don't do any further analysis.  If it's
11750   // ambiguous, the callee needs to deal with it.
11751   R.resolveKind();
11752   return false;
11753 }
11754 
11755 template<typename Derived>
11756 ExprResult
11757 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11758                                                   UnresolvedLookupExpr *Old) {
11759   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11760                  Sema::LookupOrdinaryName);
11761 
11762   // Transform the declaration set.
11763   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11764     return ExprError();
11765 
11766   // Rebuild the nested-name qualifier, if present.
11767   CXXScopeSpec SS;
11768   if (Old->getQualifierLoc()) {
11769     NestedNameSpecifierLoc QualifierLoc
11770       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11771     if (!QualifierLoc)
11772       return ExprError();
11773 
11774     SS.Adopt(QualifierLoc);
11775   }
11776 
11777   if (Old->getNamingClass()) {
11778     CXXRecordDecl *NamingClass
11779       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11780                                                             Old->getNameLoc(),
11781                                                         Old->getNamingClass()));
11782     if (!NamingClass) {
11783       R.clear();
11784       return ExprError();
11785     }
11786 
11787     R.setNamingClass(NamingClass);
11788   }
11789 
11790   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11791 
11792   // If we have neither explicit template arguments, nor the template keyword,
11793   // it's a normal declaration name or member reference.
11794   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11795     NamedDecl *D = R.getAsSingle<NamedDecl>();
11796     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11797     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11798     // give a good diagnostic.
11799     if (D && D->isCXXInstanceMember()) {
11800       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11801                                                      /*TemplateArgs=*/nullptr,
11802                                                      /*Scope=*/nullptr);
11803     }
11804 
11805     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11806   }
11807 
11808   // If we have template arguments, rebuild them, then rebuild the
11809   // templateid expression.
11810   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11811   if (Old->hasExplicitTemplateArgs() &&
11812       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11813                                               Old->getNumTemplateArgs(),
11814                                               TransArgs)) {
11815     R.clear();
11816     return ExprError();
11817   }
11818 
11819   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11820                                             Old->requiresADL(), &TransArgs);
11821 }
11822 
11823 template<typename Derived>
11824 ExprResult
11825 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11826   bool ArgChanged = false;
11827   SmallVector<TypeSourceInfo *, 4> Args;
11828   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11829     TypeSourceInfo *From = E->getArg(I);
11830     TypeLoc FromTL = From->getTypeLoc();
11831     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11832       TypeLocBuilder TLB;
11833       TLB.reserve(FromTL.getFullDataSize());
11834       QualType To = getDerived().TransformType(TLB, FromTL);
11835       if (To.isNull())
11836         return ExprError();
11837 
11838       if (To == From->getType())
11839         Args.push_back(From);
11840       else {
11841         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11842         ArgChanged = true;
11843       }
11844       continue;
11845     }
11846 
11847     ArgChanged = true;
11848 
11849     // We have a pack expansion. Instantiate it.
11850     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11851     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11852     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11853     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11854 
11855     // Determine whether the set of unexpanded parameter packs can and should
11856     // be expanded.
11857     bool Expand = true;
11858     bool RetainExpansion = false;
11859     Optional<unsigned> OrigNumExpansions =
11860         ExpansionTL.getTypePtr()->getNumExpansions();
11861     Optional<unsigned> NumExpansions = OrigNumExpansions;
11862     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11863                                              PatternTL.getSourceRange(),
11864                                              Unexpanded,
11865                                              Expand, RetainExpansion,
11866                                              NumExpansions))
11867       return ExprError();
11868 
11869     if (!Expand) {
11870       // The transform has determined that we should perform a simple
11871       // transformation on the pack expansion, producing another pack
11872       // expansion.
11873       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11874 
11875       TypeLocBuilder TLB;
11876       TLB.reserve(From->getTypeLoc().getFullDataSize());
11877 
11878       QualType To = getDerived().TransformType(TLB, PatternTL);
11879       if (To.isNull())
11880         return ExprError();
11881 
11882       To = getDerived().RebuildPackExpansionType(To,
11883                                                  PatternTL.getSourceRange(),
11884                                                  ExpansionTL.getEllipsisLoc(),
11885                                                  NumExpansions);
11886       if (To.isNull())
11887         return ExprError();
11888 
11889       PackExpansionTypeLoc ToExpansionTL
11890         = TLB.push<PackExpansionTypeLoc>(To);
11891       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11892       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11893       continue;
11894     }
11895 
11896     // Expand the pack expansion by substituting for each argument in the
11897     // pack(s).
11898     for (unsigned I = 0; I != *NumExpansions; ++I) {
11899       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11900       TypeLocBuilder TLB;
11901       TLB.reserve(PatternTL.getFullDataSize());
11902       QualType To = getDerived().TransformType(TLB, PatternTL);
11903       if (To.isNull())
11904         return ExprError();
11905 
11906       if (To->containsUnexpandedParameterPack()) {
11907         To = getDerived().RebuildPackExpansionType(To,
11908                                                    PatternTL.getSourceRange(),
11909                                                    ExpansionTL.getEllipsisLoc(),
11910                                                    NumExpansions);
11911         if (To.isNull())
11912           return ExprError();
11913 
11914         PackExpansionTypeLoc ToExpansionTL
11915           = TLB.push<PackExpansionTypeLoc>(To);
11916         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11917       }
11918 
11919       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11920     }
11921 
11922     if (!RetainExpansion)
11923       continue;
11924 
11925     // If we're supposed to retain a pack expansion, do so by temporarily
11926     // forgetting the partially-substituted parameter pack.
11927     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11928 
11929     TypeLocBuilder TLB;
11930     TLB.reserve(From->getTypeLoc().getFullDataSize());
11931 
11932     QualType To = getDerived().TransformType(TLB, PatternTL);
11933     if (To.isNull())
11934       return ExprError();
11935 
11936     To = getDerived().RebuildPackExpansionType(To,
11937                                                PatternTL.getSourceRange(),
11938                                                ExpansionTL.getEllipsisLoc(),
11939                                                NumExpansions);
11940     if (To.isNull())
11941       return ExprError();
11942 
11943     PackExpansionTypeLoc ToExpansionTL
11944       = TLB.push<PackExpansionTypeLoc>(To);
11945     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11946     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11947   }
11948 
11949   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11950     return E;
11951 
11952   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11953                                        E->getEndLoc());
11954 }
11955 
11956 template<typename Derived>
11957 ExprResult
11958 TreeTransform<Derived>::TransformConceptSpecializationExpr(
11959                                                  ConceptSpecializationExpr *E) {
11960   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
11961   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
11962   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11963                                               Old->NumTemplateArgs, TransArgs))
11964     return ExprError();
11965 
11966   return getDerived().RebuildConceptSpecializationExpr(
11967       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
11968       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
11969       &TransArgs);
11970 }
11971 
11972 template<typename Derived>
11973 ExprResult
11974 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
11975   SmallVector<ParmVarDecl*, 4> TransParams;
11976   SmallVector<QualType, 4> TransParamTypes;
11977   Sema::ExtParameterInfoBuilder ExtParamInfos;
11978 
11979   // C++2a [expr.prim.req]p2
11980   // Expressions appearing within a requirement-body are unevaluated operands.
11981   EnterExpressionEvaluationContext Ctx(
11982       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11983 
11984   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
11985       getSema().Context, getSema().CurContext,
11986       E->getBody()->getBeginLoc());
11987 
11988   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
11989 
11990   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
11991                                                E->getLocalParameters(),
11992                                                /*ParamTypes=*/nullptr,
11993                                                /*ParamInfos=*/nullptr,
11994                                                TransParamTypes, &TransParams,
11995                                                ExtParamInfos))
11996     return ExprError();
11997 
11998   for (ParmVarDecl *Param : TransParams)
11999     Param->setDeclContext(Body);
12000 
12001   SmallVector<concepts::Requirement *, 4> TransReqs;
12002   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12003                                                      TransReqs))
12004     return ExprError();
12005 
12006   for (concepts::Requirement *Req : TransReqs) {
12007     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12008       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12009         ER->getReturnTypeRequirement()
12010                 .getTypeConstraintTemplateParameterList()->getParam(0)
12011                 ->setDeclContext(Body);
12012       }
12013     }
12014   }
12015 
12016   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12017                                           TransParams, TransReqs,
12018                                           E->getRBraceLoc());
12019 }
12020 
12021 template<typename Derived>
12022 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12023     ArrayRef<concepts::Requirement *> Reqs,
12024     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12025   for (concepts::Requirement *Req : Reqs) {
12026     concepts::Requirement *TransReq = nullptr;
12027     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12028       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12029     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12030       TransReq = getDerived().TransformExprRequirement(ExprReq);
12031     else
12032       TransReq = getDerived().TransformNestedRequirement(
12033                      cast<concepts::NestedRequirement>(Req));
12034     if (!TransReq)
12035       return true;
12036     Transformed.push_back(TransReq);
12037   }
12038   return false;
12039 }
12040 
12041 template<typename Derived>
12042 concepts::TypeRequirement *
12043 TreeTransform<Derived>::TransformTypeRequirement(
12044     concepts::TypeRequirement *Req) {
12045   if (Req->isSubstitutionFailure()) {
12046     if (getDerived().AlwaysRebuild())
12047       return getDerived().RebuildTypeRequirement(
12048               Req->getSubstitutionDiagnostic());
12049     return Req;
12050   }
12051   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12052   if (!TransType)
12053     return nullptr;
12054   return getDerived().RebuildTypeRequirement(TransType);
12055 }
12056 
12057 template<typename Derived>
12058 concepts::ExprRequirement *
12059 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12060   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12061   if (Req->isExprSubstitutionFailure())
12062     TransExpr = Req->getExprSubstitutionDiagnostic();
12063   else {
12064     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12065     if (TransExprRes.isInvalid())
12066       return nullptr;
12067     TransExpr = TransExprRes.get();
12068   }
12069 
12070   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12071   const auto &RetReq = Req->getReturnTypeRequirement();
12072   if (RetReq.isEmpty())
12073     TransRetReq.emplace();
12074   else if (RetReq.isSubstitutionFailure())
12075     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12076   else if (RetReq.isTypeConstraint()) {
12077     TemplateParameterList *OrigTPL =
12078         RetReq.getTypeConstraintTemplateParameterList();
12079     TemplateParameterList *TPL =
12080         getDerived().TransformTemplateParameterList(OrigTPL);
12081     if (!TPL)
12082       return nullptr;
12083     TransRetReq.emplace(TPL);
12084   }
12085   assert(TransRetReq.hasValue() &&
12086          "All code paths leading here must set TransRetReq");
12087   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12088     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12089                                                Req->getNoexceptLoc(),
12090                                                std::move(*TransRetReq));
12091   return getDerived().RebuildExprRequirement(
12092       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12093       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12094 }
12095 
12096 template<typename Derived>
12097 concepts::NestedRequirement *
12098 TreeTransform<Derived>::TransformNestedRequirement(
12099     concepts::NestedRequirement *Req) {
12100   if (Req->isSubstitutionFailure()) {
12101     if (getDerived().AlwaysRebuild())
12102       return getDerived().RebuildNestedRequirement(
12103           Req->getSubstitutionDiagnostic());
12104     return Req;
12105   }
12106   ExprResult TransConstraint =
12107       getDerived().TransformExpr(Req->getConstraintExpr());
12108   if (TransConstraint.isInvalid())
12109     return nullptr;
12110   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12111 }
12112 
12113 template<typename Derived>
12114 ExprResult
12115 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12116   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12117   if (!T)
12118     return ExprError();
12119 
12120   if (!getDerived().AlwaysRebuild() &&
12121       T == E->getQueriedTypeSourceInfo())
12122     return E;
12123 
12124   ExprResult SubExpr;
12125   {
12126     EnterExpressionEvaluationContext Unevaluated(
12127         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12128     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12129     if (SubExpr.isInvalid())
12130       return ExprError();
12131 
12132     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12133       return E;
12134   }
12135 
12136   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12137                                             SubExpr.get(), E->getEndLoc());
12138 }
12139 
12140 template<typename Derived>
12141 ExprResult
12142 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12143   ExprResult SubExpr;
12144   {
12145     EnterExpressionEvaluationContext Unevaluated(
12146         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12147     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12148     if (SubExpr.isInvalid())
12149       return ExprError();
12150 
12151     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12152       return E;
12153   }
12154 
12155   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12156                                              SubExpr.get(), E->getEndLoc());
12157 }
12158 
12159 template <typename Derived>
12160 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12161     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12162     TypeSourceInfo **RecoveryTSI) {
12163   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12164       DRE, AddrTaken, RecoveryTSI);
12165 
12166   // Propagate both errors and recovered types, which return ExprEmpty.
12167   if (!NewDRE.isUsable())
12168     return NewDRE;
12169 
12170   // We got an expr, wrap it up in parens.
12171   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12172     return PE;
12173   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12174                                        PE->getRParen());
12175 }
12176 
12177 template <typename Derived>
12178 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12179     DependentScopeDeclRefExpr *E) {
12180   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12181                                             nullptr);
12182 }
12183 
12184 template<typename Derived>
12185 ExprResult
12186 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12187                                                DependentScopeDeclRefExpr *E,
12188                                                bool IsAddressOfOperand,
12189                                                TypeSourceInfo **RecoveryTSI) {
12190   assert(E->getQualifierLoc());
12191   NestedNameSpecifierLoc QualifierLoc
12192   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12193   if (!QualifierLoc)
12194     return ExprError();
12195   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12196 
12197   // TODO: If this is a conversion-function-id, verify that the
12198   // destination type name (if present) resolves the same way after
12199   // instantiation as it did in the local scope.
12200 
12201   DeclarationNameInfo NameInfo
12202     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12203   if (!NameInfo.getName())
12204     return ExprError();
12205 
12206   if (!E->hasExplicitTemplateArgs()) {
12207     if (!getDerived().AlwaysRebuild() &&
12208         QualifierLoc == E->getQualifierLoc() &&
12209         // Note: it is sufficient to compare the Name component of NameInfo:
12210         // if name has not changed, DNLoc has not changed either.
12211         NameInfo.getName() == E->getDeclName())
12212       return E;
12213 
12214     return getDerived().RebuildDependentScopeDeclRefExpr(
12215         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12216         IsAddressOfOperand, RecoveryTSI);
12217   }
12218 
12219   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12220   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12221                                               E->getNumTemplateArgs(),
12222                                               TransArgs))
12223     return ExprError();
12224 
12225   return getDerived().RebuildDependentScopeDeclRefExpr(
12226       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12227       RecoveryTSI);
12228 }
12229 
12230 template<typename Derived>
12231 ExprResult
12232 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12233   // CXXConstructExprs other than for list-initialization and
12234   // CXXTemporaryObjectExpr are always implicit, so when we have
12235   // a 1-argument construction we just transform that argument.
12236   if (getDerived().AllowSkippingCXXConstructExpr() &&
12237       ((E->getNumArgs() == 1 ||
12238         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12239        (!getDerived().DropCallArgument(E->getArg(0))) &&
12240        !E->isListInitialization()))
12241     return getDerived().TransformExpr(E->getArg(0));
12242 
12243   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12244 
12245   QualType T = getDerived().TransformType(E->getType());
12246   if (T.isNull())
12247     return ExprError();
12248 
12249   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12250       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12251   if (!Constructor)
12252     return ExprError();
12253 
12254   bool ArgumentChanged = false;
12255   SmallVector<Expr*, 8> Args;
12256   {
12257     EnterExpressionEvaluationContext Context(
12258         getSema(), EnterExpressionEvaluationContext::InitList,
12259         E->isListInitialization());
12260     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12261                                     &ArgumentChanged))
12262       return ExprError();
12263   }
12264 
12265   if (!getDerived().AlwaysRebuild() &&
12266       T == E->getType() &&
12267       Constructor == E->getConstructor() &&
12268       !ArgumentChanged) {
12269     // Mark the constructor as referenced.
12270     // FIXME: Instantiation-specific
12271     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12272     return E;
12273   }
12274 
12275   return getDerived().RebuildCXXConstructExpr(
12276       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12277       E->hadMultipleCandidates(), E->isListInitialization(),
12278       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12279       E->getConstructionKind(), E->getParenOrBraceRange());
12280 }
12281 
12282 template<typename Derived>
12283 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12284     CXXInheritedCtorInitExpr *E) {
12285   QualType T = getDerived().TransformType(E->getType());
12286   if (T.isNull())
12287     return ExprError();
12288 
12289   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12290       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12291   if (!Constructor)
12292     return ExprError();
12293 
12294   if (!getDerived().AlwaysRebuild() &&
12295       T == E->getType() &&
12296       Constructor == E->getConstructor()) {
12297     // Mark the constructor as referenced.
12298     // FIXME: Instantiation-specific
12299     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12300     return E;
12301   }
12302 
12303   return getDerived().RebuildCXXInheritedCtorInitExpr(
12304       T, E->getLocation(), Constructor,
12305       E->constructsVBase(), E->inheritedFromVBase());
12306 }
12307 
12308 /// Transform a C++ temporary-binding expression.
12309 ///
12310 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12311 /// transform the subexpression and return that.
12312 template<typename Derived>
12313 ExprResult
12314 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12315   return getDerived().TransformExpr(E->getSubExpr());
12316 }
12317 
12318 /// Transform a C++ expression that contains cleanups that should
12319 /// be run after the expression is evaluated.
12320 ///
12321 /// Since ExprWithCleanups nodes are implicitly generated, we
12322 /// just transform the subexpression and return that.
12323 template<typename Derived>
12324 ExprResult
12325 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12326   return getDerived().TransformExpr(E->getSubExpr());
12327 }
12328 
12329 template<typename Derived>
12330 ExprResult
12331 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12332                                                     CXXTemporaryObjectExpr *E) {
12333   TypeSourceInfo *T =
12334       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12335   if (!T)
12336     return ExprError();
12337 
12338   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12339       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12340   if (!Constructor)
12341     return ExprError();
12342 
12343   bool ArgumentChanged = false;
12344   SmallVector<Expr*, 8> Args;
12345   Args.reserve(E->getNumArgs());
12346   {
12347     EnterExpressionEvaluationContext Context(
12348         getSema(), EnterExpressionEvaluationContext::InitList,
12349         E->isListInitialization());
12350     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12351                        &ArgumentChanged))
12352       return ExprError();
12353   }
12354 
12355   if (!getDerived().AlwaysRebuild() &&
12356       T == E->getTypeSourceInfo() &&
12357       Constructor == E->getConstructor() &&
12358       !ArgumentChanged) {
12359     // FIXME: Instantiation-specific
12360     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12361     return SemaRef.MaybeBindToTemporary(E);
12362   }
12363 
12364   // FIXME: We should just pass E->isListInitialization(), but we're not
12365   // prepared to handle list-initialization without a child InitListExpr.
12366   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12367   return getDerived().RebuildCXXTemporaryObjectExpr(
12368       T, LParenLoc, Args, E->getEndLoc(),
12369       /*ListInitialization=*/LParenLoc.isInvalid());
12370 }
12371 
12372 template<typename Derived>
12373 ExprResult
12374 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12375   // Transform any init-capture expressions before entering the scope of the
12376   // lambda body, because they are not semantically within that scope.
12377   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12378   struct TransformedInitCapture {
12379     // The location of the ... if the result is retaining a pack expansion.
12380     SourceLocation EllipsisLoc;
12381     // Zero or more expansions of the init-capture.
12382     SmallVector<InitCaptureInfoTy, 4> Expansions;
12383   };
12384   SmallVector<TransformedInitCapture, 4> InitCaptures;
12385   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12386   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12387                                     CEnd = E->capture_end();
12388        C != CEnd; ++C) {
12389     if (!E->isInitCapture(C))
12390       continue;
12391 
12392     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12393     VarDecl *OldVD = C->getCapturedVar();
12394 
12395     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12396                                 Optional<unsigned> NumExpansions) {
12397       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12398           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12399 
12400       if (NewExprInitResult.isInvalid()) {
12401         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12402         return;
12403       }
12404       Expr *NewExprInit = NewExprInitResult.get();
12405 
12406       QualType NewInitCaptureType =
12407           getSema().buildLambdaInitCaptureInitialization(
12408               C->getLocation(), OldVD->getType()->isReferenceType(),
12409               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12410               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12411               NewExprInit);
12412       Result.Expansions.push_back(
12413           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12414     };
12415 
12416     // If this is an init-capture pack, consider expanding the pack now.
12417     if (OldVD->isParameterPack()) {
12418       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12419                                              ->getTypeLoc()
12420                                              .castAs<PackExpansionTypeLoc>();
12421       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12422       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12423 
12424       // Determine whether the set of unexpanded parameter packs can and should
12425       // be expanded.
12426       bool Expand = true;
12427       bool RetainExpansion = false;
12428       Optional<unsigned> OrigNumExpansions =
12429           ExpansionTL.getTypePtr()->getNumExpansions();
12430       Optional<unsigned> NumExpansions = OrigNumExpansions;
12431       if (getDerived().TryExpandParameterPacks(
12432               ExpansionTL.getEllipsisLoc(),
12433               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12434               RetainExpansion, NumExpansions))
12435         return ExprError();
12436       if (Expand) {
12437         for (unsigned I = 0; I != *NumExpansions; ++I) {
12438           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12439           SubstInitCapture(SourceLocation(), None);
12440         }
12441       }
12442       if (!Expand || RetainExpansion) {
12443         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12444         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12445         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12446       }
12447     } else {
12448       SubstInitCapture(SourceLocation(), None);
12449     }
12450   }
12451 
12452   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12453   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12454 
12455   // Transform the template parameters, and add them to the current
12456   // instantiation scope. The null case is handled correctly.
12457   auto TPL = getDerived().TransformTemplateParameterList(
12458       E->getTemplateParameterList());
12459   LSI->GLTemplateParameterList = TPL;
12460 
12461   // Transform the type of the original lambda's call operator.
12462   // The transformation MUST be done in the CurrentInstantiationScope since
12463   // it introduces a mapping of the original to the newly created
12464   // transformed parameters.
12465   TypeSourceInfo *NewCallOpTSI = nullptr;
12466   {
12467     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12468     FunctionProtoTypeLoc OldCallOpFPTL =
12469         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12470 
12471     TypeLocBuilder NewCallOpTLBuilder;
12472     SmallVector<QualType, 4> ExceptionStorage;
12473     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12474     QualType NewCallOpType = TransformFunctionProtoType(
12475         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12476         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12477           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12478                                               ExceptionStorage, Changed);
12479         });
12480     if (NewCallOpType.isNull())
12481       return ExprError();
12482     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12483                                                         NewCallOpType);
12484   }
12485 
12486   // Transform the trailing requires clause
12487   ExprResult NewTrailingRequiresClause;
12488   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12489     // FIXME: Concepts: Substitution into requires clause should only happen
12490     //                  when checking satisfaction.
12491     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12492 
12493   // Create the local class that will describe the lambda.
12494   // FIXME: KnownDependent below is wrong when substituting inside a templated
12495   // context that isn't a DeclContext (such as a variable template).
12496   CXXRecordDecl *OldClass = E->getLambdaClass();
12497   CXXRecordDecl *Class
12498     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12499                                         NewCallOpTSI,
12500                                         /*KnownDependent=*/false,
12501                                         E->getCaptureDefault());
12502   getDerived().transformedLocalDecl(OldClass, {Class});
12503 
12504   Optional<std::tuple<unsigned, bool, Decl *>> Mangling;
12505   if (getDerived().ReplacingOriginal())
12506     Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(),
12507                                OldClass->hasKnownLambdaInternalLinkage(),
12508                                OldClass->getLambdaContextDecl());
12509 
12510   // Build the call operator.
12511   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12512       Class, E->getIntroducerRange(), NewCallOpTSI,
12513       E->getCallOperator()->getEndLoc(),
12514       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12515       E->getCallOperator()->getConstexprKind(),
12516       NewTrailingRequiresClause.get());
12517 
12518   LSI->CallOperator = NewCallOperator;
12519 
12520   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12521   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12522 
12523   // Number the lambda for linkage purposes if necessary.
12524   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12525 
12526   // Introduce the context of the call operator.
12527   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12528                                  /*NewThisContext*/false);
12529 
12530   // Enter the scope of the lambda.
12531   getSema().buildLambdaScope(LSI, NewCallOperator,
12532                              E->getIntroducerRange(),
12533                              E->getCaptureDefault(),
12534                              E->getCaptureDefaultLoc(),
12535                              E->hasExplicitParameters(),
12536                              E->hasExplicitResultType(),
12537                              E->isMutable());
12538 
12539   bool Invalid = false;
12540 
12541   // Transform captures.
12542   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12543                                  CEnd = E->capture_end();
12544        C != CEnd; ++C) {
12545     // When we hit the first implicit capture, tell Sema that we've finished
12546     // the list of explicit captures.
12547     if (C->isImplicit())
12548       break;
12549 
12550     // Capturing 'this' is trivial.
12551     if (C->capturesThis()) {
12552       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12553                                     /*BuildAndDiagnose*/ true, nullptr,
12554                                     C->getCaptureKind() == LCK_StarThis);
12555       continue;
12556     }
12557     // Captured expression will be recaptured during captured variables
12558     // rebuilding.
12559     if (C->capturesVLAType())
12560       continue;
12561 
12562     // Rebuild init-captures, including the implied field declaration.
12563     if (E->isInitCapture(C)) {
12564       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12565 
12566       VarDecl *OldVD = C->getCapturedVar();
12567       llvm::SmallVector<Decl*, 4> NewVDs;
12568 
12569       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12570         ExprResult Init = Info.first;
12571         QualType InitQualType = Info.second;
12572         if (Init.isInvalid() || InitQualType.isNull()) {
12573           Invalid = true;
12574           break;
12575         }
12576         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12577             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12578             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12579         if (!NewVD) {
12580           Invalid = true;
12581           break;
12582         }
12583         NewVDs.push_back(NewVD);
12584         getSema().addInitCapture(LSI, NewVD);
12585       }
12586 
12587       if (Invalid)
12588         break;
12589 
12590       getDerived().transformedLocalDecl(OldVD, NewVDs);
12591       continue;
12592     }
12593 
12594     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12595 
12596     // Determine the capture kind for Sema.
12597     Sema::TryCaptureKind Kind
12598       = C->isImplicit()? Sema::TryCapture_Implicit
12599                        : C->getCaptureKind() == LCK_ByCopy
12600                            ? Sema::TryCapture_ExplicitByVal
12601                            : Sema::TryCapture_ExplicitByRef;
12602     SourceLocation EllipsisLoc;
12603     if (C->isPackExpansion()) {
12604       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12605       bool ShouldExpand = false;
12606       bool RetainExpansion = false;
12607       Optional<unsigned> NumExpansions;
12608       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12609                                                C->getLocation(),
12610                                                Unexpanded,
12611                                                ShouldExpand, RetainExpansion,
12612                                                NumExpansions)) {
12613         Invalid = true;
12614         continue;
12615       }
12616 
12617       if (ShouldExpand) {
12618         // The transform has determined that we should perform an expansion;
12619         // transform and capture each of the arguments.
12620         // expansion of the pattern. Do so.
12621         VarDecl *Pack = C->getCapturedVar();
12622         for (unsigned I = 0; I != *NumExpansions; ++I) {
12623           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12624           VarDecl *CapturedVar
12625             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12626                                                                Pack));
12627           if (!CapturedVar) {
12628             Invalid = true;
12629             continue;
12630           }
12631 
12632           // Capture the transformed variable.
12633           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12634         }
12635 
12636         // FIXME: Retain a pack expansion if RetainExpansion is true.
12637 
12638         continue;
12639       }
12640 
12641       EllipsisLoc = C->getEllipsisLoc();
12642     }
12643 
12644     // Transform the captured variable.
12645     VarDecl *CapturedVar
12646       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12647                                                          C->getCapturedVar()));
12648     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12649       Invalid = true;
12650       continue;
12651     }
12652 
12653     // Capture the transformed variable.
12654     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12655                                  EllipsisLoc);
12656   }
12657   getSema().finishLambdaExplicitCaptures(LSI);
12658 
12659   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12660   // evaluation context even if we're not transforming the function body.
12661   getSema().PushExpressionEvaluationContext(
12662       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12663 
12664   // Instantiate the body of the lambda expression.
12665   StmtResult Body =
12666       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12667 
12668   // ActOnLambda* will pop the function scope for us.
12669   FuncScopeCleanup.disable();
12670 
12671   if (Body.isInvalid()) {
12672     SavedContext.pop();
12673     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12674                                /*IsInstantiation=*/true);
12675     return ExprError();
12676   }
12677 
12678   // Copy the LSI before ActOnFinishFunctionBody removes it.
12679   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12680   // the call operator.
12681   auto LSICopy = *LSI;
12682   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12683                                     /*IsInstantiation*/ true);
12684   SavedContext.pop();
12685 
12686   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12687                                    &LSICopy);
12688 }
12689 
12690 template<typename Derived>
12691 StmtResult
12692 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12693   return TransformStmt(S);
12694 }
12695 
12696 template<typename Derived>
12697 StmtResult
12698 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12699   // Transform captures.
12700   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12701                                  CEnd = E->capture_end();
12702        C != CEnd; ++C) {
12703     // When we hit the first implicit capture, tell Sema that we've finished
12704     // the list of explicit captures.
12705     if (!C->isImplicit())
12706       continue;
12707 
12708     // Capturing 'this' is trivial.
12709     if (C->capturesThis()) {
12710       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12711                                     /*BuildAndDiagnose*/ true, nullptr,
12712                                     C->getCaptureKind() == LCK_StarThis);
12713       continue;
12714     }
12715     // Captured expression will be recaptured during captured variables
12716     // rebuilding.
12717     if (C->capturesVLAType())
12718       continue;
12719 
12720     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12721     assert(!E->isInitCapture(C) && "implicit init-capture?");
12722 
12723     // Transform the captured variable.
12724     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12725         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12726     if (!CapturedVar || CapturedVar->isInvalidDecl())
12727       return StmtError();
12728 
12729     // Capture the transformed variable.
12730     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12731   }
12732 
12733   return S;
12734 }
12735 
12736 template<typename Derived>
12737 ExprResult
12738 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12739                                                   CXXUnresolvedConstructExpr *E) {
12740   TypeSourceInfo *T =
12741       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12742   if (!T)
12743     return ExprError();
12744 
12745   bool ArgumentChanged = false;
12746   SmallVector<Expr*, 8> Args;
12747   Args.reserve(E->arg_size());
12748   {
12749     EnterExpressionEvaluationContext Context(
12750         getSema(), EnterExpressionEvaluationContext::InitList,
12751         E->isListInitialization());
12752     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
12753                                     &ArgumentChanged))
12754       return ExprError();
12755   }
12756 
12757   if (!getDerived().AlwaysRebuild() &&
12758       T == E->getTypeSourceInfo() &&
12759       !ArgumentChanged)
12760     return E;
12761 
12762   // FIXME: we're faking the locations of the commas
12763   return getDerived().RebuildCXXUnresolvedConstructExpr(
12764       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12765 }
12766 
12767 template<typename Derived>
12768 ExprResult
12769 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12770                                              CXXDependentScopeMemberExpr *E) {
12771   // Transform the base of the expression.
12772   ExprResult Base((Expr*) nullptr);
12773   Expr *OldBase;
12774   QualType BaseType;
12775   QualType ObjectType;
12776   if (!E->isImplicitAccess()) {
12777     OldBase = E->getBase();
12778     Base = getDerived().TransformExpr(OldBase);
12779     if (Base.isInvalid())
12780       return ExprError();
12781 
12782     // Start the member reference and compute the object's type.
12783     ParsedType ObjectTy;
12784     bool MayBePseudoDestructor = false;
12785     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12786                                                 E->getOperatorLoc(),
12787                                       E->isArrow()? tok::arrow : tok::period,
12788                                                 ObjectTy,
12789                                                 MayBePseudoDestructor);
12790     if (Base.isInvalid())
12791       return ExprError();
12792 
12793     ObjectType = ObjectTy.get();
12794     BaseType = ((Expr*) Base.get())->getType();
12795   } else {
12796     OldBase = nullptr;
12797     BaseType = getDerived().TransformType(E->getBaseType());
12798     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12799   }
12800 
12801   // Transform the first part of the nested-name-specifier that qualifies
12802   // the member name.
12803   NamedDecl *FirstQualifierInScope
12804     = getDerived().TransformFirstQualifierInScope(
12805                                             E->getFirstQualifierFoundInScope(),
12806                                             E->getQualifierLoc().getBeginLoc());
12807 
12808   NestedNameSpecifierLoc QualifierLoc;
12809   if (E->getQualifier()) {
12810     QualifierLoc
12811       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12812                                                      ObjectType,
12813                                                      FirstQualifierInScope);
12814     if (!QualifierLoc)
12815       return ExprError();
12816   }
12817 
12818   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12819 
12820   // TODO: If this is a conversion-function-id, verify that the
12821   // destination type name (if present) resolves the same way after
12822   // instantiation as it did in the local scope.
12823 
12824   DeclarationNameInfo NameInfo
12825     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12826   if (!NameInfo.getName())
12827     return ExprError();
12828 
12829   if (!E->hasExplicitTemplateArgs()) {
12830     // This is a reference to a member without an explicitly-specified
12831     // template argument list. Optimize for this common case.
12832     if (!getDerived().AlwaysRebuild() &&
12833         Base.get() == OldBase &&
12834         BaseType == E->getBaseType() &&
12835         QualifierLoc == E->getQualifierLoc() &&
12836         NameInfo.getName() == E->getMember() &&
12837         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12838       return E;
12839 
12840     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12841                                                        BaseType,
12842                                                        E->isArrow(),
12843                                                        E->getOperatorLoc(),
12844                                                        QualifierLoc,
12845                                                        TemplateKWLoc,
12846                                                        FirstQualifierInScope,
12847                                                        NameInfo,
12848                                                        /*TemplateArgs*/nullptr);
12849   }
12850 
12851   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12852   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12853                                               E->getNumTemplateArgs(),
12854                                               TransArgs))
12855     return ExprError();
12856 
12857   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12858                                                      BaseType,
12859                                                      E->isArrow(),
12860                                                      E->getOperatorLoc(),
12861                                                      QualifierLoc,
12862                                                      TemplateKWLoc,
12863                                                      FirstQualifierInScope,
12864                                                      NameInfo,
12865                                                      &TransArgs);
12866 }
12867 
12868 template<typename Derived>
12869 ExprResult
12870 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12871   // Transform the base of the expression.
12872   ExprResult Base((Expr*) nullptr);
12873   QualType BaseType;
12874   if (!Old->isImplicitAccess()) {
12875     Base = getDerived().TransformExpr(Old->getBase());
12876     if (Base.isInvalid())
12877       return ExprError();
12878     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12879                                                      Old->isArrow());
12880     if (Base.isInvalid())
12881       return ExprError();
12882     BaseType = Base.get()->getType();
12883   } else {
12884     BaseType = getDerived().TransformType(Old->getBaseType());
12885   }
12886 
12887   NestedNameSpecifierLoc QualifierLoc;
12888   if (Old->getQualifierLoc()) {
12889     QualifierLoc
12890     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12891     if (!QualifierLoc)
12892       return ExprError();
12893   }
12894 
12895   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12896 
12897   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12898                  Sema::LookupOrdinaryName);
12899 
12900   // Transform the declaration set.
12901   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12902     return ExprError();
12903 
12904   // Determine the naming class.
12905   if (Old->getNamingClass()) {
12906     CXXRecordDecl *NamingClass
12907       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12908                                                           Old->getMemberLoc(),
12909                                                         Old->getNamingClass()));
12910     if (!NamingClass)
12911       return ExprError();
12912 
12913     R.setNamingClass(NamingClass);
12914   }
12915 
12916   TemplateArgumentListInfo TransArgs;
12917   if (Old->hasExplicitTemplateArgs()) {
12918     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12919     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12920     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12921                                                 Old->getNumTemplateArgs(),
12922                                                 TransArgs))
12923       return ExprError();
12924   }
12925 
12926   // FIXME: to do this check properly, we will need to preserve the
12927   // first-qualifier-in-scope here, just in case we had a dependent
12928   // base (and therefore couldn't do the check) and a
12929   // nested-name-qualifier (and therefore could do the lookup).
12930   NamedDecl *FirstQualifierInScope = nullptr;
12931 
12932   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12933                                                   BaseType,
12934                                                   Old->getOperatorLoc(),
12935                                                   Old->isArrow(),
12936                                                   QualifierLoc,
12937                                                   TemplateKWLoc,
12938                                                   FirstQualifierInScope,
12939                                                   R,
12940                                               (Old->hasExplicitTemplateArgs()
12941                                                   ? &TransArgs : nullptr));
12942 }
12943 
12944 template<typename Derived>
12945 ExprResult
12946 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12947   EnterExpressionEvaluationContext Unevaluated(
12948       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12949   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12950   if (SubExpr.isInvalid())
12951     return ExprError();
12952 
12953   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
12954     return E;
12955 
12956   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
12957 }
12958 
12959 template<typename Derived>
12960 ExprResult
12961 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
12962   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
12963   if (Pattern.isInvalid())
12964     return ExprError();
12965 
12966   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
12967     return E;
12968 
12969   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
12970                                            E->getNumExpansions());
12971 }
12972 
12973 template<typename Derived>
12974 ExprResult
12975 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
12976   // If E is not value-dependent, then nothing will change when we transform it.
12977   // Note: This is an instantiation-centric view.
12978   if (!E->isValueDependent())
12979     return E;
12980 
12981   EnterExpressionEvaluationContext Unevaluated(
12982       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
12983 
12984   ArrayRef<TemplateArgument> PackArgs;
12985   TemplateArgument ArgStorage;
12986 
12987   // Find the argument list to transform.
12988   if (E->isPartiallySubstituted()) {
12989     PackArgs = E->getPartialArguments();
12990   } else if (E->isValueDependent()) {
12991     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
12992     bool ShouldExpand = false;
12993     bool RetainExpansion = false;
12994     Optional<unsigned> NumExpansions;
12995     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
12996                                              Unexpanded,
12997                                              ShouldExpand, RetainExpansion,
12998                                              NumExpansions))
12999       return ExprError();
13000 
13001     // If we need to expand the pack, build a template argument from it and
13002     // expand that.
13003     if (ShouldExpand) {
13004       auto *Pack = E->getPack();
13005       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13006         ArgStorage = getSema().Context.getPackExpansionType(
13007             getSema().Context.getTypeDeclType(TTPD), None);
13008       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13009         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13010       } else {
13011         auto *VD = cast<ValueDecl>(Pack);
13012         ExprResult DRE = getSema().BuildDeclRefExpr(
13013             VD, VD->getType().getNonLValueExprType(getSema().Context),
13014             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
13015             E->getPackLoc());
13016         if (DRE.isInvalid())
13017           return ExprError();
13018         ArgStorage = new (getSema().Context) PackExpansionExpr(
13019             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13020       }
13021       PackArgs = ArgStorage;
13022     }
13023   }
13024 
13025   // If we're not expanding the pack, just transform the decl.
13026   if (!PackArgs.size()) {
13027     auto *Pack = cast_or_null<NamedDecl>(
13028         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13029     if (!Pack)
13030       return ExprError();
13031     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13032                                               E->getPackLoc(),
13033                                               E->getRParenLoc(), None, None);
13034   }
13035 
13036   // Try to compute the result without performing a partial substitution.
13037   Optional<unsigned> Result = 0;
13038   for (const TemplateArgument &Arg : PackArgs) {
13039     if (!Arg.isPackExpansion()) {
13040       Result = *Result + 1;
13041       continue;
13042     }
13043 
13044     TemplateArgumentLoc ArgLoc;
13045     InventTemplateArgumentLoc(Arg, ArgLoc);
13046 
13047     // Find the pattern of the pack expansion.
13048     SourceLocation Ellipsis;
13049     Optional<unsigned> OrigNumExpansions;
13050     TemplateArgumentLoc Pattern =
13051         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13052                                                           OrigNumExpansions);
13053 
13054     // Substitute under the pack expansion. Do not expand the pack (yet).
13055     TemplateArgumentLoc OutPattern;
13056     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13057     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13058                                                /*Uneval*/ true))
13059       return true;
13060 
13061     // See if we can determine the number of arguments from the result.
13062     Optional<unsigned> NumExpansions =
13063         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13064     if (!NumExpansions) {
13065       // No: we must be in an alias template expansion, and we're going to need
13066       // to actually expand the packs.
13067       Result = None;
13068       break;
13069     }
13070 
13071     Result = *Result + *NumExpansions;
13072   }
13073 
13074   // Common case: we could determine the number of expansions without
13075   // substituting.
13076   if (Result)
13077     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13078                                               E->getPackLoc(),
13079                                               E->getRParenLoc(), *Result, None);
13080 
13081   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13082                                                E->getPackLoc());
13083   {
13084     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13085     typedef TemplateArgumentLocInventIterator<
13086         Derived, const TemplateArgument*> PackLocIterator;
13087     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13088                                    PackLocIterator(*this, PackArgs.end()),
13089                                    TransformedPackArgs, /*Uneval*/true))
13090       return ExprError();
13091   }
13092 
13093   // Check whether we managed to fully-expand the pack.
13094   // FIXME: Is it possible for us to do so and not hit the early exit path?
13095   SmallVector<TemplateArgument, 8> Args;
13096   bool PartialSubstitution = false;
13097   for (auto &Loc : TransformedPackArgs.arguments()) {
13098     Args.push_back(Loc.getArgument());
13099     if (Loc.getArgument().isPackExpansion())
13100       PartialSubstitution = true;
13101   }
13102 
13103   if (PartialSubstitution)
13104     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13105                                               E->getPackLoc(),
13106                                               E->getRParenLoc(), None, Args);
13107 
13108   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13109                                             E->getPackLoc(), E->getRParenLoc(),
13110                                             Args.size(), None);
13111 }
13112 
13113 template<typename Derived>
13114 ExprResult
13115 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13116                                           SubstNonTypeTemplateParmPackExpr *E) {
13117   // Default behavior is to do nothing with this transformation.
13118   return E;
13119 }
13120 
13121 template<typename Derived>
13122 ExprResult
13123 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13124                                           SubstNonTypeTemplateParmExpr *E) {
13125   // Default behavior is to do nothing with this transformation.
13126   return E;
13127 }
13128 
13129 template<typename Derived>
13130 ExprResult
13131 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13132   // Default behavior is to do nothing with this transformation.
13133   return E;
13134 }
13135 
13136 template<typename Derived>
13137 ExprResult
13138 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13139                                                   MaterializeTemporaryExpr *E) {
13140   return getDerived().TransformExpr(E->getSubExpr());
13141 }
13142 
13143 template<typename Derived>
13144 ExprResult
13145 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13146   UnresolvedLookupExpr *Callee = nullptr;
13147   if (Expr *OldCallee = E->getCallee()) {
13148     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13149     if (CalleeResult.isInvalid())
13150       return ExprError();
13151     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13152   }
13153 
13154   Expr *Pattern = E->getPattern();
13155 
13156   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13157   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13158   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13159 
13160   // Determine whether the set of unexpanded parameter packs can and should
13161   // be expanded.
13162   bool Expand = true;
13163   bool RetainExpansion = false;
13164   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13165                      NumExpansions = OrigNumExpansions;
13166   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13167                                            Pattern->getSourceRange(),
13168                                            Unexpanded,
13169                                            Expand, RetainExpansion,
13170                                            NumExpansions))
13171     return true;
13172 
13173   if (!Expand) {
13174     // Do not expand any packs here, just transform and rebuild a fold
13175     // expression.
13176     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13177 
13178     ExprResult LHS =
13179         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13180     if (LHS.isInvalid())
13181       return true;
13182 
13183     ExprResult RHS =
13184         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13185     if (RHS.isInvalid())
13186       return true;
13187 
13188     if (!getDerived().AlwaysRebuild() &&
13189         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13190       return E;
13191 
13192     return getDerived().RebuildCXXFoldExpr(
13193         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13194         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13195   }
13196 
13197   // Formally a fold expression expands to nested parenthesized expressions.
13198   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13199   // them.
13200   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13201     SemaRef.Diag(E->getEllipsisLoc(),
13202                  clang::diag::err_fold_expression_limit_exceeded)
13203         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13204         << E->getSourceRange();
13205     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13206     return ExprError();
13207   }
13208 
13209   // The transform has determined that we should perform an elementwise
13210   // expansion of the pattern. Do so.
13211   ExprResult Result = getDerived().TransformExpr(E->getInit());
13212   if (Result.isInvalid())
13213     return true;
13214   bool LeftFold = E->isLeftFold();
13215 
13216   // If we're retaining an expansion for a right fold, it is the innermost
13217   // component and takes the init (if any).
13218   if (!LeftFold && RetainExpansion) {
13219     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13220 
13221     ExprResult Out = getDerived().TransformExpr(Pattern);
13222     if (Out.isInvalid())
13223       return true;
13224 
13225     Result = getDerived().RebuildCXXFoldExpr(
13226         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13227         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13228     if (Result.isInvalid())
13229       return true;
13230   }
13231 
13232   for (unsigned I = 0; I != *NumExpansions; ++I) {
13233     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13234         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13235     ExprResult Out = getDerived().TransformExpr(Pattern);
13236     if (Out.isInvalid())
13237       return true;
13238 
13239     if (Out.get()->containsUnexpandedParameterPack()) {
13240       // We still have a pack; retain a pack expansion for this slice.
13241       Result = getDerived().RebuildCXXFoldExpr(
13242           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13243           E->getOperator(), E->getEllipsisLoc(),
13244           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13245           OrigNumExpansions);
13246     } else if (Result.isUsable()) {
13247       // We've got down to a single element; build a binary operator.
13248       Expr *LHS = LeftFold ? Result.get() : Out.get();
13249       Expr *RHS = LeftFold ? Out.get() : Result.get();
13250       if (Callee)
13251         Result = getDerived().RebuildCXXOperatorCallExpr(
13252             BinaryOperator::getOverloadedOperator(E->getOperator()),
13253             E->getEllipsisLoc(), Callee, LHS, RHS);
13254       else
13255         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13256                                                     E->getOperator(), LHS, RHS);
13257     } else
13258       Result = Out;
13259 
13260     if (Result.isInvalid())
13261       return true;
13262   }
13263 
13264   // If we're retaining an expansion for a left fold, it is the outermost
13265   // component and takes the complete expansion so far as its init (if any).
13266   if (LeftFold && RetainExpansion) {
13267     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13268 
13269     ExprResult Out = getDerived().TransformExpr(Pattern);
13270     if (Out.isInvalid())
13271       return true;
13272 
13273     Result = getDerived().RebuildCXXFoldExpr(
13274         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13275         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13276     if (Result.isInvalid())
13277       return true;
13278   }
13279 
13280   // If we had no init and an empty pack, and we're not retaining an expansion,
13281   // then produce a fallback value or error.
13282   if (Result.isUnset())
13283     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13284                                                 E->getOperator());
13285 
13286   return Result;
13287 }
13288 
13289 template<typename Derived>
13290 ExprResult
13291 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13292     CXXStdInitializerListExpr *E) {
13293   return getDerived().TransformExpr(E->getSubExpr());
13294 }
13295 
13296 template<typename Derived>
13297 ExprResult
13298 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13299   return SemaRef.MaybeBindToTemporary(E);
13300 }
13301 
13302 template<typename Derived>
13303 ExprResult
13304 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13305   return E;
13306 }
13307 
13308 template<typename Derived>
13309 ExprResult
13310 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13311   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13312   if (SubExpr.isInvalid())
13313     return ExprError();
13314 
13315   if (!getDerived().AlwaysRebuild() &&
13316       SubExpr.get() == E->getSubExpr())
13317     return E;
13318 
13319   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13320 }
13321 
13322 template<typename Derived>
13323 ExprResult
13324 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13325   // Transform each of the elements.
13326   SmallVector<Expr *, 8> Elements;
13327   bool ArgChanged = false;
13328   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13329                                   /*IsCall=*/false, Elements, &ArgChanged))
13330     return ExprError();
13331 
13332   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13333     return SemaRef.MaybeBindToTemporary(E);
13334 
13335   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13336                                               Elements.data(),
13337                                               Elements.size());
13338 }
13339 
13340 template<typename Derived>
13341 ExprResult
13342 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13343                                                     ObjCDictionaryLiteral *E) {
13344   // Transform each of the elements.
13345   SmallVector<ObjCDictionaryElement, 8> Elements;
13346   bool ArgChanged = false;
13347   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13348     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13349 
13350     if (OrigElement.isPackExpansion()) {
13351       // This key/value element is a pack expansion.
13352       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13353       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13354       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13355       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13356 
13357       // Determine whether the set of unexpanded parameter packs can
13358       // and should be expanded.
13359       bool Expand = true;
13360       bool RetainExpansion = false;
13361       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13362       Optional<unsigned> NumExpansions = OrigNumExpansions;
13363       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13364                                OrigElement.Value->getEndLoc());
13365       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13366                                                PatternRange, Unexpanded, Expand,
13367                                                RetainExpansion, NumExpansions))
13368         return ExprError();
13369 
13370       if (!Expand) {
13371         // The transform has determined that we should perform a simple
13372         // transformation on the pack expansion, producing another pack
13373         // expansion.
13374         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13375         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13376         if (Key.isInvalid())
13377           return ExprError();
13378 
13379         if (Key.get() != OrigElement.Key)
13380           ArgChanged = true;
13381 
13382         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13383         if (Value.isInvalid())
13384           return ExprError();
13385 
13386         if (Value.get() != OrigElement.Value)
13387           ArgChanged = true;
13388 
13389         ObjCDictionaryElement Expansion = {
13390           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13391         };
13392         Elements.push_back(Expansion);
13393         continue;
13394       }
13395 
13396       // Record right away that the argument was changed.  This needs
13397       // to happen even if the array expands to nothing.
13398       ArgChanged = true;
13399 
13400       // The transform has determined that we should perform an elementwise
13401       // expansion of the pattern. Do so.
13402       for (unsigned I = 0; I != *NumExpansions; ++I) {
13403         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13404         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13405         if (Key.isInvalid())
13406           return ExprError();
13407 
13408         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13409         if (Value.isInvalid())
13410           return ExprError();
13411 
13412         ObjCDictionaryElement Element = {
13413           Key.get(), Value.get(), SourceLocation(), NumExpansions
13414         };
13415 
13416         // If any unexpanded parameter packs remain, we still have a
13417         // pack expansion.
13418         // FIXME: Can this really happen?
13419         if (Key.get()->containsUnexpandedParameterPack() ||
13420             Value.get()->containsUnexpandedParameterPack())
13421           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13422 
13423         Elements.push_back(Element);
13424       }
13425 
13426       // FIXME: Retain a pack expansion if RetainExpansion is true.
13427 
13428       // We've finished with this pack expansion.
13429       continue;
13430     }
13431 
13432     // Transform and check key.
13433     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13434     if (Key.isInvalid())
13435       return ExprError();
13436 
13437     if (Key.get() != OrigElement.Key)
13438       ArgChanged = true;
13439 
13440     // Transform and check value.
13441     ExprResult Value
13442       = getDerived().TransformExpr(OrigElement.Value);
13443     if (Value.isInvalid())
13444       return ExprError();
13445 
13446     if (Value.get() != OrigElement.Value)
13447       ArgChanged = true;
13448 
13449     ObjCDictionaryElement Element = {
13450       Key.get(), Value.get(), SourceLocation(), None
13451     };
13452     Elements.push_back(Element);
13453   }
13454 
13455   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13456     return SemaRef.MaybeBindToTemporary(E);
13457 
13458   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13459                                                    Elements);
13460 }
13461 
13462 template<typename Derived>
13463 ExprResult
13464 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13465   TypeSourceInfo *EncodedTypeInfo
13466     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13467   if (!EncodedTypeInfo)
13468     return ExprError();
13469 
13470   if (!getDerived().AlwaysRebuild() &&
13471       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13472     return E;
13473 
13474   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13475                                             EncodedTypeInfo,
13476                                             E->getRParenLoc());
13477 }
13478 
13479 template<typename Derived>
13480 ExprResult TreeTransform<Derived>::
13481 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13482   // This is a kind of implicit conversion, and it needs to get dropped
13483   // and recomputed for the same general reasons that ImplicitCastExprs
13484   // do, as well a more specific one: this expression is only valid when
13485   // it appears *immediately* as an argument expression.
13486   return getDerived().TransformExpr(E->getSubExpr());
13487 }
13488 
13489 template<typename Derived>
13490 ExprResult TreeTransform<Derived>::
13491 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13492   TypeSourceInfo *TSInfo
13493     = getDerived().TransformType(E->getTypeInfoAsWritten());
13494   if (!TSInfo)
13495     return ExprError();
13496 
13497   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13498   if (Result.isInvalid())
13499     return ExprError();
13500 
13501   if (!getDerived().AlwaysRebuild() &&
13502       TSInfo == E->getTypeInfoAsWritten() &&
13503       Result.get() == E->getSubExpr())
13504     return E;
13505 
13506   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13507                                       E->getBridgeKeywordLoc(), TSInfo,
13508                                       Result.get());
13509 }
13510 
13511 template <typename Derived>
13512 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13513     ObjCAvailabilityCheckExpr *E) {
13514   return E;
13515 }
13516 
13517 template<typename Derived>
13518 ExprResult
13519 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13520   // Transform arguments.
13521   bool ArgChanged = false;
13522   SmallVector<Expr*, 8> Args;
13523   Args.reserve(E->getNumArgs());
13524   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13525                                   &ArgChanged))
13526     return ExprError();
13527 
13528   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13529     // Class message: transform the receiver type.
13530     TypeSourceInfo *ReceiverTypeInfo
13531       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13532     if (!ReceiverTypeInfo)
13533       return ExprError();
13534 
13535     // If nothing changed, just retain the existing message send.
13536     if (!getDerived().AlwaysRebuild() &&
13537         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13538       return SemaRef.MaybeBindToTemporary(E);
13539 
13540     // Build a new class message send.
13541     SmallVector<SourceLocation, 16> SelLocs;
13542     E->getSelectorLocs(SelLocs);
13543     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13544                                                E->getSelector(),
13545                                                SelLocs,
13546                                                E->getMethodDecl(),
13547                                                E->getLeftLoc(),
13548                                                Args,
13549                                                E->getRightLoc());
13550   }
13551   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13552            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13553     if (!E->getMethodDecl())
13554       return ExprError();
13555 
13556     // Build a new class message send to 'super'.
13557     SmallVector<SourceLocation, 16> SelLocs;
13558     E->getSelectorLocs(SelLocs);
13559     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13560                                                E->getSelector(),
13561                                                SelLocs,
13562                                                E->getReceiverType(),
13563                                                E->getMethodDecl(),
13564                                                E->getLeftLoc(),
13565                                                Args,
13566                                                E->getRightLoc());
13567   }
13568 
13569   // Instance message: transform the receiver
13570   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13571          "Only class and instance messages may be instantiated");
13572   ExprResult Receiver
13573     = getDerived().TransformExpr(E->getInstanceReceiver());
13574   if (Receiver.isInvalid())
13575     return ExprError();
13576 
13577   // If nothing changed, just retain the existing message send.
13578   if (!getDerived().AlwaysRebuild() &&
13579       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13580     return SemaRef.MaybeBindToTemporary(E);
13581 
13582   // Build a new instance message send.
13583   SmallVector<SourceLocation, 16> SelLocs;
13584   E->getSelectorLocs(SelLocs);
13585   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13586                                              E->getSelector(),
13587                                              SelLocs,
13588                                              E->getMethodDecl(),
13589                                              E->getLeftLoc(),
13590                                              Args,
13591                                              E->getRightLoc());
13592 }
13593 
13594 template<typename Derived>
13595 ExprResult
13596 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13597   return E;
13598 }
13599 
13600 template<typename Derived>
13601 ExprResult
13602 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13603   return E;
13604 }
13605 
13606 template<typename Derived>
13607 ExprResult
13608 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13609   // Transform the base expression.
13610   ExprResult Base = getDerived().TransformExpr(E->getBase());
13611   if (Base.isInvalid())
13612     return ExprError();
13613 
13614   // We don't need to transform the ivar; it will never change.
13615 
13616   // If nothing changed, just retain the existing expression.
13617   if (!getDerived().AlwaysRebuild() &&
13618       Base.get() == E->getBase())
13619     return E;
13620 
13621   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13622                                              E->getLocation(),
13623                                              E->isArrow(), E->isFreeIvar());
13624 }
13625 
13626 template<typename Derived>
13627 ExprResult
13628 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13629   // 'super' and types never change. Property never changes. Just
13630   // retain the existing expression.
13631   if (!E->isObjectReceiver())
13632     return E;
13633 
13634   // Transform the base expression.
13635   ExprResult Base = getDerived().TransformExpr(E->getBase());
13636   if (Base.isInvalid())
13637     return ExprError();
13638 
13639   // We don't need to transform the property; it will never change.
13640 
13641   // If nothing changed, just retain the existing expression.
13642   if (!getDerived().AlwaysRebuild() &&
13643       Base.get() == E->getBase())
13644     return E;
13645 
13646   if (E->isExplicitProperty())
13647     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13648                                                    E->getExplicitProperty(),
13649                                                    E->getLocation());
13650 
13651   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13652                                                  SemaRef.Context.PseudoObjectTy,
13653                                                  E->getImplicitPropertyGetter(),
13654                                                  E->getImplicitPropertySetter(),
13655                                                  E->getLocation());
13656 }
13657 
13658 template<typename Derived>
13659 ExprResult
13660 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13661   // Transform the base expression.
13662   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13663   if (Base.isInvalid())
13664     return ExprError();
13665 
13666   // Transform the key expression.
13667   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13668   if (Key.isInvalid())
13669     return ExprError();
13670 
13671   // If nothing changed, just retain the existing expression.
13672   if (!getDerived().AlwaysRebuild() &&
13673       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13674     return E;
13675 
13676   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13677                                                   Base.get(), Key.get(),
13678                                                   E->getAtIndexMethodDecl(),
13679                                                   E->setAtIndexMethodDecl());
13680 }
13681 
13682 template<typename Derived>
13683 ExprResult
13684 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13685   // Transform the base expression.
13686   ExprResult Base = getDerived().TransformExpr(E->getBase());
13687   if (Base.isInvalid())
13688     return ExprError();
13689 
13690   // If nothing changed, just retain the existing expression.
13691   if (!getDerived().AlwaysRebuild() &&
13692       Base.get() == E->getBase())
13693     return E;
13694 
13695   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13696                                          E->getOpLoc(),
13697                                          E->isArrow());
13698 }
13699 
13700 template<typename Derived>
13701 ExprResult
13702 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13703   bool ArgumentChanged = false;
13704   SmallVector<Expr*, 8> SubExprs;
13705   SubExprs.reserve(E->getNumSubExprs());
13706   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13707                                   SubExprs, &ArgumentChanged))
13708     return ExprError();
13709 
13710   if (!getDerived().AlwaysRebuild() &&
13711       !ArgumentChanged)
13712     return E;
13713 
13714   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13715                                                SubExprs,
13716                                                E->getRParenLoc());
13717 }
13718 
13719 template<typename Derived>
13720 ExprResult
13721 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13722   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13723   if (SrcExpr.isInvalid())
13724     return ExprError();
13725 
13726   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13727   if (!Type)
13728     return ExprError();
13729 
13730   if (!getDerived().AlwaysRebuild() &&
13731       Type == E->getTypeSourceInfo() &&
13732       SrcExpr.get() == E->getSrcExpr())
13733     return E;
13734 
13735   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13736                                                SrcExpr.get(), Type,
13737                                                E->getRParenLoc());
13738 }
13739 
13740 template<typename Derived>
13741 ExprResult
13742 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13743   BlockDecl *oldBlock = E->getBlockDecl();
13744 
13745   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13746   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13747 
13748   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13749   blockScope->TheDecl->setBlockMissingReturnType(
13750                          oldBlock->blockMissingReturnType());
13751 
13752   SmallVector<ParmVarDecl*, 4> params;
13753   SmallVector<QualType, 4> paramTypes;
13754 
13755   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13756 
13757   // Parameter substitution.
13758   Sema::ExtParameterInfoBuilder extParamInfos;
13759   if (getDerived().TransformFunctionTypeParams(
13760           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13761           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13762           extParamInfos)) {
13763     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13764     return ExprError();
13765   }
13766 
13767   QualType exprResultType =
13768       getDerived().TransformType(exprFunctionType->getReturnType());
13769 
13770   auto epi = exprFunctionType->getExtProtoInfo();
13771   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13772 
13773   QualType functionType =
13774     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13775   blockScope->FunctionType = functionType;
13776 
13777   // Set the parameters on the block decl.
13778   if (!params.empty())
13779     blockScope->TheDecl->setParams(params);
13780 
13781   if (!oldBlock->blockMissingReturnType()) {
13782     blockScope->HasImplicitReturnType = false;
13783     blockScope->ReturnType = exprResultType;
13784   }
13785 
13786   // Transform the body
13787   StmtResult body = getDerived().TransformStmt(E->getBody());
13788   if (body.isInvalid()) {
13789     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13790     return ExprError();
13791   }
13792 
13793 #ifndef NDEBUG
13794   // In builds with assertions, make sure that we captured everything we
13795   // captured before.
13796   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13797     for (const auto &I : oldBlock->captures()) {
13798       VarDecl *oldCapture = I.getVariable();
13799 
13800       // Ignore parameter packs.
13801       if (oldCapture->isParameterPack())
13802         continue;
13803 
13804       VarDecl *newCapture =
13805         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13806                                                  oldCapture));
13807       assert(blockScope->CaptureMap.count(newCapture));
13808     }
13809     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13810   }
13811 #endif
13812 
13813   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13814                                     /*Scope=*/nullptr);
13815 }
13816 
13817 template<typename Derived>
13818 ExprResult
13819 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13820   llvm_unreachable("Cannot transform asType expressions yet");
13821 }
13822 
13823 template<typename Derived>
13824 ExprResult
13825 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13826   bool ArgumentChanged = false;
13827   SmallVector<Expr*, 8> SubExprs;
13828   SubExprs.reserve(E->getNumSubExprs());
13829   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13830                                   SubExprs, &ArgumentChanged))
13831     return ExprError();
13832 
13833   if (!getDerived().AlwaysRebuild() &&
13834       !ArgumentChanged)
13835     return E;
13836 
13837   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13838                                         E->getOp(), E->getRParenLoc());
13839 }
13840 
13841 //===----------------------------------------------------------------------===//
13842 // Type reconstruction
13843 //===----------------------------------------------------------------------===//
13844 
13845 template<typename Derived>
13846 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13847                                                     SourceLocation Star) {
13848   return SemaRef.BuildPointerType(PointeeType, Star,
13849                                   getDerived().getBaseEntity());
13850 }
13851 
13852 template<typename Derived>
13853 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13854                                                          SourceLocation Star) {
13855   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13856                                        getDerived().getBaseEntity());
13857 }
13858 
13859 template<typename Derived>
13860 QualType
13861 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13862                                              bool WrittenAsLValue,
13863                                              SourceLocation Sigil) {
13864   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13865                                     Sigil, getDerived().getBaseEntity());
13866 }
13867 
13868 template<typename Derived>
13869 QualType
13870 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13871                                                  QualType ClassType,
13872                                                  SourceLocation Sigil) {
13873   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13874                                         getDerived().getBaseEntity());
13875 }
13876 
13877 template<typename Derived>
13878 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13879            const ObjCTypeParamDecl *Decl,
13880            SourceLocation ProtocolLAngleLoc,
13881            ArrayRef<ObjCProtocolDecl *> Protocols,
13882            ArrayRef<SourceLocation> ProtocolLocs,
13883            SourceLocation ProtocolRAngleLoc) {
13884   return SemaRef.BuildObjCTypeParamType(Decl,
13885                                         ProtocolLAngleLoc, Protocols,
13886                                         ProtocolLocs, ProtocolRAngleLoc,
13887                                         /*FailOnError=*/true);
13888 }
13889 
13890 template<typename Derived>
13891 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13892            QualType BaseType,
13893            SourceLocation Loc,
13894            SourceLocation TypeArgsLAngleLoc,
13895            ArrayRef<TypeSourceInfo *> TypeArgs,
13896            SourceLocation TypeArgsRAngleLoc,
13897            SourceLocation ProtocolLAngleLoc,
13898            ArrayRef<ObjCProtocolDecl *> Protocols,
13899            ArrayRef<SourceLocation> ProtocolLocs,
13900            SourceLocation ProtocolRAngleLoc) {
13901   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13902                                      TypeArgs, TypeArgsRAngleLoc,
13903                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13904                                      ProtocolRAngleLoc,
13905                                      /*FailOnError=*/true);
13906 }
13907 
13908 template<typename Derived>
13909 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13910            QualType PointeeType,
13911            SourceLocation Star) {
13912   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13913 }
13914 
13915 template<typename Derived>
13916 QualType
13917 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13918                                          ArrayType::ArraySizeModifier SizeMod,
13919                                          const llvm::APInt *Size,
13920                                          Expr *SizeExpr,
13921                                          unsigned IndexTypeQuals,
13922                                          SourceRange BracketsRange) {
13923   if (SizeExpr || !Size)
13924     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13925                                   IndexTypeQuals, BracketsRange,
13926                                   getDerived().getBaseEntity());
13927 
13928   QualType Types[] = {
13929     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13930     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13931     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13932   };
13933   const unsigned NumTypes = llvm::array_lengthof(Types);
13934   QualType SizeType;
13935   for (unsigned I = 0; I != NumTypes; ++I)
13936     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13937       SizeType = Types[I];
13938       break;
13939     }
13940 
13941   // Note that we can return a VariableArrayType here in the case where
13942   // the element type was a dependent VariableArrayType.
13943   IntegerLiteral *ArraySize
13944       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13945                                /*FIXME*/BracketsRange.getBegin());
13946   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13947                                 IndexTypeQuals, BracketsRange,
13948                                 getDerived().getBaseEntity());
13949 }
13950 
13951 template<typename Derived>
13952 QualType
13953 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
13954                                                  ArrayType::ArraySizeModifier SizeMod,
13955                                                  const llvm::APInt &Size,
13956                                                  Expr *SizeExpr,
13957                                                  unsigned IndexTypeQuals,
13958                                                  SourceRange BracketsRange) {
13959   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
13960                                         IndexTypeQuals, BracketsRange);
13961 }
13962 
13963 template<typename Derived>
13964 QualType
13965 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
13966                                           ArrayType::ArraySizeModifier SizeMod,
13967                                                  unsigned IndexTypeQuals,
13968                                                    SourceRange BracketsRange) {
13969   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
13970                                        IndexTypeQuals, BracketsRange);
13971 }
13972 
13973 template<typename Derived>
13974 QualType
13975 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
13976                                           ArrayType::ArraySizeModifier SizeMod,
13977                                                  Expr *SizeExpr,
13978                                                  unsigned IndexTypeQuals,
13979                                                  SourceRange BracketsRange) {
13980   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13981                                        SizeExpr,
13982                                        IndexTypeQuals, BracketsRange);
13983 }
13984 
13985 template<typename Derived>
13986 QualType
13987 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
13988                                           ArrayType::ArraySizeModifier SizeMod,
13989                                                        Expr *SizeExpr,
13990                                                        unsigned IndexTypeQuals,
13991                                                    SourceRange BracketsRange) {
13992   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13993                                        SizeExpr,
13994                                        IndexTypeQuals, BracketsRange);
13995 }
13996 
13997 template <typename Derived>
13998 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
13999     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14000   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14001                                           AttributeLoc);
14002 }
14003 
14004 template <typename Derived>
14005 QualType
14006 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14007                                           unsigned NumElements,
14008                                           VectorType::VectorKind VecKind) {
14009   // FIXME: semantic checking!
14010   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14011 }
14012 
14013 template <typename Derived>
14014 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14015     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14016     VectorType::VectorKind VecKind) {
14017   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14018 }
14019 
14020 template<typename Derived>
14021 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14022                                                       unsigned NumElements,
14023                                                  SourceLocation AttributeLoc) {
14024   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14025                           NumElements, true);
14026   IntegerLiteral *VectorSize
14027     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14028                              AttributeLoc);
14029   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14030 }
14031 
14032 template<typename Derived>
14033 QualType
14034 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14035                                                            Expr *SizeExpr,
14036                                                   SourceLocation AttributeLoc) {
14037   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14038 }
14039 
14040 template <typename Derived>
14041 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14042     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14043   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14044                                                NumColumns);
14045 }
14046 
14047 template <typename Derived>
14048 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14049     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14050     SourceLocation AttributeLoc) {
14051   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14052                                  AttributeLoc);
14053 }
14054 
14055 template<typename Derived>
14056 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14057     QualType T,
14058     MutableArrayRef<QualType> ParamTypes,
14059     const FunctionProtoType::ExtProtoInfo &EPI) {
14060   return SemaRef.BuildFunctionType(T, ParamTypes,
14061                                    getDerived().getBaseLocation(),
14062                                    getDerived().getBaseEntity(),
14063                                    EPI);
14064 }
14065 
14066 template<typename Derived>
14067 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14068   return SemaRef.Context.getFunctionNoProtoType(T);
14069 }
14070 
14071 template<typename Derived>
14072 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14073                                                             Decl *D) {
14074   assert(D && "no decl found");
14075   if (D->isInvalidDecl()) return QualType();
14076 
14077   // FIXME: Doesn't account for ObjCInterfaceDecl!
14078   TypeDecl *Ty;
14079   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14080     // A valid resolved using typename pack expansion decl can have multiple
14081     // UsingDecls, but they must each have exactly one type, and it must be
14082     // the same type in every case. But we must have at least one expansion!
14083     if (UPD->expansions().empty()) {
14084       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14085           << UPD->isCXXClassMember() << UPD;
14086       return QualType();
14087     }
14088 
14089     // We might still have some unresolved types. Try to pick a resolved type
14090     // if we can. The final instantiation will check that the remaining
14091     // unresolved types instantiate to the type we pick.
14092     QualType FallbackT;
14093     QualType T;
14094     for (auto *E : UPD->expansions()) {
14095       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14096       if (ThisT.isNull())
14097         continue;
14098       else if (ThisT->getAs<UnresolvedUsingType>())
14099         FallbackT = ThisT;
14100       else if (T.isNull())
14101         T = ThisT;
14102       else
14103         assert(getSema().Context.hasSameType(ThisT, T) &&
14104                "mismatched resolved types in using pack expansion");
14105     }
14106     return T.isNull() ? FallbackT : T;
14107   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14108     assert(Using->hasTypename() &&
14109            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14110 
14111     // A valid resolved using typename decl points to exactly one type decl.
14112     assert(++Using->shadow_begin() == Using->shadow_end());
14113     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
14114   } else {
14115     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14116            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14117     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14118   }
14119 
14120   return SemaRef.Context.getTypeDeclType(Ty);
14121 }
14122 
14123 template<typename Derived>
14124 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14125                                                        SourceLocation Loc) {
14126   return SemaRef.BuildTypeofExprType(E, Loc);
14127 }
14128 
14129 template<typename Derived>
14130 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14131   return SemaRef.Context.getTypeOfType(Underlying);
14132 }
14133 
14134 template<typename Derived>
14135 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14136                                                      SourceLocation Loc) {
14137   return SemaRef.BuildDecltypeType(E, Loc);
14138 }
14139 
14140 template<typename Derived>
14141 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14142                                             UnaryTransformType::UTTKind UKind,
14143                                             SourceLocation Loc) {
14144   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14145 }
14146 
14147 template<typename Derived>
14148 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14149                                                       TemplateName Template,
14150                                              SourceLocation TemplateNameLoc,
14151                                      TemplateArgumentListInfo &TemplateArgs) {
14152   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14153 }
14154 
14155 template<typename Derived>
14156 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14157                                                    SourceLocation KWLoc) {
14158   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14159 }
14160 
14161 template<typename Derived>
14162 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14163                                                  SourceLocation KWLoc,
14164                                                  bool isReadPipe) {
14165   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14166                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14167 }
14168 
14169 template <typename Derived>
14170 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14171                                                    unsigned NumBits,
14172                                                    SourceLocation Loc) {
14173   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14174                         NumBits, true);
14175   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14176                                                 SemaRef.Context.IntTy, Loc);
14177   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14178 }
14179 
14180 template <typename Derived>
14181 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14182     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14183   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14184 }
14185 
14186 template<typename Derived>
14187 TemplateName
14188 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14189                                             bool TemplateKW,
14190                                             TemplateDecl *Template) {
14191   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14192                                                   Template);
14193 }
14194 
14195 template<typename Derived>
14196 TemplateName
14197 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14198                                             SourceLocation TemplateKWLoc,
14199                                             const IdentifierInfo &Name,
14200                                             SourceLocation NameLoc,
14201                                             QualType ObjectType,
14202                                             NamedDecl *FirstQualifierInScope,
14203                                             bool AllowInjectedClassName) {
14204   UnqualifiedId TemplateName;
14205   TemplateName.setIdentifier(&Name, NameLoc);
14206   Sema::TemplateTy Template;
14207   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14208                               TemplateName, ParsedType::make(ObjectType),
14209                               /*EnteringContext=*/false, Template,
14210                               AllowInjectedClassName);
14211   return Template.get();
14212 }
14213 
14214 template<typename Derived>
14215 TemplateName
14216 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14217                                             SourceLocation TemplateKWLoc,
14218                                             OverloadedOperatorKind Operator,
14219                                             SourceLocation NameLoc,
14220                                             QualType ObjectType,
14221                                             bool AllowInjectedClassName) {
14222   UnqualifiedId Name;
14223   // FIXME: Bogus location information.
14224   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14225   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14226   Sema::TemplateTy Template;
14227   getSema().ActOnTemplateName(
14228       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14229       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14230   return Template.get();
14231 }
14232 
14233 template<typename Derived>
14234 ExprResult
14235 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14236                                                    SourceLocation OpLoc,
14237                                                    Expr *OrigCallee,
14238                                                    Expr *First,
14239                                                    Expr *Second) {
14240   Expr *Callee = OrigCallee->IgnoreParenCasts();
14241   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14242 
14243   if (First->getObjectKind() == OK_ObjCProperty) {
14244     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14245     if (BinaryOperator::isAssignmentOp(Opc))
14246       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14247                                                  First, Second);
14248     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14249     if (Result.isInvalid())
14250       return ExprError();
14251     First = Result.get();
14252   }
14253 
14254   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14255     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14256     if (Result.isInvalid())
14257       return ExprError();
14258     Second = Result.get();
14259   }
14260 
14261   // Determine whether this should be a builtin operation.
14262   if (Op == OO_Subscript) {
14263     if (!First->getType()->isOverloadableType() &&
14264         !Second->getType()->isOverloadableType())
14265       return getSema().CreateBuiltinArraySubscriptExpr(
14266           First, Callee->getBeginLoc(), Second, OpLoc);
14267   } else if (Op == OO_Arrow) {
14268     // -> is never a builtin operation.
14269     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14270   } else if (Second == nullptr || isPostIncDec) {
14271     if (!First->getType()->isOverloadableType() ||
14272         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14273       // The argument is not of overloadable type, or this is an expression
14274       // of the form &Class::member, so try to create a built-in unary
14275       // operation.
14276       UnaryOperatorKind Opc
14277         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14278 
14279       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14280     }
14281   } else {
14282     if (!First->getType()->isOverloadableType() &&
14283         !Second->getType()->isOverloadableType()) {
14284       // Neither of the arguments is an overloadable type, so try to
14285       // create a built-in binary operation.
14286       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14287       ExprResult Result
14288         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14289       if (Result.isInvalid())
14290         return ExprError();
14291 
14292       return Result;
14293     }
14294   }
14295 
14296   // Compute the transformed set of functions (and function templates) to be
14297   // used during overload resolution.
14298   UnresolvedSet<16> Functions;
14299   bool RequiresADL;
14300 
14301   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14302     Functions.append(ULE->decls_begin(), ULE->decls_end());
14303     // If the overload could not be resolved in the template definition
14304     // (because we had a dependent argument), ADL is performed as part of
14305     // template instantiation.
14306     RequiresADL = ULE->requiresADL();
14307   } else {
14308     // If we've resolved this to a particular non-member function, just call
14309     // that function. If we resolved it to a member function,
14310     // CreateOverloaded* will find that function for us.
14311     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14312     if (!isa<CXXMethodDecl>(ND))
14313       Functions.addDecl(ND);
14314     RequiresADL = false;
14315   }
14316 
14317   // Add any functions found via argument-dependent lookup.
14318   Expr *Args[2] = { First, Second };
14319   unsigned NumArgs = 1 + (Second != nullptr);
14320 
14321   // Create the overloaded operator invocation for unary operators.
14322   if (NumArgs == 1 || isPostIncDec) {
14323     UnaryOperatorKind Opc
14324       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14325     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14326                                            RequiresADL);
14327   }
14328 
14329   if (Op == OO_Subscript) {
14330     SourceLocation LBrace;
14331     SourceLocation RBrace;
14332 
14333     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14334         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14335         LBrace = SourceLocation::getFromRawEncoding(
14336                     NameLoc.CXXOperatorName.BeginOpNameLoc);
14337         RBrace = SourceLocation::getFromRawEncoding(
14338                     NameLoc.CXXOperatorName.EndOpNameLoc);
14339     } else {
14340       LBrace = Callee->getBeginLoc();
14341       RBrace = OpLoc;
14342     }
14343 
14344     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14345                                                       First, Second);
14346   }
14347 
14348   // Create the overloaded operator invocation for binary operators.
14349   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14350   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14351       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14352   if (Result.isInvalid())
14353     return ExprError();
14354 
14355   return Result;
14356 }
14357 
14358 template<typename Derived>
14359 ExprResult
14360 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14361                                                      SourceLocation OperatorLoc,
14362                                                        bool isArrow,
14363                                                        CXXScopeSpec &SS,
14364                                                      TypeSourceInfo *ScopeType,
14365                                                        SourceLocation CCLoc,
14366                                                        SourceLocation TildeLoc,
14367                                         PseudoDestructorTypeStorage Destroyed) {
14368   QualType BaseType = Base->getType();
14369   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14370       (!isArrow && !BaseType->getAs<RecordType>()) ||
14371       (isArrow && BaseType->getAs<PointerType>() &&
14372        !BaseType->castAs<PointerType>()->getPointeeType()
14373                                               ->template getAs<RecordType>())){
14374     // This pseudo-destructor expression is still a pseudo-destructor.
14375     return SemaRef.BuildPseudoDestructorExpr(
14376         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14377         CCLoc, TildeLoc, Destroyed);
14378   }
14379 
14380   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14381   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14382                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14383   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14384   NameInfo.setNamedTypeInfo(DestroyedType);
14385 
14386   // The scope type is now known to be a valid nested name specifier
14387   // component. Tack it on to the end of the nested name specifier.
14388   if (ScopeType) {
14389     if (!ScopeType->getType()->getAs<TagType>()) {
14390       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14391                      diag::err_expected_class_or_namespace)
14392           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14393       return ExprError();
14394     }
14395     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14396               CCLoc);
14397   }
14398 
14399   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14400   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14401                                             OperatorLoc, isArrow,
14402                                             SS, TemplateKWLoc,
14403                                             /*FIXME: FirstQualifier*/ nullptr,
14404                                             NameInfo,
14405                                             /*TemplateArgs*/ nullptr,
14406                                             /*S*/nullptr);
14407 }
14408 
14409 template<typename Derived>
14410 StmtResult
14411 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14412   SourceLocation Loc = S->getBeginLoc();
14413   CapturedDecl *CD = S->getCapturedDecl();
14414   unsigned NumParams = CD->getNumParams();
14415   unsigned ContextParamPos = CD->getContextParamPosition();
14416   SmallVector<Sema::CapturedParamNameType, 4> Params;
14417   for (unsigned I = 0; I < NumParams; ++I) {
14418     if (I != ContextParamPos) {
14419       Params.push_back(
14420              std::make_pair(
14421                   CD->getParam(I)->getName(),
14422                   getDerived().TransformType(CD->getParam(I)->getType())));
14423     } else {
14424       Params.push_back(std::make_pair(StringRef(), QualType()));
14425     }
14426   }
14427   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14428                                      S->getCapturedRegionKind(), Params);
14429   StmtResult Body;
14430   {
14431     Sema::CompoundScopeRAII CompoundScope(getSema());
14432     Body = getDerived().TransformStmt(S->getCapturedStmt());
14433   }
14434 
14435   if (Body.isInvalid()) {
14436     getSema().ActOnCapturedRegionError();
14437     return StmtError();
14438   }
14439 
14440   return getSema().ActOnCapturedRegionEnd(Body.get());
14441 }
14442 
14443 } // end namespace clang
14444 
14445 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14446