1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Basic/OpenMPKinds.h"
32 #include "clang/Sema/Designator.h"
33 #include "clang/Sema/Lookup.h"
34 #include "clang/Sema/Ownership.h"
35 #include "clang/Sema/ParsedTemplate.h"
36 #include "clang/Sema/ScopeInfo.h"
37 #include "clang/Sema/SemaDiagnostic.h"
38 #include "clang/Sema/SemaInternal.h"
39 #include "llvm/ADT/ArrayRef.h"
40 #include "llvm/Support/ErrorHandling.h"
41 #include <algorithm>
42 
43 using namespace llvm::omp;
44 
45 namespace clang {
46 using namespace sema;
47 
48 /// A semantic tree transformation that allows one to transform one
49 /// abstract syntax tree into another.
50 ///
51 /// A new tree transformation is defined by creating a new subclass \c X of
52 /// \c TreeTransform<X> and then overriding certain operations to provide
53 /// behavior specific to that transformation. For example, template
54 /// instantiation is implemented as a tree transformation where the
55 /// transformation of TemplateTypeParmType nodes involves substituting the
56 /// template arguments for their corresponding template parameters; a similar
57 /// transformation is performed for non-type template parameters and
58 /// template template parameters.
59 ///
60 /// This tree-transformation template uses static polymorphism to allow
61 /// subclasses to customize any of its operations. Thus, a subclass can
62 /// override any of the transformation or rebuild operators by providing an
63 /// operation with the same signature as the default implementation. The
64 /// overriding function should not be virtual.
65 ///
66 /// Semantic tree transformations are split into two stages, either of which
67 /// can be replaced by a subclass. The "transform" step transforms an AST node
68 /// or the parts of an AST node using the various transformation functions,
69 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
70 /// node of the appropriate kind from the pieces. The default transformation
71 /// routines recursively transform the operands to composite AST nodes (e.g.,
72 /// the pointee type of a PointerType node) and, if any of those operand nodes
73 /// were changed by the transformation, invokes the rebuild operation to create
74 /// a new AST node.
75 ///
76 /// Subclasses can customize the transformation at various levels. The
77 /// most coarse-grained transformations involve replacing TransformType(),
78 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
79 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
80 /// new implementations.
81 ///
82 /// For more fine-grained transformations, subclasses can replace any of the
83 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
84 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
85 /// replacing TransformTemplateTypeParmType() allows template instantiation
86 /// to substitute template arguments for their corresponding template
87 /// parameters. Additionally, subclasses can override the \c RebuildXXX
88 /// functions to control how AST nodes are rebuilt when their operands change.
89 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
90 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
91 /// be able to use more efficient rebuild steps.
92 ///
93 /// There are a handful of other functions that can be overridden, allowing one
94 /// to avoid traversing nodes that don't need any transformation
95 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
96 /// operands have not changed (\c AlwaysRebuild()), and customize the
97 /// default locations and entity names used for type-checking
98 /// (\c getBaseLocation(), \c getBaseEntity()).
99 template<typename Derived>
100 class TreeTransform {
101   /// Private RAII object that helps us forget and then re-remember
102   /// the template argument corresponding to a partially-substituted parameter
103   /// pack.
104   class ForgetPartiallySubstitutedPackRAII {
105     Derived &Self;
106     TemplateArgument Old;
107 
108   public:
109     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
110       Old = Self.ForgetPartiallySubstitutedPack();
111     }
112 
113     ~ForgetPartiallySubstitutedPackRAII() {
114       Self.RememberPartiallySubstitutedPack(Old);
115     }
116   };
117 
118 protected:
119   Sema &SemaRef;
120 
121   /// The set of local declarations that have been transformed, for
122   /// cases where we are forced to build new declarations within the transformer
123   /// rather than in the subclass (e.g., lambda closure types).
124   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
125 
126 public:
127   /// Initializes a new tree transformer.
128   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
129 
130   /// Retrieves a reference to the derived class.
131   Derived &getDerived() { return static_cast<Derived&>(*this); }
132 
133   /// Retrieves a reference to the derived class.
134   const Derived &getDerived() const {
135     return static_cast<const Derived&>(*this);
136   }
137 
138   static inline ExprResult Owned(Expr *E) { return E; }
139   static inline StmtResult Owned(Stmt *S) { return S; }
140 
141   /// Retrieves a reference to the semantic analysis object used for
142   /// this tree transform.
143   Sema &getSema() const { return SemaRef; }
144 
145   /// Whether the transformation should always rebuild AST nodes, even
146   /// if none of the children have changed.
147   ///
148   /// Subclasses may override this function to specify when the transformation
149   /// should rebuild all AST nodes.
150   ///
151   /// We must always rebuild all AST nodes when performing variadic template
152   /// pack expansion, in order to avoid violating the AST invariant that each
153   /// statement node appears at most once in its containing declaration.
154   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
155 
156   /// Whether the transformation is forming an expression or statement that
157   /// replaces the original. In this case, we'll reuse mangling numbers from
158   /// existing lambdas.
159   bool ReplacingOriginal() { return false; }
160 
161   /// Wether CXXConstructExpr can be skipped when they are implicit.
162   /// They will be reconstructed when used if needed.
163   /// This is usefull when the user that cause rebuilding of the
164   /// CXXConstructExpr is outside of the expression at which the TreeTransform
165   /// started.
166   bool AllowSkippingCXXConstructExpr() { return true; }
167 
168   /// Returns the location of the entity being transformed, if that
169   /// information was not available elsewhere in the AST.
170   ///
171   /// By default, returns no source-location information. Subclasses can
172   /// provide an alternative implementation that provides better location
173   /// information.
174   SourceLocation getBaseLocation() { return SourceLocation(); }
175 
176   /// Returns the name of the entity being transformed, if that
177   /// information was not available elsewhere in the AST.
178   ///
179   /// By default, returns an empty name. Subclasses can provide an alternative
180   /// implementation with a more precise name.
181   DeclarationName getBaseEntity() { return DeclarationName(); }
182 
183   /// Sets the "base" location and entity when that
184   /// information is known based on another transformation.
185   ///
186   /// By default, the source location and entity are ignored. Subclasses can
187   /// override this function to provide a customized implementation.
188   void setBase(SourceLocation Loc, DeclarationName Entity) { }
189 
190   /// RAII object that temporarily sets the base location and entity
191   /// used for reporting diagnostics in types.
192   class TemporaryBase {
193     TreeTransform &Self;
194     SourceLocation OldLocation;
195     DeclarationName OldEntity;
196 
197   public:
198     TemporaryBase(TreeTransform &Self, SourceLocation Location,
199                   DeclarationName Entity) : Self(Self) {
200       OldLocation = Self.getDerived().getBaseLocation();
201       OldEntity = Self.getDerived().getBaseEntity();
202 
203       if (Location.isValid())
204         Self.getDerived().setBase(Location, Entity);
205     }
206 
207     ~TemporaryBase() {
208       Self.getDerived().setBase(OldLocation, OldEntity);
209     }
210   };
211 
212   /// Determine whether the given type \p T has already been
213   /// transformed.
214   ///
215   /// Subclasses can provide an alternative implementation of this routine
216   /// to short-circuit evaluation when it is known that a given type will
217   /// not change. For example, template instantiation need not traverse
218   /// non-dependent types.
219   bool AlreadyTransformed(QualType T) {
220     return T.isNull();
221   }
222 
223   /// Transform a template parameter depth level.
224   ///
225   /// During a transformation that transforms template parameters, this maps
226   /// an old template parameter depth to a new depth.
227   unsigned TransformTemplateDepth(unsigned Depth) {
228     return Depth;
229   }
230 
231   /// Determine whether the given call argument should be dropped, e.g.,
232   /// because it is a default argument.
233   ///
234   /// Subclasses can provide an alternative implementation of this routine to
235   /// determine which kinds of call arguments get dropped. By default,
236   /// CXXDefaultArgument nodes are dropped (prior to transformation).
237   bool DropCallArgument(Expr *E) {
238     return E->isDefaultArgument();
239   }
240 
241   /// Determine whether we should expand a pack expansion with the
242   /// given set of parameter packs into separate arguments by repeatedly
243   /// transforming the pattern.
244   ///
245   /// By default, the transformer never tries to expand pack expansions.
246   /// Subclasses can override this routine to provide different behavior.
247   ///
248   /// \param EllipsisLoc The location of the ellipsis that identifies the
249   /// pack expansion.
250   ///
251   /// \param PatternRange The source range that covers the entire pattern of
252   /// the pack expansion.
253   ///
254   /// \param Unexpanded The set of unexpanded parameter packs within the
255   /// pattern.
256   ///
257   /// \param ShouldExpand Will be set to \c true if the transformer should
258   /// expand the corresponding pack expansions into separate arguments. When
259   /// set, \c NumExpansions must also be set.
260   ///
261   /// \param RetainExpansion Whether the caller should add an unexpanded
262   /// pack expansion after all of the expanded arguments. This is used
263   /// when extending explicitly-specified template argument packs per
264   /// C++0x [temp.arg.explicit]p9.
265   ///
266   /// \param NumExpansions The number of separate arguments that will be in
267   /// the expanded form of the corresponding pack expansion. This is both an
268   /// input and an output parameter, which can be set by the caller if the
269   /// number of expansions is known a priori (e.g., due to a prior substitution)
270   /// and will be set by the callee when the number of expansions is known.
271   /// The callee must set this value when \c ShouldExpand is \c true; it may
272   /// set this value in other cases.
273   ///
274   /// \returns true if an error occurred (e.g., because the parameter packs
275   /// are to be instantiated with arguments of different lengths), false
276   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
277   /// must be set.
278   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
279                                SourceRange PatternRange,
280                                ArrayRef<UnexpandedParameterPack> Unexpanded,
281                                bool &ShouldExpand,
282                                bool &RetainExpansion,
283                                Optional<unsigned> &NumExpansions) {
284     ShouldExpand = false;
285     return false;
286   }
287 
288   /// "Forget" about the partially-substituted pack template argument,
289   /// when performing an instantiation that must preserve the parameter pack
290   /// use.
291   ///
292   /// This routine is meant to be overridden by the template instantiator.
293   TemplateArgument ForgetPartiallySubstitutedPack() {
294     return TemplateArgument();
295   }
296 
297   /// "Remember" the partially-substituted pack template argument
298   /// after performing an instantiation that must preserve the parameter pack
299   /// use.
300   ///
301   /// This routine is meant to be overridden by the template instantiator.
302   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
303 
304   /// Note to the derived class when a function parameter pack is
305   /// being expanded.
306   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
307 
308   /// Transforms the given type into another type.
309   ///
310   /// By default, this routine transforms a type by creating a
311   /// TypeSourceInfo for it and delegating to the appropriate
312   /// function.  This is expensive, but we don't mind, because
313   /// this method is deprecated anyway;  all users should be
314   /// switched to storing TypeSourceInfos.
315   ///
316   /// \returns the transformed type.
317   QualType TransformType(QualType T);
318 
319   /// Transforms the given type-with-location into a new
320   /// type-with-location.
321   ///
322   /// By default, this routine transforms a type by delegating to the
323   /// appropriate TransformXXXType to build a new type.  Subclasses
324   /// may override this function (to take over all type
325   /// transformations) or some set of the TransformXXXType functions
326   /// to alter the transformation.
327   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
328 
329   /// Transform the given type-with-location into a new
330   /// type, collecting location information in the given builder
331   /// as necessary.
332   ///
333   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
334 
335   /// Transform a type that is permitted to produce a
336   /// DeducedTemplateSpecializationType.
337   ///
338   /// This is used in the (relatively rare) contexts where it is acceptable
339   /// for transformation to produce a class template type with deduced
340   /// template arguments.
341   /// @{
342   QualType TransformTypeWithDeducedTST(QualType T);
343   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
344   /// @}
345 
346   /// The reason why the value of a statement is not discarded, if any.
347   enum StmtDiscardKind {
348     SDK_Discarded,
349     SDK_NotDiscarded,
350     SDK_StmtExprResult,
351   };
352 
353   /// Transform the given statement.
354   ///
355   /// By default, this routine transforms a statement by delegating to the
356   /// appropriate TransformXXXStmt function to transform a specific kind of
357   /// statement or the TransformExpr() function to transform an expression.
358   /// Subclasses may override this function to transform statements using some
359   /// other mechanism.
360   ///
361   /// \returns the transformed statement.
362   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
363 
364   /// Transform the given statement.
365   ///
366   /// By default, this routine transforms a statement by delegating to the
367   /// appropriate TransformOMPXXXClause function to transform a specific kind
368   /// of clause. Subclasses may override this function to transform statements
369   /// using some other mechanism.
370   ///
371   /// \returns the transformed OpenMP clause.
372   OMPClause *TransformOMPClause(OMPClause *S);
373 
374   /// Transform the given attribute.
375   ///
376   /// By default, this routine transforms a statement by delegating to the
377   /// appropriate TransformXXXAttr function to transform a specific kind
378   /// of attribute. Subclasses may override this function to transform
379   /// attributed statements using some other mechanism.
380   ///
381   /// \returns the transformed attribute
382   const Attr *TransformAttr(const Attr *S);
383 
384 /// Transform the specified attribute.
385 ///
386 /// Subclasses should override the transformation of attributes with a pragma
387 /// spelling to transform expressions stored within the attribute.
388 ///
389 /// \returns the transformed attribute.
390 #define ATTR(X)
391 #define PRAGMA_SPELLING_ATTR(X)                                                \
392   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
393 #include "clang/Basic/AttrList.inc"
394 
395   /// Transform the given expression.
396   ///
397   /// By default, this routine transforms an expression by delegating to the
398   /// appropriate TransformXXXExpr function to build a new expression.
399   /// Subclasses may override this function to transform expressions using some
400   /// other mechanism.
401   ///
402   /// \returns the transformed expression.
403   ExprResult TransformExpr(Expr *E);
404 
405   /// Transform the given initializer.
406   ///
407   /// By default, this routine transforms an initializer by stripping off the
408   /// semantic nodes added by initialization, then passing the result to
409   /// TransformExpr or TransformExprs.
410   ///
411   /// \returns the transformed initializer.
412   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
413 
414   /// Transform the given list of expressions.
415   ///
416   /// This routine transforms a list of expressions by invoking
417   /// \c TransformExpr() for each subexpression. However, it also provides
418   /// support for variadic templates by expanding any pack expansions (if the
419   /// derived class permits such expansion) along the way. When pack expansions
420   /// are present, the number of outputs may not equal the number of inputs.
421   ///
422   /// \param Inputs The set of expressions to be transformed.
423   ///
424   /// \param NumInputs The number of expressions in \c Inputs.
425   ///
426   /// \param IsCall If \c true, then this transform is being performed on
427   /// function-call arguments, and any arguments that should be dropped, will
428   /// be.
429   ///
430   /// \param Outputs The transformed input expressions will be added to this
431   /// vector.
432   ///
433   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
434   /// due to transformation.
435   ///
436   /// \returns true if an error occurred, false otherwise.
437   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
438                       SmallVectorImpl<Expr *> &Outputs,
439                       bool *ArgChanged = nullptr);
440 
441   /// Transform the given declaration, which is referenced from a type
442   /// or expression.
443   ///
444   /// By default, acts as the identity function on declarations, unless the
445   /// transformer has had to transform the declaration itself. Subclasses
446   /// may override this function to provide alternate behavior.
447   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
448     llvm::DenseMap<Decl *, Decl *>::iterator Known
449       = TransformedLocalDecls.find(D);
450     if (Known != TransformedLocalDecls.end())
451       return Known->second;
452 
453     return D;
454   }
455 
456   /// Transform the specified condition.
457   ///
458   /// By default, this transforms the variable and expression and rebuilds
459   /// the condition.
460   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
461                                            Expr *Expr,
462                                            Sema::ConditionKind Kind);
463 
464   /// Transform the attributes associated with the given declaration and
465   /// place them on the new declaration.
466   ///
467   /// By default, this operation does nothing. Subclasses may override this
468   /// behavior to transform attributes.
469   void transformAttrs(Decl *Old, Decl *New) { }
470 
471   /// Note that a local declaration has been transformed by this
472   /// transformer.
473   ///
474   /// Local declarations are typically transformed via a call to
475   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
476   /// the transformer itself has to transform the declarations. This routine
477   /// can be overridden by a subclass that keeps track of such mappings.
478   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
479     assert(New.size() == 1 &&
480            "must override transformedLocalDecl if performing pack expansion");
481     TransformedLocalDecls[Old] = New.front();
482   }
483 
484   /// Transform the definition of the given declaration.
485   ///
486   /// By default, invokes TransformDecl() to transform the declaration.
487   /// Subclasses may override this function to provide alternate behavior.
488   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
489     return getDerived().TransformDecl(Loc, D);
490   }
491 
492   /// Transform the given declaration, which was the first part of a
493   /// nested-name-specifier in a member access expression.
494   ///
495   /// This specific declaration transformation only applies to the first
496   /// identifier in a nested-name-specifier of a member access expression, e.g.,
497   /// the \c T in \c x->T::member
498   ///
499   /// By default, invokes TransformDecl() to transform the declaration.
500   /// Subclasses may override this function to provide alternate behavior.
501   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
502     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
503   }
504 
505   /// Transform the set of declarations in an OverloadExpr.
506   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
507                                   LookupResult &R);
508 
509   /// Transform the given nested-name-specifier with source-location
510   /// information.
511   ///
512   /// By default, transforms all of the types and declarations within the
513   /// nested-name-specifier. Subclasses may override this function to provide
514   /// alternate behavior.
515   NestedNameSpecifierLoc
516   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
517                                   QualType ObjectType = QualType(),
518                                   NamedDecl *FirstQualifierInScope = nullptr);
519 
520   /// Transform the given declaration name.
521   ///
522   /// By default, transforms the types of conversion function, constructor,
523   /// and destructor names and then (if needed) rebuilds the declaration name.
524   /// Identifiers and selectors are returned unmodified. Sublcasses may
525   /// override this function to provide alternate behavior.
526   DeclarationNameInfo
527   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
528 
529   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
530       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
531   concepts::TypeRequirement *
532   TransformTypeRequirement(concepts::TypeRequirement *Req);
533   concepts::ExprRequirement *
534   TransformExprRequirement(concepts::ExprRequirement *Req);
535   concepts::NestedRequirement *
536   TransformNestedRequirement(concepts::NestedRequirement *Req);
537 
538   /// Transform the given template name.
539   ///
540   /// \param SS The nested-name-specifier that qualifies the template
541   /// name. This nested-name-specifier must already have been transformed.
542   ///
543   /// \param Name The template name to transform.
544   ///
545   /// \param NameLoc The source location of the template name.
546   ///
547   /// \param ObjectType If we're translating a template name within a member
548   /// access expression, this is the type of the object whose member template
549   /// is being referenced.
550   ///
551   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
552   /// also refers to a name within the current (lexical) scope, this is the
553   /// declaration it refers to.
554   ///
555   /// By default, transforms the template name by transforming the declarations
556   /// and nested-name-specifiers that occur within the template name.
557   /// Subclasses may override this function to provide alternate behavior.
558   TemplateName
559   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
560                         SourceLocation NameLoc,
561                         QualType ObjectType = QualType(),
562                         NamedDecl *FirstQualifierInScope = nullptr,
563                         bool AllowInjectedClassName = false);
564 
565   /// Transform the given template argument.
566   ///
567   /// By default, this operation transforms the type, expression, or
568   /// declaration stored within the template argument and constructs a
569   /// new template argument from the transformed result. Subclasses may
570   /// override this function to provide alternate behavior.
571   ///
572   /// Returns true if there was an error.
573   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
574                                  TemplateArgumentLoc &Output,
575                                  bool Uneval = false);
576 
577   /// Transform the given set of template arguments.
578   ///
579   /// By default, this operation transforms all of the template arguments
580   /// in the input set using \c TransformTemplateArgument(), and appends
581   /// the transformed arguments to the output list.
582   ///
583   /// Note that this overload of \c TransformTemplateArguments() is merely
584   /// a convenience function. Subclasses that wish to override this behavior
585   /// should override the iterator-based member template version.
586   ///
587   /// \param Inputs The set of template arguments to be transformed.
588   ///
589   /// \param NumInputs The number of template arguments in \p Inputs.
590   ///
591   /// \param Outputs The set of transformed template arguments output by this
592   /// routine.
593   ///
594   /// Returns true if an error occurred.
595   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
596                                   unsigned NumInputs,
597                                   TemplateArgumentListInfo &Outputs,
598                                   bool Uneval = false) {
599     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
600                                       Uneval);
601   }
602 
603   /// Transform the given set of template arguments.
604   ///
605   /// By default, this operation transforms all of the template arguments
606   /// in the input set using \c TransformTemplateArgument(), and appends
607   /// the transformed arguments to the output list.
608   ///
609   /// \param First An iterator to the first template argument.
610   ///
611   /// \param Last An iterator one step past the last template argument.
612   ///
613   /// \param Outputs The set of transformed template arguments output by this
614   /// routine.
615   ///
616   /// Returns true if an error occurred.
617   template<typename InputIterator>
618   bool TransformTemplateArguments(InputIterator First,
619                                   InputIterator Last,
620                                   TemplateArgumentListInfo &Outputs,
621                                   bool Uneval = false);
622 
623   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
624   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
625                                  TemplateArgumentLoc &ArgLoc);
626 
627   /// Fakes up a TypeSourceInfo for a type.
628   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
629     return SemaRef.Context.getTrivialTypeSourceInfo(T,
630                        getDerived().getBaseLocation());
631   }
632 
633 #define ABSTRACT_TYPELOC(CLASS, PARENT)
634 #define TYPELOC(CLASS, PARENT)                                   \
635   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
636 #include "clang/AST/TypeLocNodes.def"
637 
638   template<typename Fn>
639   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
640                                       FunctionProtoTypeLoc TL,
641                                       CXXRecordDecl *ThisContext,
642                                       Qualifiers ThisTypeQuals,
643                                       Fn TransformExceptionSpec);
644 
645   bool TransformExceptionSpec(SourceLocation Loc,
646                               FunctionProtoType::ExceptionSpecInfo &ESI,
647                               SmallVectorImpl<QualType> &Exceptions,
648                               bool &Changed);
649 
650   StmtResult TransformSEHHandler(Stmt *Handler);
651 
652   QualType
653   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
654                                       TemplateSpecializationTypeLoc TL,
655                                       TemplateName Template);
656 
657   QualType
658   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
659                                       DependentTemplateSpecializationTypeLoc TL,
660                                                TemplateName Template,
661                                                CXXScopeSpec &SS);
662 
663   QualType TransformDependentTemplateSpecializationType(
664       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
665       NestedNameSpecifierLoc QualifierLoc);
666 
667   /// Transforms the parameters of a function type into the
668   /// given vectors.
669   ///
670   /// The result vectors should be kept in sync; null entries in the
671   /// variables vector are acceptable.
672   ///
673   /// Return true on error.
674   bool TransformFunctionTypeParams(
675       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
676       const QualType *ParamTypes,
677       const FunctionProtoType::ExtParameterInfo *ParamInfos,
678       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
679       Sema::ExtParameterInfoBuilder &PInfos);
680 
681   /// Transforms a single function-type parameter.  Return null
682   /// on error.
683   ///
684   /// \param indexAdjustment - A number to add to the parameter's
685   ///   scope index;  can be negative
686   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
687                                           int indexAdjustment,
688                                           Optional<unsigned> NumExpansions,
689                                           bool ExpectParameterPack);
690 
691   /// Transform the body of a lambda-expression.
692   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
693   /// Alternative implementation of TransformLambdaBody that skips transforming
694   /// the body.
695   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
696 
697   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
698 
699   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
700   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
701 
702   TemplateParameterList *TransformTemplateParameterList(
703         TemplateParameterList *TPL) {
704     return TPL;
705   }
706 
707   ExprResult TransformAddressOfOperand(Expr *E);
708 
709   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
710                                                 bool IsAddressOfOperand,
711                                                 TypeSourceInfo **RecoveryTSI);
712 
713   ExprResult TransformParenDependentScopeDeclRefExpr(
714       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
715       TypeSourceInfo **RecoveryTSI);
716 
717   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
718 
719 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
720 // amount of stack usage with clang.
721 #define STMT(Node, Parent)                        \
722   LLVM_ATTRIBUTE_NOINLINE \
723   StmtResult Transform##Node(Node *S);
724 #define VALUESTMT(Node, Parent)                   \
725   LLVM_ATTRIBUTE_NOINLINE \
726   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
727 #define EXPR(Node, Parent)                        \
728   LLVM_ATTRIBUTE_NOINLINE \
729   ExprResult Transform##Node(Node *E);
730 #define ABSTRACT_STMT(Stmt)
731 #include "clang/AST/StmtNodes.inc"
732 
733 #define OMP_CLAUSE_CLASS(Enum, Str, Class)                                           \
734   LLVM_ATTRIBUTE_NOINLINE \
735   OMPClause *Transform ## Class(Class *S);
736 #include "llvm/Frontend/OpenMP/OMPKinds.def"
737 
738   /// Build a new qualified type given its unqualified type and type location.
739   ///
740   /// By default, this routine adds type qualifiers only to types that can
741   /// have qualifiers, and silently suppresses those qualifiers that are not
742   /// permitted. Subclasses may override this routine to provide different
743   /// behavior.
744   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
745 
746   /// Build a new pointer type given its pointee type.
747   ///
748   /// By default, performs semantic analysis when building the pointer type.
749   /// Subclasses may override this routine to provide different behavior.
750   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
751 
752   /// Build a new block pointer type given its pointee type.
753   ///
754   /// By default, performs semantic analysis when building the block pointer
755   /// type. Subclasses may override this routine to provide different behavior.
756   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
757 
758   /// Build a new reference type given the type it references.
759   ///
760   /// By default, performs semantic analysis when building the
761   /// reference type. Subclasses may override this routine to provide
762   /// different behavior.
763   ///
764   /// \param LValue whether the type was written with an lvalue sigil
765   /// or an rvalue sigil.
766   QualType RebuildReferenceType(QualType ReferentType,
767                                 bool LValue,
768                                 SourceLocation Sigil);
769 
770   /// Build a new member pointer type given the pointee type and the
771   /// class type it refers into.
772   ///
773   /// By default, performs semantic analysis when building the member pointer
774   /// type. Subclasses may override this routine to provide different behavior.
775   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
776                                     SourceLocation Sigil);
777 
778   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
779                                     SourceLocation ProtocolLAngleLoc,
780                                     ArrayRef<ObjCProtocolDecl *> Protocols,
781                                     ArrayRef<SourceLocation> ProtocolLocs,
782                                     SourceLocation ProtocolRAngleLoc);
783 
784   /// Build an Objective-C object type.
785   ///
786   /// By default, performs semantic analysis when building the object type.
787   /// Subclasses may override this routine to provide different behavior.
788   QualType RebuildObjCObjectType(QualType BaseType,
789                                  SourceLocation Loc,
790                                  SourceLocation TypeArgsLAngleLoc,
791                                  ArrayRef<TypeSourceInfo *> TypeArgs,
792                                  SourceLocation TypeArgsRAngleLoc,
793                                  SourceLocation ProtocolLAngleLoc,
794                                  ArrayRef<ObjCProtocolDecl *> Protocols,
795                                  ArrayRef<SourceLocation> ProtocolLocs,
796                                  SourceLocation ProtocolRAngleLoc);
797 
798   /// Build a new Objective-C object pointer type given the pointee type.
799   ///
800   /// By default, directly builds the pointer type, with no additional semantic
801   /// analysis.
802   QualType RebuildObjCObjectPointerType(QualType PointeeType,
803                                         SourceLocation Star);
804 
805   /// Build a new array type given the element type, size
806   /// modifier, size of the array (if known), size expression, and index type
807   /// qualifiers.
808   ///
809   /// By default, performs semantic analysis when building the array type.
810   /// Subclasses may override this routine to provide different behavior.
811   /// Also by default, all of the other Rebuild*Array
812   QualType RebuildArrayType(QualType ElementType,
813                             ArrayType::ArraySizeModifier SizeMod,
814                             const llvm::APInt *Size,
815                             Expr *SizeExpr,
816                             unsigned IndexTypeQuals,
817                             SourceRange BracketsRange);
818 
819   /// Build a new constant array type given the element type, size
820   /// modifier, (known) size of the array, and index type qualifiers.
821   ///
822   /// By default, performs semantic analysis when building the array type.
823   /// Subclasses may override this routine to provide different behavior.
824   QualType RebuildConstantArrayType(QualType ElementType,
825                                     ArrayType::ArraySizeModifier SizeMod,
826                                     const llvm::APInt &Size,
827                                     Expr *SizeExpr,
828                                     unsigned IndexTypeQuals,
829                                     SourceRange BracketsRange);
830 
831   /// Build a new incomplete array type given the element type, size
832   /// modifier, and index type qualifiers.
833   ///
834   /// By default, performs semantic analysis when building the array type.
835   /// Subclasses may override this routine to provide different behavior.
836   QualType RebuildIncompleteArrayType(QualType ElementType,
837                                       ArrayType::ArraySizeModifier SizeMod,
838                                       unsigned IndexTypeQuals,
839                                       SourceRange BracketsRange);
840 
841   /// Build a new variable-length array type given the element type,
842   /// size modifier, size expression, and index type qualifiers.
843   ///
844   /// By default, performs semantic analysis when building the array type.
845   /// Subclasses may override this routine to provide different behavior.
846   QualType RebuildVariableArrayType(QualType ElementType,
847                                     ArrayType::ArraySizeModifier SizeMod,
848                                     Expr *SizeExpr,
849                                     unsigned IndexTypeQuals,
850                                     SourceRange BracketsRange);
851 
852   /// Build a new dependent-sized array type given the element type,
853   /// size modifier, size expression, and index type qualifiers.
854   ///
855   /// By default, performs semantic analysis when building the array type.
856   /// Subclasses may override this routine to provide different behavior.
857   QualType RebuildDependentSizedArrayType(QualType ElementType,
858                                           ArrayType::ArraySizeModifier SizeMod,
859                                           Expr *SizeExpr,
860                                           unsigned IndexTypeQuals,
861                                           SourceRange BracketsRange);
862 
863   /// Build a new vector type given the element type and
864   /// number of elements.
865   ///
866   /// By default, performs semantic analysis when building the vector type.
867   /// Subclasses may override this routine to provide different behavior.
868   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
869                              VectorType::VectorKind VecKind);
870 
871   /// Build a new potentially dependently-sized extended vector type
872   /// given the element type and number of elements.
873   ///
874   /// By default, performs semantic analysis when building the vector type.
875   /// Subclasses may override this routine to provide different behavior.
876   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
877                                            SourceLocation AttributeLoc,
878                                            VectorType::VectorKind);
879 
880   /// Build a new extended vector type given the element type and
881   /// number of elements.
882   ///
883   /// By default, performs semantic analysis when building the vector type.
884   /// Subclasses may override this routine to provide different behavior.
885   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
886                                 SourceLocation AttributeLoc);
887 
888   /// Build a new potentially dependently-sized extended vector type
889   /// given the element type and number of elements.
890   ///
891   /// By default, performs semantic analysis when building the vector type.
892   /// Subclasses may override this routine to provide different behavior.
893   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
894                                               Expr *SizeExpr,
895                                               SourceLocation AttributeLoc);
896 
897   /// Build a new matrix type given the element type and dimensions.
898   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
899                                      unsigned NumColumns);
900 
901   /// Build a new matrix type given the type and dependently-defined
902   /// dimensions.
903   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
904                                            Expr *ColumnExpr,
905                                            SourceLocation AttributeLoc);
906 
907   /// Build a new DependentAddressSpaceType or return the pointee
908   /// type variable with the correct address space (retrieved from
909   /// AddrSpaceExpr) applied to it. The former will be returned in cases
910   /// where the address space remains dependent.
911   ///
912   /// By default, performs semantic analysis when building the type with address
913   /// space applied. Subclasses may override this routine to provide different
914   /// behavior.
915   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
916                                             Expr *AddrSpaceExpr,
917                                             SourceLocation AttributeLoc);
918 
919   /// Build a new function type.
920   ///
921   /// By default, performs semantic analysis when building the function type.
922   /// Subclasses may override this routine to provide different behavior.
923   QualType RebuildFunctionProtoType(QualType T,
924                                     MutableArrayRef<QualType> ParamTypes,
925                                     const FunctionProtoType::ExtProtoInfo &EPI);
926 
927   /// Build a new unprototyped function type.
928   QualType RebuildFunctionNoProtoType(QualType ResultType);
929 
930   /// Rebuild an unresolved typename type, given the decl that
931   /// the UnresolvedUsingTypenameDecl was transformed to.
932   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
933 
934   /// Build a new typedef type.
935   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
936     return SemaRef.Context.getTypeDeclType(Typedef);
937   }
938 
939   /// Build a new MacroDefined type.
940   QualType RebuildMacroQualifiedType(QualType T,
941                                      const IdentifierInfo *MacroII) {
942     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
943   }
944 
945   /// Build a new class/struct/union type.
946   QualType RebuildRecordType(RecordDecl *Record) {
947     return SemaRef.Context.getTypeDeclType(Record);
948   }
949 
950   /// Build a new Enum type.
951   QualType RebuildEnumType(EnumDecl *Enum) {
952     return SemaRef.Context.getTypeDeclType(Enum);
953   }
954 
955   /// Build a new typeof(expr) type.
956   ///
957   /// By default, performs semantic analysis when building the typeof type.
958   /// Subclasses may override this routine to provide different behavior.
959   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
960 
961   /// Build a new typeof(type) type.
962   ///
963   /// By default, builds a new TypeOfType with the given underlying type.
964   QualType RebuildTypeOfType(QualType Underlying);
965 
966   /// Build a new unary transform type.
967   QualType RebuildUnaryTransformType(QualType BaseType,
968                                      UnaryTransformType::UTTKind UKind,
969                                      SourceLocation Loc);
970 
971   /// Build a new C++11 decltype type.
972   ///
973   /// By default, performs semantic analysis when building the decltype type.
974   /// Subclasses may override this routine to provide different behavior.
975   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
976 
977   /// Build a new C++11 auto type.
978   ///
979   /// By default, builds a new AutoType with the given deduced type.
980   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
981                            ConceptDecl *TypeConstraintConcept,
982                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
983     // Note, IsDependent is always false here: we implicitly convert an 'auto'
984     // which has been deduced to a dependent type into an undeduced 'auto', so
985     // that we'll retry deduction after the transformation.
986     return SemaRef.Context.getAutoType(Deduced, Keyword,
987                                        /*IsDependent*/ false, /*IsPack=*/false,
988                                        TypeConstraintConcept,
989                                        TypeConstraintArgs);
990   }
991 
992   /// By default, builds a new DeducedTemplateSpecializationType with the given
993   /// deduced type.
994   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
995       QualType Deduced) {
996     return SemaRef.Context.getDeducedTemplateSpecializationType(
997         Template, Deduced, /*IsDependent*/ false);
998   }
999 
1000   /// Build a new template specialization type.
1001   ///
1002   /// By default, performs semantic analysis when building the template
1003   /// specialization type. Subclasses may override this routine to provide
1004   /// different behavior.
1005   QualType RebuildTemplateSpecializationType(TemplateName Template,
1006                                              SourceLocation TemplateLoc,
1007                                              TemplateArgumentListInfo &Args);
1008 
1009   /// Build a new parenthesized type.
1010   ///
1011   /// By default, builds a new ParenType type from the inner type.
1012   /// Subclasses may override this routine to provide different behavior.
1013   QualType RebuildParenType(QualType InnerType) {
1014     return SemaRef.BuildParenType(InnerType);
1015   }
1016 
1017   /// Build a new qualified name type.
1018   ///
1019   /// By default, builds a new ElaboratedType type from the keyword,
1020   /// the nested-name-specifier and the named type.
1021   /// Subclasses may override this routine to provide different behavior.
1022   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1023                                  ElaboratedTypeKeyword Keyword,
1024                                  NestedNameSpecifierLoc QualifierLoc,
1025                                  QualType Named) {
1026     return SemaRef.Context.getElaboratedType(Keyword,
1027                                          QualifierLoc.getNestedNameSpecifier(),
1028                                              Named);
1029   }
1030 
1031   /// Build a new typename type that refers to a template-id.
1032   ///
1033   /// By default, builds a new DependentNameType type from the
1034   /// nested-name-specifier and the given type. Subclasses may override
1035   /// this routine to provide different behavior.
1036   QualType RebuildDependentTemplateSpecializationType(
1037                                           ElaboratedTypeKeyword Keyword,
1038                                           NestedNameSpecifierLoc QualifierLoc,
1039                                           SourceLocation TemplateKWLoc,
1040                                           const IdentifierInfo *Name,
1041                                           SourceLocation NameLoc,
1042                                           TemplateArgumentListInfo &Args,
1043                                           bool AllowInjectedClassName) {
1044     // Rebuild the template name.
1045     // TODO: avoid TemplateName abstraction
1046     CXXScopeSpec SS;
1047     SS.Adopt(QualifierLoc);
1048     TemplateName InstName = getDerived().RebuildTemplateName(
1049         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1050         AllowInjectedClassName);
1051 
1052     if (InstName.isNull())
1053       return QualType();
1054 
1055     // If it's still dependent, make a dependent specialization.
1056     if (InstName.getAsDependentTemplateName())
1057       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1058                                           QualifierLoc.getNestedNameSpecifier(),
1059                                                                     Name,
1060                                                                     Args);
1061 
1062     // Otherwise, make an elaborated type wrapping a non-dependent
1063     // specialization.
1064     QualType T =
1065     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1066     if (T.isNull()) return QualType();
1067 
1068     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1069       return T;
1070 
1071     return SemaRef.Context.getElaboratedType(Keyword,
1072                                        QualifierLoc.getNestedNameSpecifier(),
1073                                              T);
1074   }
1075 
1076   /// Build a new typename type that refers to an identifier.
1077   ///
1078   /// By default, performs semantic analysis when building the typename type
1079   /// (or elaborated type). Subclasses may override this routine to provide
1080   /// different behavior.
1081   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1082                                     SourceLocation KeywordLoc,
1083                                     NestedNameSpecifierLoc QualifierLoc,
1084                                     const IdentifierInfo *Id,
1085                                     SourceLocation IdLoc,
1086                                     bool DeducedTSTContext) {
1087     CXXScopeSpec SS;
1088     SS.Adopt(QualifierLoc);
1089 
1090     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1091       // If the name is still dependent, just build a new dependent name type.
1092       if (!SemaRef.computeDeclContext(SS))
1093         return SemaRef.Context.getDependentNameType(Keyword,
1094                                           QualifierLoc.getNestedNameSpecifier(),
1095                                                     Id);
1096     }
1097 
1098     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1099       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1100                                        *Id, IdLoc, DeducedTSTContext);
1101     }
1102 
1103     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1104 
1105     // We had a dependent elaborated-type-specifier that has been transformed
1106     // into a non-dependent elaborated-type-specifier. Find the tag we're
1107     // referring to.
1108     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1109     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1110     if (!DC)
1111       return QualType();
1112 
1113     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1114       return QualType();
1115 
1116     TagDecl *Tag = nullptr;
1117     SemaRef.LookupQualifiedName(Result, DC);
1118     switch (Result.getResultKind()) {
1119       case LookupResult::NotFound:
1120       case LookupResult::NotFoundInCurrentInstantiation:
1121         break;
1122 
1123       case LookupResult::Found:
1124         Tag = Result.getAsSingle<TagDecl>();
1125         break;
1126 
1127       case LookupResult::FoundOverloaded:
1128       case LookupResult::FoundUnresolvedValue:
1129         llvm_unreachable("Tag lookup cannot find non-tags");
1130 
1131       case LookupResult::Ambiguous:
1132         // Let the LookupResult structure handle ambiguities.
1133         return QualType();
1134     }
1135 
1136     if (!Tag) {
1137       // Check where the name exists but isn't a tag type and use that to emit
1138       // better diagnostics.
1139       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1140       SemaRef.LookupQualifiedName(Result, DC);
1141       switch (Result.getResultKind()) {
1142         case LookupResult::Found:
1143         case LookupResult::FoundOverloaded:
1144         case LookupResult::FoundUnresolvedValue: {
1145           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1146           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1147           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1148                                                                << NTK << Kind;
1149           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1150           break;
1151         }
1152         default:
1153           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1154               << Kind << Id << DC << QualifierLoc.getSourceRange();
1155           break;
1156       }
1157       return QualType();
1158     }
1159 
1160     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1161                                               IdLoc, Id)) {
1162       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1163       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1164       return QualType();
1165     }
1166 
1167     // Build the elaborated-type-specifier type.
1168     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1169     return SemaRef.Context.getElaboratedType(Keyword,
1170                                          QualifierLoc.getNestedNameSpecifier(),
1171                                              T);
1172   }
1173 
1174   /// Build a new pack expansion type.
1175   ///
1176   /// By default, builds a new PackExpansionType type from the given pattern.
1177   /// Subclasses may override this routine to provide different behavior.
1178   QualType RebuildPackExpansionType(QualType Pattern,
1179                                     SourceRange PatternRange,
1180                                     SourceLocation EllipsisLoc,
1181                                     Optional<unsigned> NumExpansions) {
1182     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1183                                         NumExpansions);
1184   }
1185 
1186   /// Build a new atomic type given its value type.
1187   ///
1188   /// By default, performs semantic analysis when building the atomic type.
1189   /// Subclasses may override this routine to provide different behavior.
1190   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1191 
1192   /// Build a new pipe type given its value type.
1193   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1194                            bool isReadPipe);
1195 
1196    /// Build an extended int given its value type.
1197   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1198                              SourceLocation Loc);
1199 
1200   /// Build a dependent extended int given its value type.
1201   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1202                                       SourceLocation Loc);
1203 
1204   /// Build a new template name given a nested name specifier, a flag
1205   /// indicating whether the "template" keyword was provided, and the template
1206   /// that the template name refers to.
1207   ///
1208   /// By default, builds the new template name directly. Subclasses may override
1209   /// this routine to provide different behavior.
1210   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1211                                    bool TemplateKW,
1212                                    TemplateDecl *Template);
1213 
1214   /// Build a new template name given a nested name specifier and the
1215   /// name that is referred to as a template.
1216   ///
1217   /// By default, performs semantic analysis to determine whether the name can
1218   /// be resolved to a specific template, then builds the appropriate kind of
1219   /// template name. Subclasses may override this routine to provide different
1220   /// behavior.
1221   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1222                                    SourceLocation TemplateKWLoc,
1223                                    const IdentifierInfo &Name,
1224                                    SourceLocation NameLoc, QualType ObjectType,
1225                                    NamedDecl *FirstQualifierInScope,
1226                                    bool AllowInjectedClassName);
1227 
1228   /// Build a new template name given a nested name specifier and the
1229   /// overloaded operator name that is referred to as a template.
1230   ///
1231   /// By default, performs semantic analysis to determine whether the name can
1232   /// be resolved to a specific template, then builds the appropriate kind of
1233   /// template name. Subclasses may override this routine to provide different
1234   /// behavior.
1235   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1236                                    SourceLocation TemplateKWLoc,
1237                                    OverloadedOperatorKind Operator,
1238                                    SourceLocation NameLoc, QualType ObjectType,
1239                                    bool AllowInjectedClassName);
1240 
1241   /// Build a new template name given a template template parameter pack
1242   /// and the
1243   ///
1244   /// By default, performs semantic analysis to determine whether the name can
1245   /// be resolved to a specific template, then builds the appropriate kind of
1246   /// template name. Subclasses may override this routine to provide different
1247   /// behavior.
1248   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1249                                    const TemplateArgument &ArgPack) {
1250     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1251   }
1252 
1253   /// Build a new compound statement.
1254   ///
1255   /// By default, performs semantic analysis to build the new statement.
1256   /// Subclasses may override this routine to provide different behavior.
1257   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1258                                        MultiStmtArg Statements,
1259                                        SourceLocation RBraceLoc,
1260                                        bool IsStmtExpr) {
1261     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1262                                        IsStmtExpr);
1263   }
1264 
1265   /// Build a new case statement.
1266   ///
1267   /// By default, performs semantic analysis to build the new statement.
1268   /// Subclasses may override this routine to provide different behavior.
1269   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1270                                    Expr *LHS,
1271                                    SourceLocation EllipsisLoc,
1272                                    Expr *RHS,
1273                                    SourceLocation ColonLoc) {
1274     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1275                                    ColonLoc);
1276   }
1277 
1278   /// Attach the body to a new case statement.
1279   ///
1280   /// By default, performs semantic analysis to build the new statement.
1281   /// Subclasses may override this routine to provide different behavior.
1282   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1283     getSema().ActOnCaseStmtBody(S, Body);
1284     return S;
1285   }
1286 
1287   /// Build a new default statement.
1288   ///
1289   /// By default, performs semantic analysis to build the new statement.
1290   /// Subclasses may override this routine to provide different behavior.
1291   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1292                                       SourceLocation ColonLoc,
1293                                       Stmt *SubStmt) {
1294     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1295                                       /*CurScope=*/nullptr);
1296   }
1297 
1298   /// Build a new label statement.
1299   ///
1300   /// By default, performs semantic analysis to build the new statement.
1301   /// Subclasses may override this routine to provide different behavior.
1302   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1303                               SourceLocation ColonLoc, Stmt *SubStmt) {
1304     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1305   }
1306 
1307   /// Build a new label statement.
1308   ///
1309   /// By default, performs semantic analysis to build the new statement.
1310   /// Subclasses may override this routine to provide different behavior.
1311   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1312                                    ArrayRef<const Attr*> Attrs,
1313                                    Stmt *SubStmt) {
1314     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1315   }
1316 
1317   /// Build a new "if" statement.
1318   ///
1319   /// By default, performs semantic analysis to build the new statement.
1320   /// Subclasses may override this routine to provide different behavior.
1321   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1322                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1323                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1324                            SourceLocation ElseLoc, Stmt *Else) {
1325     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond,
1326                                  RParenLoc, Then, ElseLoc, Else);
1327   }
1328 
1329   /// Start building a new switch statement.
1330   ///
1331   /// By default, performs semantic analysis to build the new statement.
1332   /// Subclasses may override this routine to provide different behavior.
1333   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1334                                     SourceLocation LParenLoc, Stmt *Init,
1335                                     Sema::ConditionResult Cond,
1336                                     SourceLocation RParenLoc) {
1337     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1338                                             RParenLoc);
1339   }
1340 
1341   /// Attach the body to the switch statement.
1342   ///
1343   /// By default, performs semantic analysis to build the new statement.
1344   /// Subclasses may override this routine to provide different behavior.
1345   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1346                                    Stmt *Switch, Stmt *Body) {
1347     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1348   }
1349 
1350   /// Build a new while statement.
1351   ///
1352   /// By default, performs semantic analysis to build the new statement.
1353   /// Subclasses may override this routine to provide different behavior.
1354   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1355                               Sema::ConditionResult Cond,
1356                               SourceLocation RParenLoc, Stmt *Body) {
1357     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1358   }
1359 
1360   /// Build a new do-while statement.
1361   ///
1362   /// By default, performs semantic analysis to build the new statement.
1363   /// Subclasses may override this routine to provide different behavior.
1364   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1365                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1366                            Expr *Cond, SourceLocation RParenLoc) {
1367     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1368                                  Cond, RParenLoc);
1369   }
1370 
1371   /// Build a new for statement.
1372   ///
1373   /// By default, performs semantic analysis to build the new statement.
1374   /// Subclasses may override this routine to provide different behavior.
1375   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1376                             Stmt *Init, Sema::ConditionResult Cond,
1377                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1378                             Stmt *Body) {
1379     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1380                                   Inc, RParenLoc, Body);
1381   }
1382 
1383   /// Build a new goto statement.
1384   ///
1385   /// By default, performs semantic analysis to build the new statement.
1386   /// Subclasses may override this routine to provide different behavior.
1387   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1388                              LabelDecl *Label) {
1389     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1390   }
1391 
1392   /// Build a new indirect goto statement.
1393   ///
1394   /// By default, performs semantic analysis to build the new statement.
1395   /// Subclasses may override this routine to provide different behavior.
1396   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1397                                      SourceLocation StarLoc,
1398                                      Expr *Target) {
1399     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1400   }
1401 
1402   /// Build a new return statement.
1403   ///
1404   /// By default, performs semantic analysis to build the new statement.
1405   /// Subclasses may override this routine to provide different behavior.
1406   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1407     return getSema().BuildReturnStmt(ReturnLoc, Result);
1408   }
1409 
1410   /// Build a new declaration statement.
1411   ///
1412   /// By default, performs semantic analysis to build the new statement.
1413   /// Subclasses may override this routine to provide different behavior.
1414   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1415                              SourceLocation StartLoc, SourceLocation EndLoc) {
1416     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1417     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1418   }
1419 
1420   /// Build a new inline asm statement.
1421   ///
1422   /// By default, performs semantic analysis to build the new statement.
1423   /// Subclasses may override this routine to provide different behavior.
1424   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1425                                bool IsVolatile, unsigned NumOutputs,
1426                                unsigned NumInputs, IdentifierInfo **Names,
1427                                MultiExprArg Constraints, MultiExprArg Exprs,
1428                                Expr *AsmString, MultiExprArg Clobbers,
1429                                unsigned NumLabels,
1430                                SourceLocation RParenLoc) {
1431     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1432                                      NumInputs, Names, Constraints, Exprs,
1433                                      AsmString, Clobbers, NumLabels, RParenLoc);
1434   }
1435 
1436   /// Build a new MS style inline asm statement.
1437   ///
1438   /// By default, performs semantic analysis to build the new statement.
1439   /// Subclasses may override this routine to provide different behavior.
1440   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1441                               ArrayRef<Token> AsmToks,
1442                               StringRef AsmString,
1443                               unsigned NumOutputs, unsigned NumInputs,
1444                               ArrayRef<StringRef> Constraints,
1445                               ArrayRef<StringRef> Clobbers,
1446                               ArrayRef<Expr*> Exprs,
1447                               SourceLocation EndLoc) {
1448     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1449                                     NumOutputs, NumInputs,
1450                                     Constraints, Clobbers, Exprs, EndLoc);
1451   }
1452 
1453   /// Build a new co_return statement.
1454   ///
1455   /// By default, performs semantic analysis to build the new statement.
1456   /// Subclasses may override this routine to provide different behavior.
1457   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1458                                  bool IsImplicit) {
1459     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1460   }
1461 
1462   /// Build a new co_await expression.
1463   ///
1464   /// By default, performs semantic analysis to build the new expression.
1465   /// Subclasses may override this routine to provide different behavior.
1466   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1467                                 bool IsImplicit) {
1468     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1469   }
1470 
1471   /// Build a new co_await expression.
1472   ///
1473   /// By default, performs semantic analysis to build the new expression.
1474   /// Subclasses may override this routine to provide different behavior.
1475   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1476                                          Expr *Result,
1477                                          UnresolvedLookupExpr *Lookup) {
1478     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1479   }
1480 
1481   /// Build a new co_yield expression.
1482   ///
1483   /// By default, performs semantic analysis to build the new expression.
1484   /// Subclasses may override this routine to provide different behavior.
1485   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1486     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1487   }
1488 
1489   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1490     return getSema().BuildCoroutineBodyStmt(Args);
1491   }
1492 
1493   /// Build a new Objective-C \@try statement.
1494   ///
1495   /// By default, performs semantic analysis to build the new statement.
1496   /// Subclasses may override this routine to provide different behavior.
1497   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1498                                         Stmt *TryBody,
1499                                         MultiStmtArg CatchStmts,
1500                                         Stmt *Finally) {
1501     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1502                                         Finally);
1503   }
1504 
1505   /// Rebuild an Objective-C exception declaration.
1506   ///
1507   /// By default, performs semantic analysis to build the new declaration.
1508   /// Subclasses may override this routine to provide different behavior.
1509   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1510                                     TypeSourceInfo *TInfo, QualType T) {
1511     return getSema().BuildObjCExceptionDecl(TInfo, T,
1512                                             ExceptionDecl->getInnerLocStart(),
1513                                             ExceptionDecl->getLocation(),
1514                                             ExceptionDecl->getIdentifier());
1515   }
1516 
1517   /// Build a new Objective-C \@catch statement.
1518   ///
1519   /// By default, performs semantic analysis to build the new statement.
1520   /// Subclasses may override this routine to provide different behavior.
1521   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1522                                           SourceLocation RParenLoc,
1523                                           VarDecl *Var,
1524                                           Stmt *Body) {
1525     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1526                                           Var, Body);
1527   }
1528 
1529   /// Build a new Objective-C \@finally statement.
1530   ///
1531   /// By default, performs semantic analysis to build the new statement.
1532   /// Subclasses may override this routine to provide different behavior.
1533   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1534                                             Stmt *Body) {
1535     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1536   }
1537 
1538   /// Build a new Objective-C \@throw statement.
1539   ///
1540   /// By default, performs semantic analysis to build the new statement.
1541   /// Subclasses may override this routine to provide different behavior.
1542   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1543                                           Expr *Operand) {
1544     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1545   }
1546 
1547   /// Build a new OpenMP executable directive.
1548   ///
1549   /// By default, performs semantic analysis to build the new statement.
1550   /// Subclasses may override this routine to provide different behavior.
1551   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1552                                            DeclarationNameInfo DirName,
1553                                            OpenMPDirectiveKind CancelRegion,
1554                                            ArrayRef<OMPClause *> Clauses,
1555                                            Stmt *AStmt, SourceLocation StartLoc,
1556                                            SourceLocation EndLoc) {
1557     return getSema().ActOnOpenMPExecutableDirective(
1558         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1559   }
1560 
1561   /// Build a new OpenMP 'if' clause.
1562   ///
1563   /// By default, performs semantic analysis to build the new OpenMP clause.
1564   /// Subclasses may override this routine to provide different behavior.
1565   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1566                                 Expr *Condition, SourceLocation StartLoc,
1567                                 SourceLocation LParenLoc,
1568                                 SourceLocation NameModifierLoc,
1569                                 SourceLocation ColonLoc,
1570                                 SourceLocation EndLoc) {
1571     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1572                                          LParenLoc, NameModifierLoc, ColonLoc,
1573                                          EndLoc);
1574   }
1575 
1576   /// Build a new OpenMP 'final' clause.
1577   ///
1578   /// By default, performs semantic analysis to build the new OpenMP clause.
1579   /// Subclasses may override this routine to provide different behavior.
1580   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1581                                    SourceLocation LParenLoc,
1582                                    SourceLocation EndLoc) {
1583     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1584                                             EndLoc);
1585   }
1586 
1587   /// Build a new OpenMP 'num_threads' clause.
1588   ///
1589   /// By default, performs semantic analysis to build the new OpenMP clause.
1590   /// Subclasses may override this routine to provide different behavior.
1591   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1592                                         SourceLocation StartLoc,
1593                                         SourceLocation LParenLoc,
1594                                         SourceLocation EndLoc) {
1595     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1596                                                  LParenLoc, EndLoc);
1597   }
1598 
1599   /// Build a new OpenMP 'safelen' clause.
1600   ///
1601   /// By default, performs semantic analysis to build the new OpenMP clause.
1602   /// Subclasses may override this routine to provide different behavior.
1603   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1604                                      SourceLocation LParenLoc,
1605                                      SourceLocation EndLoc) {
1606     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1607   }
1608 
1609   /// Build a new OpenMP 'simdlen' clause.
1610   ///
1611   /// By default, performs semantic analysis to build the new OpenMP clause.
1612   /// Subclasses may override this routine to provide different behavior.
1613   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1614                                      SourceLocation LParenLoc,
1615                                      SourceLocation EndLoc) {
1616     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1617   }
1618 
1619   /// Build a new OpenMP 'allocator' clause.
1620   ///
1621   /// By default, performs semantic analysis to build the new OpenMP clause.
1622   /// Subclasses may override this routine to provide different behavior.
1623   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1624                                        SourceLocation LParenLoc,
1625                                        SourceLocation EndLoc) {
1626     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1627   }
1628 
1629   /// Build a new OpenMP 'collapse' clause.
1630   ///
1631   /// By default, performs semantic analysis to build the new OpenMP clause.
1632   /// Subclasses may override this routine to provide different behavior.
1633   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1634                                       SourceLocation LParenLoc,
1635                                       SourceLocation EndLoc) {
1636     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1637                                                EndLoc);
1638   }
1639 
1640   /// Build a new OpenMP 'default' clause.
1641   ///
1642   /// By default, performs semantic analysis to build the new OpenMP clause.
1643   /// Subclasses may override this routine to provide different behavior.
1644   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1645                                      SourceLocation StartLoc,
1646                                      SourceLocation LParenLoc,
1647                                      SourceLocation EndLoc) {
1648     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1649                                               StartLoc, LParenLoc, EndLoc);
1650   }
1651 
1652   /// Build a new OpenMP 'proc_bind' clause.
1653   ///
1654   /// By default, performs semantic analysis to build the new OpenMP clause.
1655   /// Subclasses may override this routine to provide different behavior.
1656   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1657                                       SourceLocation KindKwLoc,
1658                                       SourceLocation StartLoc,
1659                                       SourceLocation LParenLoc,
1660                                       SourceLocation EndLoc) {
1661     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1662                                                StartLoc, LParenLoc, EndLoc);
1663   }
1664 
1665   /// Build a new OpenMP 'schedule' clause.
1666   ///
1667   /// By default, performs semantic analysis to build the new OpenMP clause.
1668   /// Subclasses may override this routine to provide different behavior.
1669   OMPClause *RebuildOMPScheduleClause(
1670       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1671       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1672       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1673       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1674     return getSema().ActOnOpenMPScheduleClause(
1675         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1676         CommaLoc, EndLoc);
1677   }
1678 
1679   /// Build a new OpenMP 'ordered' clause.
1680   ///
1681   /// By default, performs semantic analysis to build the new OpenMP clause.
1682   /// Subclasses may override this routine to provide different behavior.
1683   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1684                                      SourceLocation EndLoc,
1685                                      SourceLocation LParenLoc, Expr *Num) {
1686     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1687   }
1688 
1689   /// Build a new OpenMP 'private' clause.
1690   ///
1691   /// By default, performs semantic analysis to build the new OpenMP clause.
1692   /// Subclasses may override this routine to provide different behavior.
1693   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1694                                      SourceLocation StartLoc,
1695                                      SourceLocation LParenLoc,
1696                                      SourceLocation EndLoc) {
1697     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1698                                               EndLoc);
1699   }
1700 
1701   /// Build a new OpenMP 'firstprivate' clause.
1702   ///
1703   /// By default, performs semantic analysis to build the new OpenMP clause.
1704   /// Subclasses may override this routine to provide different behavior.
1705   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1706                                           SourceLocation StartLoc,
1707                                           SourceLocation LParenLoc,
1708                                           SourceLocation EndLoc) {
1709     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1710                                                    EndLoc);
1711   }
1712 
1713   /// Build a new OpenMP 'lastprivate' clause.
1714   ///
1715   /// By default, performs semantic analysis to build the new OpenMP clause.
1716   /// Subclasses may override this routine to provide different behavior.
1717   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1718                                          OpenMPLastprivateModifier LPKind,
1719                                          SourceLocation LPKindLoc,
1720                                          SourceLocation ColonLoc,
1721                                          SourceLocation StartLoc,
1722                                          SourceLocation LParenLoc,
1723                                          SourceLocation EndLoc) {
1724     return getSema().ActOnOpenMPLastprivateClause(
1725         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1726   }
1727 
1728   /// Build a new OpenMP 'shared' clause.
1729   ///
1730   /// By default, performs semantic analysis to build the new OpenMP clause.
1731   /// Subclasses may override this routine to provide different behavior.
1732   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1733                                     SourceLocation StartLoc,
1734                                     SourceLocation LParenLoc,
1735                                     SourceLocation EndLoc) {
1736     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1737                                              EndLoc);
1738   }
1739 
1740   /// Build a new OpenMP 'reduction' clause.
1741   ///
1742   /// By default, performs semantic analysis to build the new statement.
1743   /// Subclasses may override this routine to provide different behavior.
1744   OMPClause *RebuildOMPReductionClause(
1745       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1746       SourceLocation StartLoc, SourceLocation LParenLoc,
1747       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1748       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1749       const DeclarationNameInfo &ReductionId,
1750       ArrayRef<Expr *> UnresolvedReductions) {
1751     return getSema().ActOnOpenMPReductionClause(
1752         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1753         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1754   }
1755 
1756   /// Build a new OpenMP 'task_reduction' clause.
1757   ///
1758   /// By default, performs semantic analysis to build the new statement.
1759   /// Subclasses may override this routine to provide different behavior.
1760   OMPClause *RebuildOMPTaskReductionClause(
1761       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1762       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1763       CXXScopeSpec &ReductionIdScopeSpec,
1764       const DeclarationNameInfo &ReductionId,
1765       ArrayRef<Expr *> UnresolvedReductions) {
1766     return getSema().ActOnOpenMPTaskReductionClause(
1767         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1768         ReductionId, UnresolvedReductions);
1769   }
1770 
1771   /// Build a new OpenMP 'in_reduction' clause.
1772   ///
1773   /// By default, performs semantic analysis to build the new statement.
1774   /// Subclasses may override this routine to provide different behavior.
1775   OMPClause *
1776   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1777                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1778                               SourceLocation EndLoc,
1779                               CXXScopeSpec &ReductionIdScopeSpec,
1780                               const DeclarationNameInfo &ReductionId,
1781                               ArrayRef<Expr *> UnresolvedReductions) {
1782     return getSema().ActOnOpenMPInReductionClause(
1783         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1784         ReductionId, UnresolvedReductions);
1785   }
1786 
1787   /// Build a new OpenMP 'linear' clause.
1788   ///
1789   /// By default, performs semantic analysis to build the new OpenMP clause.
1790   /// Subclasses may override this routine to provide different behavior.
1791   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1792                                     SourceLocation StartLoc,
1793                                     SourceLocation LParenLoc,
1794                                     OpenMPLinearClauseKind Modifier,
1795                                     SourceLocation ModifierLoc,
1796                                     SourceLocation ColonLoc,
1797                                     SourceLocation EndLoc) {
1798     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1799                                              Modifier, ModifierLoc, ColonLoc,
1800                                              EndLoc);
1801   }
1802 
1803   /// Build a new OpenMP 'aligned' clause.
1804   ///
1805   /// By default, performs semantic analysis to build the new OpenMP clause.
1806   /// Subclasses may override this routine to provide different behavior.
1807   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1808                                      SourceLocation StartLoc,
1809                                      SourceLocation LParenLoc,
1810                                      SourceLocation ColonLoc,
1811                                      SourceLocation EndLoc) {
1812     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1813                                               LParenLoc, ColonLoc, EndLoc);
1814   }
1815 
1816   /// Build a new OpenMP 'copyin' clause.
1817   ///
1818   /// By default, performs semantic analysis to build the new OpenMP clause.
1819   /// Subclasses may override this routine to provide different behavior.
1820   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1821                                     SourceLocation StartLoc,
1822                                     SourceLocation LParenLoc,
1823                                     SourceLocation EndLoc) {
1824     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1825                                              EndLoc);
1826   }
1827 
1828   /// Build a new OpenMP 'copyprivate' clause.
1829   ///
1830   /// By default, performs semantic analysis to build the new OpenMP clause.
1831   /// Subclasses may override this routine to provide different behavior.
1832   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1833                                          SourceLocation StartLoc,
1834                                          SourceLocation LParenLoc,
1835                                          SourceLocation EndLoc) {
1836     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1837                                                   EndLoc);
1838   }
1839 
1840   /// Build a new OpenMP 'flush' pseudo clause.
1841   ///
1842   /// By default, performs semantic analysis to build the new OpenMP clause.
1843   /// Subclasses may override this routine to provide different behavior.
1844   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1845                                    SourceLocation StartLoc,
1846                                    SourceLocation LParenLoc,
1847                                    SourceLocation EndLoc) {
1848     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1849                                             EndLoc);
1850   }
1851 
1852   /// Build a new OpenMP 'depobj' pseudo clause.
1853   ///
1854   /// By default, performs semantic analysis to build the new OpenMP clause.
1855   /// Subclasses may override this routine to provide different behavior.
1856   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1857                                     SourceLocation LParenLoc,
1858                                     SourceLocation EndLoc) {
1859     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1860                                              EndLoc);
1861   }
1862 
1863   /// Build a new OpenMP 'depend' pseudo clause.
1864   ///
1865   /// By default, performs semantic analysis to build the new OpenMP clause.
1866   /// Subclasses may override this routine to provide different behavior.
1867   OMPClause *
1868   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1869                          SourceLocation DepLoc, SourceLocation ColonLoc,
1870                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1871                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1872     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1873                                              ColonLoc, VarList, StartLoc,
1874                                              LParenLoc, EndLoc);
1875   }
1876 
1877   /// Build a new OpenMP 'device' clause.
1878   ///
1879   /// By default, performs semantic analysis to build the new statement.
1880   /// Subclasses may override this routine to provide different behavior.
1881   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1882                                     Expr *Device, SourceLocation StartLoc,
1883                                     SourceLocation LParenLoc,
1884                                     SourceLocation ModifierLoc,
1885                                     SourceLocation EndLoc) {
1886     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1887                                              LParenLoc, ModifierLoc, EndLoc);
1888   }
1889 
1890   /// Build a new OpenMP 'map' clause.
1891   ///
1892   /// By default, performs semantic analysis to build the new OpenMP clause.
1893   /// Subclasses may override this routine to provide different behavior.
1894   OMPClause *RebuildOMPMapClause(
1895       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1896       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1897       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1898       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1899       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1900       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1901     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1902                                           MapperIdScopeSpec, MapperId, MapType,
1903                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1904                                           VarList, Locs, UnresolvedMappers);
1905   }
1906 
1907   /// Build a new OpenMP 'allocate' clause.
1908   ///
1909   /// By default, performs semantic analysis to build the new OpenMP clause.
1910   /// Subclasses may override this routine to provide different behavior.
1911   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1912                                       SourceLocation StartLoc,
1913                                       SourceLocation LParenLoc,
1914                                       SourceLocation ColonLoc,
1915                                       SourceLocation EndLoc) {
1916     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1917                                                LParenLoc, ColonLoc, EndLoc);
1918   }
1919 
1920   /// Build a new OpenMP 'num_teams' clause.
1921   ///
1922   /// By default, performs semantic analysis to build the new statement.
1923   /// Subclasses may override this routine to provide different behavior.
1924   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1925                                       SourceLocation LParenLoc,
1926                                       SourceLocation EndLoc) {
1927     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1928                                                EndLoc);
1929   }
1930 
1931   /// Build a new OpenMP 'thread_limit' clause.
1932   ///
1933   /// By default, performs semantic analysis to build the new statement.
1934   /// Subclasses may override this routine to provide different behavior.
1935   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1936                                          SourceLocation StartLoc,
1937                                          SourceLocation LParenLoc,
1938                                          SourceLocation EndLoc) {
1939     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1940                                                   LParenLoc, EndLoc);
1941   }
1942 
1943   /// Build a new OpenMP 'priority' clause.
1944   ///
1945   /// By default, performs semantic analysis to build the new statement.
1946   /// Subclasses may override this routine to provide different behavior.
1947   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1948                                       SourceLocation LParenLoc,
1949                                       SourceLocation EndLoc) {
1950     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1951                                                EndLoc);
1952   }
1953 
1954   /// Build a new OpenMP 'grainsize' clause.
1955   ///
1956   /// By default, performs semantic analysis to build the new statement.
1957   /// Subclasses may override this routine to provide different behavior.
1958   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1959                                        SourceLocation LParenLoc,
1960                                        SourceLocation EndLoc) {
1961     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1962                                                 EndLoc);
1963   }
1964 
1965   /// Build a new OpenMP 'num_tasks' clause.
1966   ///
1967   /// By default, performs semantic analysis to build the new statement.
1968   /// Subclasses may override this routine to provide different behavior.
1969   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1970                                       SourceLocation LParenLoc,
1971                                       SourceLocation EndLoc) {
1972     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1973                                                EndLoc);
1974   }
1975 
1976   /// Build a new OpenMP 'hint' clause.
1977   ///
1978   /// By default, performs semantic analysis to build the new statement.
1979   /// Subclasses may override this routine to provide different behavior.
1980   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1981                                   SourceLocation LParenLoc,
1982                                   SourceLocation EndLoc) {
1983     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1984   }
1985 
1986   /// Build a new OpenMP 'detach' clause.
1987   ///
1988   /// By default, performs semantic analysis to build the new statement.
1989   /// Subclasses may override this routine to provide different behavior.
1990   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
1991                                     SourceLocation LParenLoc,
1992                                     SourceLocation EndLoc) {
1993     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
1994   }
1995 
1996   /// Build a new OpenMP 'dist_schedule' clause.
1997   ///
1998   /// By default, performs semantic analysis to build the new OpenMP clause.
1999   /// Subclasses may override this routine to provide different behavior.
2000   OMPClause *
2001   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2002                                Expr *ChunkSize, SourceLocation StartLoc,
2003                                SourceLocation LParenLoc, SourceLocation KindLoc,
2004                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2005     return getSema().ActOnOpenMPDistScheduleClause(
2006         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2007   }
2008 
2009   /// Build a new OpenMP 'to' clause.
2010   ///
2011   /// By default, performs semantic analysis to build the new statement.
2012   /// Subclasses may override this routine to provide different behavior.
2013   OMPClause *
2014   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2015                      ArrayRef<SourceLocation> MotionModifiersLoc,
2016                      CXXScopeSpec &MapperIdScopeSpec,
2017                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2018                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2019                      ArrayRef<Expr *> UnresolvedMappers) {
2020     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2021                                          MapperIdScopeSpec, MapperId, ColonLoc,
2022                                          VarList, Locs, UnresolvedMappers);
2023   }
2024 
2025   /// Build a new OpenMP 'from' clause.
2026   ///
2027   /// By default, performs semantic analysis to build the new statement.
2028   /// Subclasses may override this routine to provide different behavior.
2029   OMPClause *
2030   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2031                        ArrayRef<SourceLocation> MotionModifiersLoc,
2032                        CXXScopeSpec &MapperIdScopeSpec,
2033                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2034                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2035                        ArrayRef<Expr *> UnresolvedMappers) {
2036     return getSema().ActOnOpenMPFromClause(
2037         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2038         ColonLoc, VarList, Locs, UnresolvedMappers);
2039   }
2040 
2041   /// Build a new OpenMP 'use_device_ptr' clause.
2042   ///
2043   /// By default, performs semantic analysis to build the new OpenMP clause.
2044   /// Subclasses may override this routine to provide different behavior.
2045   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2046                                           const OMPVarListLocTy &Locs) {
2047     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2048   }
2049 
2050   /// Build a new OpenMP 'use_device_addr' clause.
2051   ///
2052   /// By default, performs semantic analysis to build the new OpenMP clause.
2053   /// Subclasses may override this routine to provide different behavior.
2054   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2055                                            const OMPVarListLocTy &Locs) {
2056     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2057   }
2058 
2059   /// Build a new OpenMP 'is_device_ptr' clause.
2060   ///
2061   /// By default, performs semantic analysis to build the new OpenMP clause.
2062   /// Subclasses may override this routine to provide different behavior.
2063   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2064                                          const OMPVarListLocTy &Locs) {
2065     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2066   }
2067 
2068   /// Build a new OpenMP 'defaultmap' clause.
2069   ///
2070   /// By default, performs semantic analysis to build the new OpenMP clause.
2071   /// Subclasses may override this routine to provide different behavior.
2072   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2073                                         OpenMPDefaultmapClauseKind Kind,
2074                                         SourceLocation StartLoc,
2075                                         SourceLocation LParenLoc,
2076                                         SourceLocation MLoc,
2077                                         SourceLocation KindLoc,
2078                                         SourceLocation EndLoc) {
2079     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2080                                                  MLoc, KindLoc, EndLoc);
2081   }
2082 
2083   /// Build a new OpenMP 'nontemporal' clause.
2084   ///
2085   /// By default, performs semantic analysis to build the new OpenMP clause.
2086   /// Subclasses may override this routine to provide different behavior.
2087   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2088                                          SourceLocation StartLoc,
2089                                          SourceLocation LParenLoc,
2090                                          SourceLocation EndLoc) {
2091     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2092                                                   EndLoc);
2093   }
2094 
2095   /// Build a new OpenMP 'inclusive' clause.
2096   ///
2097   /// By default, performs semantic analysis to build the new OpenMP clause.
2098   /// Subclasses may override this routine to provide different behavior.
2099   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2100                                        SourceLocation StartLoc,
2101                                        SourceLocation LParenLoc,
2102                                        SourceLocation EndLoc) {
2103     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2104                                                 EndLoc);
2105   }
2106 
2107   /// Build a new OpenMP 'exclusive' clause.
2108   ///
2109   /// By default, performs semantic analysis to build the new OpenMP clause.
2110   /// Subclasses may override this routine to provide different behavior.
2111   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2112                                        SourceLocation StartLoc,
2113                                        SourceLocation LParenLoc,
2114                                        SourceLocation EndLoc) {
2115     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2116                                                 EndLoc);
2117   }
2118 
2119   /// Build a new OpenMP 'uses_allocators' clause.
2120   ///
2121   /// By default, performs semantic analysis to build the new OpenMP clause.
2122   /// Subclasses may override this routine to provide different behavior.
2123   OMPClause *RebuildOMPUsesAllocatorsClause(
2124       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2125       SourceLocation LParenLoc, SourceLocation EndLoc) {
2126     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2127                                                     Data);
2128   }
2129 
2130   /// Build a new OpenMP 'affinity' clause.
2131   ///
2132   /// By default, performs semantic analysis to build the new OpenMP clause.
2133   /// Subclasses may override this routine to provide different behavior.
2134   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2135                                       SourceLocation LParenLoc,
2136                                       SourceLocation ColonLoc,
2137                                       SourceLocation EndLoc, Expr *Modifier,
2138                                       ArrayRef<Expr *> Locators) {
2139     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2140                                                EndLoc, Modifier, Locators);
2141   }
2142 
2143   /// Build a new OpenMP 'order' clause.
2144   ///
2145   /// By default, performs semantic analysis to build the new OpenMP clause.
2146   /// Subclasses may override this routine to provide different behavior.
2147   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2148                                    SourceLocation KindKwLoc,
2149                                    SourceLocation StartLoc,
2150                                    SourceLocation LParenLoc,
2151                                    SourceLocation EndLoc) {
2152     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2153                                             LParenLoc, EndLoc);
2154   }
2155 
2156   /// Rebuild the operand to an Objective-C \@synchronized statement.
2157   ///
2158   /// By default, performs semantic analysis to build the new statement.
2159   /// Subclasses may override this routine to provide different behavior.
2160   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2161                                               Expr *object) {
2162     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2163   }
2164 
2165   /// Build a new Objective-C \@synchronized statement.
2166   ///
2167   /// By default, performs semantic analysis to build the new statement.
2168   /// Subclasses may override this routine to provide different behavior.
2169   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2170                                            Expr *Object, Stmt *Body) {
2171     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2172   }
2173 
2174   /// Build a new Objective-C \@autoreleasepool statement.
2175   ///
2176   /// By default, performs semantic analysis to build the new statement.
2177   /// Subclasses may override this routine to provide different behavior.
2178   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2179                                             Stmt *Body) {
2180     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2181   }
2182 
2183   /// Build a new Objective-C fast enumeration statement.
2184   ///
2185   /// By default, performs semantic analysis to build the new statement.
2186   /// Subclasses may override this routine to provide different behavior.
2187   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2188                                           Stmt *Element,
2189                                           Expr *Collection,
2190                                           SourceLocation RParenLoc,
2191                                           Stmt *Body) {
2192     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2193                                                 Element,
2194                                                 Collection,
2195                                                 RParenLoc);
2196     if (ForEachStmt.isInvalid())
2197       return StmtError();
2198 
2199     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2200   }
2201 
2202   /// Build a new C++ exception declaration.
2203   ///
2204   /// By default, performs semantic analysis to build the new decaration.
2205   /// Subclasses may override this routine to provide different behavior.
2206   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2207                                 TypeSourceInfo *Declarator,
2208                                 SourceLocation StartLoc,
2209                                 SourceLocation IdLoc,
2210                                 IdentifierInfo *Id) {
2211     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2212                                                        StartLoc, IdLoc, Id);
2213     if (Var)
2214       getSema().CurContext->addDecl(Var);
2215     return Var;
2216   }
2217 
2218   /// Build a new C++ catch statement.
2219   ///
2220   /// By default, performs semantic analysis to build the new statement.
2221   /// Subclasses may override this routine to provide different behavior.
2222   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2223                                  VarDecl *ExceptionDecl,
2224                                  Stmt *Handler) {
2225     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2226                                                       Handler));
2227   }
2228 
2229   /// Build a new C++ try statement.
2230   ///
2231   /// By default, performs semantic analysis to build the new statement.
2232   /// Subclasses may override this routine to provide different behavior.
2233   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2234                                ArrayRef<Stmt *> Handlers) {
2235     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2236   }
2237 
2238   /// Build a new C++0x range-based for statement.
2239   ///
2240   /// By default, performs semantic analysis to build the new statement.
2241   /// Subclasses may override this routine to provide different behavior.
2242   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2243                                     SourceLocation CoawaitLoc, Stmt *Init,
2244                                     SourceLocation ColonLoc, Stmt *Range,
2245                                     Stmt *Begin, Stmt *End, Expr *Cond,
2246                                     Expr *Inc, Stmt *LoopVar,
2247                                     SourceLocation RParenLoc) {
2248     // If we've just learned that the range is actually an Objective-C
2249     // collection, treat this as an Objective-C fast enumeration loop.
2250     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2251       if (RangeStmt->isSingleDecl()) {
2252         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2253           if (RangeVar->isInvalidDecl())
2254             return StmtError();
2255 
2256           Expr *RangeExpr = RangeVar->getInit();
2257           if (!RangeExpr->isTypeDependent() &&
2258               RangeExpr->getType()->isObjCObjectPointerType()) {
2259             // FIXME: Support init-statements in Objective-C++20 ranged for
2260             // statement.
2261             if (Init) {
2262               return SemaRef.Diag(Init->getBeginLoc(),
2263                                   diag::err_objc_for_range_init_stmt)
2264                          << Init->getSourceRange();
2265             }
2266             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2267                                                         RangeExpr, RParenLoc);
2268           }
2269         }
2270       }
2271     }
2272 
2273     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2274                                           Range, Begin, End, Cond, Inc, LoopVar,
2275                                           RParenLoc, Sema::BFRK_Rebuild);
2276   }
2277 
2278   /// Build a new C++0x range-based for statement.
2279   ///
2280   /// By default, performs semantic analysis to build the new statement.
2281   /// Subclasses may override this routine to provide different behavior.
2282   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2283                                           bool IsIfExists,
2284                                           NestedNameSpecifierLoc QualifierLoc,
2285                                           DeclarationNameInfo NameInfo,
2286                                           Stmt *Nested) {
2287     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2288                                                 QualifierLoc, NameInfo, Nested);
2289   }
2290 
2291   /// Attach body to a C++0x range-based for statement.
2292   ///
2293   /// By default, performs semantic analysis to finish the new statement.
2294   /// Subclasses may override this routine to provide different behavior.
2295   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2296     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2297   }
2298 
2299   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2300                                Stmt *TryBlock, Stmt *Handler) {
2301     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2302   }
2303 
2304   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2305                                   Stmt *Block) {
2306     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2307   }
2308 
2309   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2310     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2311   }
2312 
2313   /// Build a new predefined expression.
2314   ///
2315   /// By default, performs semantic analysis to build the new expression.
2316   /// Subclasses may override this routine to provide different behavior.
2317   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2318                                    PredefinedExpr::IdentKind IK) {
2319     return getSema().BuildPredefinedExpr(Loc, IK);
2320   }
2321 
2322   /// Build a new expression that references a declaration.
2323   ///
2324   /// By default, performs semantic analysis to build the new expression.
2325   /// Subclasses may override this routine to provide different behavior.
2326   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2327                                         LookupResult &R,
2328                                         bool RequiresADL) {
2329     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2330   }
2331 
2332 
2333   /// Build a new expression that references a declaration.
2334   ///
2335   /// By default, performs semantic analysis to build the new expression.
2336   /// Subclasses may override this routine to provide different behavior.
2337   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2338                                 ValueDecl *VD,
2339                                 const DeclarationNameInfo &NameInfo,
2340                                 NamedDecl *Found,
2341                                 TemplateArgumentListInfo *TemplateArgs) {
2342     CXXScopeSpec SS;
2343     SS.Adopt(QualifierLoc);
2344     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2345                                               TemplateArgs);
2346   }
2347 
2348   /// Build a new expression in parentheses.
2349   ///
2350   /// By default, performs semantic analysis to build the new expression.
2351   /// Subclasses may override this routine to provide different behavior.
2352   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2353                                     SourceLocation RParen) {
2354     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2355   }
2356 
2357   /// Build a new pseudo-destructor expression.
2358   ///
2359   /// By default, performs semantic analysis to build the new expression.
2360   /// Subclasses may override this routine to provide different behavior.
2361   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2362                                             SourceLocation OperatorLoc,
2363                                             bool isArrow,
2364                                             CXXScopeSpec &SS,
2365                                             TypeSourceInfo *ScopeType,
2366                                             SourceLocation CCLoc,
2367                                             SourceLocation TildeLoc,
2368                                         PseudoDestructorTypeStorage Destroyed);
2369 
2370   /// Build a new unary operator expression.
2371   ///
2372   /// By default, performs semantic analysis to build the new expression.
2373   /// Subclasses may override this routine to provide different behavior.
2374   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2375                                         UnaryOperatorKind Opc,
2376                                         Expr *SubExpr) {
2377     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2378   }
2379 
2380   /// Build a new builtin offsetof expression.
2381   ///
2382   /// By default, performs semantic analysis to build the new expression.
2383   /// Subclasses may override this routine to provide different behavior.
2384   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2385                                  TypeSourceInfo *Type,
2386                                  ArrayRef<Sema::OffsetOfComponent> Components,
2387                                  SourceLocation RParenLoc) {
2388     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2389                                           RParenLoc);
2390   }
2391 
2392   /// Build a new sizeof, alignof or vec_step expression with a
2393   /// type argument.
2394   ///
2395   /// By default, performs semantic analysis to build the new expression.
2396   /// Subclasses may override this routine to provide different behavior.
2397   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2398                                          SourceLocation OpLoc,
2399                                          UnaryExprOrTypeTrait ExprKind,
2400                                          SourceRange R) {
2401     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2402   }
2403 
2404   /// Build a new sizeof, alignof or vec step expression with an
2405   /// expression argument.
2406   ///
2407   /// By default, performs semantic analysis to build the new expression.
2408   /// Subclasses may override this routine to provide different behavior.
2409   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2410                                          UnaryExprOrTypeTrait ExprKind,
2411                                          SourceRange R) {
2412     ExprResult Result
2413       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2414     if (Result.isInvalid())
2415       return ExprError();
2416 
2417     return Result;
2418   }
2419 
2420   /// Build a new array subscript expression.
2421   ///
2422   /// By default, performs semantic analysis to build the new expression.
2423   /// Subclasses may override this routine to provide different behavior.
2424   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2425                                              SourceLocation LBracketLoc,
2426                                              Expr *RHS,
2427                                              SourceLocation RBracketLoc) {
2428     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2429                                              LBracketLoc, RHS,
2430                                              RBracketLoc);
2431   }
2432 
2433   /// Build a new matrix subscript expression.
2434   ///
2435   /// By default, performs semantic analysis to build the new expression.
2436   /// Subclasses may override this routine to provide different behavior.
2437   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2438                                         Expr *ColumnIdx,
2439                                         SourceLocation RBracketLoc) {
2440     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2441                                                       RBracketLoc);
2442   }
2443 
2444   /// Build a new array section expression.
2445   ///
2446   /// By default, performs semantic analysis to build the new expression.
2447   /// Subclasses may override this routine to provide different behavior.
2448   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2449                                         Expr *LowerBound,
2450                                         SourceLocation ColonLocFirst,
2451                                         SourceLocation ColonLocSecond,
2452                                         Expr *Length, Expr *Stride,
2453                                         SourceLocation RBracketLoc) {
2454     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2455                                               ColonLocFirst, ColonLocSecond,
2456                                               Length, Stride, RBracketLoc);
2457   }
2458 
2459   /// Build a new array shaping expression.
2460   ///
2461   /// By default, performs semantic analysis to build the new expression.
2462   /// Subclasses may override this routine to provide different behavior.
2463   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2464                                         SourceLocation RParenLoc,
2465                                         ArrayRef<Expr *> Dims,
2466                                         ArrayRef<SourceRange> BracketsRanges) {
2467     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2468                                               BracketsRanges);
2469   }
2470 
2471   /// Build a new iterator expression.
2472   ///
2473   /// By default, performs semantic analysis to build the new expression.
2474   /// Subclasses may override this routine to provide different behavior.
2475   ExprResult RebuildOMPIteratorExpr(
2476       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2477       ArrayRef<Sema::OMPIteratorData> Data) {
2478     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2479                                           LLoc, RLoc, Data);
2480   }
2481 
2482   /// Build a new call expression.
2483   ///
2484   /// By default, performs semantic analysis to build the new expression.
2485   /// Subclasses may override this routine to provide different behavior.
2486   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2487                                    MultiExprArg Args,
2488                                    SourceLocation RParenLoc,
2489                                    Expr *ExecConfig = nullptr) {
2490     return getSema().ActOnCallExpr(
2491         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2492   }
2493 
2494   /// Build a new member access expression.
2495   ///
2496   /// By default, performs semantic analysis to build the new expression.
2497   /// Subclasses may override this routine to provide different behavior.
2498   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2499                                bool isArrow,
2500                                NestedNameSpecifierLoc QualifierLoc,
2501                                SourceLocation TemplateKWLoc,
2502                                const DeclarationNameInfo &MemberNameInfo,
2503                                ValueDecl *Member,
2504                                NamedDecl *FoundDecl,
2505                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2506                                NamedDecl *FirstQualifierInScope) {
2507     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2508                                                                       isArrow);
2509     if (!Member->getDeclName()) {
2510       // We have a reference to an unnamed field.  This is always the
2511       // base of an anonymous struct/union member access, i.e. the
2512       // field is always of record type.
2513       assert(Member->getType()->isRecordType() &&
2514              "unnamed member not of record type?");
2515 
2516       BaseResult =
2517         getSema().PerformObjectMemberConversion(BaseResult.get(),
2518                                                 QualifierLoc.getNestedNameSpecifier(),
2519                                                 FoundDecl, Member);
2520       if (BaseResult.isInvalid())
2521         return ExprError();
2522       Base = BaseResult.get();
2523 
2524       CXXScopeSpec EmptySS;
2525       return getSema().BuildFieldReferenceExpr(
2526           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2527           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2528     }
2529 
2530     CXXScopeSpec SS;
2531     SS.Adopt(QualifierLoc);
2532 
2533     Base = BaseResult.get();
2534     QualType BaseType = Base->getType();
2535 
2536     if (isArrow && !BaseType->isPointerType())
2537       return ExprError();
2538 
2539     // FIXME: this involves duplicating earlier analysis in a lot of
2540     // cases; we should avoid this when possible.
2541     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2542     R.addDecl(FoundDecl);
2543     R.resolveKind();
2544 
2545     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2546                                               SS, TemplateKWLoc,
2547                                               FirstQualifierInScope,
2548                                               R, ExplicitTemplateArgs,
2549                                               /*S*/nullptr);
2550   }
2551 
2552   /// Build a new binary operator expression.
2553   ///
2554   /// By default, performs semantic analysis to build the new expression.
2555   /// Subclasses may override this routine to provide different behavior.
2556   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2557                                          BinaryOperatorKind Opc,
2558                                          Expr *LHS, Expr *RHS) {
2559     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2560   }
2561 
2562   /// Build a new rewritten operator expression.
2563   ///
2564   /// By default, performs semantic analysis to build the new expression.
2565   /// Subclasses may override this routine to provide different behavior.
2566   ExprResult RebuildCXXRewrittenBinaryOperator(
2567       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2568       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2569     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2570                                            RHS, /*RequiresADL*/false);
2571   }
2572 
2573   /// Build a new conditional operator expression.
2574   ///
2575   /// By default, performs semantic analysis to build the new expression.
2576   /// Subclasses may override this routine to provide different behavior.
2577   ExprResult RebuildConditionalOperator(Expr *Cond,
2578                                         SourceLocation QuestionLoc,
2579                                         Expr *LHS,
2580                                         SourceLocation ColonLoc,
2581                                         Expr *RHS) {
2582     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2583                                         LHS, RHS);
2584   }
2585 
2586   /// Build a new C-style cast expression.
2587   ///
2588   /// By default, performs semantic analysis to build the new expression.
2589   /// Subclasses may override this routine to provide different behavior.
2590   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2591                                          TypeSourceInfo *TInfo,
2592                                          SourceLocation RParenLoc,
2593                                          Expr *SubExpr) {
2594     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2595                                          SubExpr);
2596   }
2597 
2598   /// Build a new compound literal expression.
2599   ///
2600   /// By default, performs semantic analysis to build the new expression.
2601   /// Subclasses may override this routine to provide different behavior.
2602   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2603                                               TypeSourceInfo *TInfo,
2604                                               SourceLocation RParenLoc,
2605                                               Expr *Init) {
2606     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2607                                               Init);
2608   }
2609 
2610   /// Build a new extended vector element access expression.
2611   ///
2612   /// By default, performs semantic analysis to build the new expression.
2613   /// Subclasses may override this routine to provide different behavior.
2614   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2615                                                SourceLocation OpLoc,
2616                                                SourceLocation AccessorLoc,
2617                                                IdentifierInfo &Accessor) {
2618 
2619     CXXScopeSpec SS;
2620     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2621     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2622                                               OpLoc, /*IsArrow*/ false,
2623                                               SS, SourceLocation(),
2624                                               /*FirstQualifierInScope*/ nullptr,
2625                                               NameInfo,
2626                                               /* TemplateArgs */ nullptr,
2627                                               /*S*/ nullptr);
2628   }
2629 
2630   /// Build a new initializer list expression.
2631   ///
2632   /// By default, performs semantic analysis to build the new expression.
2633   /// Subclasses may override this routine to provide different behavior.
2634   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2635                              MultiExprArg Inits,
2636                              SourceLocation RBraceLoc) {
2637     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2638   }
2639 
2640   /// Build a new designated initializer expression.
2641   ///
2642   /// By default, performs semantic analysis to build the new expression.
2643   /// Subclasses may override this routine to provide different behavior.
2644   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2645                                              MultiExprArg ArrayExprs,
2646                                              SourceLocation EqualOrColonLoc,
2647                                              bool GNUSyntax,
2648                                              Expr *Init) {
2649     ExprResult Result
2650       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2651                                            Init);
2652     if (Result.isInvalid())
2653       return ExprError();
2654 
2655     return Result;
2656   }
2657 
2658   /// Build a new value-initialized expression.
2659   ///
2660   /// By default, builds the implicit value initialization without performing
2661   /// any semantic analysis. Subclasses may override this routine to provide
2662   /// different behavior.
2663   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2664     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2665   }
2666 
2667   /// Build a new \c va_arg expression.
2668   ///
2669   /// By default, performs semantic analysis to build the new expression.
2670   /// Subclasses may override this routine to provide different behavior.
2671   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2672                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2673                                     SourceLocation RParenLoc) {
2674     return getSema().BuildVAArgExpr(BuiltinLoc,
2675                                     SubExpr, TInfo,
2676                                     RParenLoc);
2677   }
2678 
2679   /// Build a new expression list in parentheses.
2680   ///
2681   /// By default, performs semantic analysis to build the new expression.
2682   /// Subclasses may override this routine to provide different behavior.
2683   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2684                                   MultiExprArg SubExprs,
2685                                   SourceLocation RParenLoc) {
2686     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2687   }
2688 
2689   /// Build a new address-of-label expression.
2690   ///
2691   /// By default, performs semantic analysis, using the name of the label
2692   /// rather than attempting to map the label statement itself.
2693   /// Subclasses may override this routine to provide different behavior.
2694   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2695                                   SourceLocation LabelLoc, LabelDecl *Label) {
2696     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2697   }
2698 
2699   /// Build a new GNU statement expression.
2700   ///
2701   /// By default, performs semantic analysis to build the new expression.
2702   /// Subclasses may override this routine to provide different behavior.
2703   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2704                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2705     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2706                                    TemplateDepth);
2707   }
2708 
2709   /// Build a new __builtin_choose_expr expression.
2710   ///
2711   /// By default, performs semantic analysis to build the new expression.
2712   /// Subclasses may override this routine to provide different behavior.
2713   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2714                                      Expr *Cond, Expr *LHS, Expr *RHS,
2715                                      SourceLocation RParenLoc) {
2716     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2717                                    Cond, LHS, RHS,
2718                                    RParenLoc);
2719   }
2720 
2721   /// Build a new generic selection expression.
2722   ///
2723   /// By default, performs semantic analysis to build the new expression.
2724   /// Subclasses may override this routine to provide different behavior.
2725   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2726                                          SourceLocation DefaultLoc,
2727                                          SourceLocation RParenLoc,
2728                                          Expr *ControllingExpr,
2729                                          ArrayRef<TypeSourceInfo *> Types,
2730                                          ArrayRef<Expr *> Exprs) {
2731     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2732                                                 ControllingExpr, Types, Exprs);
2733   }
2734 
2735   /// Build a new overloaded operator call expression.
2736   ///
2737   /// By default, performs semantic analysis to build the new expression.
2738   /// The semantic analysis provides the behavior of template instantiation,
2739   /// copying with transformations that turn what looks like an overloaded
2740   /// operator call into a use of a builtin operator, performing
2741   /// argument-dependent lookup, etc. Subclasses may override this routine to
2742   /// provide different behavior.
2743   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2744                                               SourceLocation OpLoc,
2745                                               Expr *Callee,
2746                                               Expr *First,
2747                                               Expr *Second);
2748 
2749   /// Build a new C++ "named" cast expression, such as static_cast or
2750   /// reinterpret_cast.
2751   ///
2752   /// By default, this routine dispatches to one of the more-specific routines
2753   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2754   /// Subclasses may override this routine to provide different behavior.
2755   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2756                                            Stmt::StmtClass Class,
2757                                            SourceLocation LAngleLoc,
2758                                            TypeSourceInfo *TInfo,
2759                                            SourceLocation RAngleLoc,
2760                                            SourceLocation LParenLoc,
2761                                            Expr *SubExpr,
2762                                            SourceLocation RParenLoc) {
2763     switch (Class) {
2764     case Stmt::CXXStaticCastExprClass:
2765       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2766                                                    RAngleLoc, LParenLoc,
2767                                                    SubExpr, RParenLoc);
2768 
2769     case Stmt::CXXDynamicCastExprClass:
2770       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2771                                                     RAngleLoc, LParenLoc,
2772                                                     SubExpr, RParenLoc);
2773 
2774     case Stmt::CXXReinterpretCastExprClass:
2775       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2776                                                         RAngleLoc, LParenLoc,
2777                                                         SubExpr,
2778                                                         RParenLoc);
2779 
2780     case Stmt::CXXConstCastExprClass:
2781       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2782                                                    RAngleLoc, LParenLoc,
2783                                                    SubExpr, RParenLoc);
2784 
2785     case Stmt::CXXAddrspaceCastExprClass:
2786       return getDerived().RebuildCXXAddrspaceCastExpr(
2787           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2788 
2789     default:
2790       llvm_unreachable("Invalid C++ named cast");
2791     }
2792   }
2793 
2794   /// Build a new C++ static_cast expression.
2795   ///
2796   /// By default, performs semantic analysis to build the new expression.
2797   /// Subclasses may override this routine to provide different behavior.
2798   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2799                                             SourceLocation LAngleLoc,
2800                                             TypeSourceInfo *TInfo,
2801                                             SourceLocation RAngleLoc,
2802                                             SourceLocation LParenLoc,
2803                                             Expr *SubExpr,
2804                                             SourceLocation RParenLoc) {
2805     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2806                                        TInfo, SubExpr,
2807                                        SourceRange(LAngleLoc, RAngleLoc),
2808                                        SourceRange(LParenLoc, RParenLoc));
2809   }
2810 
2811   /// Build a new C++ dynamic_cast expression.
2812   ///
2813   /// By default, performs semantic analysis to build the new expression.
2814   /// Subclasses may override this routine to provide different behavior.
2815   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2816                                              SourceLocation LAngleLoc,
2817                                              TypeSourceInfo *TInfo,
2818                                              SourceLocation RAngleLoc,
2819                                              SourceLocation LParenLoc,
2820                                              Expr *SubExpr,
2821                                              SourceLocation RParenLoc) {
2822     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2823                                        TInfo, SubExpr,
2824                                        SourceRange(LAngleLoc, RAngleLoc),
2825                                        SourceRange(LParenLoc, RParenLoc));
2826   }
2827 
2828   /// Build a new C++ reinterpret_cast expression.
2829   ///
2830   /// By default, performs semantic analysis to build the new expression.
2831   /// Subclasses may override this routine to provide different behavior.
2832   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2833                                                  SourceLocation LAngleLoc,
2834                                                  TypeSourceInfo *TInfo,
2835                                                  SourceLocation RAngleLoc,
2836                                                  SourceLocation LParenLoc,
2837                                                  Expr *SubExpr,
2838                                                  SourceLocation RParenLoc) {
2839     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2840                                        TInfo, SubExpr,
2841                                        SourceRange(LAngleLoc, RAngleLoc),
2842                                        SourceRange(LParenLoc, RParenLoc));
2843   }
2844 
2845   /// Build a new C++ const_cast expression.
2846   ///
2847   /// By default, performs semantic analysis to build the new expression.
2848   /// Subclasses may override this routine to provide different behavior.
2849   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2850                                            SourceLocation LAngleLoc,
2851                                            TypeSourceInfo *TInfo,
2852                                            SourceLocation RAngleLoc,
2853                                            SourceLocation LParenLoc,
2854                                            Expr *SubExpr,
2855                                            SourceLocation RParenLoc) {
2856     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2857                                        TInfo, SubExpr,
2858                                        SourceRange(LAngleLoc, RAngleLoc),
2859                                        SourceRange(LParenLoc, RParenLoc));
2860   }
2861 
2862   ExprResult
2863   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2864                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2865                               SourceLocation LParenLoc, Expr *SubExpr,
2866                               SourceLocation RParenLoc) {
2867     return getSema().BuildCXXNamedCast(
2868         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2869         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2870   }
2871 
2872   /// Build a new C++ functional-style cast expression.
2873   ///
2874   /// By default, performs semantic analysis to build the new expression.
2875   /// Subclasses may override this routine to provide different behavior.
2876   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2877                                           SourceLocation LParenLoc,
2878                                           Expr *Sub,
2879                                           SourceLocation RParenLoc,
2880                                           bool ListInitialization) {
2881     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2882                                                MultiExprArg(&Sub, 1), RParenLoc,
2883                                                ListInitialization);
2884   }
2885 
2886   /// Build a new C++ __builtin_bit_cast expression.
2887   ///
2888   /// By default, performs semantic analysis to build the new expression.
2889   /// Subclasses may override this routine to provide different behavior.
2890   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2891                                        TypeSourceInfo *TSI, Expr *Sub,
2892                                        SourceLocation RParenLoc) {
2893     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2894   }
2895 
2896   /// Build a new C++ typeid(type) expression.
2897   ///
2898   /// By default, performs semantic analysis to build the new expression.
2899   /// Subclasses may override this routine to provide different behavior.
2900   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2901                                         SourceLocation TypeidLoc,
2902                                         TypeSourceInfo *Operand,
2903                                         SourceLocation RParenLoc) {
2904     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2905                                     RParenLoc);
2906   }
2907 
2908 
2909   /// Build a new C++ typeid(expr) expression.
2910   ///
2911   /// By default, performs semantic analysis to build the new expression.
2912   /// Subclasses may override this routine to provide different behavior.
2913   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2914                                         SourceLocation TypeidLoc,
2915                                         Expr *Operand,
2916                                         SourceLocation RParenLoc) {
2917     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2918                                     RParenLoc);
2919   }
2920 
2921   /// Build a new C++ __uuidof(type) expression.
2922   ///
2923   /// By default, performs semantic analysis to build the new expression.
2924   /// Subclasses may override this routine to provide different behavior.
2925   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2926                                   TypeSourceInfo *Operand,
2927                                   SourceLocation RParenLoc) {
2928     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2929   }
2930 
2931   /// Build a new C++ __uuidof(expr) expression.
2932   ///
2933   /// By default, performs semantic analysis to build the new expression.
2934   /// Subclasses may override this routine to provide different behavior.
2935   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2936                                   Expr *Operand, SourceLocation RParenLoc) {
2937     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2938   }
2939 
2940   /// Build a new C++ "this" expression.
2941   ///
2942   /// By default, builds a new "this" expression without performing any
2943   /// semantic analysis. Subclasses may override this routine to provide
2944   /// different behavior.
2945   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2946                                 QualType ThisType,
2947                                 bool isImplicit) {
2948     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2949   }
2950 
2951   /// Build a new C++ throw expression.
2952   ///
2953   /// By default, performs semantic analysis to build the new expression.
2954   /// Subclasses may override this routine to provide different behavior.
2955   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2956                                  bool IsThrownVariableInScope) {
2957     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2958   }
2959 
2960   /// Build a new C++ default-argument expression.
2961   ///
2962   /// By default, builds a new default-argument expression, which does not
2963   /// require any semantic analysis. Subclasses may override this routine to
2964   /// provide different behavior.
2965   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2966     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2967                                      getSema().CurContext);
2968   }
2969 
2970   /// Build a new C++11 default-initialization expression.
2971   ///
2972   /// By default, builds a new default field initialization expression, which
2973   /// does not require any semantic analysis. Subclasses may override this
2974   /// routine to provide different behavior.
2975   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2976                                        FieldDecl *Field) {
2977     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2978                                       getSema().CurContext);
2979   }
2980 
2981   /// Build a new C++ zero-initialization expression.
2982   ///
2983   /// By default, performs semantic analysis to build the new expression.
2984   /// Subclasses may override this routine to provide different behavior.
2985   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2986                                            SourceLocation LParenLoc,
2987                                            SourceLocation RParenLoc) {
2988     return getSema().BuildCXXTypeConstructExpr(
2989         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2990   }
2991 
2992   /// Build a new C++ "new" expression.
2993   ///
2994   /// By default, performs semantic analysis to build the new expression.
2995   /// Subclasses may override this routine to provide different behavior.
2996   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2997                                bool UseGlobal,
2998                                SourceLocation PlacementLParen,
2999                                MultiExprArg PlacementArgs,
3000                                SourceLocation PlacementRParen,
3001                                SourceRange TypeIdParens,
3002                                QualType AllocatedType,
3003                                TypeSourceInfo *AllocatedTypeInfo,
3004                                Optional<Expr *> ArraySize,
3005                                SourceRange DirectInitRange,
3006                                Expr *Initializer) {
3007     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3008                                  PlacementLParen,
3009                                  PlacementArgs,
3010                                  PlacementRParen,
3011                                  TypeIdParens,
3012                                  AllocatedType,
3013                                  AllocatedTypeInfo,
3014                                  ArraySize,
3015                                  DirectInitRange,
3016                                  Initializer);
3017   }
3018 
3019   /// Build a new C++ "delete" expression.
3020   ///
3021   /// By default, performs semantic analysis to build the new expression.
3022   /// Subclasses may override this routine to provide different behavior.
3023   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3024                                         bool IsGlobalDelete,
3025                                         bool IsArrayForm,
3026                                         Expr *Operand) {
3027     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3028                                     Operand);
3029   }
3030 
3031   /// Build a new type trait expression.
3032   ///
3033   /// By default, performs semantic analysis to build the new expression.
3034   /// Subclasses may override this routine to provide different behavior.
3035   ExprResult RebuildTypeTrait(TypeTrait Trait,
3036                               SourceLocation StartLoc,
3037                               ArrayRef<TypeSourceInfo *> Args,
3038                               SourceLocation RParenLoc) {
3039     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3040   }
3041 
3042   /// Build a new array type trait expression.
3043   ///
3044   /// By default, performs semantic analysis to build the new expression.
3045   /// Subclasses may override this routine to provide different behavior.
3046   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3047                                    SourceLocation StartLoc,
3048                                    TypeSourceInfo *TSInfo,
3049                                    Expr *DimExpr,
3050                                    SourceLocation RParenLoc) {
3051     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3052   }
3053 
3054   /// Build a new expression trait expression.
3055   ///
3056   /// By default, performs semantic analysis to build the new expression.
3057   /// Subclasses may override this routine to provide different behavior.
3058   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3059                                    SourceLocation StartLoc,
3060                                    Expr *Queried,
3061                                    SourceLocation RParenLoc) {
3062     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3063   }
3064 
3065   /// Build a new (previously unresolved) declaration reference
3066   /// expression.
3067   ///
3068   /// By default, performs semantic analysis to build the new expression.
3069   /// Subclasses may override this routine to provide different behavior.
3070   ExprResult RebuildDependentScopeDeclRefExpr(
3071                                           NestedNameSpecifierLoc QualifierLoc,
3072                                           SourceLocation TemplateKWLoc,
3073                                        const DeclarationNameInfo &NameInfo,
3074                               const TemplateArgumentListInfo *TemplateArgs,
3075                                           bool IsAddressOfOperand,
3076                                           TypeSourceInfo **RecoveryTSI) {
3077     CXXScopeSpec SS;
3078     SS.Adopt(QualifierLoc);
3079 
3080     if (TemplateArgs || TemplateKWLoc.isValid())
3081       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3082                                                     TemplateArgs);
3083 
3084     return getSema().BuildQualifiedDeclarationNameExpr(
3085         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3086   }
3087 
3088   /// Build a new template-id expression.
3089   ///
3090   /// By default, performs semantic analysis to build the new expression.
3091   /// Subclasses may override this routine to provide different behavior.
3092   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3093                                    SourceLocation TemplateKWLoc,
3094                                    LookupResult &R,
3095                                    bool RequiresADL,
3096                               const TemplateArgumentListInfo *TemplateArgs) {
3097     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3098                                          TemplateArgs);
3099   }
3100 
3101   /// Build a new object-construction expression.
3102   ///
3103   /// By default, performs semantic analysis to build the new expression.
3104   /// Subclasses may override this routine to provide different behavior.
3105   ExprResult RebuildCXXConstructExpr(QualType T,
3106                                      SourceLocation Loc,
3107                                      CXXConstructorDecl *Constructor,
3108                                      bool IsElidable,
3109                                      MultiExprArg Args,
3110                                      bool HadMultipleCandidates,
3111                                      bool ListInitialization,
3112                                      bool StdInitListInitialization,
3113                                      bool RequiresZeroInit,
3114                              CXXConstructExpr::ConstructionKind ConstructKind,
3115                                      SourceRange ParenRange) {
3116     // Reconstruct the constructor we originally found, which might be
3117     // different if this is a call to an inherited constructor.
3118     CXXConstructorDecl *FoundCtor = Constructor;
3119     if (Constructor->isInheritingConstructor())
3120       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3121 
3122     SmallVector<Expr*, 8> ConvertedArgs;
3123     if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs))
3124       return ExprError();
3125 
3126     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3127                                            IsElidable,
3128                                            ConvertedArgs,
3129                                            HadMultipleCandidates,
3130                                            ListInitialization,
3131                                            StdInitListInitialization,
3132                                            RequiresZeroInit, ConstructKind,
3133                                            ParenRange);
3134   }
3135 
3136   /// Build a new implicit construction via inherited constructor
3137   /// expression.
3138   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3139                                              CXXConstructorDecl *Constructor,
3140                                              bool ConstructsVBase,
3141                                              bool InheritedFromVBase) {
3142     return new (getSema().Context) CXXInheritedCtorInitExpr(
3143         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3144   }
3145 
3146   /// Build a new object-construction expression.
3147   ///
3148   /// By default, performs semantic analysis to build the new expression.
3149   /// Subclasses may override this routine to provide different behavior.
3150   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3151                                            SourceLocation LParenOrBraceLoc,
3152                                            MultiExprArg Args,
3153                                            SourceLocation RParenOrBraceLoc,
3154                                            bool ListInitialization) {
3155     return getSema().BuildCXXTypeConstructExpr(
3156         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3157   }
3158 
3159   /// Build a new object-construction expression.
3160   ///
3161   /// By default, performs semantic analysis to build the new expression.
3162   /// Subclasses may override this routine to provide different behavior.
3163   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3164                                                SourceLocation LParenLoc,
3165                                                MultiExprArg Args,
3166                                                SourceLocation RParenLoc,
3167                                                bool ListInitialization) {
3168     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3169                                                RParenLoc, ListInitialization);
3170   }
3171 
3172   /// Build a new member reference expression.
3173   ///
3174   /// By default, performs semantic analysis to build the new expression.
3175   /// Subclasses may override this routine to provide different behavior.
3176   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3177                                                 QualType BaseType,
3178                                                 bool IsArrow,
3179                                                 SourceLocation OperatorLoc,
3180                                           NestedNameSpecifierLoc QualifierLoc,
3181                                                 SourceLocation TemplateKWLoc,
3182                                             NamedDecl *FirstQualifierInScope,
3183                                    const DeclarationNameInfo &MemberNameInfo,
3184                               const TemplateArgumentListInfo *TemplateArgs) {
3185     CXXScopeSpec SS;
3186     SS.Adopt(QualifierLoc);
3187 
3188     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3189                                             OperatorLoc, IsArrow,
3190                                             SS, TemplateKWLoc,
3191                                             FirstQualifierInScope,
3192                                             MemberNameInfo,
3193                                             TemplateArgs, /*S*/nullptr);
3194   }
3195 
3196   /// Build a new member reference expression.
3197   ///
3198   /// By default, performs semantic analysis to build the new expression.
3199   /// Subclasses may override this routine to provide different behavior.
3200   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3201                                          SourceLocation OperatorLoc,
3202                                          bool IsArrow,
3203                                          NestedNameSpecifierLoc QualifierLoc,
3204                                          SourceLocation TemplateKWLoc,
3205                                          NamedDecl *FirstQualifierInScope,
3206                                          LookupResult &R,
3207                                 const TemplateArgumentListInfo *TemplateArgs) {
3208     CXXScopeSpec SS;
3209     SS.Adopt(QualifierLoc);
3210 
3211     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3212                                             OperatorLoc, IsArrow,
3213                                             SS, TemplateKWLoc,
3214                                             FirstQualifierInScope,
3215                                             R, TemplateArgs, /*S*/nullptr);
3216   }
3217 
3218   /// Build a new noexcept expression.
3219   ///
3220   /// By default, performs semantic analysis to build the new expression.
3221   /// Subclasses may override this routine to provide different behavior.
3222   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3223     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3224   }
3225 
3226   /// Build a new expression to compute the length of a parameter pack.
3227   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3228                                    NamedDecl *Pack,
3229                                    SourceLocation PackLoc,
3230                                    SourceLocation RParenLoc,
3231                                    Optional<unsigned> Length,
3232                                    ArrayRef<TemplateArgument> PartialArgs) {
3233     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3234                                   RParenLoc, Length, PartialArgs);
3235   }
3236 
3237   /// Build a new expression representing a call to a source location
3238   ///  builtin.
3239   ///
3240   /// By default, performs semantic analysis to build the new expression.
3241   /// Subclasses may override this routine to provide different behavior.
3242   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3243                                   SourceLocation BuiltinLoc,
3244                                   SourceLocation RPLoc,
3245                                   DeclContext *ParentContext) {
3246     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3247   }
3248 
3249   /// Build a new Objective-C boxed expression.
3250   ///
3251   /// By default, performs semantic analysis to build the new expression.
3252   /// Subclasses may override this routine to provide different behavior.
3253   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3254       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3255       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3256       TemplateArgumentListInfo *TALI) {
3257     CXXScopeSpec SS;
3258     SS.Adopt(NNS);
3259     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3260                                                          ConceptNameInfo,
3261                                                          FoundDecl,
3262                                                          NamedConcept, TALI);
3263     if (Result.isInvalid())
3264       return ExprError();
3265     return Result;
3266   }
3267 
3268   /// \brief Build a new requires expression.
3269   ///
3270   /// By default, performs semantic analysis to build the new expression.
3271   /// Subclasses may override this routine to provide different behavior.
3272   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3273                                  RequiresExprBodyDecl *Body,
3274                                  ArrayRef<ParmVarDecl *> LocalParameters,
3275                                  ArrayRef<concepts::Requirement *> Requirements,
3276                                  SourceLocation ClosingBraceLoc) {
3277     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3278                                 LocalParameters, Requirements, ClosingBraceLoc);
3279   }
3280 
3281   concepts::TypeRequirement *
3282   RebuildTypeRequirement(
3283       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3284     return SemaRef.BuildTypeRequirement(SubstDiag);
3285   }
3286 
3287   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3288     return SemaRef.BuildTypeRequirement(T);
3289   }
3290 
3291   concepts::ExprRequirement *
3292   RebuildExprRequirement(
3293       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3294       SourceLocation NoexceptLoc,
3295       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3296     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3297                                         std::move(Ret));
3298   }
3299 
3300   concepts::ExprRequirement *
3301   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3302                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3303     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3304                                         std::move(Ret));
3305   }
3306 
3307   concepts::NestedRequirement *
3308   RebuildNestedRequirement(
3309       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3310     return SemaRef.BuildNestedRequirement(SubstDiag);
3311   }
3312 
3313   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3314     return SemaRef.BuildNestedRequirement(Constraint);
3315   }
3316 
3317   /// \brief Build a new Objective-C boxed expression.
3318   ///
3319   /// By default, performs semantic analysis to build the new expression.
3320   /// Subclasses may override this routine to provide different behavior.
3321   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3322     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3323   }
3324 
3325   /// Build a new Objective-C array literal.
3326   ///
3327   /// By default, performs semantic analysis to build the new expression.
3328   /// Subclasses may override this routine to provide different behavior.
3329   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3330                                      Expr **Elements, unsigned NumElements) {
3331     return getSema().BuildObjCArrayLiteral(Range,
3332                                            MultiExprArg(Elements, NumElements));
3333   }
3334 
3335   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3336                                          Expr *Base, Expr *Key,
3337                                          ObjCMethodDecl *getterMethod,
3338                                          ObjCMethodDecl *setterMethod) {
3339     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3340                                                    getterMethod, setterMethod);
3341   }
3342 
3343   /// Build a new Objective-C dictionary literal.
3344   ///
3345   /// By default, performs semantic analysis to build the new expression.
3346   /// Subclasses may override this routine to provide different behavior.
3347   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3348                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3349     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3350   }
3351 
3352   /// Build a new Objective-C \@encode expression.
3353   ///
3354   /// By default, performs semantic analysis to build the new expression.
3355   /// Subclasses may override this routine to provide different behavior.
3356   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3357                                          TypeSourceInfo *EncodeTypeInfo,
3358                                          SourceLocation RParenLoc) {
3359     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3360   }
3361 
3362   /// Build a new Objective-C class message.
3363   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3364                                           Selector Sel,
3365                                           ArrayRef<SourceLocation> SelectorLocs,
3366                                           ObjCMethodDecl *Method,
3367                                           SourceLocation LBracLoc,
3368                                           MultiExprArg Args,
3369                                           SourceLocation RBracLoc) {
3370     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3371                                      ReceiverTypeInfo->getType(),
3372                                      /*SuperLoc=*/SourceLocation(),
3373                                      Sel, Method, LBracLoc, SelectorLocs,
3374                                      RBracLoc, Args);
3375   }
3376 
3377   /// Build a new Objective-C instance message.
3378   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3379                                           Selector Sel,
3380                                           ArrayRef<SourceLocation> SelectorLocs,
3381                                           ObjCMethodDecl *Method,
3382                                           SourceLocation LBracLoc,
3383                                           MultiExprArg Args,
3384                                           SourceLocation RBracLoc) {
3385     return SemaRef.BuildInstanceMessage(Receiver,
3386                                         Receiver->getType(),
3387                                         /*SuperLoc=*/SourceLocation(),
3388                                         Sel, Method, LBracLoc, SelectorLocs,
3389                                         RBracLoc, Args);
3390   }
3391 
3392   /// Build a new Objective-C instance/class message to 'super'.
3393   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3394                                     Selector Sel,
3395                                     ArrayRef<SourceLocation> SelectorLocs,
3396                                     QualType SuperType,
3397                                     ObjCMethodDecl *Method,
3398                                     SourceLocation LBracLoc,
3399                                     MultiExprArg Args,
3400                                     SourceLocation RBracLoc) {
3401     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3402                                           SuperType,
3403                                           SuperLoc,
3404                                           Sel, Method, LBracLoc, SelectorLocs,
3405                                           RBracLoc, Args)
3406                                       : SemaRef.BuildClassMessage(nullptr,
3407                                           SuperType,
3408                                           SuperLoc,
3409                                           Sel, Method, LBracLoc, SelectorLocs,
3410                                           RBracLoc, Args);
3411 
3412 
3413   }
3414 
3415   /// Build a new Objective-C ivar reference expression.
3416   ///
3417   /// By default, performs semantic analysis to build the new expression.
3418   /// Subclasses may override this routine to provide different behavior.
3419   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3420                                           SourceLocation IvarLoc,
3421                                           bool IsArrow, bool IsFreeIvar) {
3422     CXXScopeSpec SS;
3423     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3424     ExprResult Result = getSema().BuildMemberReferenceExpr(
3425         BaseArg, BaseArg->getType(),
3426         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3427         /*FirstQualifierInScope=*/nullptr, NameInfo,
3428         /*TemplateArgs=*/nullptr,
3429         /*S=*/nullptr);
3430     if (IsFreeIvar && Result.isUsable())
3431       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3432     return Result;
3433   }
3434 
3435   /// Build a new Objective-C property reference expression.
3436   ///
3437   /// By default, performs semantic analysis to build the new expression.
3438   /// Subclasses may override this routine to provide different behavior.
3439   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3440                                         ObjCPropertyDecl *Property,
3441                                         SourceLocation PropertyLoc) {
3442     CXXScopeSpec SS;
3443     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3444     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3445                                               /*FIXME:*/PropertyLoc,
3446                                               /*IsArrow=*/false,
3447                                               SS, SourceLocation(),
3448                                               /*FirstQualifierInScope=*/nullptr,
3449                                               NameInfo,
3450                                               /*TemplateArgs=*/nullptr,
3451                                               /*S=*/nullptr);
3452   }
3453 
3454   /// Build a new Objective-C property reference expression.
3455   ///
3456   /// By default, performs semantic analysis to build the new expression.
3457   /// Subclasses may override this routine to provide different behavior.
3458   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3459                                         ObjCMethodDecl *Getter,
3460                                         ObjCMethodDecl *Setter,
3461                                         SourceLocation PropertyLoc) {
3462     // Since these expressions can only be value-dependent, we do not
3463     // need to perform semantic analysis again.
3464     return Owned(
3465       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3466                                                   VK_LValue, OK_ObjCProperty,
3467                                                   PropertyLoc, Base));
3468   }
3469 
3470   /// Build a new Objective-C "isa" expression.
3471   ///
3472   /// By default, performs semantic analysis to build the new expression.
3473   /// Subclasses may override this routine to provide different behavior.
3474   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3475                                 SourceLocation OpLoc, bool IsArrow) {
3476     CXXScopeSpec SS;
3477     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3478     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3479                                               OpLoc, IsArrow,
3480                                               SS, SourceLocation(),
3481                                               /*FirstQualifierInScope=*/nullptr,
3482                                               NameInfo,
3483                                               /*TemplateArgs=*/nullptr,
3484                                               /*S=*/nullptr);
3485   }
3486 
3487   /// Build a new shuffle vector expression.
3488   ///
3489   /// By default, performs semantic analysis to build the new expression.
3490   /// Subclasses may override this routine to provide different behavior.
3491   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3492                                       MultiExprArg SubExprs,
3493                                       SourceLocation RParenLoc) {
3494     // Find the declaration for __builtin_shufflevector
3495     const IdentifierInfo &Name
3496       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3497     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3498     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3499     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3500 
3501     // Build a reference to the __builtin_shufflevector builtin
3502     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3503     Expr *Callee = new (SemaRef.Context)
3504         DeclRefExpr(SemaRef.Context, Builtin, false,
3505                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3506     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3507     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3508                                        CK_BuiltinFnToFnPtr).get();
3509 
3510     // Build the CallExpr
3511     ExprResult TheCall = CallExpr::Create(
3512         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3513         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3514         FPOptionsOverride());
3515 
3516     // Type-check the __builtin_shufflevector expression.
3517     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3518   }
3519 
3520   /// Build a new convert vector expression.
3521   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3522                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3523                                       SourceLocation RParenLoc) {
3524     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3525                                          BuiltinLoc, RParenLoc);
3526   }
3527 
3528   /// Build a new template argument pack expansion.
3529   ///
3530   /// By default, performs semantic analysis to build a new pack expansion
3531   /// for a template argument. Subclasses may override this routine to provide
3532   /// different behavior.
3533   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3534                                            SourceLocation EllipsisLoc,
3535                                            Optional<unsigned> NumExpansions) {
3536     switch (Pattern.getArgument().getKind()) {
3537     case TemplateArgument::Expression: {
3538       ExprResult Result
3539         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3540                                        EllipsisLoc, NumExpansions);
3541       if (Result.isInvalid())
3542         return TemplateArgumentLoc();
3543 
3544       return TemplateArgumentLoc(Result.get(), Result.get());
3545     }
3546 
3547     case TemplateArgument::Template:
3548       return TemplateArgumentLoc(TemplateArgument(
3549                                           Pattern.getArgument().getAsTemplate(),
3550                                                   NumExpansions),
3551                                  Pattern.getTemplateQualifierLoc(),
3552                                  Pattern.getTemplateNameLoc(),
3553                                  EllipsisLoc);
3554 
3555     case TemplateArgument::Null:
3556     case TemplateArgument::Integral:
3557     case TemplateArgument::Declaration:
3558     case TemplateArgument::Pack:
3559     case TemplateArgument::TemplateExpansion:
3560     case TemplateArgument::NullPtr:
3561       llvm_unreachable("Pack expansion pattern has no parameter packs");
3562 
3563     case TemplateArgument::Type:
3564       if (TypeSourceInfo *Expansion
3565             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3566                                            EllipsisLoc,
3567                                            NumExpansions))
3568         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3569                                    Expansion);
3570       break;
3571     }
3572 
3573     return TemplateArgumentLoc();
3574   }
3575 
3576   /// Build a new expression pack expansion.
3577   ///
3578   /// By default, performs semantic analysis to build a new pack expansion
3579   /// for an expression. Subclasses may override this routine to provide
3580   /// different behavior.
3581   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3582                                   Optional<unsigned> NumExpansions) {
3583     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3584   }
3585 
3586   /// Build a new C++1z fold-expression.
3587   ///
3588   /// By default, performs semantic analysis in order to build a new fold
3589   /// expression.
3590   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3591                                 SourceLocation LParenLoc, Expr *LHS,
3592                                 BinaryOperatorKind Operator,
3593                                 SourceLocation EllipsisLoc, Expr *RHS,
3594                                 SourceLocation RParenLoc,
3595                                 Optional<unsigned> NumExpansions) {
3596     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3597                                       EllipsisLoc, RHS, RParenLoc,
3598                                       NumExpansions);
3599   }
3600 
3601   /// Build an empty C++1z fold-expression with the given operator.
3602   ///
3603   /// By default, produces the fallback value for the fold-expression, or
3604   /// produce an error if there is no fallback value.
3605   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3606                                      BinaryOperatorKind Operator) {
3607     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3608   }
3609 
3610   /// Build a new atomic operation expression.
3611   ///
3612   /// By default, performs semantic analysis to build the new expression.
3613   /// Subclasses may override this routine to provide different behavior.
3614   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3615                                AtomicExpr::AtomicOp Op,
3616                                SourceLocation RParenLoc) {
3617     // Use this for all of the locations, since we don't know the difference
3618     // between the call and the expr at this point.
3619     SourceRange Range{BuiltinLoc, RParenLoc};
3620     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3621                                      Sema::AtomicArgumentOrder::AST);
3622   }
3623 
3624   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3625                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3626     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3627   }
3628 
3629 private:
3630   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3631                                      QualType ObjectType,
3632                                      NamedDecl *FirstQualifierInScope,
3633                                      CXXScopeSpec &SS);
3634 
3635   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3636                                              QualType ObjectType,
3637                                              NamedDecl *FirstQualifierInScope,
3638                                              CXXScopeSpec &SS);
3639 
3640   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3641                                             NamedDecl *FirstQualifierInScope,
3642                                             CXXScopeSpec &SS);
3643 
3644   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3645                                       DependentNameTypeLoc TL,
3646                                       bool DeducibleTSTContext);
3647 };
3648 
3649 template <typename Derived>
3650 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3651   if (!S)
3652     return S;
3653 
3654   switch (S->getStmtClass()) {
3655   case Stmt::NoStmtClass: break;
3656 
3657   // Transform individual statement nodes
3658   // Pass SDK into statements that can produce a value
3659 #define STMT(Node, Parent)                                              \
3660   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3661 #define VALUESTMT(Node, Parent)                                         \
3662   case Stmt::Node##Class:                                               \
3663     return getDerived().Transform##Node(cast<Node>(S), SDK);
3664 #define ABSTRACT_STMT(Node)
3665 #define EXPR(Node, Parent)
3666 #include "clang/AST/StmtNodes.inc"
3667 
3668   // Transform expressions by calling TransformExpr.
3669 #define STMT(Node, Parent)
3670 #define ABSTRACT_STMT(Stmt)
3671 #define EXPR(Node, Parent) case Stmt::Node##Class:
3672 #include "clang/AST/StmtNodes.inc"
3673     {
3674       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3675 
3676       if (SDK == SDK_StmtExprResult)
3677         E = getSema().ActOnStmtExprResult(E);
3678       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3679     }
3680   }
3681 
3682   return S;
3683 }
3684 
3685 template<typename Derived>
3686 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3687   if (!S)
3688     return S;
3689 
3690   switch (S->getClauseKind()) {
3691   default: break;
3692   // Transform individual clause nodes
3693 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \
3694   case Enum:                                                                   \
3695     return getDerived().Transform ## Class(cast<Class>(S));
3696 #include "llvm/Frontend/OpenMP/OMPKinds.def"
3697   }
3698 
3699   return S;
3700 }
3701 
3702 
3703 template<typename Derived>
3704 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3705   if (!E)
3706     return E;
3707 
3708   switch (E->getStmtClass()) {
3709     case Stmt::NoStmtClass: break;
3710 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3711 #define ABSTRACT_STMT(Stmt)
3712 #define EXPR(Node, Parent)                                              \
3713     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3714 #include "clang/AST/StmtNodes.inc"
3715   }
3716 
3717   return E;
3718 }
3719 
3720 template<typename Derived>
3721 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3722                                                         bool NotCopyInit) {
3723   // Initializers are instantiated like expressions, except that various outer
3724   // layers are stripped.
3725   if (!Init)
3726     return Init;
3727 
3728   if (auto *FE = dyn_cast<FullExpr>(Init))
3729     Init = FE->getSubExpr();
3730 
3731   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3732     Init = AIL->getCommonExpr();
3733 
3734   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3735     Init = MTE->getSubExpr();
3736 
3737   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3738     Init = Binder->getSubExpr();
3739 
3740   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3741     Init = ICE->getSubExprAsWritten();
3742 
3743   if (CXXStdInitializerListExpr *ILE =
3744           dyn_cast<CXXStdInitializerListExpr>(Init))
3745     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3746 
3747   // If this is copy-initialization, we only need to reconstruct
3748   // InitListExprs. Other forms of copy-initialization will be a no-op if
3749   // the initializer is already the right type.
3750   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3751   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3752     return getDerived().TransformExpr(Init);
3753 
3754   // Revert value-initialization back to empty parens.
3755   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3756     SourceRange Parens = VIE->getSourceRange();
3757     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3758                                              Parens.getEnd());
3759   }
3760 
3761   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3762   if (isa<ImplicitValueInitExpr>(Init))
3763     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3764                                              SourceLocation());
3765 
3766   // Revert initialization by constructor back to a parenthesized or braced list
3767   // of expressions. Any other form of initializer can just be reused directly.
3768   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3769     return getDerived().TransformExpr(Init);
3770 
3771   // If the initialization implicitly converted an initializer list to a
3772   // std::initializer_list object, unwrap the std::initializer_list too.
3773   if (Construct && Construct->isStdInitListInitialization())
3774     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3775 
3776   // Enter a list-init context if this was list initialization.
3777   EnterExpressionEvaluationContext Context(
3778       getSema(), EnterExpressionEvaluationContext::InitList,
3779       Construct->isListInitialization());
3780 
3781   SmallVector<Expr*, 8> NewArgs;
3782   bool ArgChanged = false;
3783   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3784                                   /*IsCall*/true, NewArgs, &ArgChanged))
3785     return ExprError();
3786 
3787   // If this was list initialization, revert to syntactic list form.
3788   if (Construct->isListInitialization())
3789     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3790                                         Construct->getEndLoc());
3791 
3792   // Build a ParenListExpr to represent anything else.
3793   SourceRange Parens = Construct->getParenOrBraceRange();
3794   if (Parens.isInvalid()) {
3795     // This was a variable declaration's initialization for which no initializer
3796     // was specified.
3797     assert(NewArgs.empty() &&
3798            "no parens or braces but have direct init with arguments?");
3799     return ExprEmpty();
3800   }
3801   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3802                                            Parens.getEnd());
3803 }
3804 
3805 template<typename Derived>
3806 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3807                                             unsigned NumInputs,
3808                                             bool IsCall,
3809                                       SmallVectorImpl<Expr *> &Outputs,
3810                                             bool *ArgChanged) {
3811   for (unsigned I = 0; I != NumInputs; ++I) {
3812     // If requested, drop call arguments that need to be dropped.
3813     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3814       if (ArgChanged)
3815         *ArgChanged = true;
3816 
3817       break;
3818     }
3819 
3820     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3821       Expr *Pattern = Expansion->getPattern();
3822 
3823       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3824       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3825       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3826 
3827       // Determine whether the set of unexpanded parameter packs can and should
3828       // be expanded.
3829       bool Expand = true;
3830       bool RetainExpansion = false;
3831       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3832       Optional<unsigned> NumExpansions = OrigNumExpansions;
3833       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3834                                                Pattern->getSourceRange(),
3835                                                Unexpanded,
3836                                                Expand, RetainExpansion,
3837                                                NumExpansions))
3838         return true;
3839 
3840       if (!Expand) {
3841         // The transform has determined that we should perform a simple
3842         // transformation on the pack expansion, producing another pack
3843         // expansion.
3844         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3845         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3846         if (OutPattern.isInvalid())
3847           return true;
3848 
3849         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3850                                                 Expansion->getEllipsisLoc(),
3851                                                            NumExpansions);
3852         if (Out.isInvalid())
3853           return true;
3854 
3855         if (ArgChanged)
3856           *ArgChanged = true;
3857         Outputs.push_back(Out.get());
3858         continue;
3859       }
3860 
3861       // Record right away that the argument was changed.  This needs
3862       // to happen even if the array expands to nothing.
3863       if (ArgChanged) *ArgChanged = true;
3864 
3865       // The transform has determined that we should perform an elementwise
3866       // expansion of the pattern. Do so.
3867       for (unsigned I = 0; I != *NumExpansions; ++I) {
3868         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3869         ExprResult Out = getDerived().TransformExpr(Pattern);
3870         if (Out.isInvalid())
3871           return true;
3872 
3873         if (Out.get()->containsUnexpandedParameterPack()) {
3874           Out = getDerived().RebuildPackExpansion(
3875               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3876           if (Out.isInvalid())
3877             return true;
3878         }
3879 
3880         Outputs.push_back(Out.get());
3881       }
3882 
3883       // If we're supposed to retain a pack expansion, do so by temporarily
3884       // forgetting the partially-substituted parameter pack.
3885       if (RetainExpansion) {
3886         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3887 
3888         ExprResult Out = getDerived().TransformExpr(Pattern);
3889         if (Out.isInvalid())
3890           return true;
3891 
3892         Out = getDerived().RebuildPackExpansion(
3893             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3894         if (Out.isInvalid())
3895           return true;
3896 
3897         Outputs.push_back(Out.get());
3898       }
3899 
3900       continue;
3901     }
3902 
3903     ExprResult Result =
3904       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3905              : getDerived().TransformExpr(Inputs[I]);
3906     if (Result.isInvalid())
3907       return true;
3908 
3909     if (Result.get() != Inputs[I] && ArgChanged)
3910       *ArgChanged = true;
3911 
3912     Outputs.push_back(Result.get());
3913   }
3914 
3915   return false;
3916 }
3917 
3918 template <typename Derived>
3919 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3920     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3921   if (Var) {
3922     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3923         getDerived().TransformDefinition(Var->getLocation(), Var));
3924 
3925     if (!ConditionVar)
3926       return Sema::ConditionError();
3927 
3928     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3929   }
3930 
3931   if (Expr) {
3932     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3933 
3934     if (CondExpr.isInvalid())
3935       return Sema::ConditionError();
3936 
3937     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3938   }
3939 
3940   return Sema::ConditionResult();
3941 }
3942 
3943 template<typename Derived>
3944 NestedNameSpecifierLoc
3945 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3946                                                     NestedNameSpecifierLoc NNS,
3947                                                      QualType ObjectType,
3948                                              NamedDecl *FirstQualifierInScope) {
3949   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3950   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3951        Qualifier = Qualifier.getPrefix())
3952     Qualifiers.push_back(Qualifier);
3953 
3954   CXXScopeSpec SS;
3955   while (!Qualifiers.empty()) {
3956     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3957     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3958 
3959     switch (QNNS->getKind()) {
3960     case NestedNameSpecifier::Identifier: {
3961       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3962                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3963       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3964                                               SS, FirstQualifierInScope, false))
3965         return NestedNameSpecifierLoc();
3966     }
3967       break;
3968 
3969     case NestedNameSpecifier::Namespace: {
3970       NamespaceDecl *NS
3971         = cast_or_null<NamespaceDecl>(
3972                                     getDerived().TransformDecl(
3973                                                           Q.getLocalBeginLoc(),
3974                                                        QNNS->getAsNamespace()));
3975       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3976       break;
3977     }
3978 
3979     case NestedNameSpecifier::NamespaceAlias: {
3980       NamespaceAliasDecl *Alias
3981         = cast_or_null<NamespaceAliasDecl>(
3982                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3983                                                  QNNS->getAsNamespaceAlias()));
3984       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3985                 Q.getLocalEndLoc());
3986       break;
3987     }
3988 
3989     case NestedNameSpecifier::Global:
3990       // There is no meaningful transformation that one could perform on the
3991       // global scope.
3992       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3993       break;
3994 
3995     case NestedNameSpecifier::Super: {
3996       CXXRecordDecl *RD =
3997           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3998               SourceLocation(), QNNS->getAsRecordDecl()));
3999       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4000       break;
4001     }
4002 
4003     case NestedNameSpecifier::TypeSpecWithTemplate:
4004     case NestedNameSpecifier::TypeSpec: {
4005       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4006                                               FirstQualifierInScope, SS);
4007 
4008       if (!TL)
4009         return NestedNameSpecifierLoc();
4010 
4011       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4012           (SemaRef.getLangOpts().CPlusPlus11 &&
4013            TL.getType()->isEnumeralType())) {
4014         assert(!TL.getType().hasLocalQualifiers() &&
4015                "Can't get cv-qualifiers here");
4016         if (TL.getType()->isEnumeralType())
4017           SemaRef.Diag(TL.getBeginLoc(),
4018                        diag::warn_cxx98_compat_enum_nested_name_spec);
4019         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
4020                   Q.getLocalEndLoc());
4021         break;
4022       }
4023       // If the nested-name-specifier is an invalid type def, don't emit an
4024       // error because a previous error should have already been emitted.
4025       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4026       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4027         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4028           << TL.getType() << SS.getRange();
4029       }
4030       return NestedNameSpecifierLoc();
4031     }
4032     }
4033 
4034     // The qualifier-in-scope and object type only apply to the leftmost entity.
4035     FirstQualifierInScope = nullptr;
4036     ObjectType = QualType();
4037   }
4038 
4039   // Don't rebuild the nested-name-specifier if we don't have to.
4040   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4041       !getDerived().AlwaysRebuild())
4042     return NNS;
4043 
4044   // If we can re-use the source-location data from the original
4045   // nested-name-specifier, do so.
4046   if (SS.location_size() == NNS.getDataLength() &&
4047       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4048     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4049 
4050   // Allocate new nested-name-specifier location information.
4051   return SS.getWithLocInContext(SemaRef.Context);
4052 }
4053 
4054 template<typename Derived>
4055 DeclarationNameInfo
4056 TreeTransform<Derived>
4057 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4058   DeclarationName Name = NameInfo.getName();
4059   if (!Name)
4060     return DeclarationNameInfo();
4061 
4062   switch (Name.getNameKind()) {
4063   case DeclarationName::Identifier:
4064   case DeclarationName::ObjCZeroArgSelector:
4065   case DeclarationName::ObjCOneArgSelector:
4066   case DeclarationName::ObjCMultiArgSelector:
4067   case DeclarationName::CXXOperatorName:
4068   case DeclarationName::CXXLiteralOperatorName:
4069   case DeclarationName::CXXUsingDirective:
4070     return NameInfo;
4071 
4072   case DeclarationName::CXXDeductionGuideName: {
4073     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4074     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4075         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4076     if (!NewTemplate)
4077       return DeclarationNameInfo();
4078 
4079     DeclarationNameInfo NewNameInfo(NameInfo);
4080     NewNameInfo.setName(
4081         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4082     return NewNameInfo;
4083   }
4084 
4085   case DeclarationName::CXXConstructorName:
4086   case DeclarationName::CXXDestructorName:
4087   case DeclarationName::CXXConversionFunctionName: {
4088     TypeSourceInfo *NewTInfo;
4089     CanQualType NewCanTy;
4090     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4091       NewTInfo = getDerived().TransformType(OldTInfo);
4092       if (!NewTInfo)
4093         return DeclarationNameInfo();
4094       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4095     }
4096     else {
4097       NewTInfo = nullptr;
4098       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4099       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4100       if (NewT.isNull())
4101         return DeclarationNameInfo();
4102       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4103     }
4104 
4105     DeclarationName NewName
4106       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4107                                                            NewCanTy);
4108     DeclarationNameInfo NewNameInfo(NameInfo);
4109     NewNameInfo.setName(NewName);
4110     NewNameInfo.setNamedTypeInfo(NewTInfo);
4111     return NewNameInfo;
4112   }
4113   }
4114 
4115   llvm_unreachable("Unknown name kind.");
4116 }
4117 
4118 template<typename Derived>
4119 TemplateName
4120 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4121                                               TemplateName Name,
4122                                               SourceLocation NameLoc,
4123                                               QualType ObjectType,
4124                                               NamedDecl *FirstQualifierInScope,
4125                                               bool AllowInjectedClassName) {
4126   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4127     TemplateDecl *Template = QTN->getTemplateDecl();
4128     assert(Template && "qualified template name must refer to a template");
4129 
4130     TemplateDecl *TransTemplate
4131       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4132                                                               Template));
4133     if (!TransTemplate)
4134       return TemplateName();
4135 
4136     if (!getDerived().AlwaysRebuild() &&
4137         SS.getScopeRep() == QTN->getQualifier() &&
4138         TransTemplate == Template)
4139       return Name;
4140 
4141     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4142                                             TransTemplate);
4143   }
4144 
4145   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4146     if (SS.getScopeRep()) {
4147       // These apply to the scope specifier, not the template.
4148       ObjectType = QualType();
4149       FirstQualifierInScope = nullptr;
4150     }
4151 
4152     if (!getDerived().AlwaysRebuild() &&
4153         SS.getScopeRep() == DTN->getQualifier() &&
4154         ObjectType.isNull())
4155       return Name;
4156 
4157     // FIXME: Preserve the location of the "template" keyword.
4158     SourceLocation TemplateKWLoc = NameLoc;
4159 
4160     if (DTN->isIdentifier()) {
4161       return getDerived().RebuildTemplateName(SS,
4162                                               TemplateKWLoc,
4163                                               *DTN->getIdentifier(),
4164                                               NameLoc,
4165                                               ObjectType,
4166                                               FirstQualifierInScope,
4167                                               AllowInjectedClassName);
4168     }
4169 
4170     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4171                                             DTN->getOperator(), NameLoc,
4172                                             ObjectType, AllowInjectedClassName);
4173   }
4174 
4175   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4176     TemplateDecl *TransTemplate
4177       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4178                                                               Template));
4179     if (!TransTemplate)
4180       return TemplateName();
4181 
4182     if (!getDerived().AlwaysRebuild() &&
4183         TransTemplate == Template)
4184       return Name;
4185 
4186     return TemplateName(TransTemplate);
4187   }
4188 
4189   if (SubstTemplateTemplateParmPackStorage *SubstPack
4190       = Name.getAsSubstTemplateTemplateParmPack()) {
4191     TemplateTemplateParmDecl *TransParam
4192     = cast_or_null<TemplateTemplateParmDecl>(
4193             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4194     if (!TransParam)
4195       return TemplateName();
4196 
4197     if (!getDerived().AlwaysRebuild() &&
4198         TransParam == SubstPack->getParameterPack())
4199       return Name;
4200 
4201     return getDerived().RebuildTemplateName(TransParam,
4202                                             SubstPack->getArgumentPack());
4203   }
4204 
4205   // These should be getting filtered out before they reach the AST.
4206   llvm_unreachable("overloaded function decl survived to here");
4207 }
4208 
4209 template<typename Derived>
4210 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4211                                          const TemplateArgument &Arg,
4212                                          TemplateArgumentLoc &Output) {
4213   Output = getSema().getTrivialTemplateArgumentLoc(
4214       Arg, QualType(), getDerived().getBaseLocation());
4215 }
4216 
4217 template<typename Derived>
4218 bool TreeTransform<Derived>::TransformTemplateArgument(
4219                                          const TemplateArgumentLoc &Input,
4220                                          TemplateArgumentLoc &Output, bool Uneval) {
4221   const TemplateArgument &Arg = Input.getArgument();
4222   switch (Arg.getKind()) {
4223   case TemplateArgument::Null:
4224   case TemplateArgument::Pack:
4225     llvm_unreachable("Unexpected TemplateArgument");
4226 
4227   case TemplateArgument::Integral:
4228   case TemplateArgument::NullPtr:
4229   case TemplateArgument::Declaration: {
4230     // Transform a resolved template argument straight to a resolved template
4231     // argument. We get here when substituting into an already-substituted
4232     // template type argument during concept satisfaction checking.
4233     QualType T = Arg.getNonTypeTemplateArgumentType();
4234     QualType NewT = getDerived().TransformType(T);
4235     if (NewT.isNull())
4236       return true;
4237 
4238     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4239                        ? Arg.getAsDecl()
4240                        : nullptr;
4241     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4242                               getDerived().getBaseLocation(), D))
4243                         : nullptr;
4244     if (D && !NewD)
4245       return true;
4246 
4247     if (NewT == T && D == NewD)
4248       Output = Input;
4249     else if (Arg.getKind() == TemplateArgument::Integral)
4250       Output = TemplateArgumentLoc(
4251           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4252           TemplateArgumentLocInfo());
4253     else if (Arg.getKind() == TemplateArgument::NullPtr)
4254       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4255                                    TemplateArgumentLocInfo());
4256     else
4257       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4258                                    TemplateArgumentLocInfo());
4259 
4260     return false;
4261   }
4262 
4263   case TemplateArgument::Type: {
4264     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4265     if (!DI)
4266       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4267 
4268     DI = getDerived().TransformType(DI);
4269     if (!DI) return true;
4270 
4271     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4272     return false;
4273   }
4274 
4275   case TemplateArgument::Template: {
4276     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4277     if (QualifierLoc) {
4278       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4279       if (!QualifierLoc)
4280         return true;
4281     }
4282 
4283     CXXScopeSpec SS;
4284     SS.Adopt(QualifierLoc);
4285     TemplateName Template
4286       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4287                                            Input.getTemplateNameLoc());
4288     if (Template.isNull())
4289       return true;
4290 
4291     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
4292                                  Input.getTemplateNameLoc());
4293     return false;
4294   }
4295 
4296   case TemplateArgument::TemplateExpansion:
4297     llvm_unreachable("Caller should expand pack expansions");
4298 
4299   case TemplateArgument::Expression: {
4300     // Template argument expressions are constant expressions.
4301     EnterExpressionEvaluationContext Unevaluated(
4302         getSema(),
4303         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4304                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4305         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4306         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4307 
4308     Expr *InputExpr = Input.getSourceExpression();
4309     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4310 
4311     ExprResult E = getDerived().TransformExpr(InputExpr);
4312     E = SemaRef.ActOnConstantExpression(E);
4313     if (E.isInvalid()) return true;
4314     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4315     return false;
4316   }
4317   }
4318 
4319   // Work around bogus GCC warning
4320   return true;
4321 }
4322 
4323 /// Iterator adaptor that invents template argument location information
4324 /// for each of the template arguments in its underlying iterator.
4325 template<typename Derived, typename InputIterator>
4326 class TemplateArgumentLocInventIterator {
4327   TreeTransform<Derived> &Self;
4328   InputIterator Iter;
4329 
4330 public:
4331   typedef TemplateArgumentLoc value_type;
4332   typedef TemplateArgumentLoc reference;
4333   typedef typename std::iterator_traits<InputIterator>::difference_type
4334     difference_type;
4335   typedef std::input_iterator_tag iterator_category;
4336 
4337   class pointer {
4338     TemplateArgumentLoc Arg;
4339 
4340   public:
4341     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4342 
4343     const TemplateArgumentLoc *operator->() const { return &Arg; }
4344   };
4345 
4346   TemplateArgumentLocInventIterator() { }
4347 
4348   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4349                                              InputIterator Iter)
4350     : Self(Self), Iter(Iter) { }
4351 
4352   TemplateArgumentLocInventIterator &operator++() {
4353     ++Iter;
4354     return *this;
4355   }
4356 
4357   TemplateArgumentLocInventIterator operator++(int) {
4358     TemplateArgumentLocInventIterator Old(*this);
4359     ++(*this);
4360     return Old;
4361   }
4362 
4363   reference operator*() const {
4364     TemplateArgumentLoc Result;
4365     Self.InventTemplateArgumentLoc(*Iter, Result);
4366     return Result;
4367   }
4368 
4369   pointer operator->() const { return pointer(**this); }
4370 
4371   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4372                          const TemplateArgumentLocInventIterator &Y) {
4373     return X.Iter == Y.Iter;
4374   }
4375 
4376   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4377                          const TemplateArgumentLocInventIterator &Y) {
4378     return X.Iter != Y.Iter;
4379   }
4380 };
4381 
4382 template<typename Derived>
4383 template<typename InputIterator>
4384 bool TreeTransform<Derived>::TransformTemplateArguments(
4385     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4386     bool Uneval) {
4387   for (; First != Last; ++First) {
4388     TemplateArgumentLoc Out;
4389     TemplateArgumentLoc In = *First;
4390 
4391     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4392       // Unpack argument packs, which we translate them into separate
4393       // arguments.
4394       // FIXME: We could do much better if we could guarantee that the
4395       // TemplateArgumentLocInfo for the pack expansion would be usable for
4396       // all of the template arguments in the argument pack.
4397       typedef TemplateArgumentLocInventIterator<Derived,
4398                                                 TemplateArgument::pack_iterator>
4399         PackLocIterator;
4400       if (TransformTemplateArguments(PackLocIterator(*this,
4401                                                  In.getArgument().pack_begin()),
4402                                      PackLocIterator(*this,
4403                                                    In.getArgument().pack_end()),
4404                                      Outputs, Uneval))
4405         return true;
4406 
4407       continue;
4408     }
4409 
4410     if (In.getArgument().isPackExpansion()) {
4411       // We have a pack expansion, for which we will be substituting into
4412       // the pattern.
4413       SourceLocation Ellipsis;
4414       Optional<unsigned> OrigNumExpansions;
4415       TemplateArgumentLoc Pattern
4416         = getSema().getTemplateArgumentPackExpansionPattern(
4417               In, Ellipsis, OrigNumExpansions);
4418 
4419       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4420       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4421       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4422 
4423       // Determine whether the set of unexpanded parameter packs can and should
4424       // be expanded.
4425       bool Expand = true;
4426       bool RetainExpansion = false;
4427       Optional<unsigned> NumExpansions = OrigNumExpansions;
4428       if (getDerived().TryExpandParameterPacks(Ellipsis,
4429                                                Pattern.getSourceRange(),
4430                                                Unexpanded,
4431                                                Expand,
4432                                                RetainExpansion,
4433                                                NumExpansions))
4434         return true;
4435 
4436       if (!Expand) {
4437         // The transform has determined that we should perform a simple
4438         // transformation on the pack expansion, producing another pack
4439         // expansion.
4440         TemplateArgumentLoc OutPattern;
4441         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4442         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4443           return true;
4444 
4445         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4446                                                 NumExpansions);
4447         if (Out.getArgument().isNull())
4448           return true;
4449 
4450         Outputs.addArgument(Out);
4451         continue;
4452       }
4453 
4454       // The transform has determined that we should perform an elementwise
4455       // expansion of the pattern. Do so.
4456       for (unsigned I = 0; I != *NumExpansions; ++I) {
4457         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4458 
4459         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4460           return true;
4461 
4462         if (Out.getArgument().containsUnexpandedParameterPack()) {
4463           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4464                                                   OrigNumExpansions);
4465           if (Out.getArgument().isNull())
4466             return true;
4467         }
4468 
4469         Outputs.addArgument(Out);
4470       }
4471 
4472       // If we're supposed to retain a pack expansion, do so by temporarily
4473       // forgetting the partially-substituted parameter pack.
4474       if (RetainExpansion) {
4475         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4476 
4477         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4478           return true;
4479 
4480         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4481                                                 OrigNumExpansions);
4482         if (Out.getArgument().isNull())
4483           return true;
4484 
4485         Outputs.addArgument(Out);
4486       }
4487 
4488       continue;
4489     }
4490 
4491     // The simple case:
4492     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4493       return true;
4494 
4495     Outputs.addArgument(Out);
4496   }
4497 
4498   return false;
4499 
4500 }
4501 
4502 //===----------------------------------------------------------------------===//
4503 // Type transformation
4504 //===----------------------------------------------------------------------===//
4505 
4506 template<typename Derived>
4507 QualType TreeTransform<Derived>::TransformType(QualType T) {
4508   if (getDerived().AlreadyTransformed(T))
4509     return T;
4510 
4511   // Temporary workaround.  All of these transformations should
4512   // eventually turn into transformations on TypeLocs.
4513   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4514                                                 getDerived().getBaseLocation());
4515 
4516   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4517 
4518   if (!NewDI)
4519     return QualType();
4520 
4521   return NewDI->getType();
4522 }
4523 
4524 template<typename Derived>
4525 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4526   // Refine the base location to the type's location.
4527   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4528                        getDerived().getBaseEntity());
4529   if (getDerived().AlreadyTransformed(DI->getType()))
4530     return DI;
4531 
4532   TypeLocBuilder TLB;
4533 
4534   TypeLoc TL = DI->getTypeLoc();
4535   TLB.reserve(TL.getFullDataSize());
4536 
4537   QualType Result = getDerived().TransformType(TLB, TL);
4538   if (Result.isNull())
4539     return nullptr;
4540 
4541   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4542 }
4543 
4544 template<typename Derived>
4545 QualType
4546 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4547   switch (T.getTypeLocClass()) {
4548 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4549 #define TYPELOC(CLASS, PARENT)                                                 \
4550   case TypeLoc::CLASS:                                                         \
4551     return getDerived().Transform##CLASS##Type(TLB,                            \
4552                                                T.castAs<CLASS##TypeLoc>());
4553 #include "clang/AST/TypeLocNodes.def"
4554   }
4555 
4556   llvm_unreachable("unhandled type loc!");
4557 }
4558 
4559 template<typename Derived>
4560 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4561   if (!isa<DependentNameType>(T))
4562     return TransformType(T);
4563 
4564   if (getDerived().AlreadyTransformed(T))
4565     return T;
4566   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4567                                                 getDerived().getBaseLocation());
4568   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4569   return NewDI ? NewDI->getType() : QualType();
4570 }
4571 
4572 template<typename Derived>
4573 TypeSourceInfo *
4574 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4575   if (!isa<DependentNameType>(DI->getType()))
4576     return TransformType(DI);
4577 
4578   // Refine the base location to the type's location.
4579   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4580                        getDerived().getBaseEntity());
4581   if (getDerived().AlreadyTransformed(DI->getType()))
4582     return DI;
4583 
4584   TypeLocBuilder TLB;
4585 
4586   TypeLoc TL = DI->getTypeLoc();
4587   TLB.reserve(TL.getFullDataSize());
4588 
4589   auto QTL = TL.getAs<QualifiedTypeLoc>();
4590   if (QTL)
4591     TL = QTL.getUnqualifiedLoc();
4592 
4593   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4594 
4595   QualType Result = getDerived().TransformDependentNameType(
4596       TLB, DNTL, /*DeducedTSTContext*/true);
4597   if (Result.isNull())
4598     return nullptr;
4599 
4600   if (QTL) {
4601     Result = getDerived().RebuildQualifiedType(Result, QTL);
4602     if (Result.isNull())
4603       return nullptr;
4604     TLB.TypeWasModifiedSafely(Result);
4605   }
4606 
4607   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4608 }
4609 
4610 template<typename Derived>
4611 QualType
4612 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4613                                                QualifiedTypeLoc T) {
4614   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4615   if (Result.isNull())
4616     return QualType();
4617 
4618   Result = getDerived().RebuildQualifiedType(Result, T);
4619 
4620   if (Result.isNull())
4621     return QualType();
4622 
4623   // RebuildQualifiedType might have updated the type, but not in a way
4624   // that invalidates the TypeLoc. (There's no location information for
4625   // qualifiers.)
4626   TLB.TypeWasModifiedSafely(Result);
4627 
4628   return Result;
4629 }
4630 
4631 template <typename Derived>
4632 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4633                                                       QualifiedTypeLoc TL) {
4634 
4635   SourceLocation Loc = TL.getBeginLoc();
4636   Qualifiers Quals = TL.getType().getLocalQualifiers();
4637 
4638   if (((T.getAddressSpace() != LangAS::Default &&
4639         Quals.getAddressSpace() != LangAS::Default)) &&
4640       T.getAddressSpace() != Quals.getAddressSpace()) {
4641     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4642         << TL.getType() << T;
4643     return QualType();
4644   }
4645 
4646   // C++ [dcl.fct]p7:
4647   //   [When] adding cv-qualifications on top of the function type [...] the
4648   //   cv-qualifiers are ignored.
4649   if (T->isFunctionType()) {
4650     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4651                                                      Quals.getAddressSpace());
4652     return T;
4653   }
4654 
4655   // C++ [dcl.ref]p1:
4656   //   when the cv-qualifiers are introduced through the use of a typedef-name
4657   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4658   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4659   // applied to a reference type.
4660   if (T->isReferenceType()) {
4661     // The only qualifier that applies to a reference type is restrict.
4662     if (!Quals.hasRestrict())
4663       return T;
4664     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4665   }
4666 
4667   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4668   // resulting type.
4669   if (Quals.hasObjCLifetime()) {
4670     if (!T->isObjCLifetimeType() && !T->isDependentType())
4671       Quals.removeObjCLifetime();
4672     else if (T.getObjCLifetime()) {
4673       // Objective-C ARC:
4674       //   A lifetime qualifier applied to a substituted template parameter
4675       //   overrides the lifetime qualifier from the template argument.
4676       const AutoType *AutoTy;
4677       if (const SubstTemplateTypeParmType *SubstTypeParam
4678                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4679         QualType Replacement = SubstTypeParam->getReplacementType();
4680         Qualifiers Qs = Replacement.getQualifiers();
4681         Qs.removeObjCLifetime();
4682         Replacement = SemaRef.Context.getQualifiedType(
4683             Replacement.getUnqualifiedType(), Qs);
4684         T = SemaRef.Context.getSubstTemplateTypeParmType(
4685             SubstTypeParam->getReplacedParameter(), Replacement);
4686       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4687         // 'auto' types behave the same way as template parameters.
4688         QualType Deduced = AutoTy->getDeducedType();
4689         Qualifiers Qs = Deduced.getQualifiers();
4690         Qs.removeObjCLifetime();
4691         Deduced =
4692             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4693         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4694                                         AutoTy->isDependentType(),
4695                                         /*isPack=*/false,
4696                                         AutoTy->getTypeConstraintConcept(),
4697                                         AutoTy->getTypeConstraintArguments());
4698       } else {
4699         // Otherwise, complain about the addition of a qualifier to an
4700         // already-qualified type.
4701         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4702         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4703         Quals.removeObjCLifetime();
4704       }
4705     }
4706   }
4707 
4708   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4709 }
4710 
4711 template<typename Derived>
4712 TypeLoc
4713 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4714                                                    QualType ObjectType,
4715                                                    NamedDecl *UnqualLookup,
4716                                                    CXXScopeSpec &SS) {
4717   if (getDerived().AlreadyTransformed(TL.getType()))
4718     return TL;
4719 
4720   TypeSourceInfo *TSI =
4721       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4722   if (TSI)
4723     return TSI->getTypeLoc();
4724   return TypeLoc();
4725 }
4726 
4727 template<typename Derived>
4728 TypeSourceInfo *
4729 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4730                                                    QualType ObjectType,
4731                                                    NamedDecl *UnqualLookup,
4732                                                    CXXScopeSpec &SS) {
4733   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4734     return TSInfo;
4735 
4736   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4737                                    UnqualLookup, SS);
4738 }
4739 
4740 template <typename Derived>
4741 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4742     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4743     CXXScopeSpec &SS) {
4744   QualType T = TL.getType();
4745   assert(!getDerived().AlreadyTransformed(T));
4746 
4747   TypeLocBuilder TLB;
4748   QualType Result;
4749 
4750   if (isa<TemplateSpecializationType>(T)) {
4751     TemplateSpecializationTypeLoc SpecTL =
4752         TL.castAs<TemplateSpecializationTypeLoc>();
4753 
4754     TemplateName Template = getDerived().TransformTemplateName(
4755         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4756         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4757     if (Template.isNull())
4758       return nullptr;
4759 
4760     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4761                                                               Template);
4762   } else if (isa<DependentTemplateSpecializationType>(T)) {
4763     DependentTemplateSpecializationTypeLoc SpecTL =
4764         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4765 
4766     TemplateName Template
4767       = getDerived().RebuildTemplateName(SS,
4768                                          SpecTL.getTemplateKeywordLoc(),
4769                                          *SpecTL.getTypePtr()->getIdentifier(),
4770                                          SpecTL.getTemplateNameLoc(),
4771                                          ObjectType, UnqualLookup,
4772                                          /*AllowInjectedClassName*/true);
4773     if (Template.isNull())
4774       return nullptr;
4775 
4776     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4777                                                                        SpecTL,
4778                                                                        Template,
4779                                                                        SS);
4780   } else {
4781     // Nothing special needs to be done for these.
4782     Result = getDerived().TransformType(TLB, TL);
4783   }
4784 
4785   if (Result.isNull())
4786     return nullptr;
4787 
4788   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4789 }
4790 
4791 template <class TyLoc> static inline
4792 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4793   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4794   NewT.setNameLoc(T.getNameLoc());
4795   return T.getType();
4796 }
4797 
4798 template<typename Derived>
4799 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4800                                                       BuiltinTypeLoc T) {
4801   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4802   NewT.setBuiltinLoc(T.getBuiltinLoc());
4803   if (T.needsExtraLocalData())
4804     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4805   return T.getType();
4806 }
4807 
4808 template<typename Derived>
4809 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4810                                                       ComplexTypeLoc T) {
4811   // FIXME: recurse?
4812   return TransformTypeSpecType(TLB, T);
4813 }
4814 
4815 template <typename Derived>
4816 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4817                                                        AdjustedTypeLoc TL) {
4818   // Adjustments applied during transformation are handled elsewhere.
4819   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4820 }
4821 
4822 template<typename Derived>
4823 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4824                                                       DecayedTypeLoc TL) {
4825   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4826   if (OriginalType.isNull())
4827     return QualType();
4828 
4829   QualType Result = TL.getType();
4830   if (getDerived().AlwaysRebuild() ||
4831       OriginalType != TL.getOriginalLoc().getType())
4832     Result = SemaRef.Context.getDecayedType(OriginalType);
4833   TLB.push<DecayedTypeLoc>(Result);
4834   // Nothing to set for DecayedTypeLoc.
4835   return Result;
4836 }
4837 
4838 template<typename Derived>
4839 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4840                                                       PointerTypeLoc TL) {
4841   QualType PointeeType
4842     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4843   if (PointeeType.isNull())
4844     return QualType();
4845 
4846   QualType Result = TL.getType();
4847   if (PointeeType->getAs<ObjCObjectType>()) {
4848     // A dependent pointer type 'T *' has is being transformed such
4849     // that an Objective-C class type is being replaced for 'T'. The
4850     // resulting pointer type is an ObjCObjectPointerType, not a
4851     // PointerType.
4852     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4853 
4854     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4855     NewT.setStarLoc(TL.getStarLoc());
4856     return Result;
4857   }
4858 
4859   if (getDerived().AlwaysRebuild() ||
4860       PointeeType != TL.getPointeeLoc().getType()) {
4861     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4862     if (Result.isNull())
4863       return QualType();
4864   }
4865 
4866   // Objective-C ARC can add lifetime qualifiers to the type that we're
4867   // pointing to.
4868   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4869 
4870   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4871   NewT.setSigilLoc(TL.getSigilLoc());
4872   return Result;
4873 }
4874 
4875 template<typename Derived>
4876 QualType
4877 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4878                                                   BlockPointerTypeLoc TL) {
4879   QualType PointeeType
4880     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4881   if (PointeeType.isNull())
4882     return QualType();
4883 
4884   QualType Result = TL.getType();
4885   if (getDerived().AlwaysRebuild() ||
4886       PointeeType != TL.getPointeeLoc().getType()) {
4887     Result = getDerived().RebuildBlockPointerType(PointeeType,
4888                                                   TL.getSigilLoc());
4889     if (Result.isNull())
4890       return QualType();
4891   }
4892 
4893   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4894   NewT.setSigilLoc(TL.getSigilLoc());
4895   return Result;
4896 }
4897 
4898 /// Transforms a reference type.  Note that somewhat paradoxically we
4899 /// don't care whether the type itself is an l-value type or an r-value
4900 /// type;  we only care if the type was *written* as an l-value type
4901 /// or an r-value type.
4902 template<typename Derived>
4903 QualType
4904 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4905                                                ReferenceTypeLoc TL) {
4906   const ReferenceType *T = TL.getTypePtr();
4907 
4908   // Note that this works with the pointee-as-written.
4909   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4910   if (PointeeType.isNull())
4911     return QualType();
4912 
4913   QualType Result = TL.getType();
4914   if (getDerived().AlwaysRebuild() ||
4915       PointeeType != T->getPointeeTypeAsWritten()) {
4916     Result = getDerived().RebuildReferenceType(PointeeType,
4917                                                T->isSpelledAsLValue(),
4918                                                TL.getSigilLoc());
4919     if (Result.isNull())
4920       return QualType();
4921   }
4922 
4923   // Objective-C ARC can add lifetime qualifiers to the type that we're
4924   // referring to.
4925   TLB.TypeWasModifiedSafely(
4926       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4927 
4928   // r-value references can be rebuilt as l-value references.
4929   ReferenceTypeLoc NewTL;
4930   if (isa<LValueReferenceType>(Result))
4931     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4932   else
4933     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4934   NewTL.setSigilLoc(TL.getSigilLoc());
4935 
4936   return Result;
4937 }
4938 
4939 template<typename Derived>
4940 QualType
4941 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4942                                                  LValueReferenceTypeLoc TL) {
4943   return TransformReferenceType(TLB, TL);
4944 }
4945 
4946 template<typename Derived>
4947 QualType
4948 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4949                                                  RValueReferenceTypeLoc TL) {
4950   return TransformReferenceType(TLB, TL);
4951 }
4952 
4953 template<typename Derived>
4954 QualType
4955 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4956                                                    MemberPointerTypeLoc TL) {
4957   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4958   if (PointeeType.isNull())
4959     return QualType();
4960 
4961   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4962   TypeSourceInfo *NewClsTInfo = nullptr;
4963   if (OldClsTInfo) {
4964     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4965     if (!NewClsTInfo)
4966       return QualType();
4967   }
4968 
4969   const MemberPointerType *T = TL.getTypePtr();
4970   QualType OldClsType = QualType(T->getClass(), 0);
4971   QualType NewClsType;
4972   if (NewClsTInfo)
4973     NewClsType = NewClsTInfo->getType();
4974   else {
4975     NewClsType = getDerived().TransformType(OldClsType);
4976     if (NewClsType.isNull())
4977       return QualType();
4978   }
4979 
4980   QualType Result = TL.getType();
4981   if (getDerived().AlwaysRebuild() ||
4982       PointeeType != T->getPointeeType() ||
4983       NewClsType != OldClsType) {
4984     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4985                                                    TL.getStarLoc());
4986     if (Result.isNull())
4987       return QualType();
4988   }
4989 
4990   // If we had to adjust the pointee type when building a member pointer, make
4991   // sure to push TypeLoc info for it.
4992   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4993   if (MPT && PointeeType != MPT->getPointeeType()) {
4994     assert(isa<AdjustedType>(MPT->getPointeeType()));
4995     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4996   }
4997 
4998   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4999   NewTL.setSigilLoc(TL.getSigilLoc());
5000   NewTL.setClassTInfo(NewClsTInfo);
5001 
5002   return Result;
5003 }
5004 
5005 template<typename Derived>
5006 QualType
5007 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5008                                                    ConstantArrayTypeLoc TL) {
5009   const ConstantArrayType *T = TL.getTypePtr();
5010   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5011   if (ElementType.isNull())
5012     return QualType();
5013 
5014   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5015   Expr *OldSize = TL.getSizeExpr();
5016   if (!OldSize)
5017     OldSize = const_cast<Expr*>(T->getSizeExpr());
5018   Expr *NewSize = nullptr;
5019   if (OldSize) {
5020     EnterExpressionEvaluationContext Unevaluated(
5021         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5022     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5023     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5024   }
5025 
5026   QualType Result = TL.getType();
5027   if (getDerived().AlwaysRebuild() ||
5028       ElementType != T->getElementType() ||
5029       (T->getSizeExpr() && NewSize != OldSize)) {
5030     Result = getDerived().RebuildConstantArrayType(ElementType,
5031                                                    T->getSizeModifier(),
5032                                                    T->getSize(), NewSize,
5033                                              T->getIndexTypeCVRQualifiers(),
5034                                                    TL.getBracketsRange());
5035     if (Result.isNull())
5036       return QualType();
5037   }
5038 
5039   // We might have either a ConstantArrayType or a VariableArrayType now:
5040   // a ConstantArrayType is allowed to have an element type which is a
5041   // VariableArrayType if the type is dependent.  Fortunately, all array
5042   // types have the same location layout.
5043   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5044   NewTL.setLBracketLoc(TL.getLBracketLoc());
5045   NewTL.setRBracketLoc(TL.getRBracketLoc());
5046   NewTL.setSizeExpr(NewSize);
5047 
5048   return Result;
5049 }
5050 
5051 template<typename Derived>
5052 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5053                                               TypeLocBuilder &TLB,
5054                                               IncompleteArrayTypeLoc TL) {
5055   const IncompleteArrayType *T = TL.getTypePtr();
5056   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5057   if (ElementType.isNull())
5058     return QualType();
5059 
5060   QualType Result = TL.getType();
5061   if (getDerived().AlwaysRebuild() ||
5062       ElementType != T->getElementType()) {
5063     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5064                                                      T->getSizeModifier(),
5065                                            T->getIndexTypeCVRQualifiers(),
5066                                                      TL.getBracketsRange());
5067     if (Result.isNull())
5068       return QualType();
5069   }
5070 
5071   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5072   NewTL.setLBracketLoc(TL.getLBracketLoc());
5073   NewTL.setRBracketLoc(TL.getRBracketLoc());
5074   NewTL.setSizeExpr(nullptr);
5075 
5076   return Result;
5077 }
5078 
5079 template<typename Derived>
5080 QualType
5081 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5082                                                    VariableArrayTypeLoc TL) {
5083   const VariableArrayType *T = TL.getTypePtr();
5084   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5085   if (ElementType.isNull())
5086     return QualType();
5087 
5088   ExprResult SizeResult;
5089   {
5090     EnterExpressionEvaluationContext Context(
5091         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5092     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5093   }
5094   if (SizeResult.isInvalid())
5095     return QualType();
5096   SizeResult =
5097       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5098   if (SizeResult.isInvalid())
5099     return QualType();
5100 
5101   Expr *Size = SizeResult.get();
5102 
5103   QualType Result = TL.getType();
5104   if (getDerived().AlwaysRebuild() ||
5105       ElementType != T->getElementType() ||
5106       Size != T->getSizeExpr()) {
5107     Result = getDerived().RebuildVariableArrayType(ElementType,
5108                                                    T->getSizeModifier(),
5109                                                    Size,
5110                                              T->getIndexTypeCVRQualifiers(),
5111                                                    TL.getBracketsRange());
5112     if (Result.isNull())
5113       return QualType();
5114   }
5115 
5116   // We might have constant size array now, but fortunately it has the same
5117   // location layout.
5118   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5119   NewTL.setLBracketLoc(TL.getLBracketLoc());
5120   NewTL.setRBracketLoc(TL.getRBracketLoc());
5121   NewTL.setSizeExpr(Size);
5122 
5123   return Result;
5124 }
5125 
5126 template<typename Derived>
5127 QualType
5128 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5129                                              DependentSizedArrayTypeLoc TL) {
5130   const DependentSizedArrayType *T = TL.getTypePtr();
5131   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5132   if (ElementType.isNull())
5133     return QualType();
5134 
5135   // Array bounds are constant expressions.
5136   EnterExpressionEvaluationContext Unevaluated(
5137       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5138 
5139   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5140   Expr *origSize = TL.getSizeExpr();
5141   if (!origSize) origSize = T->getSizeExpr();
5142 
5143   ExprResult sizeResult
5144     = getDerived().TransformExpr(origSize);
5145   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5146   if (sizeResult.isInvalid())
5147     return QualType();
5148 
5149   Expr *size = sizeResult.get();
5150 
5151   QualType Result = TL.getType();
5152   if (getDerived().AlwaysRebuild() ||
5153       ElementType != T->getElementType() ||
5154       size != origSize) {
5155     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5156                                                          T->getSizeModifier(),
5157                                                          size,
5158                                                 T->getIndexTypeCVRQualifiers(),
5159                                                         TL.getBracketsRange());
5160     if (Result.isNull())
5161       return QualType();
5162   }
5163 
5164   // We might have any sort of array type now, but fortunately they
5165   // all have the same location layout.
5166   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5167   NewTL.setLBracketLoc(TL.getLBracketLoc());
5168   NewTL.setRBracketLoc(TL.getRBracketLoc());
5169   NewTL.setSizeExpr(size);
5170 
5171   return Result;
5172 }
5173 
5174 template <typename Derived>
5175 QualType TreeTransform<Derived>::TransformDependentVectorType(
5176     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5177   const DependentVectorType *T = TL.getTypePtr();
5178   QualType ElementType = getDerived().TransformType(T->getElementType());
5179   if (ElementType.isNull())
5180     return QualType();
5181 
5182   EnterExpressionEvaluationContext Unevaluated(
5183       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5184 
5185   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5186   Size = SemaRef.ActOnConstantExpression(Size);
5187   if (Size.isInvalid())
5188     return QualType();
5189 
5190   QualType Result = TL.getType();
5191   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5192       Size.get() != T->getSizeExpr()) {
5193     Result = getDerived().RebuildDependentVectorType(
5194         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5195     if (Result.isNull())
5196       return QualType();
5197   }
5198 
5199   // Result might be dependent or not.
5200   if (isa<DependentVectorType>(Result)) {
5201     DependentVectorTypeLoc NewTL =
5202         TLB.push<DependentVectorTypeLoc>(Result);
5203     NewTL.setNameLoc(TL.getNameLoc());
5204   } else {
5205     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5206     NewTL.setNameLoc(TL.getNameLoc());
5207   }
5208 
5209   return Result;
5210 }
5211 
5212 template<typename Derived>
5213 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5214                                       TypeLocBuilder &TLB,
5215                                       DependentSizedExtVectorTypeLoc TL) {
5216   const DependentSizedExtVectorType *T = TL.getTypePtr();
5217 
5218   // FIXME: ext vector locs should be nested
5219   QualType ElementType = getDerived().TransformType(T->getElementType());
5220   if (ElementType.isNull())
5221     return QualType();
5222 
5223   // Vector sizes are constant expressions.
5224   EnterExpressionEvaluationContext Unevaluated(
5225       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5226 
5227   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5228   Size = SemaRef.ActOnConstantExpression(Size);
5229   if (Size.isInvalid())
5230     return QualType();
5231 
5232   QualType Result = TL.getType();
5233   if (getDerived().AlwaysRebuild() ||
5234       ElementType != T->getElementType() ||
5235       Size.get() != T->getSizeExpr()) {
5236     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5237                                                              Size.get(),
5238                                                          T->getAttributeLoc());
5239     if (Result.isNull())
5240       return QualType();
5241   }
5242 
5243   // Result might be dependent or not.
5244   if (isa<DependentSizedExtVectorType>(Result)) {
5245     DependentSizedExtVectorTypeLoc NewTL
5246       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5247     NewTL.setNameLoc(TL.getNameLoc());
5248   } else {
5249     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5250     NewTL.setNameLoc(TL.getNameLoc());
5251   }
5252 
5253   return Result;
5254 }
5255 
5256 template <typename Derived>
5257 QualType
5258 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5259                                                     ConstantMatrixTypeLoc TL) {
5260   const ConstantMatrixType *T = TL.getTypePtr();
5261   QualType ElementType = getDerived().TransformType(T->getElementType());
5262   if (ElementType.isNull())
5263     return QualType();
5264 
5265   QualType Result = TL.getType();
5266   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5267     Result = getDerived().RebuildConstantMatrixType(
5268         ElementType, T->getNumRows(), T->getNumColumns());
5269     if (Result.isNull())
5270       return QualType();
5271   }
5272 
5273   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5274   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5275   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5276   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5277   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5278 
5279   return Result;
5280 }
5281 
5282 template <typename Derived>
5283 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5284     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5285   const DependentSizedMatrixType *T = TL.getTypePtr();
5286 
5287   QualType ElementType = getDerived().TransformType(T->getElementType());
5288   if (ElementType.isNull()) {
5289     return QualType();
5290   }
5291 
5292   // Matrix dimensions are constant expressions.
5293   EnterExpressionEvaluationContext Unevaluated(
5294       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5295 
5296   Expr *origRows = TL.getAttrRowOperand();
5297   if (!origRows)
5298     origRows = T->getRowExpr();
5299   Expr *origColumns = TL.getAttrColumnOperand();
5300   if (!origColumns)
5301     origColumns = T->getColumnExpr();
5302 
5303   ExprResult rowResult = getDerived().TransformExpr(origRows);
5304   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5305   if (rowResult.isInvalid())
5306     return QualType();
5307 
5308   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5309   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5310   if (columnResult.isInvalid())
5311     return QualType();
5312 
5313   Expr *rows = rowResult.get();
5314   Expr *columns = columnResult.get();
5315 
5316   QualType Result = TL.getType();
5317   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5318       rows != origRows || columns != origColumns) {
5319     Result = getDerived().RebuildDependentSizedMatrixType(
5320         ElementType, rows, columns, T->getAttributeLoc());
5321 
5322     if (Result.isNull())
5323       return QualType();
5324   }
5325 
5326   // We might have any sort of matrix type now, but fortunately they
5327   // all have the same location layout.
5328   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5329   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5330   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5331   NewTL.setAttrRowOperand(rows);
5332   NewTL.setAttrColumnOperand(columns);
5333   return Result;
5334 }
5335 
5336 template <typename Derived>
5337 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5338     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5339   const DependentAddressSpaceType *T = TL.getTypePtr();
5340 
5341   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5342 
5343   if (pointeeType.isNull())
5344     return QualType();
5345 
5346   // Address spaces are constant expressions.
5347   EnterExpressionEvaluationContext Unevaluated(
5348       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5349 
5350   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5351   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5352   if (AddrSpace.isInvalid())
5353     return QualType();
5354 
5355   QualType Result = TL.getType();
5356   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5357       AddrSpace.get() != T->getAddrSpaceExpr()) {
5358     Result = getDerived().RebuildDependentAddressSpaceType(
5359         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5360     if (Result.isNull())
5361       return QualType();
5362   }
5363 
5364   // Result might be dependent or not.
5365   if (isa<DependentAddressSpaceType>(Result)) {
5366     DependentAddressSpaceTypeLoc NewTL =
5367         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5368 
5369     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5370     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5371     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5372 
5373   } else {
5374     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5375         Result, getDerived().getBaseLocation());
5376     TransformType(TLB, DI->getTypeLoc());
5377   }
5378 
5379   return Result;
5380 }
5381 
5382 template <typename Derived>
5383 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5384                                                      VectorTypeLoc TL) {
5385   const VectorType *T = TL.getTypePtr();
5386   QualType ElementType = getDerived().TransformType(T->getElementType());
5387   if (ElementType.isNull())
5388     return QualType();
5389 
5390   QualType Result = TL.getType();
5391   if (getDerived().AlwaysRebuild() ||
5392       ElementType != T->getElementType()) {
5393     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5394                                             T->getVectorKind());
5395     if (Result.isNull())
5396       return QualType();
5397   }
5398 
5399   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5400   NewTL.setNameLoc(TL.getNameLoc());
5401 
5402   return Result;
5403 }
5404 
5405 template<typename Derived>
5406 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5407                                                         ExtVectorTypeLoc TL) {
5408   const VectorType *T = TL.getTypePtr();
5409   QualType ElementType = getDerived().TransformType(T->getElementType());
5410   if (ElementType.isNull())
5411     return QualType();
5412 
5413   QualType Result = TL.getType();
5414   if (getDerived().AlwaysRebuild() ||
5415       ElementType != T->getElementType()) {
5416     Result = getDerived().RebuildExtVectorType(ElementType,
5417                                                T->getNumElements(),
5418                                                /*FIXME*/ SourceLocation());
5419     if (Result.isNull())
5420       return QualType();
5421   }
5422 
5423   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5424   NewTL.setNameLoc(TL.getNameLoc());
5425 
5426   return Result;
5427 }
5428 
5429 template <typename Derived>
5430 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5431     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5432     bool ExpectParameterPack) {
5433   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5434   TypeSourceInfo *NewDI = nullptr;
5435 
5436   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5437     // If we're substituting into a pack expansion type and we know the
5438     // length we want to expand to, just substitute for the pattern.
5439     TypeLoc OldTL = OldDI->getTypeLoc();
5440     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5441 
5442     TypeLocBuilder TLB;
5443     TypeLoc NewTL = OldDI->getTypeLoc();
5444     TLB.reserve(NewTL.getFullDataSize());
5445 
5446     QualType Result = getDerived().TransformType(TLB,
5447                                                OldExpansionTL.getPatternLoc());
5448     if (Result.isNull())
5449       return nullptr;
5450 
5451     Result = RebuildPackExpansionType(Result,
5452                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5453                                       OldExpansionTL.getEllipsisLoc(),
5454                                       NumExpansions);
5455     if (Result.isNull())
5456       return nullptr;
5457 
5458     PackExpansionTypeLoc NewExpansionTL
5459       = TLB.push<PackExpansionTypeLoc>(Result);
5460     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5461     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5462   } else
5463     NewDI = getDerived().TransformType(OldDI);
5464   if (!NewDI)
5465     return nullptr;
5466 
5467   if (NewDI == OldDI && indexAdjustment == 0)
5468     return OldParm;
5469 
5470   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5471                                              OldParm->getDeclContext(),
5472                                              OldParm->getInnerLocStart(),
5473                                              OldParm->getLocation(),
5474                                              OldParm->getIdentifier(),
5475                                              NewDI->getType(),
5476                                              NewDI,
5477                                              OldParm->getStorageClass(),
5478                                              /* DefArg */ nullptr);
5479   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5480                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5481   return newParm;
5482 }
5483 
5484 template <typename Derived>
5485 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5486     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5487     const QualType *ParamTypes,
5488     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5489     SmallVectorImpl<QualType> &OutParamTypes,
5490     SmallVectorImpl<ParmVarDecl *> *PVars,
5491     Sema::ExtParameterInfoBuilder &PInfos) {
5492   int indexAdjustment = 0;
5493 
5494   unsigned NumParams = Params.size();
5495   for (unsigned i = 0; i != NumParams; ++i) {
5496     if (ParmVarDecl *OldParm = Params[i]) {
5497       assert(OldParm->getFunctionScopeIndex() == i);
5498 
5499       Optional<unsigned> NumExpansions;
5500       ParmVarDecl *NewParm = nullptr;
5501       if (OldParm->isParameterPack()) {
5502         // We have a function parameter pack that may need to be expanded.
5503         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5504 
5505         // Find the parameter packs that could be expanded.
5506         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5507         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5508         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5509         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5510 
5511         // Determine whether we should expand the parameter packs.
5512         bool ShouldExpand = false;
5513         bool RetainExpansion = false;
5514         Optional<unsigned> OrigNumExpansions;
5515         if (Unexpanded.size() > 0) {
5516           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5517           NumExpansions = OrigNumExpansions;
5518           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5519                                                    Pattern.getSourceRange(),
5520                                                    Unexpanded,
5521                                                    ShouldExpand,
5522                                                    RetainExpansion,
5523                                                    NumExpansions)) {
5524             return true;
5525           }
5526         } else {
5527 #ifndef NDEBUG
5528           const AutoType *AT =
5529               Pattern.getType().getTypePtr()->getContainedAutoType();
5530           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5531                  "Could not find parameter packs or undeduced auto type!");
5532 #endif
5533         }
5534 
5535         if (ShouldExpand) {
5536           // Expand the function parameter pack into multiple, separate
5537           // parameters.
5538           getDerived().ExpandingFunctionParameterPack(OldParm);
5539           for (unsigned I = 0; I != *NumExpansions; ++I) {
5540             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5541             ParmVarDecl *NewParm
5542               = getDerived().TransformFunctionTypeParam(OldParm,
5543                                                         indexAdjustment++,
5544                                                         OrigNumExpansions,
5545                                                 /*ExpectParameterPack=*/false);
5546             if (!NewParm)
5547               return true;
5548 
5549             if (ParamInfos)
5550               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5551             OutParamTypes.push_back(NewParm->getType());
5552             if (PVars)
5553               PVars->push_back(NewParm);
5554           }
5555 
5556           // If we're supposed to retain a pack expansion, do so by temporarily
5557           // forgetting the partially-substituted parameter pack.
5558           if (RetainExpansion) {
5559             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5560             ParmVarDecl *NewParm
5561               = getDerived().TransformFunctionTypeParam(OldParm,
5562                                                         indexAdjustment++,
5563                                                         OrigNumExpansions,
5564                                                 /*ExpectParameterPack=*/false);
5565             if (!NewParm)
5566               return true;
5567 
5568             if (ParamInfos)
5569               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5570             OutParamTypes.push_back(NewParm->getType());
5571             if (PVars)
5572               PVars->push_back(NewParm);
5573           }
5574 
5575           // The next parameter should have the same adjustment as the
5576           // last thing we pushed, but we post-incremented indexAdjustment
5577           // on every push.  Also, if we push nothing, the adjustment should
5578           // go down by one.
5579           indexAdjustment--;
5580 
5581           // We're done with the pack expansion.
5582           continue;
5583         }
5584 
5585         // We'll substitute the parameter now without expanding the pack
5586         // expansion.
5587         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5588         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5589                                                           indexAdjustment,
5590                                                           NumExpansions,
5591                                                   /*ExpectParameterPack=*/true);
5592         assert(NewParm->isParameterPack() &&
5593                "Parameter pack no longer a parameter pack after "
5594                "transformation.");
5595       } else {
5596         NewParm = getDerived().TransformFunctionTypeParam(
5597             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5598       }
5599 
5600       if (!NewParm)
5601         return true;
5602 
5603       if (ParamInfos)
5604         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5605       OutParamTypes.push_back(NewParm->getType());
5606       if (PVars)
5607         PVars->push_back(NewParm);
5608       continue;
5609     }
5610 
5611     // Deal with the possibility that we don't have a parameter
5612     // declaration for this parameter.
5613     QualType OldType = ParamTypes[i];
5614     bool IsPackExpansion = false;
5615     Optional<unsigned> NumExpansions;
5616     QualType NewType;
5617     if (const PackExpansionType *Expansion
5618                                        = dyn_cast<PackExpansionType>(OldType)) {
5619       // We have a function parameter pack that may need to be expanded.
5620       QualType Pattern = Expansion->getPattern();
5621       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5622       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5623 
5624       // Determine whether we should expand the parameter packs.
5625       bool ShouldExpand = false;
5626       bool RetainExpansion = false;
5627       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5628                                                Unexpanded,
5629                                                ShouldExpand,
5630                                                RetainExpansion,
5631                                                NumExpansions)) {
5632         return true;
5633       }
5634 
5635       if (ShouldExpand) {
5636         // Expand the function parameter pack into multiple, separate
5637         // parameters.
5638         for (unsigned I = 0; I != *NumExpansions; ++I) {
5639           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5640           QualType NewType = getDerived().TransformType(Pattern);
5641           if (NewType.isNull())
5642             return true;
5643 
5644           if (NewType->containsUnexpandedParameterPack()) {
5645             NewType =
5646                 getSema().getASTContext().getPackExpansionType(NewType, None);
5647 
5648             if (NewType.isNull())
5649               return true;
5650           }
5651 
5652           if (ParamInfos)
5653             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5654           OutParamTypes.push_back(NewType);
5655           if (PVars)
5656             PVars->push_back(nullptr);
5657         }
5658 
5659         // We're done with the pack expansion.
5660         continue;
5661       }
5662 
5663       // If we're supposed to retain a pack expansion, do so by temporarily
5664       // forgetting the partially-substituted parameter pack.
5665       if (RetainExpansion) {
5666         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5667         QualType NewType = getDerived().TransformType(Pattern);
5668         if (NewType.isNull())
5669           return true;
5670 
5671         if (ParamInfos)
5672           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5673         OutParamTypes.push_back(NewType);
5674         if (PVars)
5675           PVars->push_back(nullptr);
5676       }
5677 
5678       // We'll substitute the parameter now without expanding the pack
5679       // expansion.
5680       OldType = Expansion->getPattern();
5681       IsPackExpansion = true;
5682       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5683       NewType = getDerived().TransformType(OldType);
5684     } else {
5685       NewType = getDerived().TransformType(OldType);
5686     }
5687 
5688     if (NewType.isNull())
5689       return true;
5690 
5691     if (IsPackExpansion)
5692       NewType = getSema().Context.getPackExpansionType(NewType,
5693                                                        NumExpansions);
5694 
5695     if (ParamInfos)
5696       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5697     OutParamTypes.push_back(NewType);
5698     if (PVars)
5699       PVars->push_back(nullptr);
5700   }
5701 
5702 #ifndef NDEBUG
5703   if (PVars) {
5704     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5705       if (ParmVarDecl *parm = (*PVars)[i])
5706         assert(parm->getFunctionScopeIndex() == i);
5707   }
5708 #endif
5709 
5710   return false;
5711 }
5712 
5713 template<typename Derived>
5714 QualType
5715 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5716                                                    FunctionProtoTypeLoc TL) {
5717   SmallVector<QualType, 4> ExceptionStorage;
5718   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5719   return getDerived().TransformFunctionProtoType(
5720       TLB, TL, nullptr, Qualifiers(),
5721       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5722         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5723                                             ExceptionStorage, Changed);
5724       });
5725 }
5726 
5727 template<typename Derived> template<typename Fn>
5728 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5729     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5730     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5731 
5732   // Transform the parameters and return type.
5733   //
5734   // We are required to instantiate the params and return type in source order.
5735   // When the function has a trailing return type, we instantiate the
5736   // parameters before the return type,  since the return type can then refer
5737   // to the parameters themselves (via decltype, sizeof, etc.).
5738   //
5739   SmallVector<QualType, 4> ParamTypes;
5740   SmallVector<ParmVarDecl*, 4> ParamDecls;
5741   Sema::ExtParameterInfoBuilder ExtParamInfos;
5742   const FunctionProtoType *T = TL.getTypePtr();
5743 
5744   QualType ResultType;
5745 
5746   if (T->hasTrailingReturn()) {
5747     if (getDerived().TransformFunctionTypeParams(
5748             TL.getBeginLoc(), TL.getParams(),
5749             TL.getTypePtr()->param_type_begin(),
5750             T->getExtParameterInfosOrNull(),
5751             ParamTypes, &ParamDecls, ExtParamInfos))
5752       return QualType();
5753 
5754     {
5755       // C++11 [expr.prim.general]p3:
5756       //   If a declaration declares a member function or member function
5757       //   template of a class X, the expression this is a prvalue of type
5758       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5759       //   and the end of the function-definition, member-declarator, or
5760       //   declarator.
5761       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5762 
5763       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5764       if (ResultType.isNull())
5765         return QualType();
5766     }
5767   }
5768   else {
5769     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5770     if (ResultType.isNull())
5771       return QualType();
5772 
5773     if (getDerived().TransformFunctionTypeParams(
5774             TL.getBeginLoc(), TL.getParams(),
5775             TL.getTypePtr()->param_type_begin(),
5776             T->getExtParameterInfosOrNull(),
5777             ParamTypes, &ParamDecls, ExtParamInfos))
5778       return QualType();
5779   }
5780 
5781   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5782 
5783   bool EPIChanged = false;
5784   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5785     return QualType();
5786 
5787   // Handle extended parameter information.
5788   if (auto NewExtParamInfos =
5789         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5790     if (!EPI.ExtParameterInfos ||
5791         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5792           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5793       EPIChanged = true;
5794     }
5795     EPI.ExtParameterInfos = NewExtParamInfos;
5796   } else if (EPI.ExtParameterInfos) {
5797     EPIChanged = true;
5798     EPI.ExtParameterInfos = nullptr;
5799   }
5800 
5801   QualType Result = TL.getType();
5802   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5803       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5804     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5805     if (Result.isNull())
5806       return QualType();
5807   }
5808 
5809   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5810   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5811   NewTL.setLParenLoc(TL.getLParenLoc());
5812   NewTL.setRParenLoc(TL.getRParenLoc());
5813   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5814   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5815   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5816     NewTL.setParam(i, ParamDecls[i]);
5817 
5818   return Result;
5819 }
5820 
5821 template<typename Derived>
5822 bool TreeTransform<Derived>::TransformExceptionSpec(
5823     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5824     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5825   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5826 
5827   // Instantiate a dynamic noexcept expression, if any.
5828   if (isComputedNoexcept(ESI.Type)) {
5829     EnterExpressionEvaluationContext Unevaluated(
5830         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5831     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5832     if (NoexceptExpr.isInvalid())
5833       return true;
5834 
5835     ExceptionSpecificationType EST = ESI.Type;
5836     NoexceptExpr =
5837         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5838     if (NoexceptExpr.isInvalid())
5839       return true;
5840 
5841     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5842       Changed = true;
5843     ESI.NoexceptExpr = NoexceptExpr.get();
5844     ESI.Type = EST;
5845   }
5846 
5847   if (ESI.Type != EST_Dynamic)
5848     return false;
5849 
5850   // Instantiate a dynamic exception specification's type.
5851   for (QualType T : ESI.Exceptions) {
5852     if (const PackExpansionType *PackExpansion =
5853             T->getAs<PackExpansionType>()) {
5854       Changed = true;
5855 
5856       // We have a pack expansion. Instantiate it.
5857       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5858       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5859                                               Unexpanded);
5860       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5861 
5862       // Determine whether the set of unexpanded parameter packs can and
5863       // should
5864       // be expanded.
5865       bool Expand = false;
5866       bool RetainExpansion = false;
5867       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5868       // FIXME: Track the location of the ellipsis (and track source location
5869       // information for the types in the exception specification in general).
5870       if (getDerived().TryExpandParameterPacks(
5871               Loc, SourceRange(), Unexpanded, Expand,
5872               RetainExpansion, NumExpansions))
5873         return true;
5874 
5875       if (!Expand) {
5876         // We can't expand this pack expansion into separate arguments yet;
5877         // just substitute into the pattern and create a new pack expansion
5878         // type.
5879         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5880         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5881         if (U.isNull())
5882           return true;
5883 
5884         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5885         Exceptions.push_back(U);
5886         continue;
5887       }
5888 
5889       // Substitute into the pack expansion pattern for each slice of the
5890       // pack.
5891       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5892         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5893 
5894         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5895         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5896           return true;
5897 
5898         Exceptions.push_back(U);
5899       }
5900     } else {
5901       QualType U = getDerived().TransformType(T);
5902       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5903         return true;
5904       if (T != U)
5905         Changed = true;
5906 
5907       Exceptions.push_back(U);
5908     }
5909   }
5910 
5911   ESI.Exceptions = Exceptions;
5912   if (ESI.Exceptions.empty())
5913     ESI.Type = EST_DynamicNone;
5914   return false;
5915 }
5916 
5917 template<typename Derived>
5918 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5919                                                  TypeLocBuilder &TLB,
5920                                                  FunctionNoProtoTypeLoc TL) {
5921   const FunctionNoProtoType *T = TL.getTypePtr();
5922   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5923   if (ResultType.isNull())
5924     return QualType();
5925 
5926   QualType Result = TL.getType();
5927   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5928     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5929 
5930   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5931   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5932   NewTL.setLParenLoc(TL.getLParenLoc());
5933   NewTL.setRParenLoc(TL.getRParenLoc());
5934   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5935 
5936   return Result;
5937 }
5938 
5939 template<typename Derived> QualType
5940 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5941                                                  UnresolvedUsingTypeLoc TL) {
5942   const UnresolvedUsingType *T = TL.getTypePtr();
5943   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5944   if (!D)
5945     return QualType();
5946 
5947   QualType Result = TL.getType();
5948   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5949     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5950     if (Result.isNull())
5951       return QualType();
5952   }
5953 
5954   // We might get an arbitrary type spec type back.  We should at
5955   // least always get a type spec type, though.
5956   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5957   NewTL.setNameLoc(TL.getNameLoc());
5958 
5959   return Result;
5960 }
5961 
5962 template<typename Derived>
5963 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5964                                                       TypedefTypeLoc TL) {
5965   const TypedefType *T = TL.getTypePtr();
5966   TypedefNameDecl *Typedef
5967     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5968                                                                T->getDecl()));
5969   if (!Typedef)
5970     return QualType();
5971 
5972   QualType Result = TL.getType();
5973   if (getDerived().AlwaysRebuild() ||
5974       Typedef != T->getDecl()) {
5975     Result = getDerived().RebuildTypedefType(Typedef);
5976     if (Result.isNull())
5977       return QualType();
5978   }
5979 
5980   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5981   NewTL.setNameLoc(TL.getNameLoc());
5982 
5983   return Result;
5984 }
5985 
5986 template<typename Derived>
5987 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5988                                                       TypeOfExprTypeLoc TL) {
5989   // typeof expressions are not potentially evaluated contexts
5990   EnterExpressionEvaluationContext Unevaluated(
5991       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5992       Sema::ReuseLambdaContextDecl);
5993 
5994   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5995   if (E.isInvalid())
5996     return QualType();
5997 
5998   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5999   if (E.isInvalid())
6000     return QualType();
6001 
6002   QualType Result = TL.getType();
6003   if (getDerived().AlwaysRebuild() ||
6004       E.get() != TL.getUnderlyingExpr()) {
6005     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6006     if (Result.isNull())
6007       return QualType();
6008   }
6009   else E.get();
6010 
6011   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6012   NewTL.setTypeofLoc(TL.getTypeofLoc());
6013   NewTL.setLParenLoc(TL.getLParenLoc());
6014   NewTL.setRParenLoc(TL.getRParenLoc());
6015 
6016   return Result;
6017 }
6018 
6019 template<typename Derived>
6020 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6021                                                      TypeOfTypeLoc TL) {
6022   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6023   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6024   if (!New_Under_TI)
6025     return QualType();
6026 
6027   QualType Result = TL.getType();
6028   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6029     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6030     if (Result.isNull())
6031       return QualType();
6032   }
6033 
6034   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6035   NewTL.setTypeofLoc(TL.getTypeofLoc());
6036   NewTL.setLParenLoc(TL.getLParenLoc());
6037   NewTL.setRParenLoc(TL.getRParenLoc());
6038   NewTL.setUnderlyingTInfo(New_Under_TI);
6039 
6040   return Result;
6041 }
6042 
6043 template<typename Derived>
6044 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6045                                                        DecltypeTypeLoc TL) {
6046   const DecltypeType *T = TL.getTypePtr();
6047 
6048   // decltype expressions are not potentially evaluated contexts
6049   EnterExpressionEvaluationContext Unevaluated(
6050       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6051       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6052 
6053   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6054   if (E.isInvalid())
6055     return QualType();
6056 
6057   E = getSema().ActOnDecltypeExpression(E.get());
6058   if (E.isInvalid())
6059     return QualType();
6060 
6061   QualType Result = TL.getType();
6062   if (getDerived().AlwaysRebuild() ||
6063       E.get() != T->getUnderlyingExpr()) {
6064     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6065     if (Result.isNull())
6066       return QualType();
6067   }
6068   else E.get();
6069 
6070   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6071   NewTL.setNameLoc(TL.getNameLoc());
6072 
6073   return Result;
6074 }
6075 
6076 template<typename Derived>
6077 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6078                                                             TypeLocBuilder &TLB,
6079                                                      UnaryTransformTypeLoc TL) {
6080   QualType Result = TL.getType();
6081   if (Result->isDependentType()) {
6082     const UnaryTransformType *T = TL.getTypePtr();
6083     QualType NewBase =
6084       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6085     Result = getDerived().RebuildUnaryTransformType(NewBase,
6086                                                     T->getUTTKind(),
6087                                                     TL.getKWLoc());
6088     if (Result.isNull())
6089       return QualType();
6090   }
6091 
6092   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6093   NewTL.setKWLoc(TL.getKWLoc());
6094   NewTL.setParensRange(TL.getParensRange());
6095   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6096   return Result;
6097 }
6098 
6099 template<typename Derived>
6100 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6101     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6102   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6103 
6104   CXXScopeSpec SS;
6105   TemplateName TemplateName = getDerived().TransformTemplateName(
6106       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6107   if (TemplateName.isNull())
6108     return QualType();
6109 
6110   QualType OldDeduced = T->getDeducedType();
6111   QualType NewDeduced;
6112   if (!OldDeduced.isNull()) {
6113     NewDeduced = getDerived().TransformType(OldDeduced);
6114     if (NewDeduced.isNull())
6115       return QualType();
6116   }
6117 
6118   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6119       TemplateName, NewDeduced);
6120   if (Result.isNull())
6121     return QualType();
6122 
6123   DeducedTemplateSpecializationTypeLoc NewTL =
6124       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6125   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6126 
6127   return Result;
6128 }
6129 
6130 template<typename Derived>
6131 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6132                                                      RecordTypeLoc TL) {
6133   const RecordType *T = TL.getTypePtr();
6134   RecordDecl *Record
6135     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6136                                                           T->getDecl()));
6137   if (!Record)
6138     return QualType();
6139 
6140   QualType Result = TL.getType();
6141   if (getDerived().AlwaysRebuild() ||
6142       Record != T->getDecl()) {
6143     Result = getDerived().RebuildRecordType(Record);
6144     if (Result.isNull())
6145       return QualType();
6146   }
6147 
6148   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6149   NewTL.setNameLoc(TL.getNameLoc());
6150 
6151   return Result;
6152 }
6153 
6154 template<typename Derived>
6155 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6156                                                    EnumTypeLoc TL) {
6157   const EnumType *T = TL.getTypePtr();
6158   EnumDecl *Enum
6159     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6160                                                         T->getDecl()));
6161   if (!Enum)
6162     return QualType();
6163 
6164   QualType Result = TL.getType();
6165   if (getDerived().AlwaysRebuild() ||
6166       Enum != T->getDecl()) {
6167     Result = getDerived().RebuildEnumType(Enum);
6168     if (Result.isNull())
6169       return QualType();
6170   }
6171 
6172   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6173   NewTL.setNameLoc(TL.getNameLoc());
6174 
6175   return Result;
6176 }
6177 
6178 template<typename Derived>
6179 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6180                                          TypeLocBuilder &TLB,
6181                                          InjectedClassNameTypeLoc TL) {
6182   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6183                                        TL.getTypePtr()->getDecl());
6184   if (!D) return QualType();
6185 
6186   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6187   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6188   return T;
6189 }
6190 
6191 template<typename Derived>
6192 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6193                                                 TypeLocBuilder &TLB,
6194                                                 TemplateTypeParmTypeLoc TL) {
6195   return TransformTypeSpecType(TLB, TL);
6196 }
6197 
6198 template<typename Derived>
6199 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6200                                          TypeLocBuilder &TLB,
6201                                          SubstTemplateTypeParmTypeLoc TL) {
6202   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6203 
6204   // Substitute into the replacement type, which itself might involve something
6205   // that needs to be transformed. This only tends to occur with default
6206   // template arguments of template template parameters.
6207   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6208   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6209   if (Replacement.isNull())
6210     return QualType();
6211 
6212   // Always canonicalize the replacement type.
6213   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6214   QualType Result
6215     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6216                                                    Replacement);
6217 
6218   // Propagate type-source information.
6219   SubstTemplateTypeParmTypeLoc NewTL
6220     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6221   NewTL.setNameLoc(TL.getNameLoc());
6222   return Result;
6223 
6224 }
6225 
6226 template<typename Derived>
6227 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6228                                           TypeLocBuilder &TLB,
6229                                           SubstTemplateTypeParmPackTypeLoc TL) {
6230   return TransformTypeSpecType(TLB, TL);
6231 }
6232 
6233 template<typename Derived>
6234 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6235                                                         TypeLocBuilder &TLB,
6236                                            TemplateSpecializationTypeLoc TL) {
6237   const TemplateSpecializationType *T = TL.getTypePtr();
6238 
6239   // The nested-name-specifier never matters in a TemplateSpecializationType,
6240   // because we can't have a dependent nested-name-specifier anyway.
6241   CXXScopeSpec SS;
6242   TemplateName Template
6243     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6244                                          TL.getTemplateNameLoc());
6245   if (Template.isNull())
6246     return QualType();
6247 
6248   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6249 }
6250 
6251 template<typename Derived>
6252 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6253                                                      AtomicTypeLoc TL) {
6254   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6255   if (ValueType.isNull())
6256     return QualType();
6257 
6258   QualType Result = TL.getType();
6259   if (getDerived().AlwaysRebuild() ||
6260       ValueType != TL.getValueLoc().getType()) {
6261     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6262     if (Result.isNull())
6263       return QualType();
6264   }
6265 
6266   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6267   NewTL.setKWLoc(TL.getKWLoc());
6268   NewTL.setLParenLoc(TL.getLParenLoc());
6269   NewTL.setRParenLoc(TL.getRParenLoc());
6270 
6271   return Result;
6272 }
6273 
6274 template <typename Derived>
6275 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6276                                                    PipeTypeLoc TL) {
6277   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6278   if (ValueType.isNull())
6279     return QualType();
6280 
6281   QualType Result = TL.getType();
6282   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6283     const PipeType *PT = Result->castAs<PipeType>();
6284     bool isReadPipe = PT->isReadOnly();
6285     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6286     if (Result.isNull())
6287       return QualType();
6288   }
6289 
6290   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6291   NewTL.setKWLoc(TL.getKWLoc());
6292 
6293   return Result;
6294 }
6295 
6296 template <typename Derived>
6297 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6298                                                      ExtIntTypeLoc TL) {
6299   const ExtIntType *EIT = TL.getTypePtr();
6300   QualType Result = TL.getType();
6301 
6302   if (getDerived().AlwaysRebuild()) {
6303     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6304                                             EIT->getNumBits(), TL.getNameLoc());
6305     if (Result.isNull())
6306       return QualType();
6307   }
6308 
6309   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6310   NewTL.setNameLoc(TL.getNameLoc());
6311   return Result;
6312 }
6313 
6314 template <typename Derived>
6315 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6316     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6317   const DependentExtIntType *EIT = TL.getTypePtr();
6318 
6319   EnterExpressionEvaluationContext Unevaluated(
6320       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6321   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6322   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6323 
6324   if (BitsExpr.isInvalid())
6325     return QualType();
6326 
6327   QualType Result = TL.getType();
6328 
6329   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6330     Result = getDerived().RebuildDependentExtIntType(
6331         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6332 
6333     if (Result.isNull())
6334       return QualType();
6335   }
6336 
6337   if (isa<DependentExtIntType>(Result)) {
6338     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6339     NewTL.setNameLoc(TL.getNameLoc());
6340   } else {
6341     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6342     NewTL.setNameLoc(TL.getNameLoc());
6343   }
6344   return Result;
6345 }
6346 
6347   /// Simple iterator that traverses the template arguments in a
6348   /// container that provides a \c getArgLoc() member function.
6349   ///
6350   /// This iterator is intended to be used with the iterator form of
6351   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6352   template<typename ArgLocContainer>
6353   class TemplateArgumentLocContainerIterator {
6354     ArgLocContainer *Container;
6355     unsigned Index;
6356 
6357   public:
6358     typedef TemplateArgumentLoc value_type;
6359     typedef TemplateArgumentLoc reference;
6360     typedef int difference_type;
6361     typedef std::input_iterator_tag iterator_category;
6362 
6363     class pointer {
6364       TemplateArgumentLoc Arg;
6365 
6366     public:
6367       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6368 
6369       const TemplateArgumentLoc *operator->() const {
6370         return &Arg;
6371       }
6372     };
6373 
6374 
6375     TemplateArgumentLocContainerIterator() {}
6376 
6377     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6378                                  unsigned Index)
6379       : Container(&Container), Index(Index) { }
6380 
6381     TemplateArgumentLocContainerIterator &operator++() {
6382       ++Index;
6383       return *this;
6384     }
6385 
6386     TemplateArgumentLocContainerIterator operator++(int) {
6387       TemplateArgumentLocContainerIterator Old(*this);
6388       ++(*this);
6389       return Old;
6390     }
6391 
6392     TemplateArgumentLoc operator*() const {
6393       return Container->getArgLoc(Index);
6394     }
6395 
6396     pointer operator->() const {
6397       return pointer(Container->getArgLoc(Index));
6398     }
6399 
6400     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6401                            const TemplateArgumentLocContainerIterator &Y) {
6402       return X.Container == Y.Container && X.Index == Y.Index;
6403     }
6404 
6405     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6406                            const TemplateArgumentLocContainerIterator &Y) {
6407       return !(X == Y);
6408     }
6409   };
6410 
6411 template<typename Derived>
6412 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6413                                                    AutoTypeLoc TL) {
6414   const AutoType *T = TL.getTypePtr();
6415   QualType OldDeduced = T->getDeducedType();
6416   QualType NewDeduced;
6417   if (!OldDeduced.isNull()) {
6418     NewDeduced = getDerived().TransformType(OldDeduced);
6419     if (NewDeduced.isNull())
6420       return QualType();
6421   }
6422 
6423   ConceptDecl *NewCD = nullptr;
6424   TemplateArgumentListInfo NewTemplateArgs;
6425   NestedNameSpecifierLoc NewNestedNameSpec;
6426   if (TL.getTypePtr()->isConstrained()) {
6427     NewCD = cast_or_null<ConceptDecl>(
6428         getDerived().TransformDecl(
6429             TL.getConceptNameLoc(),
6430             TL.getTypePtr()->getTypeConstraintConcept()));
6431 
6432     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6433     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6434     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6435     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6436                                                 ArgIterator(TL,
6437                                                             TL.getNumArgs()),
6438                                                 NewTemplateArgs))
6439       return QualType();
6440 
6441     if (TL.getNestedNameSpecifierLoc()) {
6442       NewNestedNameSpec
6443         = getDerived().TransformNestedNameSpecifierLoc(
6444             TL.getNestedNameSpecifierLoc());
6445       if (!NewNestedNameSpec)
6446         return QualType();
6447     }
6448   }
6449 
6450   QualType Result = TL.getType();
6451   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6452       T->isDependentType()) {
6453     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6454     NewArgList.reserve(NewArgList.size());
6455     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6456       NewArgList.push_back(ArgLoc.getArgument());
6457     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6458                                           NewArgList);
6459     if (Result.isNull())
6460       return QualType();
6461   }
6462 
6463   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6464   NewTL.setNameLoc(TL.getNameLoc());
6465   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6466   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6467   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6468   NewTL.setFoundDecl(TL.getFoundDecl());
6469   NewTL.setLAngleLoc(TL.getLAngleLoc());
6470   NewTL.setRAngleLoc(TL.getRAngleLoc());
6471   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6472     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6473 
6474   return Result;
6475 }
6476 
6477 template <typename Derived>
6478 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6479                                                         TypeLocBuilder &TLB,
6480                                            TemplateSpecializationTypeLoc TL,
6481                                                       TemplateName Template) {
6482   TemplateArgumentListInfo NewTemplateArgs;
6483   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6484   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6485   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6486     ArgIterator;
6487   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6488                                               ArgIterator(TL, TL.getNumArgs()),
6489                                               NewTemplateArgs))
6490     return QualType();
6491 
6492   // FIXME: maybe don't rebuild if all the template arguments are the same.
6493 
6494   QualType Result =
6495     getDerived().RebuildTemplateSpecializationType(Template,
6496                                                    TL.getTemplateNameLoc(),
6497                                                    NewTemplateArgs);
6498 
6499   if (!Result.isNull()) {
6500     // Specializations of template template parameters are represented as
6501     // TemplateSpecializationTypes, and substitution of type alias templates
6502     // within a dependent context can transform them into
6503     // DependentTemplateSpecializationTypes.
6504     if (isa<DependentTemplateSpecializationType>(Result)) {
6505       DependentTemplateSpecializationTypeLoc NewTL
6506         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6507       NewTL.setElaboratedKeywordLoc(SourceLocation());
6508       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6509       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6510       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6511       NewTL.setLAngleLoc(TL.getLAngleLoc());
6512       NewTL.setRAngleLoc(TL.getRAngleLoc());
6513       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6514         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6515       return Result;
6516     }
6517 
6518     TemplateSpecializationTypeLoc NewTL
6519       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6520     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6521     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6522     NewTL.setLAngleLoc(TL.getLAngleLoc());
6523     NewTL.setRAngleLoc(TL.getRAngleLoc());
6524     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6525       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6526   }
6527 
6528   return Result;
6529 }
6530 
6531 template <typename Derived>
6532 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6533                                      TypeLocBuilder &TLB,
6534                                      DependentTemplateSpecializationTypeLoc TL,
6535                                      TemplateName Template,
6536                                      CXXScopeSpec &SS) {
6537   TemplateArgumentListInfo NewTemplateArgs;
6538   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6539   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6540   typedef TemplateArgumentLocContainerIterator<
6541             DependentTemplateSpecializationTypeLoc> ArgIterator;
6542   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6543                                               ArgIterator(TL, TL.getNumArgs()),
6544                                               NewTemplateArgs))
6545     return QualType();
6546 
6547   // FIXME: maybe don't rebuild if all the template arguments are the same.
6548 
6549   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6550     QualType Result
6551       = getSema().Context.getDependentTemplateSpecializationType(
6552                                                 TL.getTypePtr()->getKeyword(),
6553                                                          DTN->getQualifier(),
6554                                                          DTN->getIdentifier(),
6555                                                                NewTemplateArgs);
6556 
6557     DependentTemplateSpecializationTypeLoc NewTL
6558       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6559     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6560     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6561     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6562     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6563     NewTL.setLAngleLoc(TL.getLAngleLoc());
6564     NewTL.setRAngleLoc(TL.getRAngleLoc());
6565     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6566       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6567     return Result;
6568   }
6569 
6570   QualType Result
6571     = getDerived().RebuildTemplateSpecializationType(Template,
6572                                                      TL.getTemplateNameLoc(),
6573                                                      NewTemplateArgs);
6574 
6575   if (!Result.isNull()) {
6576     /// FIXME: Wrap this in an elaborated-type-specifier?
6577     TemplateSpecializationTypeLoc NewTL
6578       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6579     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6580     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6581     NewTL.setLAngleLoc(TL.getLAngleLoc());
6582     NewTL.setRAngleLoc(TL.getRAngleLoc());
6583     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6584       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6585   }
6586 
6587   return Result;
6588 }
6589 
6590 template<typename Derived>
6591 QualType
6592 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6593                                                 ElaboratedTypeLoc TL) {
6594   const ElaboratedType *T = TL.getTypePtr();
6595 
6596   NestedNameSpecifierLoc QualifierLoc;
6597   // NOTE: the qualifier in an ElaboratedType is optional.
6598   if (TL.getQualifierLoc()) {
6599     QualifierLoc
6600       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6601     if (!QualifierLoc)
6602       return QualType();
6603   }
6604 
6605   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6606   if (NamedT.isNull())
6607     return QualType();
6608 
6609   // C++0x [dcl.type.elab]p2:
6610   //   If the identifier resolves to a typedef-name or the simple-template-id
6611   //   resolves to an alias template specialization, the
6612   //   elaborated-type-specifier is ill-formed.
6613   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6614     if (const TemplateSpecializationType *TST =
6615           NamedT->getAs<TemplateSpecializationType>()) {
6616       TemplateName Template = TST->getTemplateName();
6617       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6618               Template.getAsTemplateDecl())) {
6619         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6620                      diag::err_tag_reference_non_tag)
6621             << TAT << Sema::NTK_TypeAliasTemplate
6622             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6623         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6624       }
6625     }
6626   }
6627 
6628   QualType Result = TL.getType();
6629   if (getDerived().AlwaysRebuild() ||
6630       QualifierLoc != TL.getQualifierLoc() ||
6631       NamedT != T->getNamedType()) {
6632     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6633                                                 T->getKeyword(),
6634                                                 QualifierLoc, NamedT);
6635     if (Result.isNull())
6636       return QualType();
6637   }
6638 
6639   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6640   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6641   NewTL.setQualifierLoc(QualifierLoc);
6642   return Result;
6643 }
6644 
6645 template<typename Derived>
6646 QualType TreeTransform<Derived>::TransformAttributedType(
6647                                                 TypeLocBuilder &TLB,
6648                                                 AttributedTypeLoc TL) {
6649   const AttributedType *oldType = TL.getTypePtr();
6650   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6651   if (modifiedType.isNull())
6652     return QualType();
6653 
6654   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6655   const Attr *oldAttr = TL.getAttr();
6656   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6657   if (oldAttr && !newAttr)
6658     return QualType();
6659 
6660   QualType result = TL.getType();
6661 
6662   // FIXME: dependent operand expressions?
6663   if (getDerived().AlwaysRebuild() ||
6664       modifiedType != oldType->getModifiedType()) {
6665     // TODO: this is really lame; we should really be rebuilding the
6666     // equivalent type from first principles.
6667     QualType equivalentType
6668       = getDerived().TransformType(oldType->getEquivalentType());
6669     if (equivalentType.isNull())
6670       return QualType();
6671 
6672     // Check whether we can add nullability; it is only represented as
6673     // type sugar, and therefore cannot be diagnosed in any other way.
6674     if (auto nullability = oldType->getImmediateNullability()) {
6675       if (!modifiedType->canHaveNullability()) {
6676         SemaRef.Diag(TL.getAttr()->getLocation(),
6677                      diag::err_nullability_nonpointer)
6678             << DiagNullabilityKind(*nullability, false) << modifiedType;
6679         return QualType();
6680       }
6681     }
6682 
6683     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6684                                                modifiedType,
6685                                                equivalentType);
6686   }
6687 
6688   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6689   newTL.setAttr(newAttr);
6690   return result;
6691 }
6692 
6693 template<typename Derived>
6694 QualType
6695 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6696                                            ParenTypeLoc TL) {
6697   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6698   if (Inner.isNull())
6699     return QualType();
6700 
6701   QualType Result = TL.getType();
6702   if (getDerived().AlwaysRebuild() ||
6703       Inner != TL.getInnerLoc().getType()) {
6704     Result = getDerived().RebuildParenType(Inner);
6705     if (Result.isNull())
6706       return QualType();
6707   }
6708 
6709   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6710   NewTL.setLParenLoc(TL.getLParenLoc());
6711   NewTL.setRParenLoc(TL.getRParenLoc());
6712   return Result;
6713 }
6714 
6715 template <typename Derived>
6716 QualType
6717 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6718                                                     MacroQualifiedTypeLoc TL) {
6719   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6720   if (Inner.isNull())
6721     return QualType();
6722 
6723   QualType Result = TL.getType();
6724   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6725     Result =
6726         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6727     if (Result.isNull())
6728       return QualType();
6729   }
6730 
6731   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6732   NewTL.setExpansionLoc(TL.getExpansionLoc());
6733   return Result;
6734 }
6735 
6736 template<typename Derived>
6737 QualType TreeTransform<Derived>::TransformDependentNameType(
6738     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6739   return TransformDependentNameType(TLB, TL, false);
6740 }
6741 
6742 template<typename Derived>
6743 QualType TreeTransform<Derived>::TransformDependentNameType(
6744     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6745   const DependentNameType *T = TL.getTypePtr();
6746 
6747   NestedNameSpecifierLoc QualifierLoc
6748     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6749   if (!QualifierLoc)
6750     return QualType();
6751 
6752   QualType Result
6753     = getDerived().RebuildDependentNameType(T->getKeyword(),
6754                                             TL.getElaboratedKeywordLoc(),
6755                                             QualifierLoc,
6756                                             T->getIdentifier(),
6757                                             TL.getNameLoc(),
6758                                             DeducedTSTContext);
6759   if (Result.isNull())
6760     return QualType();
6761 
6762   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6763     QualType NamedT = ElabT->getNamedType();
6764     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6765 
6766     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6767     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6768     NewTL.setQualifierLoc(QualifierLoc);
6769   } else {
6770     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6771     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6772     NewTL.setQualifierLoc(QualifierLoc);
6773     NewTL.setNameLoc(TL.getNameLoc());
6774   }
6775   return Result;
6776 }
6777 
6778 template<typename Derived>
6779 QualType TreeTransform<Derived>::
6780           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6781                                  DependentTemplateSpecializationTypeLoc TL) {
6782   NestedNameSpecifierLoc QualifierLoc;
6783   if (TL.getQualifierLoc()) {
6784     QualifierLoc
6785       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6786     if (!QualifierLoc)
6787       return QualType();
6788   }
6789 
6790   return getDerived()
6791            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6792 }
6793 
6794 template<typename Derived>
6795 QualType TreeTransform<Derived>::
6796 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6797                                    DependentTemplateSpecializationTypeLoc TL,
6798                                        NestedNameSpecifierLoc QualifierLoc) {
6799   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6800 
6801   TemplateArgumentListInfo NewTemplateArgs;
6802   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6803   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6804 
6805   typedef TemplateArgumentLocContainerIterator<
6806   DependentTemplateSpecializationTypeLoc> ArgIterator;
6807   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6808                                               ArgIterator(TL, TL.getNumArgs()),
6809                                               NewTemplateArgs))
6810     return QualType();
6811 
6812   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6813       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6814       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6815       /*AllowInjectedClassName*/ false);
6816   if (Result.isNull())
6817     return QualType();
6818 
6819   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6820     QualType NamedT = ElabT->getNamedType();
6821 
6822     // Copy information relevant to the template specialization.
6823     TemplateSpecializationTypeLoc NamedTL
6824       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6825     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6826     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6827     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6828     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6829     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6830       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6831 
6832     // Copy information relevant to the elaborated type.
6833     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6834     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6835     NewTL.setQualifierLoc(QualifierLoc);
6836   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6837     DependentTemplateSpecializationTypeLoc SpecTL
6838       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6839     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6840     SpecTL.setQualifierLoc(QualifierLoc);
6841     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6842     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6843     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6844     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6845     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6846       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6847   } else {
6848     TemplateSpecializationTypeLoc SpecTL
6849       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6850     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6851     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6852     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6853     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6854     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6855       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6856   }
6857   return Result;
6858 }
6859 
6860 template<typename Derived>
6861 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6862                                                       PackExpansionTypeLoc TL) {
6863   QualType Pattern
6864     = getDerived().TransformType(TLB, TL.getPatternLoc());
6865   if (Pattern.isNull())
6866     return QualType();
6867 
6868   QualType Result = TL.getType();
6869   if (getDerived().AlwaysRebuild() ||
6870       Pattern != TL.getPatternLoc().getType()) {
6871     Result = getDerived().RebuildPackExpansionType(Pattern,
6872                                            TL.getPatternLoc().getSourceRange(),
6873                                                    TL.getEllipsisLoc(),
6874                                            TL.getTypePtr()->getNumExpansions());
6875     if (Result.isNull())
6876       return QualType();
6877   }
6878 
6879   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6880   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6881   return Result;
6882 }
6883 
6884 template<typename Derived>
6885 QualType
6886 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6887                                                    ObjCInterfaceTypeLoc TL) {
6888   // ObjCInterfaceType is never dependent.
6889   TLB.pushFullCopy(TL);
6890   return TL.getType();
6891 }
6892 
6893 template<typename Derived>
6894 QualType
6895 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6896                                                    ObjCTypeParamTypeLoc TL) {
6897   const ObjCTypeParamType *T = TL.getTypePtr();
6898   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6899       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6900   if (!OTP)
6901     return QualType();
6902 
6903   QualType Result = TL.getType();
6904   if (getDerived().AlwaysRebuild() ||
6905       OTP != T->getDecl()) {
6906     Result = getDerived().RebuildObjCTypeParamType(OTP,
6907                  TL.getProtocolLAngleLoc(),
6908                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6909                                     TL.getNumProtocols()),
6910                  TL.getProtocolLocs(),
6911                  TL.getProtocolRAngleLoc());
6912     if (Result.isNull())
6913       return QualType();
6914   }
6915 
6916   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6917   if (TL.getNumProtocols()) {
6918     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6919     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6920       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6921     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6922   }
6923   return Result;
6924 }
6925 
6926 template<typename Derived>
6927 QualType
6928 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6929                                                 ObjCObjectTypeLoc TL) {
6930   // Transform base type.
6931   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6932   if (BaseType.isNull())
6933     return QualType();
6934 
6935   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6936 
6937   // Transform type arguments.
6938   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6939   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6940     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6941     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6942     QualType TypeArg = TypeArgInfo->getType();
6943     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6944       AnyChanged = true;
6945 
6946       // We have a pack expansion. Instantiate it.
6947       const auto *PackExpansion = PackExpansionLoc.getType()
6948                                     ->castAs<PackExpansionType>();
6949       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6950       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6951                                               Unexpanded);
6952       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6953 
6954       // Determine whether the set of unexpanded parameter packs can
6955       // and should be expanded.
6956       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6957       bool Expand = false;
6958       bool RetainExpansion = false;
6959       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6960       if (getDerived().TryExpandParameterPacks(
6961             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6962             Unexpanded, Expand, RetainExpansion, NumExpansions))
6963         return QualType();
6964 
6965       if (!Expand) {
6966         // We can't expand this pack expansion into separate arguments yet;
6967         // just substitute into the pattern and create a new pack expansion
6968         // type.
6969         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6970 
6971         TypeLocBuilder TypeArgBuilder;
6972         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6973         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6974                                                              PatternLoc);
6975         if (NewPatternType.isNull())
6976           return QualType();
6977 
6978         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6979                                       NewPatternType, NumExpansions);
6980         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6981         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6982         NewTypeArgInfos.push_back(
6983           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6984         continue;
6985       }
6986 
6987       // Substitute into the pack expansion pattern for each slice of the
6988       // pack.
6989       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6990         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6991 
6992         TypeLocBuilder TypeArgBuilder;
6993         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6994 
6995         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6996                                                          PatternLoc);
6997         if (NewTypeArg.isNull())
6998           return QualType();
6999 
7000         NewTypeArgInfos.push_back(
7001           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7002       }
7003 
7004       continue;
7005     }
7006 
7007     TypeLocBuilder TypeArgBuilder;
7008     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7009     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7010     if (NewTypeArg.isNull())
7011       return QualType();
7012 
7013     // If nothing changed, just keep the old TypeSourceInfo.
7014     if (NewTypeArg == TypeArg) {
7015       NewTypeArgInfos.push_back(TypeArgInfo);
7016       continue;
7017     }
7018 
7019     NewTypeArgInfos.push_back(
7020       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7021     AnyChanged = true;
7022   }
7023 
7024   QualType Result = TL.getType();
7025   if (getDerived().AlwaysRebuild() || AnyChanged) {
7026     // Rebuild the type.
7027     Result = getDerived().RebuildObjCObjectType(
7028         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7029         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7030         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7031         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7032 
7033     if (Result.isNull())
7034       return QualType();
7035   }
7036 
7037   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7038   NewT.setHasBaseTypeAsWritten(true);
7039   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7040   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7041     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7042   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7043   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7044   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7045     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7046   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7047   return Result;
7048 }
7049 
7050 template<typename Derived>
7051 QualType
7052 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7053                                                ObjCObjectPointerTypeLoc TL) {
7054   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7055   if (PointeeType.isNull())
7056     return QualType();
7057 
7058   QualType Result = TL.getType();
7059   if (getDerived().AlwaysRebuild() ||
7060       PointeeType != TL.getPointeeLoc().getType()) {
7061     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7062                                                        TL.getStarLoc());
7063     if (Result.isNull())
7064       return QualType();
7065   }
7066 
7067   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7068   NewT.setStarLoc(TL.getStarLoc());
7069   return Result;
7070 }
7071 
7072 //===----------------------------------------------------------------------===//
7073 // Statement transformation
7074 //===----------------------------------------------------------------------===//
7075 template<typename Derived>
7076 StmtResult
7077 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7078   return S;
7079 }
7080 
7081 template<typename Derived>
7082 StmtResult
7083 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7084   return getDerived().TransformCompoundStmt(S, false);
7085 }
7086 
7087 template<typename Derived>
7088 StmtResult
7089 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7090                                               bool IsStmtExpr) {
7091   Sema::CompoundScopeRAII CompoundScope(getSema());
7092 
7093   const Stmt *ExprResult = S->getStmtExprResult();
7094   bool SubStmtInvalid = false;
7095   bool SubStmtChanged = false;
7096   SmallVector<Stmt*, 8> Statements;
7097   for (auto *B : S->body()) {
7098     StmtResult Result = getDerived().TransformStmt(
7099         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7100 
7101     if (Result.isInvalid()) {
7102       // Immediately fail if this was a DeclStmt, since it's very
7103       // likely that this will cause problems for future statements.
7104       if (isa<DeclStmt>(B))
7105         return StmtError();
7106 
7107       // Otherwise, just keep processing substatements and fail later.
7108       SubStmtInvalid = true;
7109       continue;
7110     }
7111 
7112     SubStmtChanged = SubStmtChanged || Result.get() != B;
7113     Statements.push_back(Result.getAs<Stmt>());
7114   }
7115 
7116   if (SubStmtInvalid)
7117     return StmtError();
7118 
7119   if (!getDerived().AlwaysRebuild() &&
7120       !SubStmtChanged)
7121     return S;
7122 
7123   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7124                                           Statements,
7125                                           S->getRBracLoc(),
7126                                           IsStmtExpr);
7127 }
7128 
7129 template<typename Derived>
7130 StmtResult
7131 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7132   ExprResult LHS, RHS;
7133   {
7134     EnterExpressionEvaluationContext Unevaluated(
7135         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7136 
7137     // Transform the left-hand case value.
7138     LHS = getDerived().TransformExpr(S->getLHS());
7139     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7140     if (LHS.isInvalid())
7141       return StmtError();
7142 
7143     // Transform the right-hand case value (for the GNU case-range extension).
7144     RHS = getDerived().TransformExpr(S->getRHS());
7145     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7146     if (RHS.isInvalid())
7147       return StmtError();
7148   }
7149 
7150   // Build the case statement.
7151   // Case statements are always rebuilt so that they will attached to their
7152   // transformed switch statement.
7153   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7154                                                        LHS.get(),
7155                                                        S->getEllipsisLoc(),
7156                                                        RHS.get(),
7157                                                        S->getColonLoc());
7158   if (Case.isInvalid())
7159     return StmtError();
7160 
7161   // Transform the statement following the case
7162   StmtResult SubStmt =
7163       getDerived().TransformStmt(S->getSubStmt());
7164   if (SubStmt.isInvalid())
7165     return StmtError();
7166 
7167   // Attach the body to the case statement
7168   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7169 }
7170 
7171 template <typename Derived>
7172 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7173   // Transform the statement following the default case
7174   StmtResult SubStmt =
7175       getDerived().TransformStmt(S->getSubStmt());
7176   if (SubStmt.isInvalid())
7177     return StmtError();
7178 
7179   // Default statements are always rebuilt
7180   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7181                                          SubStmt.get());
7182 }
7183 
7184 template<typename Derived>
7185 StmtResult
7186 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7187   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7188   if (SubStmt.isInvalid())
7189     return StmtError();
7190 
7191   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7192                                         S->getDecl());
7193   if (!LD)
7194     return StmtError();
7195 
7196   // If we're transforming "in-place" (we're not creating new local
7197   // declarations), assume we're replacing the old label statement
7198   // and clear out the reference to it.
7199   if (LD == S->getDecl())
7200     S->getDecl()->setStmt(nullptr);
7201 
7202   // FIXME: Pass the real colon location in.
7203   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7204                                        cast<LabelDecl>(LD), SourceLocation(),
7205                                        SubStmt.get());
7206 }
7207 
7208 template <typename Derived>
7209 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7210   if (!R)
7211     return R;
7212 
7213   switch (R->getKind()) {
7214 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7215 #define ATTR(X)
7216 #define PRAGMA_SPELLING_ATTR(X)                                                \
7217   case attr::X:                                                                \
7218     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7219 #include "clang/Basic/AttrList.inc"
7220   default:
7221     return R;
7222   }
7223 }
7224 
7225 template <typename Derived>
7226 StmtResult
7227 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7228                                                 StmtDiscardKind SDK) {
7229   bool AttrsChanged = false;
7230   SmallVector<const Attr *, 1> Attrs;
7231 
7232   // Visit attributes and keep track if any are transformed.
7233   for (const auto *I : S->getAttrs()) {
7234     const Attr *R = getDerived().TransformAttr(I);
7235     AttrsChanged |= (I != R);
7236     Attrs.push_back(R);
7237   }
7238 
7239   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7240   if (SubStmt.isInvalid())
7241     return StmtError();
7242 
7243   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7244     return S;
7245 
7246   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7247                                             SubStmt.get());
7248 }
7249 
7250 template<typename Derived>
7251 StmtResult
7252 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7253   // Transform the initialization statement
7254   StmtResult Init = getDerived().TransformStmt(S->getInit());
7255   if (Init.isInvalid())
7256     return StmtError();
7257 
7258   // Transform the condition
7259   Sema::ConditionResult Cond = getDerived().TransformCondition(
7260       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7261       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7262                        : Sema::ConditionKind::Boolean);
7263   if (Cond.isInvalid())
7264     return StmtError();
7265 
7266   // If this is a constexpr if, determine which arm we should instantiate.
7267   llvm::Optional<bool> ConstexprConditionValue;
7268   if (S->isConstexpr())
7269     ConstexprConditionValue = Cond.getKnownValue();
7270 
7271   // Transform the "then" branch.
7272   StmtResult Then;
7273   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7274     Then = getDerived().TransformStmt(S->getThen());
7275     if (Then.isInvalid())
7276       return StmtError();
7277   } else {
7278     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7279   }
7280 
7281   // Transform the "else" branch.
7282   StmtResult Else;
7283   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7284     Else = getDerived().TransformStmt(S->getElse());
7285     if (Else.isInvalid())
7286       return StmtError();
7287   }
7288 
7289   if (!getDerived().AlwaysRebuild() &&
7290       Init.get() == S->getInit() &&
7291       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7292       Then.get() == S->getThen() &&
7293       Else.get() == S->getElse())
7294     return S;
7295 
7296   return getDerived().RebuildIfStmt(
7297       S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond,
7298       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7299 }
7300 
7301 template<typename Derived>
7302 StmtResult
7303 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7304   // Transform the initialization statement
7305   StmtResult Init = getDerived().TransformStmt(S->getInit());
7306   if (Init.isInvalid())
7307     return StmtError();
7308 
7309   // Transform the condition.
7310   Sema::ConditionResult Cond = getDerived().TransformCondition(
7311       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7312       Sema::ConditionKind::Switch);
7313   if (Cond.isInvalid())
7314     return StmtError();
7315 
7316   // Rebuild the switch statement.
7317   StmtResult Switch =
7318       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7319                                           Init.get(), Cond, S->getRParenLoc());
7320   if (Switch.isInvalid())
7321     return StmtError();
7322 
7323   // Transform the body of the switch statement.
7324   StmtResult Body = getDerived().TransformStmt(S->getBody());
7325   if (Body.isInvalid())
7326     return StmtError();
7327 
7328   // Complete the switch statement.
7329   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7330                                             Body.get());
7331 }
7332 
7333 template<typename Derived>
7334 StmtResult
7335 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7336   // Transform the condition
7337   Sema::ConditionResult Cond = getDerived().TransformCondition(
7338       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7339       Sema::ConditionKind::Boolean);
7340   if (Cond.isInvalid())
7341     return StmtError();
7342 
7343   // Transform the body
7344   StmtResult Body = getDerived().TransformStmt(S->getBody());
7345   if (Body.isInvalid())
7346     return StmtError();
7347 
7348   if (!getDerived().AlwaysRebuild() &&
7349       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7350       Body.get() == S->getBody())
7351     return Owned(S);
7352 
7353   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7354                                        Cond, S->getRParenLoc(), Body.get());
7355 }
7356 
7357 template<typename Derived>
7358 StmtResult
7359 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7360   // Transform the body
7361   StmtResult Body = getDerived().TransformStmt(S->getBody());
7362   if (Body.isInvalid())
7363     return StmtError();
7364 
7365   // Transform the condition
7366   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7367   if (Cond.isInvalid())
7368     return StmtError();
7369 
7370   if (!getDerived().AlwaysRebuild() &&
7371       Cond.get() == S->getCond() &&
7372       Body.get() == S->getBody())
7373     return S;
7374 
7375   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7376                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7377                                     S->getRParenLoc());
7378 }
7379 
7380 template<typename Derived>
7381 StmtResult
7382 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7383   if (getSema().getLangOpts().OpenMP)
7384     getSema().startOpenMPLoop();
7385 
7386   // Transform the initialization statement
7387   StmtResult Init = getDerived().TransformStmt(S->getInit());
7388   if (Init.isInvalid())
7389     return StmtError();
7390 
7391   // In OpenMP loop region loop control variable must be captured and be
7392   // private. Perform analysis of first part (if any).
7393   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7394     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7395 
7396   // Transform the condition
7397   Sema::ConditionResult Cond = getDerived().TransformCondition(
7398       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7399       Sema::ConditionKind::Boolean);
7400   if (Cond.isInvalid())
7401     return StmtError();
7402 
7403   // Transform the increment
7404   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7405   if (Inc.isInvalid())
7406     return StmtError();
7407 
7408   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7409   if (S->getInc() && !FullInc.get())
7410     return StmtError();
7411 
7412   // Transform the body
7413   StmtResult Body = getDerived().TransformStmt(S->getBody());
7414   if (Body.isInvalid())
7415     return StmtError();
7416 
7417   if (!getDerived().AlwaysRebuild() &&
7418       Init.get() == S->getInit() &&
7419       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7420       Inc.get() == S->getInc() &&
7421       Body.get() == S->getBody())
7422     return S;
7423 
7424   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7425                                      Init.get(), Cond, FullInc,
7426                                      S->getRParenLoc(), Body.get());
7427 }
7428 
7429 template<typename Derived>
7430 StmtResult
7431 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7432   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7433                                         S->getLabel());
7434   if (!LD)
7435     return StmtError();
7436 
7437   // Goto statements must always be rebuilt, to resolve the label.
7438   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7439                                       cast<LabelDecl>(LD));
7440 }
7441 
7442 template<typename Derived>
7443 StmtResult
7444 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7445   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7446   if (Target.isInvalid())
7447     return StmtError();
7448   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7449 
7450   if (!getDerived().AlwaysRebuild() &&
7451       Target.get() == S->getTarget())
7452     return S;
7453 
7454   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7455                                               Target.get());
7456 }
7457 
7458 template<typename Derived>
7459 StmtResult
7460 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7461   return S;
7462 }
7463 
7464 template<typename Derived>
7465 StmtResult
7466 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7467   return S;
7468 }
7469 
7470 template<typename Derived>
7471 StmtResult
7472 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7473   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7474                                                         /*NotCopyInit*/false);
7475   if (Result.isInvalid())
7476     return StmtError();
7477 
7478   // FIXME: We always rebuild the return statement because there is no way
7479   // to tell whether the return type of the function has changed.
7480   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7481 }
7482 
7483 template<typename Derived>
7484 StmtResult
7485 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7486   bool DeclChanged = false;
7487   SmallVector<Decl *, 4> Decls;
7488   for (auto *D : S->decls()) {
7489     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7490     if (!Transformed)
7491       return StmtError();
7492 
7493     if (Transformed != D)
7494       DeclChanged = true;
7495 
7496     Decls.push_back(Transformed);
7497   }
7498 
7499   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7500     return S;
7501 
7502   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7503 }
7504 
7505 template<typename Derived>
7506 StmtResult
7507 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7508 
7509   SmallVector<Expr*, 8> Constraints;
7510   SmallVector<Expr*, 8> Exprs;
7511   SmallVector<IdentifierInfo *, 4> Names;
7512 
7513   ExprResult AsmString;
7514   SmallVector<Expr*, 8> Clobbers;
7515 
7516   bool ExprsChanged = false;
7517 
7518   // Go through the outputs.
7519   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7520     Names.push_back(S->getOutputIdentifier(I));
7521 
7522     // No need to transform the constraint literal.
7523     Constraints.push_back(S->getOutputConstraintLiteral(I));
7524 
7525     // Transform the output expr.
7526     Expr *OutputExpr = S->getOutputExpr(I);
7527     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7528     if (Result.isInvalid())
7529       return StmtError();
7530 
7531     ExprsChanged |= Result.get() != OutputExpr;
7532 
7533     Exprs.push_back(Result.get());
7534   }
7535 
7536   // Go through the inputs.
7537   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7538     Names.push_back(S->getInputIdentifier(I));
7539 
7540     // No need to transform the constraint literal.
7541     Constraints.push_back(S->getInputConstraintLiteral(I));
7542 
7543     // Transform the input expr.
7544     Expr *InputExpr = S->getInputExpr(I);
7545     ExprResult Result = getDerived().TransformExpr(InputExpr);
7546     if (Result.isInvalid())
7547       return StmtError();
7548 
7549     ExprsChanged |= Result.get() != InputExpr;
7550 
7551     Exprs.push_back(Result.get());
7552   }
7553 
7554   // Go through the Labels.
7555   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7556     Names.push_back(S->getLabelIdentifier(I));
7557 
7558     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7559     if (Result.isInvalid())
7560       return StmtError();
7561     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7562     Exprs.push_back(Result.get());
7563   }
7564   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7565     return S;
7566 
7567   // Go through the clobbers.
7568   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7569     Clobbers.push_back(S->getClobberStringLiteral(I));
7570 
7571   // No need to transform the asm string literal.
7572   AsmString = S->getAsmString();
7573   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7574                                         S->isVolatile(), S->getNumOutputs(),
7575                                         S->getNumInputs(), Names.data(),
7576                                         Constraints, Exprs, AsmString.get(),
7577                                         Clobbers, S->getNumLabels(),
7578                                         S->getRParenLoc());
7579 }
7580 
7581 template<typename Derived>
7582 StmtResult
7583 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7584   ArrayRef<Token> AsmToks =
7585     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7586 
7587   bool HadError = false, HadChange = false;
7588 
7589   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7590   SmallVector<Expr*, 8> TransformedExprs;
7591   TransformedExprs.reserve(SrcExprs.size());
7592   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7593     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7594     if (!Result.isUsable()) {
7595       HadError = true;
7596     } else {
7597       HadChange |= (Result.get() != SrcExprs[i]);
7598       TransformedExprs.push_back(Result.get());
7599     }
7600   }
7601 
7602   if (HadError) return StmtError();
7603   if (!HadChange && !getDerived().AlwaysRebuild())
7604     return Owned(S);
7605 
7606   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7607                                        AsmToks, S->getAsmString(),
7608                                        S->getNumOutputs(), S->getNumInputs(),
7609                                        S->getAllConstraints(), S->getClobbers(),
7610                                        TransformedExprs, S->getEndLoc());
7611 }
7612 
7613 // C++ Coroutines TS
7614 
7615 template<typename Derived>
7616 StmtResult
7617 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7618   auto *ScopeInfo = SemaRef.getCurFunction();
7619   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7620   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7621          ScopeInfo->NeedsCoroutineSuspends &&
7622          ScopeInfo->CoroutineSuspends.first == nullptr &&
7623          ScopeInfo->CoroutineSuspends.second == nullptr &&
7624          "expected clean scope info");
7625 
7626   // Set that we have (possibly-invalid) suspend points before we do anything
7627   // that may fail.
7628   ScopeInfo->setNeedsCoroutineSuspends(false);
7629 
7630   // We re-build the coroutine promise object (and the coroutine parameters its
7631   // type and constructor depend on) based on the types used in our current
7632   // function. We must do so, and set it on the current FunctionScopeInfo,
7633   // before attempting to transform the other parts of the coroutine body
7634   // statement, such as the implicit suspend statements (because those
7635   // statements reference the FunctionScopeInfo::CoroutinePromise).
7636   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7637     return StmtError();
7638   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7639   if (!Promise)
7640     return StmtError();
7641   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7642   ScopeInfo->CoroutinePromise = Promise;
7643 
7644   // Transform the implicit coroutine statements constructed using dependent
7645   // types during the previous parse: initial and final suspensions, the return
7646   // object, and others. We also transform the coroutine function's body.
7647   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7648   if (InitSuspend.isInvalid())
7649     return StmtError();
7650   StmtResult FinalSuspend =
7651       getDerived().TransformStmt(S->getFinalSuspendStmt());
7652   if (FinalSuspend.isInvalid() ||
7653       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7654     return StmtError();
7655   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7656   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7657 
7658   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7659   if (BodyRes.isInvalid())
7660     return StmtError();
7661 
7662   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7663   if (Builder.isInvalid())
7664     return StmtError();
7665 
7666   Expr *ReturnObject = S->getReturnValueInit();
7667   assert(ReturnObject && "the return object is expected to be valid");
7668   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7669                                                      /*NoCopyInit*/ false);
7670   if (Res.isInvalid())
7671     return StmtError();
7672   Builder.ReturnValue = Res.get();
7673 
7674   // If during the previous parse the coroutine still had a dependent promise
7675   // statement, we may need to build some implicit coroutine statements
7676   // (such as exception and fallthrough handlers) for the first time.
7677   if (S->hasDependentPromiseType()) {
7678     // We can only build these statements, however, if the current promise type
7679     // is not dependent.
7680     if (!Promise->getType()->isDependentType()) {
7681       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7682              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7683              "these nodes should not have been built yet");
7684       if (!Builder.buildDependentStatements())
7685         return StmtError();
7686     }
7687   } else {
7688     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7689       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7690       if (Res.isInvalid())
7691         return StmtError();
7692       Builder.OnFallthrough = Res.get();
7693     }
7694 
7695     if (auto *OnException = S->getExceptionHandler()) {
7696       StmtResult Res = getDerived().TransformStmt(OnException);
7697       if (Res.isInvalid())
7698         return StmtError();
7699       Builder.OnException = Res.get();
7700     }
7701 
7702     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7703       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7704       if (Res.isInvalid())
7705         return StmtError();
7706       Builder.ReturnStmtOnAllocFailure = Res.get();
7707     }
7708 
7709     // Transform any additional statements we may have already built
7710     assert(S->getAllocate() && S->getDeallocate() &&
7711            "allocation and deallocation calls must already be built");
7712     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7713     if (AllocRes.isInvalid())
7714       return StmtError();
7715     Builder.Allocate = AllocRes.get();
7716 
7717     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7718     if (DeallocRes.isInvalid())
7719       return StmtError();
7720     Builder.Deallocate = DeallocRes.get();
7721 
7722     assert(S->getResultDecl() && "ResultDecl must already be built");
7723     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7724     if (ResultDecl.isInvalid())
7725       return StmtError();
7726     Builder.ResultDecl = ResultDecl.get();
7727 
7728     if (auto *ReturnStmt = S->getReturnStmt()) {
7729       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7730       if (Res.isInvalid())
7731         return StmtError();
7732       Builder.ReturnStmt = Res.get();
7733     }
7734   }
7735 
7736   return getDerived().RebuildCoroutineBodyStmt(Builder);
7737 }
7738 
7739 template<typename Derived>
7740 StmtResult
7741 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7742   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7743                                                         /*NotCopyInit*/false);
7744   if (Result.isInvalid())
7745     return StmtError();
7746 
7747   // Always rebuild; we don't know if this needs to be injected into a new
7748   // context or if the promise type has changed.
7749   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7750                                           S->isImplicit());
7751 }
7752 
7753 template<typename Derived>
7754 ExprResult
7755 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7756   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7757                                                         /*NotCopyInit*/false);
7758   if (Result.isInvalid())
7759     return ExprError();
7760 
7761   // Always rebuild; we don't know if this needs to be injected into a new
7762   // context or if the promise type has changed.
7763   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7764                                          E->isImplicit());
7765 }
7766 
7767 template <typename Derived>
7768 ExprResult
7769 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7770   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7771                                                         /*NotCopyInit*/ false);
7772   if (OperandResult.isInvalid())
7773     return ExprError();
7774 
7775   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7776           E->getOperatorCoawaitLookup());
7777 
7778   if (LookupResult.isInvalid())
7779     return ExprError();
7780 
7781   // Always rebuild; we don't know if this needs to be injected into a new
7782   // context or if the promise type has changed.
7783   return getDerived().RebuildDependentCoawaitExpr(
7784       E->getKeywordLoc(), OperandResult.get(),
7785       cast<UnresolvedLookupExpr>(LookupResult.get()));
7786 }
7787 
7788 template<typename Derived>
7789 ExprResult
7790 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7791   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7792                                                         /*NotCopyInit*/false);
7793   if (Result.isInvalid())
7794     return ExprError();
7795 
7796   // Always rebuild; we don't know if this needs to be injected into a new
7797   // context or if the promise type has changed.
7798   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7799 }
7800 
7801 // Objective-C Statements.
7802 
7803 template<typename Derived>
7804 StmtResult
7805 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7806   // Transform the body of the @try.
7807   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7808   if (TryBody.isInvalid())
7809     return StmtError();
7810 
7811   // Transform the @catch statements (if present).
7812   bool AnyCatchChanged = false;
7813   SmallVector<Stmt*, 8> CatchStmts;
7814   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7815     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7816     if (Catch.isInvalid())
7817       return StmtError();
7818     if (Catch.get() != S->getCatchStmt(I))
7819       AnyCatchChanged = true;
7820     CatchStmts.push_back(Catch.get());
7821   }
7822 
7823   // Transform the @finally statement (if present).
7824   StmtResult Finally;
7825   if (S->getFinallyStmt()) {
7826     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7827     if (Finally.isInvalid())
7828       return StmtError();
7829   }
7830 
7831   // If nothing changed, just retain this statement.
7832   if (!getDerived().AlwaysRebuild() &&
7833       TryBody.get() == S->getTryBody() &&
7834       !AnyCatchChanged &&
7835       Finally.get() == S->getFinallyStmt())
7836     return S;
7837 
7838   // Build a new statement.
7839   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7840                                            CatchStmts, Finally.get());
7841 }
7842 
7843 template<typename Derived>
7844 StmtResult
7845 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7846   // Transform the @catch parameter, if there is one.
7847   VarDecl *Var = nullptr;
7848   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7849     TypeSourceInfo *TSInfo = nullptr;
7850     if (FromVar->getTypeSourceInfo()) {
7851       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7852       if (!TSInfo)
7853         return StmtError();
7854     }
7855 
7856     QualType T;
7857     if (TSInfo)
7858       T = TSInfo->getType();
7859     else {
7860       T = getDerived().TransformType(FromVar->getType());
7861       if (T.isNull())
7862         return StmtError();
7863     }
7864 
7865     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7866     if (!Var)
7867       return StmtError();
7868   }
7869 
7870   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7871   if (Body.isInvalid())
7872     return StmtError();
7873 
7874   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7875                                              S->getRParenLoc(),
7876                                              Var, Body.get());
7877 }
7878 
7879 template<typename Derived>
7880 StmtResult
7881 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7882   // Transform the body.
7883   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7884   if (Body.isInvalid())
7885     return StmtError();
7886 
7887   // If nothing changed, just retain this statement.
7888   if (!getDerived().AlwaysRebuild() &&
7889       Body.get() == S->getFinallyBody())
7890     return S;
7891 
7892   // Build a new statement.
7893   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7894                                                Body.get());
7895 }
7896 
7897 template<typename Derived>
7898 StmtResult
7899 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7900   ExprResult Operand;
7901   if (S->getThrowExpr()) {
7902     Operand = getDerived().TransformExpr(S->getThrowExpr());
7903     if (Operand.isInvalid())
7904       return StmtError();
7905   }
7906 
7907   if (!getDerived().AlwaysRebuild() &&
7908       Operand.get() == S->getThrowExpr())
7909     return S;
7910 
7911   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7912 }
7913 
7914 template<typename Derived>
7915 StmtResult
7916 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7917                                                   ObjCAtSynchronizedStmt *S) {
7918   // Transform the object we are locking.
7919   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7920   if (Object.isInvalid())
7921     return StmtError();
7922   Object =
7923     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7924                                                   Object.get());
7925   if (Object.isInvalid())
7926     return StmtError();
7927 
7928   // Transform the body.
7929   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7930   if (Body.isInvalid())
7931     return StmtError();
7932 
7933   // If nothing change, just retain the current statement.
7934   if (!getDerived().AlwaysRebuild() &&
7935       Object.get() == S->getSynchExpr() &&
7936       Body.get() == S->getSynchBody())
7937     return S;
7938 
7939   // Build a new statement.
7940   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7941                                                     Object.get(), Body.get());
7942 }
7943 
7944 template<typename Derived>
7945 StmtResult
7946 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7947                                               ObjCAutoreleasePoolStmt *S) {
7948   // Transform the body.
7949   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7950   if (Body.isInvalid())
7951     return StmtError();
7952 
7953   // If nothing changed, just retain this statement.
7954   if (!getDerived().AlwaysRebuild() &&
7955       Body.get() == S->getSubStmt())
7956     return S;
7957 
7958   // Build a new statement.
7959   return getDerived().RebuildObjCAutoreleasePoolStmt(
7960                         S->getAtLoc(), Body.get());
7961 }
7962 
7963 template<typename Derived>
7964 StmtResult
7965 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7966                                                   ObjCForCollectionStmt *S) {
7967   // Transform the element statement.
7968   StmtResult Element =
7969       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7970   if (Element.isInvalid())
7971     return StmtError();
7972 
7973   // Transform the collection expression.
7974   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7975   if (Collection.isInvalid())
7976     return StmtError();
7977 
7978   // Transform the body.
7979   StmtResult Body = getDerived().TransformStmt(S->getBody());
7980   if (Body.isInvalid())
7981     return StmtError();
7982 
7983   // If nothing changed, just retain this statement.
7984   if (!getDerived().AlwaysRebuild() &&
7985       Element.get() == S->getElement() &&
7986       Collection.get() == S->getCollection() &&
7987       Body.get() == S->getBody())
7988     return S;
7989 
7990   // Build a new statement.
7991   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7992                                                    Element.get(),
7993                                                    Collection.get(),
7994                                                    S->getRParenLoc(),
7995                                                    Body.get());
7996 }
7997 
7998 template <typename Derived>
7999 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8000   // Transform the exception declaration, if any.
8001   VarDecl *Var = nullptr;
8002   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8003     TypeSourceInfo *T =
8004         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8005     if (!T)
8006       return StmtError();
8007 
8008     Var = getDerived().RebuildExceptionDecl(
8009         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8010         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8011     if (!Var || Var->isInvalidDecl())
8012       return StmtError();
8013   }
8014 
8015   // Transform the actual exception handler.
8016   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8017   if (Handler.isInvalid())
8018     return StmtError();
8019 
8020   if (!getDerived().AlwaysRebuild() && !Var &&
8021       Handler.get() == S->getHandlerBlock())
8022     return S;
8023 
8024   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8025 }
8026 
8027 template <typename Derived>
8028 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8029   // Transform the try block itself.
8030   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8031   if (TryBlock.isInvalid())
8032     return StmtError();
8033 
8034   // Transform the handlers.
8035   bool HandlerChanged = false;
8036   SmallVector<Stmt *, 8> Handlers;
8037   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8038     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8039     if (Handler.isInvalid())
8040       return StmtError();
8041 
8042     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8043     Handlers.push_back(Handler.getAs<Stmt>());
8044   }
8045 
8046   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8047       !HandlerChanged)
8048     return S;
8049 
8050   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8051                                         Handlers);
8052 }
8053 
8054 template<typename Derived>
8055 StmtResult
8056 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8057   StmtResult Init =
8058       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8059   if (Init.isInvalid())
8060     return StmtError();
8061 
8062   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8063   if (Range.isInvalid())
8064     return StmtError();
8065 
8066   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8067   if (Begin.isInvalid())
8068     return StmtError();
8069   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8070   if (End.isInvalid())
8071     return StmtError();
8072 
8073   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8074   if (Cond.isInvalid())
8075     return StmtError();
8076   if (Cond.get())
8077     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8078   if (Cond.isInvalid())
8079     return StmtError();
8080   if (Cond.get())
8081     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8082 
8083   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8084   if (Inc.isInvalid())
8085     return StmtError();
8086   if (Inc.get())
8087     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8088 
8089   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8090   if (LoopVar.isInvalid())
8091     return StmtError();
8092 
8093   StmtResult NewStmt = S;
8094   if (getDerived().AlwaysRebuild() ||
8095       Init.get() != S->getInit() ||
8096       Range.get() != S->getRangeStmt() ||
8097       Begin.get() != S->getBeginStmt() ||
8098       End.get() != S->getEndStmt() ||
8099       Cond.get() != S->getCond() ||
8100       Inc.get() != S->getInc() ||
8101       LoopVar.get() != S->getLoopVarStmt()) {
8102     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8103                                                   S->getCoawaitLoc(), Init.get(),
8104                                                   S->getColonLoc(), Range.get(),
8105                                                   Begin.get(), End.get(),
8106                                                   Cond.get(),
8107                                                   Inc.get(), LoopVar.get(),
8108                                                   S->getRParenLoc());
8109     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8110       // Might not have attached any initializer to the loop variable.
8111       getSema().ActOnInitializerError(
8112           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8113       return StmtError();
8114     }
8115   }
8116 
8117   StmtResult Body = getDerived().TransformStmt(S->getBody());
8118   if (Body.isInvalid())
8119     return StmtError();
8120 
8121   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8122   // it now so we have a new statement to attach the body to.
8123   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8124     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8125                                                   S->getCoawaitLoc(), Init.get(),
8126                                                   S->getColonLoc(), Range.get(),
8127                                                   Begin.get(), End.get(),
8128                                                   Cond.get(),
8129                                                   Inc.get(), LoopVar.get(),
8130                                                   S->getRParenLoc());
8131     if (NewStmt.isInvalid())
8132       return StmtError();
8133   }
8134 
8135   if (NewStmt.get() == S)
8136     return S;
8137 
8138   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8139 }
8140 
8141 template<typename Derived>
8142 StmtResult
8143 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8144                                                     MSDependentExistsStmt *S) {
8145   // Transform the nested-name-specifier, if any.
8146   NestedNameSpecifierLoc QualifierLoc;
8147   if (S->getQualifierLoc()) {
8148     QualifierLoc
8149       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8150     if (!QualifierLoc)
8151       return StmtError();
8152   }
8153 
8154   // Transform the declaration name.
8155   DeclarationNameInfo NameInfo = S->getNameInfo();
8156   if (NameInfo.getName()) {
8157     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8158     if (!NameInfo.getName())
8159       return StmtError();
8160   }
8161 
8162   // Check whether anything changed.
8163   if (!getDerived().AlwaysRebuild() &&
8164       QualifierLoc == S->getQualifierLoc() &&
8165       NameInfo.getName() == S->getNameInfo().getName())
8166     return S;
8167 
8168   // Determine whether this name exists, if we can.
8169   CXXScopeSpec SS;
8170   SS.Adopt(QualifierLoc);
8171   bool Dependent = false;
8172   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8173   case Sema::IER_Exists:
8174     if (S->isIfExists())
8175       break;
8176 
8177     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8178 
8179   case Sema::IER_DoesNotExist:
8180     if (S->isIfNotExists())
8181       break;
8182 
8183     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8184 
8185   case Sema::IER_Dependent:
8186     Dependent = true;
8187     break;
8188 
8189   case Sema::IER_Error:
8190     return StmtError();
8191   }
8192 
8193   // We need to continue with the instantiation, so do so now.
8194   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8195   if (SubStmt.isInvalid())
8196     return StmtError();
8197 
8198   // If we have resolved the name, just transform to the substatement.
8199   if (!Dependent)
8200     return SubStmt;
8201 
8202   // The name is still dependent, so build a dependent expression again.
8203   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8204                                                    S->isIfExists(),
8205                                                    QualifierLoc,
8206                                                    NameInfo,
8207                                                    SubStmt.get());
8208 }
8209 
8210 template<typename Derived>
8211 ExprResult
8212 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8213   NestedNameSpecifierLoc QualifierLoc;
8214   if (E->getQualifierLoc()) {
8215     QualifierLoc
8216     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8217     if (!QualifierLoc)
8218       return ExprError();
8219   }
8220 
8221   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8222     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8223   if (!PD)
8224     return ExprError();
8225 
8226   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8227   if (Base.isInvalid())
8228     return ExprError();
8229 
8230   return new (SemaRef.getASTContext())
8231       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8232                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8233                         QualifierLoc, E->getMemberLoc());
8234 }
8235 
8236 template <typename Derived>
8237 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8238     MSPropertySubscriptExpr *E) {
8239   auto BaseRes = getDerived().TransformExpr(E->getBase());
8240   if (BaseRes.isInvalid())
8241     return ExprError();
8242   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8243   if (IdxRes.isInvalid())
8244     return ExprError();
8245 
8246   if (!getDerived().AlwaysRebuild() &&
8247       BaseRes.get() == E->getBase() &&
8248       IdxRes.get() == E->getIdx())
8249     return E;
8250 
8251   return getDerived().RebuildArraySubscriptExpr(
8252       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8253 }
8254 
8255 template <typename Derived>
8256 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8257   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8258   if (TryBlock.isInvalid())
8259     return StmtError();
8260 
8261   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8262   if (Handler.isInvalid())
8263     return StmtError();
8264 
8265   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8266       Handler.get() == S->getHandler())
8267     return S;
8268 
8269   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8270                                         TryBlock.get(), Handler.get());
8271 }
8272 
8273 template <typename Derived>
8274 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8275   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8276   if (Block.isInvalid())
8277     return StmtError();
8278 
8279   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8280 }
8281 
8282 template <typename Derived>
8283 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8284   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8285   if (FilterExpr.isInvalid())
8286     return StmtError();
8287 
8288   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8289   if (Block.isInvalid())
8290     return StmtError();
8291 
8292   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8293                                            Block.get());
8294 }
8295 
8296 template <typename Derived>
8297 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8298   if (isa<SEHFinallyStmt>(Handler))
8299     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8300   else
8301     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8302 }
8303 
8304 template<typename Derived>
8305 StmtResult
8306 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8307   return S;
8308 }
8309 
8310 //===----------------------------------------------------------------------===//
8311 // OpenMP directive transformation
8312 //===----------------------------------------------------------------------===//
8313 template <typename Derived>
8314 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8315     OMPExecutableDirective *D) {
8316 
8317   // Transform the clauses
8318   llvm::SmallVector<OMPClause *, 16> TClauses;
8319   ArrayRef<OMPClause *> Clauses = D->clauses();
8320   TClauses.reserve(Clauses.size());
8321   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8322        I != E; ++I) {
8323     if (*I) {
8324       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8325       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8326       getDerived().getSema().EndOpenMPClause();
8327       if (Clause)
8328         TClauses.push_back(Clause);
8329     } else {
8330       TClauses.push_back(nullptr);
8331     }
8332   }
8333   StmtResult AssociatedStmt;
8334   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8335     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8336                                                   /*CurScope=*/nullptr);
8337     StmtResult Body;
8338     {
8339       Sema::CompoundScopeRAII CompoundScope(getSema());
8340       Stmt *CS;
8341       if (D->getDirectiveKind() == OMPD_atomic ||
8342           D->getDirectiveKind() == OMPD_critical ||
8343           D->getDirectiveKind() == OMPD_section ||
8344           D->getDirectiveKind() == OMPD_master)
8345         CS = D->getAssociatedStmt();
8346       else
8347         CS = D->getInnermostCapturedStmt()->getCapturedStmt();
8348       Body = getDerived().TransformStmt(CS);
8349     }
8350     AssociatedStmt =
8351         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8352     if (AssociatedStmt.isInvalid()) {
8353       return StmtError();
8354     }
8355   }
8356   if (TClauses.size() != Clauses.size()) {
8357     return StmtError();
8358   }
8359 
8360   // Transform directive name for 'omp critical' directive.
8361   DeclarationNameInfo DirName;
8362   if (D->getDirectiveKind() == OMPD_critical) {
8363     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8364     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8365   }
8366   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8367   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8368     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8369   } else if (D->getDirectiveKind() == OMPD_cancel) {
8370     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8371   }
8372 
8373   return getDerived().RebuildOMPExecutableDirective(
8374       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8375       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8376 }
8377 
8378 template <typename Derived>
8379 StmtResult
8380 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8381   DeclarationNameInfo DirName;
8382   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8383                                              D->getBeginLoc());
8384   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8385   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8386   return Res;
8387 }
8388 
8389 template <typename Derived>
8390 StmtResult
8391 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8392   DeclarationNameInfo DirName;
8393   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8394                                              D->getBeginLoc());
8395   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8396   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8397   return Res;
8398 }
8399 
8400 template <typename Derived>
8401 StmtResult
8402 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8403   DeclarationNameInfo DirName;
8404   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8405                                              D->getBeginLoc());
8406   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8407   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8408   return Res;
8409 }
8410 
8411 template <typename Derived>
8412 StmtResult
8413 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8414   DeclarationNameInfo DirName;
8415   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8416                                              D->getBeginLoc());
8417   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8418   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8419   return Res;
8420 }
8421 
8422 template <typename Derived>
8423 StmtResult
8424 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8425   DeclarationNameInfo DirName;
8426   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8427                                              D->getBeginLoc());
8428   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8429   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8430   return Res;
8431 }
8432 
8433 template <typename Derived>
8434 StmtResult
8435 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8436   DeclarationNameInfo DirName;
8437   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8438                                              D->getBeginLoc());
8439   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8440   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8441   return Res;
8442 }
8443 
8444 template <typename Derived>
8445 StmtResult
8446 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8447   DeclarationNameInfo DirName;
8448   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8449                                              D->getBeginLoc());
8450   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8451   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8452   return Res;
8453 }
8454 
8455 template <typename Derived>
8456 StmtResult
8457 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8458   DeclarationNameInfo DirName;
8459   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8460                                              D->getBeginLoc());
8461   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8462   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8463   return Res;
8464 }
8465 
8466 template <typename Derived>
8467 StmtResult
8468 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8469   getDerived().getSema().StartOpenMPDSABlock(
8470       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8471   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8472   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8473   return Res;
8474 }
8475 
8476 template <typename Derived>
8477 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8478     OMPParallelForDirective *D) {
8479   DeclarationNameInfo DirName;
8480   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8481                                              nullptr, D->getBeginLoc());
8482   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8483   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8484   return Res;
8485 }
8486 
8487 template <typename Derived>
8488 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8489     OMPParallelForSimdDirective *D) {
8490   DeclarationNameInfo DirName;
8491   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8492                                              nullptr, D->getBeginLoc());
8493   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8494   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8495   return Res;
8496 }
8497 
8498 template <typename Derived>
8499 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8500     OMPParallelMasterDirective *D) {
8501   DeclarationNameInfo DirName;
8502   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8503                                              nullptr, D->getBeginLoc());
8504   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8505   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8506   return Res;
8507 }
8508 
8509 template <typename Derived>
8510 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8511     OMPParallelSectionsDirective *D) {
8512   DeclarationNameInfo DirName;
8513   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8514                                              nullptr, D->getBeginLoc());
8515   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8516   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8517   return Res;
8518 }
8519 
8520 template <typename Derived>
8521 StmtResult
8522 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8523   DeclarationNameInfo DirName;
8524   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8525                                              D->getBeginLoc());
8526   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8527   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8528   return Res;
8529 }
8530 
8531 template <typename Derived>
8532 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8533     OMPTaskyieldDirective *D) {
8534   DeclarationNameInfo DirName;
8535   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8536                                              D->getBeginLoc());
8537   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8538   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8539   return Res;
8540 }
8541 
8542 template <typename Derived>
8543 StmtResult
8544 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8545   DeclarationNameInfo DirName;
8546   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8547                                              D->getBeginLoc());
8548   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8549   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8550   return Res;
8551 }
8552 
8553 template <typename Derived>
8554 StmtResult
8555 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8556   DeclarationNameInfo DirName;
8557   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8558                                              D->getBeginLoc());
8559   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8560   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8561   return Res;
8562 }
8563 
8564 template <typename Derived>
8565 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8566     OMPTaskgroupDirective *D) {
8567   DeclarationNameInfo DirName;
8568   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8569                                              D->getBeginLoc());
8570   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8571   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8572   return Res;
8573 }
8574 
8575 template <typename Derived>
8576 StmtResult
8577 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8578   DeclarationNameInfo DirName;
8579   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8580                                              D->getBeginLoc());
8581   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8582   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8583   return Res;
8584 }
8585 
8586 template <typename Derived>
8587 StmtResult
8588 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8589   DeclarationNameInfo DirName;
8590   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8591                                              D->getBeginLoc());
8592   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8593   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8594   return Res;
8595 }
8596 
8597 template <typename Derived>
8598 StmtResult
8599 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8600   DeclarationNameInfo DirName;
8601   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8602                                              D->getBeginLoc());
8603   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8604   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8605   return Res;
8606 }
8607 
8608 template <typename Derived>
8609 StmtResult
8610 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8611   DeclarationNameInfo DirName;
8612   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8613                                              D->getBeginLoc());
8614   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8615   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8616   return Res;
8617 }
8618 
8619 template <typename Derived>
8620 StmtResult
8621 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8622   DeclarationNameInfo DirName;
8623   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8624                                              D->getBeginLoc());
8625   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8626   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8627   return Res;
8628 }
8629 
8630 template <typename Derived>
8631 StmtResult
8632 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8633   DeclarationNameInfo DirName;
8634   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8635                                              D->getBeginLoc());
8636   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8637   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8638   return Res;
8639 }
8640 
8641 template <typename Derived>
8642 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8643     OMPTargetDataDirective *D) {
8644   DeclarationNameInfo DirName;
8645   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8646                                              D->getBeginLoc());
8647   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8648   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8649   return Res;
8650 }
8651 
8652 template <typename Derived>
8653 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8654     OMPTargetEnterDataDirective *D) {
8655   DeclarationNameInfo DirName;
8656   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8657                                              nullptr, D->getBeginLoc());
8658   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8659   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8660   return Res;
8661 }
8662 
8663 template <typename Derived>
8664 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8665     OMPTargetExitDataDirective *D) {
8666   DeclarationNameInfo DirName;
8667   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8668                                              nullptr, D->getBeginLoc());
8669   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8670   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8671   return Res;
8672 }
8673 
8674 template <typename Derived>
8675 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8676     OMPTargetParallelDirective *D) {
8677   DeclarationNameInfo DirName;
8678   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8679                                              nullptr, D->getBeginLoc());
8680   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8681   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8682   return Res;
8683 }
8684 
8685 template <typename Derived>
8686 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8687     OMPTargetParallelForDirective *D) {
8688   DeclarationNameInfo DirName;
8689   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8690                                              nullptr, D->getBeginLoc());
8691   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8692   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8693   return Res;
8694 }
8695 
8696 template <typename Derived>
8697 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8698     OMPTargetUpdateDirective *D) {
8699   DeclarationNameInfo DirName;
8700   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8701                                              nullptr, D->getBeginLoc());
8702   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8703   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8704   return Res;
8705 }
8706 
8707 template <typename Derived>
8708 StmtResult
8709 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8710   DeclarationNameInfo DirName;
8711   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8712                                              D->getBeginLoc());
8713   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8714   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8715   return Res;
8716 }
8717 
8718 template <typename Derived>
8719 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8720     OMPCancellationPointDirective *D) {
8721   DeclarationNameInfo DirName;
8722   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8723                                              nullptr, D->getBeginLoc());
8724   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8725   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8726   return Res;
8727 }
8728 
8729 template <typename Derived>
8730 StmtResult
8731 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8732   DeclarationNameInfo DirName;
8733   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8734                                              D->getBeginLoc());
8735   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8736   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8737   return Res;
8738 }
8739 
8740 template <typename Derived>
8741 StmtResult
8742 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8743   DeclarationNameInfo DirName;
8744   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8745                                              D->getBeginLoc());
8746   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8747   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8748   return Res;
8749 }
8750 
8751 template <typename Derived>
8752 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8753     OMPTaskLoopSimdDirective *D) {
8754   DeclarationNameInfo DirName;
8755   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8756                                              nullptr, D->getBeginLoc());
8757   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8758   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8759   return Res;
8760 }
8761 
8762 template <typename Derived>
8763 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8764     OMPMasterTaskLoopDirective *D) {
8765   DeclarationNameInfo DirName;
8766   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8767                                              nullptr, D->getBeginLoc());
8768   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8769   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8770   return Res;
8771 }
8772 
8773 template <typename Derived>
8774 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8775     OMPMasterTaskLoopSimdDirective *D) {
8776   DeclarationNameInfo DirName;
8777   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8778                                              nullptr, D->getBeginLoc());
8779   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8780   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8781   return Res;
8782 }
8783 
8784 template <typename Derived>
8785 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8786     OMPParallelMasterTaskLoopDirective *D) {
8787   DeclarationNameInfo DirName;
8788   getDerived().getSema().StartOpenMPDSABlock(
8789       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8790   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8791   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8792   return Res;
8793 }
8794 
8795 template <typename Derived>
8796 StmtResult
8797 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8798     OMPParallelMasterTaskLoopSimdDirective *D) {
8799   DeclarationNameInfo DirName;
8800   getDerived().getSema().StartOpenMPDSABlock(
8801       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8802   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8803   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8804   return Res;
8805 }
8806 
8807 template <typename Derived>
8808 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8809     OMPDistributeDirective *D) {
8810   DeclarationNameInfo DirName;
8811   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8812                                              D->getBeginLoc());
8813   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8814   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8815   return Res;
8816 }
8817 
8818 template <typename Derived>
8819 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8820     OMPDistributeParallelForDirective *D) {
8821   DeclarationNameInfo DirName;
8822   getDerived().getSema().StartOpenMPDSABlock(
8823       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8824   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8825   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8826   return Res;
8827 }
8828 
8829 template <typename Derived>
8830 StmtResult
8831 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8832     OMPDistributeParallelForSimdDirective *D) {
8833   DeclarationNameInfo DirName;
8834   getDerived().getSema().StartOpenMPDSABlock(
8835       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8836   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8837   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8838   return Res;
8839 }
8840 
8841 template <typename Derived>
8842 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8843     OMPDistributeSimdDirective *D) {
8844   DeclarationNameInfo DirName;
8845   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8846                                              nullptr, D->getBeginLoc());
8847   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8848   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8849   return Res;
8850 }
8851 
8852 template <typename Derived>
8853 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8854     OMPTargetParallelForSimdDirective *D) {
8855   DeclarationNameInfo DirName;
8856   getDerived().getSema().StartOpenMPDSABlock(
8857       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8858   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8859   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8860   return Res;
8861 }
8862 
8863 template <typename Derived>
8864 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8865     OMPTargetSimdDirective *D) {
8866   DeclarationNameInfo DirName;
8867   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8868                                              D->getBeginLoc());
8869   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8870   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8871   return Res;
8872 }
8873 
8874 template <typename Derived>
8875 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8876     OMPTeamsDistributeDirective *D) {
8877   DeclarationNameInfo DirName;
8878   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8879                                              nullptr, D->getBeginLoc());
8880   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8881   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8882   return Res;
8883 }
8884 
8885 template <typename Derived>
8886 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8887     OMPTeamsDistributeSimdDirective *D) {
8888   DeclarationNameInfo DirName;
8889   getDerived().getSema().StartOpenMPDSABlock(
8890       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8891   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8892   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8893   return Res;
8894 }
8895 
8896 template <typename Derived>
8897 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8898     OMPTeamsDistributeParallelForSimdDirective *D) {
8899   DeclarationNameInfo DirName;
8900   getDerived().getSema().StartOpenMPDSABlock(
8901       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8902       D->getBeginLoc());
8903   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8904   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8905   return Res;
8906 }
8907 
8908 template <typename Derived>
8909 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8910     OMPTeamsDistributeParallelForDirective *D) {
8911   DeclarationNameInfo DirName;
8912   getDerived().getSema().StartOpenMPDSABlock(
8913       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8914   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8915   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8916   return Res;
8917 }
8918 
8919 template <typename Derived>
8920 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8921     OMPTargetTeamsDirective *D) {
8922   DeclarationNameInfo DirName;
8923   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8924                                              nullptr, D->getBeginLoc());
8925   auto Res = getDerived().TransformOMPExecutableDirective(D);
8926   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8927   return Res;
8928 }
8929 
8930 template <typename Derived>
8931 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8932     OMPTargetTeamsDistributeDirective *D) {
8933   DeclarationNameInfo DirName;
8934   getDerived().getSema().StartOpenMPDSABlock(
8935       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8936   auto Res = getDerived().TransformOMPExecutableDirective(D);
8937   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8938   return Res;
8939 }
8940 
8941 template <typename Derived>
8942 StmtResult
8943 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8944     OMPTargetTeamsDistributeParallelForDirective *D) {
8945   DeclarationNameInfo DirName;
8946   getDerived().getSema().StartOpenMPDSABlock(
8947       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8948       D->getBeginLoc());
8949   auto Res = getDerived().TransformOMPExecutableDirective(D);
8950   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8951   return Res;
8952 }
8953 
8954 template <typename Derived>
8955 StmtResult TreeTransform<Derived>::
8956     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8957         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8958   DeclarationNameInfo DirName;
8959   getDerived().getSema().StartOpenMPDSABlock(
8960       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8961       D->getBeginLoc());
8962   auto Res = getDerived().TransformOMPExecutableDirective(D);
8963   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8964   return Res;
8965 }
8966 
8967 template <typename Derived>
8968 StmtResult
8969 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8970     OMPTargetTeamsDistributeSimdDirective *D) {
8971   DeclarationNameInfo DirName;
8972   getDerived().getSema().StartOpenMPDSABlock(
8973       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8974   auto Res = getDerived().TransformOMPExecutableDirective(D);
8975   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8976   return Res;
8977 }
8978 
8979 
8980 //===----------------------------------------------------------------------===//
8981 // OpenMP clause transformation
8982 //===----------------------------------------------------------------------===//
8983 template <typename Derived>
8984 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8985   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8986   if (Cond.isInvalid())
8987     return nullptr;
8988   return getDerived().RebuildOMPIfClause(
8989       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8990       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8991 }
8992 
8993 template <typename Derived>
8994 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8995   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8996   if (Cond.isInvalid())
8997     return nullptr;
8998   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8999                                             C->getLParenLoc(), C->getEndLoc());
9000 }
9001 
9002 template <typename Derived>
9003 OMPClause *
9004 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9005   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9006   if (NumThreads.isInvalid())
9007     return nullptr;
9008   return getDerived().RebuildOMPNumThreadsClause(
9009       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9010 }
9011 
9012 template <typename Derived>
9013 OMPClause *
9014 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9015   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9016   if (E.isInvalid())
9017     return nullptr;
9018   return getDerived().RebuildOMPSafelenClause(
9019       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9020 }
9021 
9022 template <typename Derived>
9023 OMPClause *
9024 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9025   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9026   if (E.isInvalid())
9027     return nullptr;
9028   return getDerived().RebuildOMPAllocatorClause(
9029       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9030 }
9031 
9032 template <typename Derived>
9033 OMPClause *
9034 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9035   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9036   if (E.isInvalid())
9037     return nullptr;
9038   return getDerived().RebuildOMPSimdlenClause(
9039       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9040 }
9041 
9042 template <typename Derived>
9043 OMPClause *
9044 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9045   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9046   if (E.isInvalid())
9047     return nullptr;
9048   return getDerived().RebuildOMPCollapseClause(
9049       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9050 }
9051 
9052 template <typename Derived>
9053 OMPClause *
9054 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9055   return getDerived().RebuildOMPDefaultClause(
9056       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9057       C->getLParenLoc(), C->getEndLoc());
9058 }
9059 
9060 template <typename Derived>
9061 OMPClause *
9062 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9063   return getDerived().RebuildOMPProcBindClause(
9064       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9065       C->getLParenLoc(), C->getEndLoc());
9066 }
9067 
9068 template <typename Derived>
9069 OMPClause *
9070 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9071   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9072   if (E.isInvalid())
9073     return nullptr;
9074   return getDerived().RebuildOMPScheduleClause(
9075       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9076       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9077       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9078       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9079 }
9080 
9081 template <typename Derived>
9082 OMPClause *
9083 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9084   ExprResult E;
9085   if (auto *Num = C->getNumForLoops()) {
9086     E = getDerived().TransformExpr(Num);
9087     if (E.isInvalid())
9088       return nullptr;
9089   }
9090   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9091                                               C->getLParenLoc(), E.get());
9092 }
9093 
9094 template <typename Derived>
9095 OMPClause *
9096 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9097   ExprResult E;
9098   if (Expr *Evt = C->getEventHandler()) {
9099     E = getDerived().TransformExpr(Evt);
9100     if (E.isInvalid())
9101       return nullptr;
9102   }
9103   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9104                                              C->getLParenLoc(), C->getEndLoc());
9105 }
9106 
9107 template <typename Derived>
9108 OMPClause *
9109 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9110   // No need to rebuild this clause, no template-dependent parameters.
9111   return C;
9112 }
9113 
9114 template <typename Derived>
9115 OMPClause *
9116 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9117   // No need to rebuild this clause, no template-dependent parameters.
9118   return C;
9119 }
9120 
9121 template <typename Derived>
9122 OMPClause *
9123 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9124   // No need to rebuild this clause, no template-dependent parameters.
9125   return C;
9126 }
9127 
9128 template <typename Derived>
9129 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9130   // No need to rebuild this clause, no template-dependent parameters.
9131   return C;
9132 }
9133 
9134 template <typename Derived>
9135 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9136   // No need to rebuild this clause, no template-dependent parameters.
9137   return C;
9138 }
9139 
9140 template <typename Derived>
9141 OMPClause *
9142 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9143   // No need to rebuild this clause, no template-dependent parameters.
9144   return C;
9145 }
9146 
9147 template <typename Derived>
9148 OMPClause *
9149 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9150   // No need to rebuild this clause, no template-dependent parameters.
9151   return C;
9152 }
9153 
9154 template <typename Derived>
9155 OMPClause *
9156 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9157   // No need to rebuild this clause, no template-dependent parameters.
9158   return C;
9159 }
9160 
9161 template <typename Derived>
9162 OMPClause *
9163 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9164   // No need to rebuild this clause, no template-dependent parameters.
9165   return C;
9166 }
9167 
9168 template <typename Derived>
9169 OMPClause *
9170 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9171   // No need to rebuild this clause, no template-dependent parameters.
9172   return C;
9173 }
9174 
9175 template <typename Derived>
9176 OMPClause *
9177 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9178   // No need to rebuild this clause, no template-dependent parameters.
9179   return C;
9180 }
9181 
9182 template <typename Derived>
9183 OMPClause *
9184 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9185   // No need to rebuild this clause, no template-dependent parameters.
9186   return C;
9187 }
9188 
9189 template <typename Derived>
9190 OMPClause *
9191 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9192   // No need to rebuild this clause, no template-dependent parameters.
9193   return C;
9194 }
9195 
9196 template <typename Derived>
9197 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9198   // No need to rebuild this clause, no template-dependent parameters.
9199   return C;
9200 }
9201 
9202 template <typename Derived>
9203 OMPClause *
9204 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9205   // No need to rebuild this clause, no template-dependent parameters.
9206   return C;
9207 }
9208 
9209 template <typename Derived>
9210 OMPClause *
9211 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9212   // No need to rebuild this clause, no template-dependent parameters.
9213   return C;
9214 }
9215 
9216 template <typename Derived>
9217 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9218     OMPUnifiedAddressClause *C) {
9219   llvm_unreachable("unified_address clause cannot appear in dependent context");
9220 }
9221 
9222 template <typename Derived>
9223 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9224     OMPUnifiedSharedMemoryClause *C) {
9225   llvm_unreachable(
9226       "unified_shared_memory clause cannot appear in dependent context");
9227 }
9228 
9229 template <typename Derived>
9230 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9231     OMPReverseOffloadClause *C) {
9232   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9233 }
9234 
9235 template <typename Derived>
9236 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9237     OMPDynamicAllocatorsClause *C) {
9238   llvm_unreachable(
9239       "dynamic_allocators clause cannot appear in dependent context");
9240 }
9241 
9242 template <typename Derived>
9243 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9244     OMPAtomicDefaultMemOrderClause *C) {
9245   llvm_unreachable(
9246       "atomic_default_mem_order clause cannot appear in dependent context");
9247 }
9248 
9249 template <typename Derived>
9250 OMPClause *
9251 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9252   llvm::SmallVector<Expr *, 16> Vars;
9253   Vars.reserve(C->varlist_size());
9254   for (auto *VE : C->varlists()) {
9255     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9256     if (EVar.isInvalid())
9257       return nullptr;
9258     Vars.push_back(EVar.get());
9259   }
9260   return getDerived().RebuildOMPPrivateClause(
9261       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9262 }
9263 
9264 template <typename Derived>
9265 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9266     OMPFirstprivateClause *C) {
9267   llvm::SmallVector<Expr *, 16> Vars;
9268   Vars.reserve(C->varlist_size());
9269   for (auto *VE : C->varlists()) {
9270     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9271     if (EVar.isInvalid())
9272       return nullptr;
9273     Vars.push_back(EVar.get());
9274   }
9275   return getDerived().RebuildOMPFirstprivateClause(
9276       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9277 }
9278 
9279 template <typename Derived>
9280 OMPClause *
9281 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9282   llvm::SmallVector<Expr *, 16> Vars;
9283   Vars.reserve(C->varlist_size());
9284   for (auto *VE : C->varlists()) {
9285     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9286     if (EVar.isInvalid())
9287       return nullptr;
9288     Vars.push_back(EVar.get());
9289   }
9290   return getDerived().RebuildOMPLastprivateClause(
9291       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9292       C->getLParenLoc(), C->getEndLoc());
9293 }
9294 
9295 template <typename Derived>
9296 OMPClause *
9297 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9298   llvm::SmallVector<Expr *, 16> Vars;
9299   Vars.reserve(C->varlist_size());
9300   for (auto *VE : C->varlists()) {
9301     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9302     if (EVar.isInvalid())
9303       return nullptr;
9304     Vars.push_back(EVar.get());
9305   }
9306   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9307                                              C->getLParenLoc(), C->getEndLoc());
9308 }
9309 
9310 template <typename Derived>
9311 OMPClause *
9312 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9313   llvm::SmallVector<Expr *, 16> Vars;
9314   Vars.reserve(C->varlist_size());
9315   for (auto *VE : C->varlists()) {
9316     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9317     if (EVar.isInvalid())
9318       return nullptr;
9319     Vars.push_back(EVar.get());
9320   }
9321   CXXScopeSpec ReductionIdScopeSpec;
9322   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9323 
9324   DeclarationNameInfo NameInfo = C->getNameInfo();
9325   if (NameInfo.getName()) {
9326     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9327     if (!NameInfo.getName())
9328       return nullptr;
9329   }
9330   // Build a list of all UDR decls with the same names ranged by the Scopes.
9331   // The Scope boundary is a duplication of the previous decl.
9332   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9333   for (auto *E : C->reduction_ops()) {
9334     // Transform all the decls.
9335     if (E) {
9336       auto *ULE = cast<UnresolvedLookupExpr>(E);
9337       UnresolvedSet<8> Decls;
9338       for (auto *D : ULE->decls()) {
9339         NamedDecl *InstD =
9340             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9341         Decls.addDecl(InstD, InstD->getAccess());
9342       }
9343       UnresolvedReductions.push_back(
9344        UnresolvedLookupExpr::Create(
9345           SemaRef.Context, /*NamingClass=*/nullptr,
9346           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9347           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9348           Decls.begin(), Decls.end()));
9349     } else
9350       UnresolvedReductions.push_back(nullptr);
9351   }
9352   return getDerived().RebuildOMPReductionClause(
9353       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9354       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9355       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9356 }
9357 
9358 template <typename Derived>
9359 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9360     OMPTaskReductionClause *C) {
9361   llvm::SmallVector<Expr *, 16> Vars;
9362   Vars.reserve(C->varlist_size());
9363   for (auto *VE : C->varlists()) {
9364     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9365     if (EVar.isInvalid())
9366       return nullptr;
9367     Vars.push_back(EVar.get());
9368   }
9369   CXXScopeSpec ReductionIdScopeSpec;
9370   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9371 
9372   DeclarationNameInfo NameInfo = C->getNameInfo();
9373   if (NameInfo.getName()) {
9374     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9375     if (!NameInfo.getName())
9376       return nullptr;
9377   }
9378   // Build a list of all UDR decls with the same names ranged by the Scopes.
9379   // The Scope boundary is a duplication of the previous decl.
9380   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9381   for (auto *E : C->reduction_ops()) {
9382     // Transform all the decls.
9383     if (E) {
9384       auto *ULE = cast<UnresolvedLookupExpr>(E);
9385       UnresolvedSet<8> Decls;
9386       for (auto *D : ULE->decls()) {
9387         NamedDecl *InstD =
9388             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9389         Decls.addDecl(InstD, InstD->getAccess());
9390       }
9391       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9392           SemaRef.Context, /*NamingClass=*/nullptr,
9393           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9394           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9395     } else
9396       UnresolvedReductions.push_back(nullptr);
9397   }
9398   return getDerived().RebuildOMPTaskReductionClause(
9399       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9400       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9401 }
9402 
9403 template <typename Derived>
9404 OMPClause *
9405 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9406   llvm::SmallVector<Expr *, 16> Vars;
9407   Vars.reserve(C->varlist_size());
9408   for (auto *VE : C->varlists()) {
9409     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9410     if (EVar.isInvalid())
9411       return nullptr;
9412     Vars.push_back(EVar.get());
9413   }
9414   CXXScopeSpec ReductionIdScopeSpec;
9415   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9416 
9417   DeclarationNameInfo NameInfo = C->getNameInfo();
9418   if (NameInfo.getName()) {
9419     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9420     if (!NameInfo.getName())
9421       return nullptr;
9422   }
9423   // Build a list of all UDR decls with the same names ranged by the Scopes.
9424   // The Scope boundary is a duplication of the previous decl.
9425   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9426   for (auto *E : C->reduction_ops()) {
9427     // Transform all the decls.
9428     if (E) {
9429       auto *ULE = cast<UnresolvedLookupExpr>(E);
9430       UnresolvedSet<8> Decls;
9431       for (auto *D : ULE->decls()) {
9432         NamedDecl *InstD =
9433             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9434         Decls.addDecl(InstD, InstD->getAccess());
9435       }
9436       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9437           SemaRef.Context, /*NamingClass=*/nullptr,
9438           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9439           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9440     } else
9441       UnresolvedReductions.push_back(nullptr);
9442   }
9443   return getDerived().RebuildOMPInReductionClause(
9444       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9445       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9446 }
9447 
9448 template <typename Derived>
9449 OMPClause *
9450 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9451   llvm::SmallVector<Expr *, 16> Vars;
9452   Vars.reserve(C->varlist_size());
9453   for (auto *VE : C->varlists()) {
9454     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9455     if (EVar.isInvalid())
9456       return nullptr;
9457     Vars.push_back(EVar.get());
9458   }
9459   ExprResult Step = getDerived().TransformExpr(C->getStep());
9460   if (Step.isInvalid())
9461     return nullptr;
9462   return getDerived().RebuildOMPLinearClause(
9463       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9464       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9465 }
9466 
9467 template <typename Derived>
9468 OMPClause *
9469 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9470   llvm::SmallVector<Expr *, 16> Vars;
9471   Vars.reserve(C->varlist_size());
9472   for (auto *VE : C->varlists()) {
9473     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9474     if (EVar.isInvalid())
9475       return nullptr;
9476     Vars.push_back(EVar.get());
9477   }
9478   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9479   if (Alignment.isInvalid())
9480     return nullptr;
9481   return getDerived().RebuildOMPAlignedClause(
9482       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9483       C->getColonLoc(), C->getEndLoc());
9484 }
9485 
9486 template <typename Derived>
9487 OMPClause *
9488 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9489   llvm::SmallVector<Expr *, 16> Vars;
9490   Vars.reserve(C->varlist_size());
9491   for (auto *VE : C->varlists()) {
9492     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9493     if (EVar.isInvalid())
9494       return nullptr;
9495     Vars.push_back(EVar.get());
9496   }
9497   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9498                                              C->getLParenLoc(), C->getEndLoc());
9499 }
9500 
9501 template <typename Derived>
9502 OMPClause *
9503 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9504   llvm::SmallVector<Expr *, 16> Vars;
9505   Vars.reserve(C->varlist_size());
9506   for (auto *VE : C->varlists()) {
9507     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9508     if (EVar.isInvalid())
9509       return nullptr;
9510     Vars.push_back(EVar.get());
9511   }
9512   return getDerived().RebuildOMPCopyprivateClause(
9513       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9514 }
9515 
9516 template <typename Derived>
9517 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9518   llvm::SmallVector<Expr *, 16> Vars;
9519   Vars.reserve(C->varlist_size());
9520   for (auto *VE : C->varlists()) {
9521     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9522     if (EVar.isInvalid())
9523       return nullptr;
9524     Vars.push_back(EVar.get());
9525   }
9526   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9527                                             C->getLParenLoc(), C->getEndLoc());
9528 }
9529 
9530 template <typename Derived>
9531 OMPClause *
9532 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9533   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9534   if (E.isInvalid())
9535     return nullptr;
9536   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9537                                              C->getLParenLoc(), C->getEndLoc());
9538 }
9539 
9540 template <typename Derived>
9541 OMPClause *
9542 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9543   llvm::SmallVector<Expr *, 16> Vars;
9544   Expr *DepModifier = C->getModifier();
9545   if (DepModifier) {
9546     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9547     if (DepModRes.isInvalid())
9548       return nullptr;
9549     DepModifier = DepModRes.get();
9550   }
9551   Vars.reserve(C->varlist_size());
9552   for (auto *VE : C->varlists()) {
9553     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9554     if (EVar.isInvalid())
9555       return nullptr;
9556     Vars.push_back(EVar.get());
9557   }
9558   return getDerived().RebuildOMPDependClause(
9559       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9560       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9561       C->getEndLoc());
9562 }
9563 
9564 template <typename Derived>
9565 OMPClause *
9566 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9567   ExprResult E = getDerived().TransformExpr(C->getDevice());
9568   if (E.isInvalid())
9569     return nullptr;
9570   return getDerived().RebuildOMPDeviceClause(
9571       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9572       C->getModifierLoc(), C->getEndLoc());
9573 }
9574 
9575 template <typename Derived, class T>
9576 bool transformOMPMappableExprListClause(
9577     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9578     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9579     DeclarationNameInfo &MapperIdInfo,
9580     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9581   // Transform expressions in the list.
9582   Vars.reserve(C->varlist_size());
9583   for (auto *VE : C->varlists()) {
9584     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9585     if (EVar.isInvalid())
9586       return true;
9587     Vars.push_back(EVar.get());
9588   }
9589   // Transform mapper scope specifier and identifier.
9590   NestedNameSpecifierLoc QualifierLoc;
9591   if (C->getMapperQualifierLoc()) {
9592     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9593         C->getMapperQualifierLoc());
9594     if (!QualifierLoc)
9595       return true;
9596   }
9597   MapperIdScopeSpec.Adopt(QualifierLoc);
9598   MapperIdInfo = C->getMapperIdInfo();
9599   if (MapperIdInfo.getName()) {
9600     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9601     if (!MapperIdInfo.getName())
9602       return true;
9603   }
9604   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9605   // the previous user-defined mapper lookup in dependent environment.
9606   for (auto *E : C->mapperlists()) {
9607     // Transform all the decls.
9608     if (E) {
9609       auto *ULE = cast<UnresolvedLookupExpr>(E);
9610       UnresolvedSet<8> Decls;
9611       for (auto *D : ULE->decls()) {
9612         NamedDecl *InstD =
9613             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9614         Decls.addDecl(InstD, InstD->getAccess());
9615       }
9616       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9617           TT.getSema().Context, /*NamingClass=*/nullptr,
9618           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9619           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9620           Decls.end()));
9621     } else {
9622       UnresolvedMappers.push_back(nullptr);
9623     }
9624   }
9625   return false;
9626 }
9627 
9628 template <typename Derived>
9629 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9630   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9631   llvm::SmallVector<Expr *, 16> Vars;
9632   CXXScopeSpec MapperIdScopeSpec;
9633   DeclarationNameInfo MapperIdInfo;
9634   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9635   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9636           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9637     return nullptr;
9638   return getDerived().RebuildOMPMapClause(
9639       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9640       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9641       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9642 }
9643 
9644 template <typename Derived>
9645 OMPClause *
9646 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9647   Expr *Allocator = C->getAllocator();
9648   if (Allocator) {
9649     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9650     if (AllocatorRes.isInvalid())
9651       return nullptr;
9652     Allocator = AllocatorRes.get();
9653   }
9654   llvm::SmallVector<Expr *, 16> Vars;
9655   Vars.reserve(C->varlist_size());
9656   for (auto *VE : C->varlists()) {
9657     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9658     if (EVar.isInvalid())
9659       return nullptr;
9660     Vars.push_back(EVar.get());
9661   }
9662   return getDerived().RebuildOMPAllocateClause(
9663       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9664       C->getEndLoc());
9665 }
9666 
9667 template <typename Derived>
9668 OMPClause *
9669 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9670   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9671   if (E.isInvalid())
9672     return nullptr;
9673   return getDerived().RebuildOMPNumTeamsClause(
9674       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9675 }
9676 
9677 template <typename Derived>
9678 OMPClause *
9679 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9680   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9681   if (E.isInvalid())
9682     return nullptr;
9683   return getDerived().RebuildOMPThreadLimitClause(
9684       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9685 }
9686 
9687 template <typename Derived>
9688 OMPClause *
9689 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9690   ExprResult E = getDerived().TransformExpr(C->getPriority());
9691   if (E.isInvalid())
9692     return nullptr;
9693   return getDerived().RebuildOMPPriorityClause(
9694       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9695 }
9696 
9697 template <typename Derived>
9698 OMPClause *
9699 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9700   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9701   if (E.isInvalid())
9702     return nullptr;
9703   return getDerived().RebuildOMPGrainsizeClause(
9704       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9705 }
9706 
9707 template <typename Derived>
9708 OMPClause *
9709 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9710   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9711   if (E.isInvalid())
9712     return nullptr;
9713   return getDerived().RebuildOMPNumTasksClause(
9714       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9715 }
9716 
9717 template <typename Derived>
9718 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9719   ExprResult E = getDerived().TransformExpr(C->getHint());
9720   if (E.isInvalid())
9721     return nullptr;
9722   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9723                                            C->getLParenLoc(), C->getEndLoc());
9724 }
9725 
9726 template <typename Derived>
9727 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9728     OMPDistScheduleClause *C) {
9729   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9730   if (E.isInvalid())
9731     return nullptr;
9732   return getDerived().RebuildOMPDistScheduleClause(
9733       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9734       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9735 }
9736 
9737 template <typename Derived>
9738 OMPClause *
9739 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9740   // Rebuild Defaultmap Clause since we need to invoke the checking of
9741   // defaultmap(none:variable-category) after template initialization.
9742   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9743                                                  C->getDefaultmapKind(),
9744                                                  C->getBeginLoc(),
9745                                                  C->getLParenLoc(),
9746                                                  C->getDefaultmapModifierLoc(),
9747                                                  C->getDefaultmapKindLoc(),
9748                                                  C->getEndLoc());
9749 }
9750 
9751 template <typename Derived>
9752 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9753   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9754   llvm::SmallVector<Expr *, 16> Vars;
9755   CXXScopeSpec MapperIdScopeSpec;
9756   DeclarationNameInfo MapperIdInfo;
9757   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9758   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9759           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9760     return nullptr;
9761   return getDerived().RebuildOMPToClause(
9762       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9763       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9764 }
9765 
9766 template <typename Derived>
9767 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9768   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9769   llvm::SmallVector<Expr *, 16> Vars;
9770   CXXScopeSpec MapperIdScopeSpec;
9771   DeclarationNameInfo MapperIdInfo;
9772   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9773   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9774           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9775     return nullptr;
9776   return getDerived().RebuildOMPFromClause(
9777       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9778       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9779 }
9780 
9781 template <typename Derived>
9782 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9783     OMPUseDevicePtrClause *C) {
9784   llvm::SmallVector<Expr *, 16> Vars;
9785   Vars.reserve(C->varlist_size());
9786   for (auto *VE : C->varlists()) {
9787     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9788     if (EVar.isInvalid())
9789       return nullptr;
9790     Vars.push_back(EVar.get());
9791   }
9792   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9793   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9794 }
9795 
9796 template <typename Derived>
9797 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
9798     OMPUseDeviceAddrClause *C) {
9799   llvm::SmallVector<Expr *, 16> Vars;
9800   Vars.reserve(C->varlist_size());
9801   for (auto *VE : C->varlists()) {
9802     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9803     if (EVar.isInvalid())
9804       return nullptr;
9805     Vars.push_back(EVar.get());
9806   }
9807   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9808   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
9809 }
9810 
9811 template <typename Derived>
9812 OMPClause *
9813 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9814   llvm::SmallVector<Expr *, 16> Vars;
9815   Vars.reserve(C->varlist_size());
9816   for (auto *VE : C->varlists()) {
9817     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9818     if (EVar.isInvalid())
9819       return nullptr;
9820     Vars.push_back(EVar.get());
9821   }
9822   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9823   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9824 }
9825 
9826 template <typename Derived>
9827 OMPClause *
9828 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9829   llvm::SmallVector<Expr *, 16> Vars;
9830   Vars.reserve(C->varlist_size());
9831   for (auto *VE : C->varlists()) {
9832     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9833     if (EVar.isInvalid())
9834       return nullptr;
9835     Vars.push_back(EVar.get());
9836   }
9837   return getDerived().RebuildOMPNontemporalClause(
9838       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9839 }
9840 
9841 template <typename Derived>
9842 OMPClause *
9843 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
9844   llvm::SmallVector<Expr *, 16> Vars;
9845   Vars.reserve(C->varlist_size());
9846   for (auto *VE : C->varlists()) {
9847     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9848     if (EVar.isInvalid())
9849       return nullptr;
9850     Vars.push_back(EVar.get());
9851   }
9852   return getDerived().RebuildOMPInclusiveClause(
9853       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9854 }
9855 
9856 template <typename Derived>
9857 OMPClause *
9858 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
9859   llvm::SmallVector<Expr *, 16> Vars;
9860   Vars.reserve(C->varlist_size());
9861   for (auto *VE : C->varlists()) {
9862     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9863     if (EVar.isInvalid())
9864       return nullptr;
9865     Vars.push_back(EVar.get());
9866   }
9867   return getDerived().RebuildOMPExclusiveClause(
9868       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9869 }
9870 
9871 template <typename Derived>
9872 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
9873     OMPUsesAllocatorsClause *C) {
9874   SmallVector<Sema::UsesAllocatorsData, 16> Data;
9875   Data.reserve(C->getNumberOfAllocators());
9876   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
9877     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
9878     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
9879     if (Allocator.isInvalid())
9880       continue;
9881     ExprResult AllocatorTraits;
9882     if (Expr *AT = D.AllocatorTraits) {
9883       AllocatorTraits = getDerived().TransformExpr(AT);
9884       if (AllocatorTraits.isInvalid())
9885         continue;
9886     }
9887     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
9888     NewD.Allocator = Allocator.get();
9889     NewD.AllocatorTraits = AllocatorTraits.get();
9890     NewD.LParenLoc = D.LParenLoc;
9891     NewD.RParenLoc = D.RParenLoc;
9892   }
9893   return getDerived().RebuildOMPUsesAllocatorsClause(
9894       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9895 }
9896 
9897 template <typename Derived>
9898 OMPClause *
9899 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
9900   SmallVector<Expr *, 4> Locators;
9901   Locators.reserve(C->varlist_size());
9902   ExprResult ModifierRes;
9903   if (Expr *Modifier = C->getModifier()) {
9904     ModifierRes = getDerived().TransformExpr(Modifier);
9905     if (ModifierRes.isInvalid())
9906       return nullptr;
9907   }
9908   for (Expr *E : C->varlists()) {
9909     ExprResult Locator = getDerived().TransformExpr(E);
9910     if (Locator.isInvalid())
9911       continue;
9912     Locators.push_back(Locator.get());
9913   }
9914   return getDerived().RebuildOMPAffinityClause(
9915       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
9916       ModifierRes.get(), Locators);
9917 }
9918 
9919 template <typename Derived>
9920 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
9921   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
9922                                             C->getBeginLoc(), C->getLParenLoc(),
9923                                             C->getEndLoc());
9924 }
9925 
9926 //===----------------------------------------------------------------------===//
9927 // Expression transformation
9928 //===----------------------------------------------------------------------===//
9929 template<typename Derived>
9930 ExprResult
9931 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9932   return TransformExpr(E->getSubExpr());
9933 }
9934 
9935 template<typename Derived>
9936 ExprResult
9937 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9938   if (!E->isTypeDependent())
9939     return E;
9940 
9941   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9942                                             E->getIdentKind());
9943 }
9944 
9945 template<typename Derived>
9946 ExprResult
9947 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9948   NestedNameSpecifierLoc QualifierLoc;
9949   if (E->getQualifierLoc()) {
9950     QualifierLoc
9951       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9952     if (!QualifierLoc)
9953       return ExprError();
9954   }
9955 
9956   ValueDecl *ND
9957     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9958                                                          E->getDecl()));
9959   if (!ND)
9960     return ExprError();
9961 
9962   NamedDecl *Found = ND;
9963   if (E->getFoundDecl() != E->getDecl()) {
9964     Found = cast_or_null<NamedDecl>(
9965         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
9966     if (!Found)
9967       return ExprError();
9968   }
9969 
9970   DeclarationNameInfo NameInfo = E->getNameInfo();
9971   if (NameInfo.getName()) {
9972     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9973     if (!NameInfo.getName())
9974       return ExprError();
9975   }
9976 
9977   if (!getDerived().AlwaysRebuild() &&
9978       QualifierLoc == E->getQualifierLoc() &&
9979       ND == E->getDecl() &&
9980       Found == E->getFoundDecl() &&
9981       NameInfo.getName() == E->getDecl()->getDeclName() &&
9982       !E->hasExplicitTemplateArgs()) {
9983 
9984     // Mark it referenced in the new context regardless.
9985     // FIXME: this is a bit instantiation-specific.
9986     SemaRef.MarkDeclRefReferenced(E);
9987 
9988     return E;
9989   }
9990 
9991   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9992   if (E->hasExplicitTemplateArgs()) {
9993     TemplateArgs = &TransArgs;
9994     TransArgs.setLAngleLoc(E->getLAngleLoc());
9995     TransArgs.setRAngleLoc(E->getRAngleLoc());
9996     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9997                                                 E->getNumTemplateArgs(),
9998                                                 TransArgs))
9999       return ExprError();
10000   }
10001 
10002   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10003                                          Found, TemplateArgs);
10004 }
10005 
10006 template<typename Derived>
10007 ExprResult
10008 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10009   return E;
10010 }
10011 
10012 template <typename Derived>
10013 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10014     FixedPointLiteral *E) {
10015   return E;
10016 }
10017 
10018 template<typename Derived>
10019 ExprResult
10020 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10021   return E;
10022 }
10023 
10024 template<typename Derived>
10025 ExprResult
10026 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10027   return E;
10028 }
10029 
10030 template<typename Derived>
10031 ExprResult
10032 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10033   return E;
10034 }
10035 
10036 template<typename Derived>
10037 ExprResult
10038 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10039   return E;
10040 }
10041 
10042 template<typename Derived>
10043 ExprResult
10044 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10045   if (FunctionDecl *FD = E->getDirectCallee())
10046     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10047   return SemaRef.MaybeBindToTemporary(E);
10048 }
10049 
10050 template<typename Derived>
10051 ExprResult
10052 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10053   ExprResult ControllingExpr =
10054     getDerived().TransformExpr(E->getControllingExpr());
10055   if (ControllingExpr.isInvalid())
10056     return ExprError();
10057 
10058   SmallVector<Expr *, 4> AssocExprs;
10059   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10060   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10061     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10062     if (TSI) {
10063       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10064       if (!AssocType)
10065         return ExprError();
10066       AssocTypes.push_back(AssocType);
10067     } else {
10068       AssocTypes.push_back(nullptr);
10069     }
10070 
10071     ExprResult AssocExpr =
10072         getDerived().TransformExpr(Assoc.getAssociationExpr());
10073     if (AssocExpr.isInvalid())
10074       return ExprError();
10075     AssocExprs.push_back(AssocExpr.get());
10076   }
10077 
10078   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10079                                                   E->getDefaultLoc(),
10080                                                   E->getRParenLoc(),
10081                                                   ControllingExpr.get(),
10082                                                   AssocTypes,
10083                                                   AssocExprs);
10084 }
10085 
10086 template<typename Derived>
10087 ExprResult
10088 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10089   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10090   if (SubExpr.isInvalid())
10091     return ExprError();
10092 
10093   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10094     return E;
10095 
10096   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10097                                        E->getRParen());
10098 }
10099 
10100 /// The operand of a unary address-of operator has special rules: it's
10101 /// allowed to refer to a non-static member of a class even if there's no 'this'
10102 /// object available.
10103 template<typename Derived>
10104 ExprResult
10105 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10106   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10107     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10108   else
10109     return getDerived().TransformExpr(E);
10110 }
10111 
10112 template<typename Derived>
10113 ExprResult
10114 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10115   ExprResult SubExpr;
10116   if (E->getOpcode() == UO_AddrOf)
10117     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10118   else
10119     SubExpr = TransformExpr(E->getSubExpr());
10120   if (SubExpr.isInvalid())
10121     return ExprError();
10122 
10123   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10124     return E;
10125 
10126   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10127                                            E->getOpcode(),
10128                                            SubExpr.get());
10129 }
10130 
10131 template<typename Derived>
10132 ExprResult
10133 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10134   // Transform the type.
10135   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10136   if (!Type)
10137     return ExprError();
10138 
10139   // Transform all of the components into components similar to what the
10140   // parser uses.
10141   // FIXME: It would be slightly more efficient in the non-dependent case to
10142   // just map FieldDecls, rather than requiring the rebuilder to look for
10143   // the fields again. However, __builtin_offsetof is rare enough in
10144   // template code that we don't care.
10145   bool ExprChanged = false;
10146   typedef Sema::OffsetOfComponent Component;
10147   SmallVector<Component, 4> Components;
10148   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10149     const OffsetOfNode &ON = E->getComponent(I);
10150     Component Comp;
10151     Comp.isBrackets = true;
10152     Comp.LocStart = ON.getSourceRange().getBegin();
10153     Comp.LocEnd = ON.getSourceRange().getEnd();
10154     switch (ON.getKind()) {
10155     case OffsetOfNode::Array: {
10156       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10157       ExprResult Index = getDerived().TransformExpr(FromIndex);
10158       if (Index.isInvalid())
10159         return ExprError();
10160 
10161       ExprChanged = ExprChanged || Index.get() != FromIndex;
10162       Comp.isBrackets = true;
10163       Comp.U.E = Index.get();
10164       break;
10165     }
10166 
10167     case OffsetOfNode::Field:
10168     case OffsetOfNode::Identifier:
10169       Comp.isBrackets = false;
10170       Comp.U.IdentInfo = ON.getFieldName();
10171       if (!Comp.U.IdentInfo)
10172         continue;
10173 
10174       break;
10175 
10176     case OffsetOfNode::Base:
10177       // Will be recomputed during the rebuild.
10178       continue;
10179     }
10180 
10181     Components.push_back(Comp);
10182   }
10183 
10184   // If nothing changed, retain the existing expression.
10185   if (!getDerived().AlwaysRebuild() &&
10186       Type == E->getTypeSourceInfo() &&
10187       !ExprChanged)
10188     return E;
10189 
10190   // Build a new offsetof expression.
10191   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10192                                           Components, E->getRParenLoc());
10193 }
10194 
10195 template<typename Derived>
10196 ExprResult
10197 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10198   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10199          "opaque value expression requires transformation");
10200   return E;
10201 }
10202 
10203 template<typename Derived>
10204 ExprResult
10205 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10206   return E;
10207 }
10208 
10209 template <typename Derived>
10210 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10211   llvm::SmallVector<Expr *, 8> Children;
10212   bool Changed = false;
10213   for (Expr *C : E->subExpressions()) {
10214     ExprResult NewC = getDerived().TransformExpr(C);
10215     if (NewC.isInvalid())
10216       return ExprError();
10217     Children.push_back(NewC.get());
10218 
10219     Changed |= NewC.get() != C;
10220   }
10221   if (!getDerived().AlwaysRebuild() && !Changed)
10222     return E;
10223   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10224                                           Children, E->getType());
10225 }
10226 
10227 template<typename Derived>
10228 ExprResult
10229 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10230   // Rebuild the syntactic form.  The original syntactic form has
10231   // opaque-value expressions in it, so strip those away and rebuild
10232   // the result.  This is a really awful way of doing this, but the
10233   // better solution (rebuilding the semantic expressions and
10234   // rebinding OVEs as necessary) doesn't work; we'd need
10235   // TreeTransform to not strip away implicit conversions.
10236   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10237   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10238   if (result.isInvalid()) return ExprError();
10239 
10240   // If that gives us a pseudo-object result back, the pseudo-object
10241   // expression must have been an lvalue-to-rvalue conversion which we
10242   // should reapply.
10243   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10244     result = SemaRef.checkPseudoObjectRValue(result.get());
10245 
10246   return result;
10247 }
10248 
10249 template<typename Derived>
10250 ExprResult
10251 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10252                                                 UnaryExprOrTypeTraitExpr *E) {
10253   if (E->isArgumentType()) {
10254     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10255 
10256     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10257     if (!NewT)
10258       return ExprError();
10259 
10260     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10261       return E;
10262 
10263     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10264                                                     E->getKind(),
10265                                                     E->getSourceRange());
10266   }
10267 
10268   // C++0x [expr.sizeof]p1:
10269   //   The operand is either an expression, which is an unevaluated operand
10270   //   [...]
10271   EnterExpressionEvaluationContext Unevaluated(
10272       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10273       Sema::ReuseLambdaContextDecl);
10274 
10275   // Try to recover if we have something like sizeof(T::X) where X is a type.
10276   // Notably, there must be *exactly* one set of parens if X is a type.
10277   TypeSourceInfo *RecoveryTSI = nullptr;
10278   ExprResult SubExpr;
10279   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10280   if (auto *DRE =
10281           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10282     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10283         PE, DRE, false, &RecoveryTSI);
10284   else
10285     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10286 
10287   if (RecoveryTSI) {
10288     return getDerived().RebuildUnaryExprOrTypeTrait(
10289         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10290   } else if (SubExpr.isInvalid())
10291     return ExprError();
10292 
10293   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10294     return E;
10295 
10296   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10297                                                   E->getOperatorLoc(),
10298                                                   E->getKind(),
10299                                                   E->getSourceRange());
10300 }
10301 
10302 template<typename Derived>
10303 ExprResult
10304 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10305   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10306   if (LHS.isInvalid())
10307     return ExprError();
10308 
10309   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10310   if (RHS.isInvalid())
10311     return ExprError();
10312 
10313 
10314   if (!getDerived().AlwaysRebuild() &&
10315       LHS.get() == E->getLHS() &&
10316       RHS.get() == E->getRHS())
10317     return E;
10318 
10319   return getDerived().RebuildArraySubscriptExpr(
10320       LHS.get(),
10321       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10322 }
10323 
10324 template <typename Derived>
10325 ExprResult
10326 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10327   ExprResult Base = getDerived().TransformExpr(E->getBase());
10328   if (Base.isInvalid())
10329     return ExprError();
10330 
10331   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10332   if (RowIdx.isInvalid())
10333     return ExprError();
10334 
10335   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10336   if (ColumnIdx.isInvalid())
10337     return ExprError();
10338 
10339   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10340       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10341     return E;
10342 
10343   return getDerived().RebuildMatrixSubscriptExpr(
10344       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10345 }
10346 
10347 template <typename Derived>
10348 ExprResult
10349 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10350   ExprResult Base = getDerived().TransformExpr(E->getBase());
10351   if (Base.isInvalid())
10352     return ExprError();
10353 
10354   ExprResult LowerBound;
10355   if (E->getLowerBound()) {
10356     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10357     if (LowerBound.isInvalid())
10358       return ExprError();
10359   }
10360 
10361   ExprResult Length;
10362   if (E->getLength()) {
10363     Length = getDerived().TransformExpr(E->getLength());
10364     if (Length.isInvalid())
10365       return ExprError();
10366   }
10367 
10368   ExprResult Stride;
10369   if (Expr *Str = E->getStride()) {
10370     Stride = getDerived().TransformExpr(Str);
10371     if (Stride.isInvalid())
10372       return ExprError();
10373   }
10374 
10375   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10376       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10377     return E;
10378 
10379   return getDerived().RebuildOMPArraySectionExpr(
10380       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10381       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10382       E->getRBracketLoc());
10383 }
10384 
10385 template <typename Derived>
10386 ExprResult
10387 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10388   ExprResult Base = getDerived().TransformExpr(E->getBase());
10389   if (Base.isInvalid())
10390     return ExprError();
10391 
10392   SmallVector<Expr *, 4> Dims;
10393   bool ErrorFound = false;
10394   for (Expr *Dim : E->getDimensions()) {
10395     ExprResult DimRes = getDerived().TransformExpr(Dim);
10396     if (DimRes.isInvalid()) {
10397       ErrorFound = true;
10398       continue;
10399     }
10400     Dims.push_back(DimRes.get());
10401   }
10402 
10403   if (ErrorFound)
10404     return ExprError();
10405   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10406                                                  E->getRParenLoc(), Dims,
10407                                                  E->getBracketsRanges());
10408 }
10409 
10410 template <typename Derived>
10411 ExprResult
10412 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10413   unsigned NumIterators = E->numOfIterators();
10414   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10415 
10416   bool ErrorFound = false;
10417   bool NeedToRebuild = getDerived().AlwaysRebuild();
10418   for (unsigned I = 0; I < NumIterators; ++I) {
10419     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10420     Data[I].DeclIdent = D->getIdentifier();
10421     Data[I].DeclIdentLoc = D->getLocation();
10422     if (D->getLocation() == D->getBeginLoc()) {
10423       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10424              "Implicit type must be int.");
10425     } else {
10426       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10427       QualType DeclTy = getDerived().TransformType(D->getType());
10428       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10429     }
10430     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10431     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10432     ExprResult End = getDerived().TransformExpr(Range.End);
10433     ExprResult Step = getDerived().TransformExpr(Range.Step);
10434     ErrorFound = ErrorFound ||
10435                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10436                                                !Data[I].Type.get().isNull())) ||
10437                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10438     if (ErrorFound)
10439       continue;
10440     Data[I].Range.Begin = Begin.get();
10441     Data[I].Range.End = End.get();
10442     Data[I].Range.Step = Step.get();
10443     Data[I].AssignLoc = E->getAssignLoc(I);
10444     Data[I].ColonLoc = E->getColonLoc(I);
10445     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10446     NeedToRebuild =
10447         NeedToRebuild ||
10448         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10449                                        D->getType().getTypePtrOrNull()) ||
10450         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10451         Range.Step != Data[I].Range.Step;
10452   }
10453   if (ErrorFound)
10454     return ExprError();
10455   if (!NeedToRebuild)
10456     return E;
10457 
10458   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10459       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10460   if (!Res.isUsable())
10461     return Res;
10462   auto *IE = cast<OMPIteratorExpr>(Res.get());
10463   for (unsigned I = 0; I < NumIterators; ++I)
10464     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10465                                       IE->getIteratorDecl(I));
10466   return Res;
10467 }
10468 
10469 template<typename Derived>
10470 ExprResult
10471 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10472   // Transform the callee.
10473   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10474   if (Callee.isInvalid())
10475     return ExprError();
10476 
10477   // Transform arguments.
10478   bool ArgChanged = false;
10479   SmallVector<Expr*, 8> Args;
10480   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10481                                   &ArgChanged))
10482     return ExprError();
10483 
10484   if (!getDerived().AlwaysRebuild() &&
10485       Callee.get() == E->getCallee() &&
10486       !ArgChanged)
10487     return SemaRef.MaybeBindToTemporary(E);
10488 
10489   // FIXME: Wrong source location information for the '('.
10490   SourceLocation FakeLParenLoc
10491     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10492 
10493   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10494   if (E->hasStoredFPFeatures()) {
10495     FPOptionsOverride NewOverrides = E->getFPFeatures();
10496     getSema().CurFPFeatures =
10497         NewOverrides.applyOverrides(getSema().getLangOpts());
10498     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10499   }
10500 
10501   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10502                                       Args,
10503                                       E->getRParenLoc());
10504 }
10505 
10506 template<typename Derived>
10507 ExprResult
10508 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10509   ExprResult Base = getDerived().TransformExpr(E->getBase());
10510   if (Base.isInvalid())
10511     return ExprError();
10512 
10513   NestedNameSpecifierLoc QualifierLoc;
10514   if (E->hasQualifier()) {
10515     QualifierLoc
10516       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10517 
10518     if (!QualifierLoc)
10519       return ExprError();
10520   }
10521   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10522 
10523   ValueDecl *Member
10524     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10525                                                          E->getMemberDecl()));
10526   if (!Member)
10527     return ExprError();
10528 
10529   NamedDecl *FoundDecl = E->getFoundDecl();
10530   if (FoundDecl == E->getMemberDecl()) {
10531     FoundDecl = Member;
10532   } else {
10533     FoundDecl = cast_or_null<NamedDecl>(
10534                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10535     if (!FoundDecl)
10536       return ExprError();
10537   }
10538 
10539   if (!getDerived().AlwaysRebuild() &&
10540       Base.get() == E->getBase() &&
10541       QualifierLoc == E->getQualifierLoc() &&
10542       Member == E->getMemberDecl() &&
10543       FoundDecl == E->getFoundDecl() &&
10544       !E->hasExplicitTemplateArgs()) {
10545 
10546     // Mark it referenced in the new context regardless.
10547     // FIXME: this is a bit instantiation-specific.
10548     SemaRef.MarkMemberReferenced(E);
10549 
10550     return E;
10551   }
10552 
10553   TemplateArgumentListInfo TransArgs;
10554   if (E->hasExplicitTemplateArgs()) {
10555     TransArgs.setLAngleLoc(E->getLAngleLoc());
10556     TransArgs.setRAngleLoc(E->getRAngleLoc());
10557     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10558                                                 E->getNumTemplateArgs(),
10559                                                 TransArgs))
10560       return ExprError();
10561   }
10562 
10563   // FIXME: Bogus source location for the operator
10564   SourceLocation FakeOperatorLoc =
10565       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10566 
10567   // FIXME: to do this check properly, we will need to preserve the
10568   // first-qualifier-in-scope here, just in case we had a dependent
10569   // base (and therefore couldn't do the check) and a
10570   // nested-name-qualifier (and therefore could do the lookup).
10571   NamedDecl *FirstQualifierInScope = nullptr;
10572   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10573   if (MemberNameInfo.getName()) {
10574     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10575     if (!MemberNameInfo.getName())
10576       return ExprError();
10577   }
10578 
10579   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10580                                         E->isArrow(),
10581                                         QualifierLoc,
10582                                         TemplateKWLoc,
10583                                         MemberNameInfo,
10584                                         Member,
10585                                         FoundDecl,
10586                                         (E->hasExplicitTemplateArgs()
10587                                            ? &TransArgs : nullptr),
10588                                         FirstQualifierInScope);
10589 }
10590 
10591 template<typename Derived>
10592 ExprResult
10593 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10594   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10595   if (LHS.isInvalid())
10596     return ExprError();
10597 
10598   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10599   if (RHS.isInvalid())
10600     return ExprError();
10601 
10602   if (!getDerived().AlwaysRebuild() &&
10603       LHS.get() == E->getLHS() &&
10604       RHS.get() == E->getRHS())
10605     return E;
10606 
10607   if (E->isCompoundAssignmentOp())
10608     // FPFeatures has already been established from trailing storage
10609     return getDerived().RebuildBinaryOperator(
10610         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10611   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10612   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10613   getSema().CurFPFeatures =
10614       NewOverrides.applyOverrides(getSema().getLangOpts());
10615   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10616   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10617                                             LHS.get(), RHS.get());
10618 }
10619 
10620 template <typename Derived>
10621 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10622     CXXRewrittenBinaryOperator *E) {
10623   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10624 
10625   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10626   if (LHS.isInvalid())
10627     return ExprError();
10628 
10629   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10630   if (RHS.isInvalid())
10631     return ExprError();
10632 
10633   if (!getDerived().AlwaysRebuild() &&
10634       LHS.get() == Decomp.LHS &&
10635       RHS.get() == Decomp.RHS)
10636     return E;
10637 
10638   // Extract the already-resolved callee declarations so that we can restrict
10639   // ourselves to using them as the unqualified lookup results when rebuilding.
10640   UnresolvedSet<2> UnqualLookups;
10641   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10642                             const_cast<Expr *>(Decomp.InnerBinOp)};
10643   for (Expr *PossibleBinOp : PossibleBinOps) {
10644     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10645     if (!Op)
10646       continue;
10647     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10648     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10649       continue;
10650 
10651     // Transform the callee in case we built a call to a local extern
10652     // declaration.
10653     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10654         E->getOperatorLoc(), Callee->getFoundDecl()));
10655     if (!Found)
10656       return ExprError();
10657     UnqualLookups.addDecl(Found);
10658   }
10659 
10660   return getDerived().RebuildCXXRewrittenBinaryOperator(
10661       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10662 }
10663 
10664 template<typename Derived>
10665 ExprResult
10666 TreeTransform<Derived>::TransformCompoundAssignOperator(
10667                                                       CompoundAssignOperator *E) {
10668   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10669   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10670   getSema().CurFPFeatures =
10671       NewOverrides.applyOverrides(getSema().getLangOpts());
10672   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10673   return getDerived().TransformBinaryOperator(E);
10674 }
10675 
10676 template<typename Derived>
10677 ExprResult TreeTransform<Derived>::
10678 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10679   // Just rebuild the common and RHS expressions and see whether we
10680   // get any changes.
10681 
10682   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10683   if (commonExpr.isInvalid())
10684     return ExprError();
10685 
10686   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10687   if (rhs.isInvalid())
10688     return ExprError();
10689 
10690   if (!getDerived().AlwaysRebuild() &&
10691       commonExpr.get() == e->getCommon() &&
10692       rhs.get() == e->getFalseExpr())
10693     return e;
10694 
10695   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10696                                                  e->getQuestionLoc(),
10697                                                  nullptr,
10698                                                  e->getColonLoc(),
10699                                                  rhs.get());
10700 }
10701 
10702 template<typename Derived>
10703 ExprResult
10704 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10705   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10706   if (Cond.isInvalid())
10707     return ExprError();
10708 
10709   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10710   if (LHS.isInvalid())
10711     return ExprError();
10712 
10713   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10714   if (RHS.isInvalid())
10715     return ExprError();
10716 
10717   if (!getDerived().AlwaysRebuild() &&
10718       Cond.get() == E->getCond() &&
10719       LHS.get() == E->getLHS() &&
10720       RHS.get() == E->getRHS())
10721     return E;
10722 
10723   return getDerived().RebuildConditionalOperator(Cond.get(),
10724                                                  E->getQuestionLoc(),
10725                                                  LHS.get(),
10726                                                  E->getColonLoc(),
10727                                                  RHS.get());
10728 }
10729 
10730 template<typename Derived>
10731 ExprResult
10732 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10733   // Implicit casts are eliminated during transformation, since they
10734   // will be recomputed by semantic analysis after transformation.
10735   return getDerived().TransformExpr(E->getSubExprAsWritten());
10736 }
10737 
10738 template<typename Derived>
10739 ExprResult
10740 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10741   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10742   if (!Type)
10743     return ExprError();
10744 
10745   ExprResult SubExpr
10746     = getDerived().TransformExpr(E->getSubExprAsWritten());
10747   if (SubExpr.isInvalid())
10748     return ExprError();
10749 
10750   if (!getDerived().AlwaysRebuild() &&
10751       Type == E->getTypeInfoAsWritten() &&
10752       SubExpr.get() == E->getSubExpr())
10753     return E;
10754 
10755   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10756                                             Type,
10757                                             E->getRParenLoc(),
10758                                             SubExpr.get());
10759 }
10760 
10761 template<typename Derived>
10762 ExprResult
10763 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10764   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10765   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10766   if (!NewT)
10767     return ExprError();
10768 
10769   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10770   if (Init.isInvalid())
10771     return ExprError();
10772 
10773   if (!getDerived().AlwaysRebuild() &&
10774       OldT == NewT &&
10775       Init.get() == E->getInitializer())
10776     return SemaRef.MaybeBindToTemporary(E);
10777 
10778   // Note: the expression type doesn't necessarily match the
10779   // type-as-written, but that's okay, because it should always be
10780   // derivable from the initializer.
10781 
10782   return getDerived().RebuildCompoundLiteralExpr(
10783       E->getLParenLoc(), NewT,
10784       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10785 }
10786 
10787 template<typename Derived>
10788 ExprResult
10789 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10790   ExprResult Base = getDerived().TransformExpr(E->getBase());
10791   if (Base.isInvalid())
10792     return ExprError();
10793 
10794   if (!getDerived().AlwaysRebuild() &&
10795       Base.get() == E->getBase())
10796     return E;
10797 
10798   // FIXME: Bad source location
10799   SourceLocation FakeOperatorLoc =
10800       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10801   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10802                                                   E->getAccessorLoc(),
10803                                                   E->getAccessor());
10804 }
10805 
10806 template<typename Derived>
10807 ExprResult
10808 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10809   if (InitListExpr *Syntactic = E->getSyntacticForm())
10810     E = Syntactic;
10811 
10812   bool InitChanged = false;
10813 
10814   EnterExpressionEvaluationContext Context(
10815       getSema(), EnterExpressionEvaluationContext::InitList);
10816 
10817   SmallVector<Expr*, 4> Inits;
10818   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10819                                   Inits, &InitChanged))
10820     return ExprError();
10821 
10822   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10823     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10824     // in some cases. We can't reuse it in general, because the syntactic and
10825     // semantic forms are linked, and we can't know that semantic form will
10826     // match even if the syntactic form does.
10827   }
10828 
10829   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10830                                       E->getRBraceLoc());
10831 }
10832 
10833 template<typename Derived>
10834 ExprResult
10835 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10836   Designation Desig;
10837 
10838   // transform the initializer value
10839   ExprResult Init = getDerived().TransformExpr(E->getInit());
10840   if (Init.isInvalid())
10841     return ExprError();
10842 
10843   // transform the designators.
10844   SmallVector<Expr*, 4> ArrayExprs;
10845   bool ExprChanged = false;
10846   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10847     if (D.isFieldDesignator()) {
10848       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10849                                                D.getDotLoc(),
10850                                                D.getFieldLoc()));
10851       if (D.getField()) {
10852         FieldDecl *Field = cast_or_null<FieldDecl>(
10853             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10854         if (Field != D.getField())
10855           // Rebuild the expression when the transformed FieldDecl is
10856           // different to the already assigned FieldDecl.
10857           ExprChanged = true;
10858       } else {
10859         // Ensure that the designator expression is rebuilt when there isn't
10860         // a resolved FieldDecl in the designator as we don't want to assign
10861         // a FieldDecl to a pattern designator that will be instantiated again.
10862         ExprChanged = true;
10863       }
10864       continue;
10865     }
10866 
10867     if (D.isArrayDesignator()) {
10868       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10869       if (Index.isInvalid())
10870         return ExprError();
10871 
10872       Desig.AddDesignator(
10873           Designator::getArray(Index.get(), D.getLBracketLoc()));
10874 
10875       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10876       ArrayExprs.push_back(Index.get());
10877       continue;
10878     }
10879 
10880     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10881     ExprResult Start
10882       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10883     if (Start.isInvalid())
10884       return ExprError();
10885 
10886     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10887     if (End.isInvalid())
10888       return ExprError();
10889 
10890     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10891                                                   End.get(),
10892                                                   D.getLBracketLoc(),
10893                                                   D.getEllipsisLoc()));
10894 
10895     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10896                   End.get() != E->getArrayRangeEnd(D);
10897 
10898     ArrayExprs.push_back(Start.get());
10899     ArrayExprs.push_back(End.get());
10900   }
10901 
10902   if (!getDerived().AlwaysRebuild() &&
10903       Init.get() == E->getInit() &&
10904       !ExprChanged)
10905     return E;
10906 
10907   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10908                                                 E->getEqualOrColonLoc(),
10909                                                 E->usesGNUSyntax(), Init.get());
10910 }
10911 
10912 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10913 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10914 template<typename Derived>
10915 ExprResult
10916 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10917     DesignatedInitUpdateExpr *E) {
10918   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10919                    "initializer");
10920   return ExprError();
10921 }
10922 
10923 template<typename Derived>
10924 ExprResult
10925 TreeTransform<Derived>::TransformNoInitExpr(
10926     NoInitExpr *E) {
10927   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10928   return ExprError();
10929 }
10930 
10931 template<typename Derived>
10932 ExprResult
10933 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10934   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10935   return ExprError();
10936 }
10937 
10938 template<typename Derived>
10939 ExprResult
10940 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10941   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10942   return ExprError();
10943 }
10944 
10945 template<typename Derived>
10946 ExprResult
10947 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10948                                                      ImplicitValueInitExpr *E) {
10949   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10950 
10951   // FIXME: Will we ever have proper type location here? Will we actually
10952   // need to transform the type?
10953   QualType T = getDerived().TransformType(E->getType());
10954   if (T.isNull())
10955     return ExprError();
10956 
10957   if (!getDerived().AlwaysRebuild() &&
10958       T == E->getType())
10959     return E;
10960 
10961   return getDerived().RebuildImplicitValueInitExpr(T);
10962 }
10963 
10964 template<typename Derived>
10965 ExprResult
10966 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10967   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10968   if (!TInfo)
10969     return ExprError();
10970 
10971   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10972   if (SubExpr.isInvalid())
10973     return ExprError();
10974 
10975   if (!getDerived().AlwaysRebuild() &&
10976       TInfo == E->getWrittenTypeInfo() &&
10977       SubExpr.get() == E->getSubExpr())
10978     return E;
10979 
10980   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10981                                        TInfo, E->getRParenLoc());
10982 }
10983 
10984 template<typename Derived>
10985 ExprResult
10986 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10987   bool ArgumentChanged = false;
10988   SmallVector<Expr*, 4> Inits;
10989   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10990                      &ArgumentChanged))
10991     return ExprError();
10992 
10993   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10994                                            Inits,
10995                                            E->getRParenLoc());
10996 }
10997 
10998 /// Transform an address-of-label expression.
10999 ///
11000 /// By default, the transformation of an address-of-label expression always
11001 /// rebuilds the expression, so that the label identifier can be resolved to
11002 /// the corresponding label statement by semantic analysis.
11003 template<typename Derived>
11004 ExprResult
11005 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11006   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11007                                         E->getLabel());
11008   if (!LD)
11009     return ExprError();
11010 
11011   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11012                                            cast<LabelDecl>(LD));
11013 }
11014 
11015 template<typename Derived>
11016 ExprResult
11017 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11018   SemaRef.ActOnStartStmtExpr();
11019   StmtResult SubStmt
11020     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11021   if (SubStmt.isInvalid()) {
11022     SemaRef.ActOnStmtExprError();
11023     return ExprError();
11024   }
11025 
11026   unsigned OldDepth = E->getTemplateDepth();
11027   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11028 
11029   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11030       SubStmt.get() == E->getSubStmt()) {
11031     // Calling this an 'error' is unintuitive, but it does the right thing.
11032     SemaRef.ActOnStmtExprError();
11033     return SemaRef.MaybeBindToTemporary(E);
11034   }
11035 
11036   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11037                                       E->getRParenLoc(), NewDepth);
11038 }
11039 
11040 template<typename Derived>
11041 ExprResult
11042 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11043   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11044   if (Cond.isInvalid())
11045     return ExprError();
11046 
11047   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11048   if (LHS.isInvalid())
11049     return ExprError();
11050 
11051   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11052   if (RHS.isInvalid())
11053     return ExprError();
11054 
11055   if (!getDerived().AlwaysRebuild() &&
11056       Cond.get() == E->getCond() &&
11057       LHS.get() == E->getLHS() &&
11058       RHS.get() == E->getRHS())
11059     return E;
11060 
11061   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11062                                         Cond.get(), LHS.get(), RHS.get(),
11063                                         E->getRParenLoc());
11064 }
11065 
11066 template<typename Derived>
11067 ExprResult
11068 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11069   return E;
11070 }
11071 
11072 template<typename Derived>
11073 ExprResult
11074 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11075   switch (E->getOperator()) {
11076   case OO_New:
11077   case OO_Delete:
11078   case OO_Array_New:
11079   case OO_Array_Delete:
11080     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11081 
11082   case OO_Call: {
11083     // This is a call to an object's operator().
11084     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11085 
11086     // Transform the object itself.
11087     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11088     if (Object.isInvalid())
11089       return ExprError();
11090 
11091     // FIXME: Poor location information
11092     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11093         static_cast<Expr *>(Object.get())->getEndLoc());
11094 
11095     // Transform the call arguments.
11096     SmallVector<Expr*, 8> Args;
11097     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11098                                     Args))
11099       return ExprError();
11100 
11101     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11102                                         E->getEndLoc());
11103   }
11104 
11105 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11106   case OO_##Name:
11107 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11108 #include "clang/Basic/OperatorKinds.def"
11109   case OO_Subscript:
11110     // Handled below.
11111     break;
11112 
11113   case OO_Conditional:
11114     llvm_unreachable("conditional operator is not actually overloadable");
11115 
11116   case OO_None:
11117   case NUM_OVERLOADED_OPERATORS:
11118     llvm_unreachable("not an overloaded operator?");
11119   }
11120 
11121   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11122   if (Callee.isInvalid())
11123     return ExprError();
11124 
11125   ExprResult First;
11126   if (E->getOperator() == OO_Amp)
11127     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11128   else
11129     First = getDerived().TransformExpr(E->getArg(0));
11130   if (First.isInvalid())
11131     return ExprError();
11132 
11133   ExprResult Second;
11134   if (E->getNumArgs() == 2) {
11135     Second = getDerived().TransformExpr(E->getArg(1));
11136     if (Second.isInvalid())
11137       return ExprError();
11138   }
11139 
11140   if (!getDerived().AlwaysRebuild() &&
11141       Callee.get() == E->getCallee() &&
11142       First.get() == E->getArg(0) &&
11143       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11144     return SemaRef.MaybeBindToTemporary(E);
11145 
11146   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11147   FPOptionsOverride NewOverrides(E->getFPFeatures());
11148   getSema().CurFPFeatures =
11149       NewOverrides.applyOverrides(getSema().getLangOpts());
11150   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11151 
11152   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11153                                                  E->getOperatorLoc(),
11154                                                  Callee.get(),
11155                                                  First.get(),
11156                                                  Second.get());
11157 }
11158 
11159 template<typename Derived>
11160 ExprResult
11161 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11162   return getDerived().TransformCallExpr(E);
11163 }
11164 
11165 template <typename Derived>
11166 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11167   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11168                          getSema().CurContext != E->getParentContext();
11169 
11170   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11171     return E;
11172 
11173   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11174                                            E->getEndLoc(),
11175                                            getSema().CurContext);
11176 }
11177 
11178 template<typename Derived>
11179 ExprResult
11180 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11181   // Transform the callee.
11182   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11183   if (Callee.isInvalid())
11184     return ExprError();
11185 
11186   // Transform exec config.
11187   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11188   if (EC.isInvalid())
11189     return ExprError();
11190 
11191   // Transform arguments.
11192   bool ArgChanged = false;
11193   SmallVector<Expr*, 8> Args;
11194   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11195                                   &ArgChanged))
11196     return ExprError();
11197 
11198   if (!getDerived().AlwaysRebuild() &&
11199       Callee.get() == E->getCallee() &&
11200       !ArgChanged)
11201     return SemaRef.MaybeBindToTemporary(E);
11202 
11203   // FIXME: Wrong source location information for the '('.
11204   SourceLocation FakeLParenLoc
11205     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11206   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11207                                       Args,
11208                                       E->getRParenLoc(), EC.get());
11209 }
11210 
11211 template<typename Derived>
11212 ExprResult
11213 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11214   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11215   if (!Type)
11216     return ExprError();
11217 
11218   ExprResult SubExpr
11219     = getDerived().TransformExpr(E->getSubExprAsWritten());
11220   if (SubExpr.isInvalid())
11221     return ExprError();
11222 
11223   if (!getDerived().AlwaysRebuild() &&
11224       Type == E->getTypeInfoAsWritten() &&
11225       SubExpr.get() == E->getSubExpr())
11226     return E;
11227   return getDerived().RebuildCXXNamedCastExpr(
11228       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11229       Type, E->getAngleBrackets().getEnd(),
11230       // FIXME. this should be '(' location
11231       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11232 }
11233 
11234 template<typename Derived>
11235 ExprResult
11236 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11237   TypeSourceInfo *TSI =
11238       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11239   if (!TSI)
11240     return ExprError();
11241 
11242   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11243   if (Sub.isInvalid())
11244     return ExprError();
11245 
11246   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11247                                                 Sub.get(), BCE->getEndLoc());
11248 }
11249 
11250 template<typename Derived>
11251 ExprResult
11252 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11253   return getDerived().TransformCXXNamedCastExpr(E);
11254 }
11255 
11256 template<typename Derived>
11257 ExprResult
11258 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11259   return getDerived().TransformCXXNamedCastExpr(E);
11260 }
11261 
11262 template<typename Derived>
11263 ExprResult
11264 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11265                                                       CXXReinterpretCastExpr *E) {
11266   return getDerived().TransformCXXNamedCastExpr(E);
11267 }
11268 
11269 template<typename Derived>
11270 ExprResult
11271 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11272   return getDerived().TransformCXXNamedCastExpr(E);
11273 }
11274 
11275 template<typename Derived>
11276 ExprResult
11277 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11278   return getDerived().TransformCXXNamedCastExpr(E);
11279 }
11280 
11281 template<typename Derived>
11282 ExprResult
11283 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11284                                                      CXXFunctionalCastExpr *E) {
11285   TypeSourceInfo *Type =
11286       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11287   if (!Type)
11288     return ExprError();
11289 
11290   ExprResult SubExpr
11291     = getDerived().TransformExpr(E->getSubExprAsWritten());
11292   if (SubExpr.isInvalid())
11293     return ExprError();
11294 
11295   if (!getDerived().AlwaysRebuild() &&
11296       Type == E->getTypeInfoAsWritten() &&
11297       SubExpr.get() == E->getSubExpr())
11298     return E;
11299 
11300   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11301                                                    E->getLParenLoc(),
11302                                                    SubExpr.get(),
11303                                                    E->getRParenLoc(),
11304                                                    E->isListInitialization());
11305 }
11306 
11307 template<typename Derived>
11308 ExprResult
11309 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11310   if (E->isTypeOperand()) {
11311     TypeSourceInfo *TInfo
11312       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11313     if (!TInfo)
11314       return ExprError();
11315 
11316     if (!getDerived().AlwaysRebuild() &&
11317         TInfo == E->getTypeOperandSourceInfo())
11318       return E;
11319 
11320     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11321                                              TInfo, E->getEndLoc());
11322   }
11323 
11324   // We don't know whether the subexpression is potentially evaluated until
11325   // after we perform semantic analysis.  We speculatively assume it is
11326   // unevaluated; it will get fixed later if the subexpression is in fact
11327   // potentially evaluated.
11328   EnterExpressionEvaluationContext Unevaluated(
11329       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11330       Sema::ReuseLambdaContextDecl);
11331 
11332   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11333   if (SubExpr.isInvalid())
11334     return ExprError();
11335 
11336   if (!getDerived().AlwaysRebuild() &&
11337       SubExpr.get() == E->getExprOperand())
11338     return E;
11339 
11340   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11341                                            SubExpr.get(), E->getEndLoc());
11342 }
11343 
11344 template<typename Derived>
11345 ExprResult
11346 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11347   if (E->isTypeOperand()) {
11348     TypeSourceInfo *TInfo
11349       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11350     if (!TInfo)
11351       return ExprError();
11352 
11353     if (!getDerived().AlwaysRebuild() &&
11354         TInfo == E->getTypeOperandSourceInfo())
11355       return E;
11356 
11357     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11358                                              TInfo, E->getEndLoc());
11359   }
11360 
11361   EnterExpressionEvaluationContext Unevaluated(
11362       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11363 
11364   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11365   if (SubExpr.isInvalid())
11366     return ExprError();
11367 
11368   if (!getDerived().AlwaysRebuild() &&
11369       SubExpr.get() == E->getExprOperand())
11370     return E;
11371 
11372   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11373                                            SubExpr.get(), E->getEndLoc());
11374 }
11375 
11376 template<typename Derived>
11377 ExprResult
11378 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11379   return E;
11380 }
11381 
11382 template<typename Derived>
11383 ExprResult
11384 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11385                                                      CXXNullPtrLiteralExpr *E) {
11386   return E;
11387 }
11388 
11389 template<typename Derived>
11390 ExprResult
11391 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11392   QualType T = getSema().getCurrentThisType();
11393 
11394   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11395     // Mark it referenced in the new context regardless.
11396     // FIXME: this is a bit instantiation-specific.
11397     getSema().MarkThisReferenced(E);
11398     return E;
11399   }
11400 
11401   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11402 }
11403 
11404 template<typename Derived>
11405 ExprResult
11406 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11407   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11408   if (SubExpr.isInvalid())
11409     return ExprError();
11410 
11411   if (!getDerived().AlwaysRebuild() &&
11412       SubExpr.get() == E->getSubExpr())
11413     return E;
11414 
11415   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11416                                           E->isThrownVariableInScope());
11417 }
11418 
11419 template<typename Derived>
11420 ExprResult
11421 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11422   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11423       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11424   if (!Param)
11425     return ExprError();
11426 
11427   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11428       E->getUsedContext() == SemaRef.CurContext)
11429     return E;
11430 
11431   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11432 }
11433 
11434 template<typename Derived>
11435 ExprResult
11436 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11437   FieldDecl *Field = cast_or_null<FieldDecl>(
11438       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11439   if (!Field)
11440     return ExprError();
11441 
11442   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11443       E->getUsedContext() == SemaRef.CurContext)
11444     return E;
11445 
11446   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11447 }
11448 
11449 template<typename Derived>
11450 ExprResult
11451 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11452                                                     CXXScalarValueInitExpr *E) {
11453   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11454   if (!T)
11455     return ExprError();
11456 
11457   if (!getDerived().AlwaysRebuild() &&
11458       T == E->getTypeSourceInfo())
11459     return E;
11460 
11461   return getDerived().RebuildCXXScalarValueInitExpr(T,
11462                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11463                                                     E->getRParenLoc());
11464 }
11465 
11466 template<typename Derived>
11467 ExprResult
11468 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11469   // Transform the type that we're allocating
11470   TypeSourceInfo *AllocTypeInfo =
11471       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11472   if (!AllocTypeInfo)
11473     return ExprError();
11474 
11475   // Transform the size of the array we're allocating (if any).
11476   Optional<Expr *> ArraySize;
11477   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11478     ExprResult NewArraySize;
11479     if (*OldArraySize) {
11480       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11481       if (NewArraySize.isInvalid())
11482         return ExprError();
11483     }
11484     ArraySize = NewArraySize.get();
11485   }
11486 
11487   // Transform the placement arguments (if any).
11488   bool ArgumentChanged = false;
11489   SmallVector<Expr*, 8> PlacementArgs;
11490   if (getDerived().TransformExprs(E->getPlacementArgs(),
11491                                   E->getNumPlacementArgs(), true,
11492                                   PlacementArgs, &ArgumentChanged))
11493     return ExprError();
11494 
11495   // Transform the initializer (if any).
11496   Expr *OldInit = E->getInitializer();
11497   ExprResult NewInit;
11498   if (OldInit)
11499     NewInit = getDerived().TransformInitializer(OldInit, true);
11500   if (NewInit.isInvalid())
11501     return ExprError();
11502 
11503   // Transform new operator and delete operator.
11504   FunctionDecl *OperatorNew = nullptr;
11505   if (E->getOperatorNew()) {
11506     OperatorNew = cast_or_null<FunctionDecl>(
11507         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11508     if (!OperatorNew)
11509       return ExprError();
11510   }
11511 
11512   FunctionDecl *OperatorDelete = nullptr;
11513   if (E->getOperatorDelete()) {
11514     OperatorDelete = cast_or_null<FunctionDecl>(
11515         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11516     if (!OperatorDelete)
11517       return ExprError();
11518   }
11519 
11520   if (!getDerived().AlwaysRebuild() &&
11521       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11522       ArraySize == E->getArraySize() &&
11523       NewInit.get() == OldInit &&
11524       OperatorNew == E->getOperatorNew() &&
11525       OperatorDelete == E->getOperatorDelete() &&
11526       !ArgumentChanged) {
11527     // Mark any declarations we need as referenced.
11528     // FIXME: instantiation-specific.
11529     if (OperatorNew)
11530       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11531     if (OperatorDelete)
11532       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11533 
11534     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11535       QualType ElementType
11536         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11537       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11538         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11539         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11540           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11541         }
11542       }
11543     }
11544 
11545     return E;
11546   }
11547 
11548   QualType AllocType = AllocTypeInfo->getType();
11549   if (!ArraySize) {
11550     // If no array size was specified, but the new expression was
11551     // instantiated with an array type (e.g., "new T" where T is
11552     // instantiated with "int[4]"), extract the outer bound from the
11553     // array type as our array size. We do this with constant and
11554     // dependently-sized array types.
11555     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11556     if (!ArrayT) {
11557       // Do nothing
11558     } else if (const ConstantArrayType *ConsArrayT
11559                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11560       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11561                                          SemaRef.Context.getSizeType(),
11562                                          /*FIXME:*/ E->getBeginLoc());
11563       AllocType = ConsArrayT->getElementType();
11564     } else if (const DependentSizedArrayType *DepArrayT
11565                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11566       if (DepArrayT->getSizeExpr()) {
11567         ArraySize = DepArrayT->getSizeExpr();
11568         AllocType = DepArrayT->getElementType();
11569       }
11570     }
11571   }
11572 
11573   return getDerived().RebuildCXXNewExpr(
11574       E->getBeginLoc(), E->isGlobalNew(),
11575       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11576       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11577       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11578 }
11579 
11580 template<typename Derived>
11581 ExprResult
11582 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11583   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11584   if (Operand.isInvalid())
11585     return ExprError();
11586 
11587   // Transform the delete operator, if known.
11588   FunctionDecl *OperatorDelete = nullptr;
11589   if (E->getOperatorDelete()) {
11590     OperatorDelete = cast_or_null<FunctionDecl>(
11591         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11592     if (!OperatorDelete)
11593       return ExprError();
11594   }
11595 
11596   if (!getDerived().AlwaysRebuild() &&
11597       Operand.get() == E->getArgument() &&
11598       OperatorDelete == E->getOperatorDelete()) {
11599     // Mark any declarations we need as referenced.
11600     // FIXME: instantiation-specific.
11601     if (OperatorDelete)
11602       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11603 
11604     if (!E->getArgument()->isTypeDependent()) {
11605       QualType Destroyed = SemaRef.Context.getBaseElementType(
11606                                                          E->getDestroyedType());
11607       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11608         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11609         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11610                                        SemaRef.LookupDestructor(Record));
11611       }
11612     }
11613 
11614     return E;
11615   }
11616 
11617   return getDerived().RebuildCXXDeleteExpr(
11618       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11619 }
11620 
11621 template<typename Derived>
11622 ExprResult
11623 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11624                                                      CXXPseudoDestructorExpr *E) {
11625   ExprResult Base = getDerived().TransformExpr(E->getBase());
11626   if (Base.isInvalid())
11627     return ExprError();
11628 
11629   ParsedType ObjectTypePtr;
11630   bool MayBePseudoDestructor = false;
11631   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11632                                               E->getOperatorLoc(),
11633                                         E->isArrow()? tok::arrow : tok::period,
11634                                               ObjectTypePtr,
11635                                               MayBePseudoDestructor);
11636   if (Base.isInvalid())
11637     return ExprError();
11638 
11639   QualType ObjectType = ObjectTypePtr.get();
11640   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11641   if (QualifierLoc) {
11642     QualifierLoc
11643       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11644     if (!QualifierLoc)
11645       return ExprError();
11646   }
11647   CXXScopeSpec SS;
11648   SS.Adopt(QualifierLoc);
11649 
11650   PseudoDestructorTypeStorage Destroyed;
11651   if (E->getDestroyedTypeInfo()) {
11652     TypeSourceInfo *DestroyedTypeInfo
11653       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11654                                                 ObjectType, nullptr, SS);
11655     if (!DestroyedTypeInfo)
11656       return ExprError();
11657     Destroyed = DestroyedTypeInfo;
11658   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11659     // We aren't likely to be able to resolve the identifier down to a type
11660     // now anyway, so just retain the identifier.
11661     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11662                                             E->getDestroyedTypeLoc());
11663   } else {
11664     // Look for a destructor known with the given name.
11665     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11666                                               *E->getDestroyedTypeIdentifier(),
11667                                                 E->getDestroyedTypeLoc(),
11668                                                 /*Scope=*/nullptr,
11669                                                 SS, ObjectTypePtr,
11670                                                 false);
11671     if (!T)
11672       return ExprError();
11673 
11674     Destroyed
11675       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11676                                                  E->getDestroyedTypeLoc());
11677   }
11678 
11679   TypeSourceInfo *ScopeTypeInfo = nullptr;
11680   if (E->getScopeTypeInfo()) {
11681     CXXScopeSpec EmptySS;
11682     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11683                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11684     if (!ScopeTypeInfo)
11685       return ExprError();
11686   }
11687 
11688   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11689                                                      E->getOperatorLoc(),
11690                                                      E->isArrow(),
11691                                                      SS,
11692                                                      ScopeTypeInfo,
11693                                                      E->getColonColonLoc(),
11694                                                      E->getTildeLoc(),
11695                                                      Destroyed);
11696 }
11697 
11698 template <typename Derived>
11699 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11700                                                         bool RequiresADL,
11701                                                         LookupResult &R) {
11702   // Transform all the decls.
11703   bool AllEmptyPacks = true;
11704   for (auto *OldD : Old->decls()) {
11705     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11706     if (!InstD) {
11707       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11708       // This can happen because of dependent hiding.
11709       if (isa<UsingShadowDecl>(OldD))
11710         continue;
11711       else {
11712         R.clear();
11713         return true;
11714       }
11715     }
11716 
11717     // Expand using pack declarations.
11718     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11719     ArrayRef<NamedDecl*> Decls = SingleDecl;
11720     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11721       Decls = UPD->expansions();
11722 
11723     // Expand using declarations.
11724     for (auto *D : Decls) {
11725       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11726         for (auto *SD : UD->shadows())
11727           R.addDecl(SD);
11728       } else {
11729         R.addDecl(D);
11730       }
11731     }
11732 
11733     AllEmptyPacks &= Decls.empty();
11734   };
11735 
11736   // C++ [temp.res]/8.4.2:
11737   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11738   //   a name in the template definition found a using-declaration, but the
11739   //   lookup in the corresponding scope in the instantiation odoes not find
11740   //   any declarations because the using-declaration was a pack expansion and
11741   //   the corresponding pack is empty
11742   if (AllEmptyPacks && !RequiresADL) {
11743     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11744         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11745     return true;
11746   }
11747 
11748   // Resolve a kind, but don't do any further analysis.  If it's
11749   // ambiguous, the callee needs to deal with it.
11750   R.resolveKind();
11751   return false;
11752 }
11753 
11754 template<typename Derived>
11755 ExprResult
11756 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11757                                                   UnresolvedLookupExpr *Old) {
11758   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11759                  Sema::LookupOrdinaryName);
11760 
11761   // Transform the declaration set.
11762   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11763     return ExprError();
11764 
11765   // Rebuild the nested-name qualifier, if present.
11766   CXXScopeSpec SS;
11767   if (Old->getQualifierLoc()) {
11768     NestedNameSpecifierLoc QualifierLoc
11769       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11770     if (!QualifierLoc)
11771       return ExprError();
11772 
11773     SS.Adopt(QualifierLoc);
11774   }
11775 
11776   if (Old->getNamingClass()) {
11777     CXXRecordDecl *NamingClass
11778       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11779                                                             Old->getNameLoc(),
11780                                                         Old->getNamingClass()));
11781     if (!NamingClass) {
11782       R.clear();
11783       return ExprError();
11784     }
11785 
11786     R.setNamingClass(NamingClass);
11787   }
11788 
11789   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11790 
11791   // If we have neither explicit template arguments, nor the template keyword,
11792   // it's a normal declaration name or member reference.
11793   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11794     NamedDecl *D = R.getAsSingle<NamedDecl>();
11795     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11796     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11797     // give a good diagnostic.
11798     if (D && D->isCXXInstanceMember()) {
11799       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11800                                                      /*TemplateArgs=*/nullptr,
11801                                                      /*Scope=*/nullptr);
11802     }
11803 
11804     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11805   }
11806 
11807   // If we have template arguments, rebuild them, then rebuild the
11808   // templateid expression.
11809   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11810   if (Old->hasExplicitTemplateArgs() &&
11811       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11812                                               Old->getNumTemplateArgs(),
11813                                               TransArgs)) {
11814     R.clear();
11815     return ExprError();
11816   }
11817 
11818   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11819                                             Old->requiresADL(), &TransArgs);
11820 }
11821 
11822 template<typename Derived>
11823 ExprResult
11824 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11825   bool ArgChanged = false;
11826   SmallVector<TypeSourceInfo *, 4> Args;
11827   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11828     TypeSourceInfo *From = E->getArg(I);
11829     TypeLoc FromTL = From->getTypeLoc();
11830     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11831       TypeLocBuilder TLB;
11832       TLB.reserve(FromTL.getFullDataSize());
11833       QualType To = getDerived().TransformType(TLB, FromTL);
11834       if (To.isNull())
11835         return ExprError();
11836 
11837       if (To == From->getType())
11838         Args.push_back(From);
11839       else {
11840         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11841         ArgChanged = true;
11842       }
11843       continue;
11844     }
11845 
11846     ArgChanged = true;
11847 
11848     // We have a pack expansion. Instantiate it.
11849     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11850     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11851     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11852     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11853 
11854     // Determine whether the set of unexpanded parameter packs can and should
11855     // be expanded.
11856     bool Expand = true;
11857     bool RetainExpansion = false;
11858     Optional<unsigned> OrigNumExpansions =
11859         ExpansionTL.getTypePtr()->getNumExpansions();
11860     Optional<unsigned> NumExpansions = OrigNumExpansions;
11861     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11862                                              PatternTL.getSourceRange(),
11863                                              Unexpanded,
11864                                              Expand, RetainExpansion,
11865                                              NumExpansions))
11866       return ExprError();
11867 
11868     if (!Expand) {
11869       // The transform has determined that we should perform a simple
11870       // transformation on the pack expansion, producing another pack
11871       // expansion.
11872       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11873 
11874       TypeLocBuilder TLB;
11875       TLB.reserve(From->getTypeLoc().getFullDataSize());
11876 
11877       QualType To = getDerived().TransformType(TLB, PatternTL);
11878       if (To.isNull())
11879         return ExprError();
11880 
11881       To = getDerived().RebuildPackExpansionType(To,
11882                                                  PatternTL.getSourceRange(),
11883                                                  ExpansionTL.getEllipsisLoc(),
11884                                                  NumExpansions);
11885       if (To.isNull())
11886         return ExprError();
11887 
11888       PackExpansionTypeLoc ToExpansionTL
11889         = TLB.push<PackExpansionTypeLoc>(To);
11890       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11891       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11892       continue;
11893     }
11894 
11895     // Expand the pack expansion by substituting for each argument in the
11896     // pack(s).
11897     for (unsigned I = 0; I != *NumExpansions; ++I) {
11898       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11899       TypeLocBuilder TLB;
11900       TLB.reserve(PatternTL.getFullDataSize());
11901       QualType To = getDerived().TransformType(TLB, PatternTL);
11902       if (To.isNull())
11903         return ExprError();
11904 
11905       if (To->containsUnexpandedParameterPack()) {
11906         To = getDerived().RebuildPackExpansionType(To,
11907                                                    PatternTL.getSourceRange(),
11908                                                    ExpansionTL.getEllipsisLoc(),
11909                                                    NumExpansions);
11910         if (To.isNull())
11911           return ExprError();
11912 
11913         PackExpansionTypeLoc ToExpansionTL
11914           = TLB.push<PackExpansionTypeLoc>(To);
11915         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11916       }
11917 
11918       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11919     }
11920 
11921     if (!RetainExpansion)
11922       continue;
11923 
11924     // If we're supposed to retain a pack expansion, do so by temporarily
11925     // forgetting the partially-substituted parameter pack.
11926     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11927 
11928     TypeLocBuilder TLB;
11929     TLB.reserve(From->getTypeLoc().getFullDataSize());
11930 
11931     QualType To = getDerived().TransformType(TLB, PatternTL);
11932     if (To.isNull())
11933       return ExprError();
11934 
11935     To = getDerived().RebuildPackExpansionType(To,
11936                                                PatternTL.getSourceRange(),
11937                                                ExpansionTL.getEllipsisLoc(),
11938                                                NumExpansions);
11939     if (To.isNull())
11940       return ExprError();
11941 
11942     PackExpansionTypeLoc ToExpansionTL
11943       = TLB.push<PackExpansionTypeLoc>(To);
11944     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11945     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11946   }
11947 
11948   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11949     return E;
11950 
11951   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11952                                        E->getEndLoc());
11953 }
11954 
11955 template<typename Derived>
11956 ExprResult
11957 TreeTransform<Derived>::TransformConceptSpecializationExpr(
11958                                                  ConceptSpecializationExpr *E) {
11959   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
11960   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
11961   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11962                                               Old->NumTemplateArgs, TransArgs))
11963     return ExprError();
11964 
11965   return getDerived().RebuildConceptSpecializationExpr(
11966       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
11967       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
11968       &TransArgs);
11969 }
11970 
11971 template<typename Derived>
11972 ExprResult
11973 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
11974   SmallVector<ParmVarDecl*, 4> TransParams;
11975   SmallVector<QualType, 4> TransParamTypes;
11976   Sema::ExtParameterInfoBuilder ExtParamInfos;
11977 
11978   // C++2a [expr.prim.req]p2
11979   // Expressions appearing within a requirement-body are unevaluated operands.
11980   EnterExpressionEvaluationContext Ctx(
11981       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11982 
11983   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
11984       getSema().Context, getSema().CurContext,
11985       E->getBody()->getBeginLoc());
11986 
11987   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
11988 
11989   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
11990                                                E->getLocalParameters(),
11991                                                /*ParamTypes=*/nullptr,
11992                                                /*ParamInfos=*/nullptr,
11993                                                TransParamTypes, &TransParams,
11994                                                ExtParamInfos))
11995     return ExprError();
11996 
11997   for (ParmVarDecl *Param : TransParams)
11998     Param->setDeclContext(Body);
11999 
12000   SmallVector<concepts::Requirement *, 4> TransReqs;
12001   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12002                                                      TransReqs))
12003     return ExprError();
12004 
12005   for (concepts::Requirement *Req : TransReqs) {
12006     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12007       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12008         ER->getReturnTypeRequirement()
12009                 .getTypeConstraintTemplateParameterList()->getParam(0)
12010                 ->setDeclContext(Body);
12011       }
12012     }
12013   }
12014 
12015   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12016                                           TransParams, TransReqs,
12017                                           E->getRBraceLoc());
12018 }
12019 
12020 template<typename Derived>
12021 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12022     ArrayRef<concepts::Requirement *> Reqs,
12023     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12024   for (concepts::Requirement *Req : Reqs) {
12025     concepts::Requirement *TransReq = nullptr;
12026     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12027       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12028     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12029       TransReq = getDerived().TransformExprRequirement(ExprReq);
12030     else
12031       TransReq = getDerived().TransformNestedRequirement(
12032                      cast<concepts::NestedRequirement>(Req));
12033     if (!TransReq)
12034       return true;
12035     Transformed.push_back(TransReq);
12036   }
12037   return false;
12038 }
12039 
12040 template<typename Derived>
12041 concepts::TypeRequirement *
12042 TreeTransform<Derived>::TransformTypeRequirement(
12043     concepts::TypeRequirement *Req) {
12044   if (Req->isSubstitutionFailure()) {
12045     if (getDerived().AlwaysRebuild())
12046       return getDerived().RebuildTypeRequirement(
12047               Req->getSubstitutionDiagnostic());
12048     return Req;
12049   }
12050   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12051   if (!TransType)
12052     return nullptr;
12053   return getDerived().RebuildTypeRequirement(TransType);
12054 }
12055 
12056 template<typename Derived>
12057 concepts::ExprRequirement *
12058 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12059   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12060   if (Req->isExprSubstitutionFailure())
12061     TransExpr = Req->getExprSubstitutionDiagnostic();
12062   else {
12063     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12064     if (TransExprRes.isInvalid())
12065       return nullptr;
12066     TransExpr = TransExprRes.get();
12067   }
12068 
12069   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12070   const auto &RetReq = Req->getReturnTypeRequirement();
12071   if (RetReq.isEmpty())
12072     TransRetReq.emplace();
12073   else if (RetReq.isSubstitutionFailure())
12074     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12075   else if (RetReq.isTypeConstraint()) {
12076     TemplateParameterList *OrigTPL =
12077         RetReq.getTypeConstraintTemplateParameterList();
12078     TemplateParameterList *TPL =
12079         getDerived().TransformTemplateParameterList(OrigTPL);
12080     if (!TPL)
12081       return nullptr;
12082     TransRetReq.emplace(TPL);
12083   }
12084   assert(TransRetReq.hasValue() &&
12085          "All code paths leading here must set TransRetReq");
12086   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12087     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12088                                                Req->getNoexceptLoc(),
12089                                                std::move(*TransRetReq));
12090   return getDerived().RebuildExprRequirement(
12091       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12092       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12093 }
12094 
12095 template<typename Derived>
12096 concepts::NestedRequirement *
12097 TreeTransform<Derived>::TransformNestedRequirement(
12098     concepts::NestedRequirement *Req) {
12099   if (Req->isSubstitutionFailure()) {
12100     if (getDerived().AlwaysRebuild())
12101       return getDerived().RebuildNestedRequirement(
12102           Req->getSubstitutionDiagnostic());
12103     return Req;
12104   }
12105   ExprResult TransConstraint =
12106       getDerived().TransformExpr(Req->getConstraintExpr());
12107   if (TransConstraint.isInvalid())
12108     return nullptr;
12109   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12110 }
12111 
12112 template<typename Derived>
12113 ExprResult
12114 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12115   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12116   if (!T)
12117     return ExprError();
12118 
12119   if (!getDerived().AlwaysRebuild() &&
12120       T == E->getQueriedTypeSourceInfo())
12121     return E;
12122 
12123   ExprResult SubExpr;
12124   {
12125     EnterExpressionEvaluationContext Unevaluated(
12126         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12127     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12128     if (SubExpr.isInvalid())
12129       return ExprError();
12130 
12131     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12132       return E;
12133   }
12134 
12135   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12136                                             SubExpr.get(), E->getEndLoc());
12137 }
12138 
12139 template<typename Derived>
12140 ExprResult
12141 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12142   ExprResult SubExpr;
12143   {
12144     EnterExpressionEvaluationContext Unevaluated(
12145         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12146     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12147     if (SubExpr.isInvalid())
12148       return ExprError();
12149 
12150     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12151       return E;
12152   }
12153 
12154   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12155                                              SubExpr.get(), E->getEndLoc());
12156 }
12157 
12158 template <typename Derived>
12159 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12160     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12161     TypeSourceInfo **RecoveryTSI) {
12162   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12163       DRE, AddrTaken, RecoveryTSI);
12164 
12165   // Propagate both errors and recovered types, which return ExprEmpty.
12166   if (!NewDRE.isUsable())
12167     return NewDRE;
12168 
12169   // We got an expr, wrap it up in parens.
12170   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12171     return PE;
12172   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12173                                        PE->getRParen());
12174 }
12175 
12176 template <typename Derived>
12177 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12178     DependentScopeDeclRefExpr *E) {
12179   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12180                                             nullptr);
12181 }
12182 
12183 template<typename Derived>
12184 ExprResult
12185 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12186                                                DependentScopeDeclRefExpr *E,
12187                                                bool IsAddressOfOperand,
12188                                                TypeSourceInfo **RecoveryTSI) {
12189   assert(E->getQualifierLoc());
12190   NestedNameSpecifierLoc QualifierLoc
12191   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12192   if (!QualifierLoc)
12193     return ExprError();
12194   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12195 
12196   // TODO: If this is a conversion-function-id, verify that the
12197   // destination type name (if present) resolves the same way after
12198   // instantiation as it did in the local scope.
12199 
12200   DeclarationNameInfo NameInfo
12201     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12202   if (!NameInfo.getName())
12203     return ExprError();
12204 
12205   if (!E->hasExplicitTemplateArgs()) {
12206     if (!getDerived().AlwaysRebuild() &&
12207         QualifierLoc == E->getQualifierLoc() &&
12208         // Note: it is sufficient to compare the Name component of NameInfo:
12209         // if name has not changed, DNLoc has not changed either.
12210         NameInfo.getName() == E->getDeclName())
12211       return E;
12212 
12213     return getDerived().RebuildDependentScopeDeclRefExpr(
12214         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12215         IsAddressOfOperand, RecoveryTSI);
12216   }
12217 
12218   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12219   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12220                                               E->getNumTemplateArgs(),
12221                                               TransArgs))
12222     return ExprError();
12223 
12224   return getDerived().RebuildDependentScopeDeclRefExpr(
12225       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12226       RecoveryTSI);
12227 }
12228 
12229 template<typename Derived>
12230 ExprResult
12231 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12232   // CXXConstructExprs other than for list-initialization and
12233   // CXXTemporaryObjectExpr are always implicit, so when we have
12234   // a 1-argument construction we just transform that argument.
12235   if (getDerived().AllowSkippingCXXConstructExpr() &&
12236       ((E->getNumArgs() == 1 ||
12237         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12238        (!getDerived().DropCallArgument(E->getArg(0))) &&
12239        !E->isListInitialization()))
12240     return getDerived().TransformExpr(E->getArg(0));
12241 
12242   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12243 
12244   QualType T = getDerived().TransformType(E->getType());
12245   if (T.isNull())
12246     return ExprError();
12247 
12248   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12249       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12250   if (!Constructor)
12251     return ExprError();
12252 
12253   bool ArgumentChanged = false;
12254   SmallVector<Expr*, 8> Args;
12255   {
12256     EnterExpressionEvaluationContext Context(
12257         getSema(), EnterExpressionEvaluationContext::InitList,
12258         E->isListInitialization());
12259     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12260                                     &ArgumentChanged))
12261       return ExprError();
12262   }
12263 
12264   if (!getDerived().AlwaysRebuild() &&
12265       T == E->getType() &&
12266       Constructor == E->getConstructor() &&
12267       !ArgumentChanged) {
12268     // Mark the constructor as referenced.
12269     // FIXME: Instantiation-specific
12270     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12271     return E;
12272   }
12273 
12274   return getDerived().RebuildCXXConstructExpr(
12275       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12276       E->hadMultipleCandidates(), E->isListInitialization(),
12277       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12278       E->getConstructionKind(), E->getParenOrBraceRange());
12279 }
12280 
12281 template<typename Derived>
12282 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12283     CXXInheritedCtorInitExpr *E) {
12284   QualType T = getDerived().TransformType(E->getType());
12285   if (T.isNull())
12286     return ExprError();
12287 
12288   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12289       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12290   if (!Constructor)
12291     return ExprError();
12292 
12293   if (!getDerived().AlwaysRebuild() &&
12294       T == E->getType() &&
12295       Constructor == E->getConstructor()) {
12296     // Mark the constructor as referenced.
12297     // FIXME: Instantiation-specific
12298     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12299     return E;
12300   }
12301 
12302   return getDerived().RebuildCXXInheritedCtorInitExpr(
12303       T, E->getLocation(), Constructor,
12304       E->constructsVBase(), E->inheritedFromVBase());
12305 }
12306 
12307 /// Transform a C++ temporary-binding expression.
12308 ///
12309 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12310 /// transform the subexpression and return that.
12311 template<typename Derived>
12312 ExprResult
12313 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12314   return getDerived().TransformExpr(E->getSubExpr());
12315 }
12316 
12317 /// Transform a C++ expression that contains cleanups that should
12318 /// be run after the expression is evaluated.
12319 ///
12320 /// Since ExprWithCleanups nodes are implicitly generated, we
12321 /// just transform the subexpression and return that.
12322 template<typename Derived>
12323 ExprResult
12324 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12325   return getDerived().TransformExpr(E->getSubExpr());
12326 }
12327 
12328 template<typename Derived>
12329 ExprResult
12330 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12331                                                     CXXTemporaryObjectExpr *E) {
12332   TypeSourceInfo *T =
12333       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12334   if (!T)
12335     return ExprError();
12336 
12337   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12338       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12339   if (!Constructor)
12340     return ExprError();
12341 
12342   bool ArgumentChanged = false;
12343   SmallVector<Expr*, 8> Args;
12344   Args.reserve(E->getNumArgs());
12345   {
12346     EnterExpressionEvaluationContext Context(
12347         getSema(), EnterExpressionEvaluationContext::InitList,
12348         E->isListInitialization());
12349     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12350                        &ArgumentChanged))
12351       return ExprError();
12352   }
12353 
12354   if (!getDerived().AlwaysRebuild() &&
12355       T == E->getTypeSourceInfo() &&
12356       Constructor == E->getConstructor() &&
12357       !ArgumentChanged) {
12358     // FIXME: Instantiation-specific
12359     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12360     return SemaRef.MaybeBindToTemporary(E);
12361   }
12362 
12363   // FIXME: We should just pass E->isListInitialization(), but we're not
12364   // prepared to handle list-initialization without a child InitListExpr.
12365   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12366   return getDerived().RebuildCXXTemporaryObjectExpr(
12367       T, LParenLoc, Args, E->getEndLoc(),
12368       /*ListInitialization=*/LParenLoc.isInvalid());
12369 }
12370 
12371 template<typename Derived>
12372 ExprResult
12373 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12374   // Transform any init-capture expressions before entering the scope of the
12375   // lambda body, because they are not semantically within that scope.
12376   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12377   struct TransformedInitCapture {
12378     // The location of the ... if the result is retaining a pack expansion.
12379     SourceLocation EllipsisLoc;
12380     // Zero or more expansions of the init-capture.
12381     SmallVector<InitCaptureInfoTy, 4> Expansions;
12382   };
12383   SmallVector<TransformedInitCapture, 4> InitCaptures;
12384   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12385   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12386                                     CEnd = E->capture_end();
12387        C != CEnd; ++C) {
12388     if (!E->isInitCapture(C))
12389       continue;
12390 
12391     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12392     VarDecl *OldVD = C->getCapturedVar();
12393 
12394     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12395                                 Optional<unsigned> NumExpansions) {
12396       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12397           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12398 
12399       if (NewExprInitResult.isInvalid()) {
12400         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12401         return;
12402       }
12403       Expr *NewExprInit = NewExprInitResult.get();
12404 
12405       QualType NewInitCaptureType =
12406           getSema().buildLambdaInitCaptureInitialization(
12407               C->getLocation(), OldVD->getType()->isReferenceType(),
12408               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12409               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12410               NewExprInit);
12411       Result.Expansions.push_back(
12412           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12413     };
12414 
12415     // If this is an init-capture pack, consider expanding the pack now.
12416     if (OldVD->isParameterPack()) {
12417       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12418                                              ->getTypeLoc()
12419                                              .castAs<PackExpansionTypeLoc>();
12420       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12421       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12422 
12423       // Determine whether the set of unexpanded parameter packs can and should
12424       // be expanded.
12425       bool Expand = true;
12426       bool RetainExpansion = false;
12427       Optional<unsigned> OrigNumExpansions =
12428           ExpansionTL.getTypePtr()->getNumExpansions();
12429       Optional<unsigned> NumExpansions = OrigNumExpansions;
12430       if (getDerived().TryExpandParameterPacks(
12431               ExpansionTL.getEllipsisLoc(),
12432               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12433               RetainExpansion, NumExpansions))
12434         return ExprError();
12435       if (Expand) {
12436         for (unsigned I = 0; I != *NumExpansions; ++I) {
12437           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12438           SubstInitCapture(SourceLocation(), None);
12439         }
12440       }
12441       if (!Expand || RetainExpansion) {
12442         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12443         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12444         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12445       }
12446     } else {
12447       SubstInitCapture(SourceLocation(), None);
12448     }
12449   }
12450 
12451   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12452   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12453 
12454   // Transform the template parameters, and add them to the current
12455   // instantiation scope. The null case is handled correctly.
12456   auto TPL = getDerived().TransformTemplateParameterList(
12457       E->getTemplateParameterList());
12458   LSI->GLTemplateParameterList = TPL;
12459 
12460   // Transform the type of the original lambda's call operator.
12461   // The transformation MUST be done in the CurrentInstantiationScope since
12462   // it introduces a mapping of the original to the newly created
12463   // transformed parameters.
12464   TypeSourceInfo *NewCallOpTSI = nullptr;
12465   {
12466     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12467     FunctionProtoTypeLoc OldCallOpFPTL =
12468         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12469 
12470     TypeLocBuilder NewCallOpTLBuilder;
12471     SmallVector<QualType, 4> ExceptionStorage;
12472     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12473     QualType NewCallOpType = TransformFunctionProtoType(
12474         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12475         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12476           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12477                                               ExceptionStorage, Changed);
12478         });
12479     if (NewCallOpType.isNull())
12480       return ExprError();
12481     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12482                                                         NewCallOpType);
12483   }
12484 
12485   // Transform the trailing requires clause
12486   ExprResult NewTrailingRequiresClause;
12487   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12488     // FIXME: Concepts: Substitution into requires clause should only happen
12489     //                  when checking satisfaction.
12490     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12491 
12492   // Create the local class that will describe the lambda.
12493   // FIXME: KnownDependent below is wrong when substituting inside a templated
12494   // context that isn't a DeclContext (such as a variable template).
12495   CXXRecordDecl *OldClass = E->getLambdaClass();
12496   CXXRecordDecl *Class
12497     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12498                                         NewCallOpTSI,
12499                                         /*KnownDependent=*/false,
12500                                         E->getCaptureDefault());
12501   getDerived().transformedLocalDecl(OldClass, {Class});
12502 
12503   Optional<std::tuple<unsigned, bool, Decl *>> Mangling;
12504   if (getDerived().ReplacingOriginal())
12505     Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(),
12506                                OldClass->hasKnownLambdaInternalLinkage(),
12507                                OldClass->getLambdaContextDecl());
12508 
12509   // Build the call operator.
12510   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12511       Class, E->getIntroducerRange(), NewCallOpTSI,
12512       E->getCallOperator()->getEndLoc(),
12513       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12514       E->getCallOperator()->getConstexprKind(),
12515       NewTrailingRequiresClause.get());
12516 
12517   LSI->CallOperator = NewCallOperator;
12518 
12519   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12520   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12521 
12522   // Number the lambda for linkage purposes if necessary.
12523   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12524 
12525   // Introduce the context of the call operator.
12526   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12527                                  /*NewThisContext*/false);
12528 
12529   // Enter the scope of the lambda.
12530   getSema().buildLambdaScope(LSI, NewCallOperator,
12531                              E->getIntroducerRange(),
12532                              E->getCaptureDefault(),
12533                              E->getCaptureDefaultLoc(),
12534                              E->hasExplicitParameters(),
12535                              E->hasExplicitResultType(),
12536                              E->isMutable());
12537 
12538   bool Invalid = false;
12539 
12540   // Transform captures.
12541   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12542                                  CEnd = E->capture_end();
12543        C != CEnd; ++C) {
12544     // When we hit the first implicit capture, tell Sema that we've finished
12545     // the list of explicit captures.
12546     if (C->isImplicit())
12547       break;
12548 
12549     // Capturing 'this' is trivial.
12550     if (C->capturesThis()) {
12551       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12552                                     /*BuildAndDiagnose*/ true, nullptr,
12553                                     C->getCaptureKind() == LCK_StarThis);
12554       continue;
12555     }
12556     // Captured expression will be recaptured during captured variables
12557     // rebuilding.
12558     if (C->capturesVLAType())
12559       continue;
12560 
12561     // Rebuild init-captures, including the implied field declaration.
12562     if (E->isInitCapture(C)) {
12563       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12564 
12565       VarDecl *OldVD = C->getCapturedVar();
12566       llvm::SmallVector<Decl*, 4> NewVDs;
12567 
12568       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12569         ExprResult Init = Info.first;
12570         QualType InitQualType = Info.second;
12571         if (Init.isInvalid() || InitQualType.isNull()) {
12572           Invalid = true;
12573           break;
12574         }
12575         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12576             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12577             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12578         if (!NewVD) {
12579           Invalid = true;
12580           break;
12581         }
12582         NewVDs.push_back(NewVD);
12583         getSema().addInitCapture(LSI, NewVD);
12584       }
12585 
12586       if (Invalid)
12587         break;
12588 
12589       getDerived().transformedLocalDecl(OldVD, NewVDs);
12590       continue;
12591     }
12592 
12593     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12594 
12595     // Determine the capture kind for Sema.
12596     Sema::TryCaptureKind Kind
12597       = C->isImplicit()? Sema::TryCapture_Implicit
12598                        : C->getCaptureKind() == LCK_ByCopy
12599                            ? Sema::TryCapture_ExplicitByVal
12600                            : Sema::TryCapture_ExplicitByRef;
12601     SourceLocation EllipsisLoc;
12602     if (C->isPackExpansion()) {
12603       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12604       bool ShouldExpand = false;
12605       bool RetainExpansion = false;
12606       Optional<unsigned> NumExpansions;
12607       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12608                                                C->getLocation(),
12609                                                Unexpanded,
12610                                                ShouldExpand, RetainExpansion,
12611                                                NumExpansions)) {
12612         Invalid = true;
12613         continue;
12614       }
12615 
12616       if (ShouldExpand) {
12617         // The transform has determined that we should perform an expansion;
12618         // transform and capture each of the arguments.
12619         // expansion of the pattern. Do so.
12620         VarDecl *Pack = C->getCapturedVar();
12621         for (unsigned I = 0; I != *NumExpansions; ++I) {
12622           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12623           VarDecl *CapturedVar
12624             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12625                                                                Pack));
12626           if (!CapturedVar) {
12627             Invalid = true;
12628             continue;
12629           }
12630 
12631           // Capture the transformed variable.
12632           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12633         }
12634 
12635         // FIXME: Retain a pack expansion if RetainExpansion is true.
12636 
12637         continue;
12638       }
12639 
12640       EllipsisLoc = C->getEllipsisLoc();
12641     }
12642 
12643     // Transform the captured variable.
12644     VarDecl *CapturedVar
12645       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12646                                                          C->getCapturedVar()));
12647     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12648       Invalid = true;
12649       continue;
12650     }
12651 
12652     // Capture the transformed variable.
12653     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12654                                  EllipsisLoc);
12655   }
12656   getSema().finishLambdaExplicitCaptures(LSI);
12657 
12658   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12659   // evaluation context even if we're not transforming the function body.
12660   getSema().PushExpressionEvaluationContext(
12661       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12662 
12663   // Instantiate the body of the lambda expression.
12664   StmtResult Body =
12665       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12666 
12667   // ActOnLambda* will pop the function scope for us.
12668   FuncScopeCleanup.disable();
12669 
12670   if (Body.isInvalid()) {
12671     SavedContext.pop();
12672     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12673                                /*IsInstantiation=*/true);
12674     return ExprError();
12675   }
12676 
12677   // Copy the LSI before ActOnFinishFunctionBody removes it.
12678   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12679   // the call operator.
12680   auto LSICopy = *LSI;
12681   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12682                                     /*IsInstantiation*/ true);
12683   SavedContext.pop();
12684 
12685   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12686                                    &LSICopy);
12687 }
12688 
12689 template<typename Derived>
12690 StmtResult
12691 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12692   return TransformStmt(S);
12693 }
12694 
12695 template<typename Derived>
12696 StmtResult
12697 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12698   // Transform captures.
12699   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12700                                  CEnd = E->capture_end();
12701        C != CEnd; ++C) {
12702     // When we hit the first implicit capture, tell Sema that we've finished
12703     // the list of explicit captures.
12704     if (!C->isImplicit())
12705       continue;
12706 
12707     // Capturing 'this' is trivial.
12708     if (C->capturesThis()) {
12709       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12710                                     /*BuildAndDiagnose*/ true, nullptr,
12711                                     C->getCaptureKind() == LCK_StarThis);
12712       continue;
12713     }
12714     // Captured expression will be recaptured during captured variables
12715     // rebuilding.
12716     if (C->capturesVLAType())
12717       continue;
12718 
12719     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12720     assert(!E->isInitCapture(C) && "implicit init-capture?");
12721 
12722     // Transform the captured variable.
12723     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12724         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12725     if (!CapturedVar || CapturedVar->isInvalidDecl())
12726       return StmtError();
12727 
12728     // Capture the transformed variable.
12729     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12730   }
12731 
12732   return S;
12733 }
12734 
12735 template<typename Derived>
12736 ExprResult
12737 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12738                                                   CXXUnresolvedConstructExpr *E) {
12739   TypeSourceInfo *T =
12740       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12741   if (!T)
12742     return ExprError();
12743 
12744   bool ArgumentChanged = false;
12745   SmallVector<Expr*, 8> Args;
12746   Args.reserve(E->arg_size());
12747   {
12748     EnterExpressionEvaluationContext Context(
12749         getSema(), EnterExpressionEvaluationContext::InitList,
12750         E->isListInitialization());
12751     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
12752                                     &ArgumentChanged))
12753       return ExprError();
12754   }
12755 
12756   if (!getDerived().AlwaysRebuild() &&
12757       T == E->getTypeSourceInfo() &&
12758       !ArgumentChanged)
12759     return E;
12760 
12761   // FIXME: we're faking the locations of the commas
12762   return getDerived().RebuildCXXUnresolvedConstructExpr(
12763       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12764 }
12765 
12766 template<typename Derived>
12767 ExprResult
12768 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12769                                              CXXDependentScopeMemberExpr *E) {
12770   // Transform the base of the expression.
12771   ExprResult Base((Expr*) nullptr);
12772   Expr *OldBase;
12773   QualType BaseType;
12774   QualType ObjectType;
12775   if (!E->isImplicitAccess()) {
12776     OldBase = E->getBase();
12777     Base = getDerived().TransformExpr(OldBase);
12778     if (Base.isInvalid())
12779       return ExprError();
12780 
12781     // Start the member reference and compute the object's type.
12782     ParsedType ObjectTy;
12783     bool MayBePseudoDestructor = false;
12784     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12785                                                 E->getOperatorLoc(),
12786                                       E->isArrow()? tok::arrow : tok::period,
12787                                                 ObjectTy,
12788                                                 MayBePseudoDestructor);
12789     if (Base.isInvalid())
12790       return ExprError();
12791 
12792     ObjectType = ObjectTy.get();
12793     BaseType = ((Expr*) Base.get())->getType();
12794   } else {
12795     OldBase = nullptr;
12796     BaseType = getDerived().TransformType(E->getBaseType());
12797     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12798   }
12799 
12800   // Transform the first part of the nested-name-specifier that qualifies
12801   // the member name.
12802   NamedDecl *FirstQualifierInScope
12803     = getDerived().TransformFirstQualifierInScope(
12804                                             E->getFirstQualifierFoundInScope(),
12805                                             E->getQualifierLoc().getBeginLoc());
12806 
12807   NestedNameSpecifierLoc QualifierLoc;
12808   if (E->getQualifier()) {
12809     QualifierLoc
12810       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12811                                                      ObjectType,
12812                                                      FirstQualifierInScope);
12813     if (!QualifierLoc)
12814       return ExprError();
12815   }
12816 
12817   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12818 
12819   // TODO: If this is a conversion-function-id, verify that the
12820   // destination type name (if present) resolves the same way after
12821   // instantiation as it did in the local scope.
12822 
12823   DeclarationNameInfo NameInfo
12824     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12825   if (!NameInfo.getName())
12826     return ExprError();
12827 
12828   if (!E->hasExplicitTemplateArgs()) {
12829     // This is a reference to a member without an explicitly-specified
12830     // template argument list. Optimize for this common case.
12831     if (!getDerived().AlwaysRebuild() &&
12832         Base.get() == OldBase &&
12833         BaseType == E->getBaseType() &&
12834         QualifierLoc == E->getQualifierLoc() &&
12835         NameInfo.getName() == E->getMember() &&
12836         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12837       return E;
12838 
12839     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12840                                                        BaseType,
12841                                                        E->isArrow(),
12842                                                        E->getOperatorLoc(),
12843                                                        QualifierLoc,
12844                                                        TemplateKWLoc,
12845                                                        FirstQualifierInScope,
12846                                                        NameInfo,
12847                                                        /*TemplateArgs*/nullptr);
12848   }
12849 
12850   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12851   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12852                                               E->getNumTemplateArgs(),
12853                                               TransArgs))
12854     return ExprError();
12855 
12856   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12857                                                      BaseType,
12858                                                      E->isArrow(),
12859                                                      E->getOperatorLoc(),
12860                                                      QualifierLoc,
12861                                                      TemplateKWLoc,
12862                                                      FirstQualifierInScope,
12863                                                      NameInfo,
12864                                                      &TransArgs);
12865 }
12866 
12867 template<typename Derived>
12868 ExprResult
12869 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12870   // Transform the base of the expression.
12871   ExprResult Base((Expr*) nullptr);
12872   QualType BaseType;
12873   if (!Old->isImplicitAccess()) {
12874     Base = getDerived().TransformExpr(Old->getBase());
12875     if (Base.isInvalid())
12876       return ExprError();
12877     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12878                                                      Old->isArrow());
12879     if (Base.isInvalid())
12880       return ExprError();
12881     BaseType = Base.get()->getType();
12882   } else {
12883     BaseType = getDerived().TransformType(Old->getBaseType());
12884   }
12885 
12886   NestedNameSpecifierLoc QualifierLoc;
12887   if (Old->getQualifierLoc()) {
12888     QualifierLoc
12889     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12890     if (!QualifierLoc)
12891       return ExprError();
12892   }
12893 
12894   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12895 
12896   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12897                  Sema::LookupOrdinaryName);
12898 
12899   // Transform the declaration set.
12900   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12901     return ExprError();
12902 
12903   // Determine the naming class.
12904   if (Old->getNamingClass()) {
12905     CXXRecordDecl *NamingClass
12906       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12907                                                           Old->getMemberLoc(),
12908                                                         Old->getNamingClass()));
12909     if (!NamingClass)
12910       return ExprError();
12911 
12912     R.setNamingClass(NamingClass);
12913   }
12914 
12915   TemplateArgumentListInfo TransArgs;
12916   if (Old->hasExplicitTemplateArgs()) {
12917     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12918     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12919     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12920                                                 Old->getNumTemplateArgs(),
12921                                                 TransArgs))
12922       return ExprError();
12923   }
12924 
12925   // FIXME: to do this check properly, we will need to preserve the
12926   // first-qualifier-in-scope here, just in case we had a dependent
12927   // base (and therefore couldn't do the check) and a
12928   // nested-name-qualifier (and therefore could do the lookup).
12929   NamedDecl *FirstQualifierInScope = nullptr;
12930 
12931   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12932                                                   BaseType,
12933                                                   Old->getOperatorLoc(),
12934                                                   Old->isArrow(),
12935                                                   QualifierLoc,
12936                                                   TemplateKWLoc,
12937                                                   FirstQualifierInScope,
12938                                                   R,
12939                                               (Old->hasExplicitTemplateArgs()
12940                                                   ? &TransArgs : nullptr));
12941 }
12942 
12943 template<typename Derived>
12944 ExprResult
12945 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12946   EnterExpressionEvaluationContext Unevaluated(
12947       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12948   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12949   if (SubExpr.isInvalid())
12950     return ExprError();
12951 
12952   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
12953     return E;
12954 
12955   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
12956 }
12957 
12958 template<typename Derived>
12959 ExprResult
12960 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
12961   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
12962   if (Pattern.isInvalid())
12963     return ExprError();
12964 
12965   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
12966     return E;
12967 
12968   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
12969                                            E->getNumExpansions());
12970 }
12971 
12972 template<typename Derived>
12973 ExprResult
12974 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
12975   // If E is not value-dependent, then nothing will change when we transform it.
12976   // Note: This is an instantiation-centric view.
12977   if (!E->isValueDependent())
12978     return E;
12979 
12980   EnterExpressionEvaluationContext Unevaluated(
12981       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
12982 
12983   ArrayRef<TemplateArgument> PackArgs;
12984   TemplateArgument ArgStorage;
12985 
12986   // Find the argument list to transform.
12987   if (E->isPartiallySubstituted()) {
12988     PackArgs = E->getPartialArguments();
12989   } else if (E->isValueDependent()) {
12990     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
12991     bool ShouldExpand = false;
12992     bool RetainExpansion = false;
12993     Optional<unsigned> NumExpansions;
12994     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
12995                                              Unexpanded,
12996                                              ShouldExpand, RetainExpansion,
12997                                              NumExpansions))
12998       return ExprError();
12999 
13000     // If we need to expand the pack, build a template argument from it and
13001     // expand that.
13002     if (ShouldExpand) {
13003       auto *Pack = E->getPack();
13004       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13005         ArgStorage = getSema().Context.getPackExpansionType(
13006             getSema().Context.getTypeDeclType(TTPD), None);
13007       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13008         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13009       } else {
13010         auto *VD = cast<ValueDecl>(Pack);
13011         ExprResult DRE = getSema().BuildDeclRefExpr(
13012             VD, VD->getType().getNonLValueExprType(getSema().Context),
13013             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
13014             E->getPackLoc());
13015         if (DRE.isInvalid())
13016           return ExprError();
13017         ArgStorage = new (getSema().Context) PackExpansionExpr(
13018             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13019       }
13020       PackArgs = ArgStorage;
13021     }
13022   }
13023 
13024   // If we're not expanding the pack, just transform the decl.
13025   if (!PackArgs.size()) {
13026     auto *Pack = cast_or_null<NamedDecl>(
13027         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13028     if (!Pack)
13029       return ExprError();
13030     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13031                                               E->getPackLoc(),
13032                                               E->getRParenLoc(), None, None);
13033   }
13034 
13035   // Try to compute the result without performing a partial substitution.
13036   Optional<unsigned> Result = 0;
13037   for (const TemplateArgument &Arg : PackArgs) {
13038     if (!Arg.isPackExpansion()) {
13039       Result = *Result + 1;
13040       continue;
13041     }
13042 
13043     TemplateArgumentLoc ArgLoc;
13044     InventTemplateArgumentLoc(Arg, ArgLoc);
13045 
13046     // Find the pattern of the pack expansion.
13047     SourceLocation Ellipsis;
13048     Optional<unsigned> OrigNumExpansions;
13049     TemplateArgumentLoc Pattern =
13050         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13051                                                           OrigNumExpansions);
13052 
13053     // Substitute under the pack expansion. Do not expand the pack (yet).
13054     TemplateArgumentLoc OutPattern;
13055     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13056     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13057                                                /*Uneval*/ true))
13058       return true;
13059 
13060     // See if we can determine the number of arguments from the result.
13061     Optional<unsigned> NumExpansions =
13062         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13063     if (!NumExpansions) {
13064       // No: we must be in an alias template expansion, and we're going to need
13065       // to actually expand the packs.
13066       Result = None;
13067       break;
13068     }
13069 
13070     Result = *Result + *NumExpansions;
13071   }
13072 
13073   // Common case: we could determine the number of expansions without
13074   // substituting.
13075   if (Result)
13076     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13077                                               E->getPackLoc(),
13078                                               E->getRParenLoc(), *Result, None);
13079 
13080   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13081                                                E->getPackLoc());
13082   {
13083     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13084     typedef TemplateArgumentLocInventIterator<
13085         Derived, const TemplateArgument*> PackLocIterator;
13086     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13087                                    PackLocIterator(*this, PackArgs.end()),
13088                                    TransformedPackArgs, /*Uneval*/true))
13089       return ExprError();
13090   }
13091 
13092   // Check whether we managed to fully-expand the pack.
13093   // FIXME: Is it possible for us to do so and not hit the early exit path?
13094   SmallVector<TemplateArgument, 8> Args;
13095   bool PartialSubstitution = false;
13096   for (auto &Loc : TransformedPackArgs.arguments()) {
13097     Args.push_back(Loc.getArgument());
13098     if (Loc.getArgument().isPackExpansion())
13099       PartialSubstitution = true;
13100   }
13101 
13102   if (PartialSubstitution)
13103     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13104                                               E->getPackLoc(),
13105                                               E->getRParenLoc(), None, Args);
13106 
13107   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13108                                             E->getPackLoc(), E->getRParenLoc(),
13109                                             Args.size(), None);
13110 }
13111 
13112 template<typename Derived>
13113 ExprResult
13114 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13115                                           SubstNonTypeTemplateParmPackExpr *E) {
13116   // Default behavior is to do nothing with this transformation.
13117   return E;
13118 }
13119 
13120 template<typename Derived>
13121 ExprResult
13122 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13123                                           SubstNonTypeTemplateParmExpr *E) {
13124   // Default behavior is to do nothing with this transformation.
13125   return E;
13126 }
13127 
13128 template<typename Derived>
13129 ExprResult
13130 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13131   // Default behavior is to do nothing with this transformation.
13132   return E;
13133 }
13134 
13135 template<typename Derived>
13136 ExprResult
13137 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13138                                                   MaterializeTemporaryExpr *E) {
13139   return getDerived().TransformExpr(E->getSubExpr());
13140 }
13141 
13142 template<typename Derived>
13143 ExprResult
13144 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13145   UnresolvedLookupExpr *Callee = nullptr;
13146   if (Expr *OldCallee = E->getCallee()) {
13147     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13148     if (CalleeResult.isInvalid())
13149       return ExprError();
13150     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13151   }
13152 
13153   Expr *Pattern = E->getPattern();
13154 
13155   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13156   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13157   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13158 
13159   // Determine whether the set of unexpanded parameter packs can and should
13160   // be expanded.
13161   bool Expand = true;
13162   bool RetainExpansion = false;
13163   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13164                      NumExpansions = OrigNumExpansions;
13165   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13166                                            Pattern->getSourceRange(),
13167                                            Unexpanded,
13168                                            Expand, RetainExpansion,
13169                                            NumExpansions))
13170     return true;
13171 
13172   if (!Expand) {
13173     // Do not expand any packs here, just transform and rebuild a fold
13174     // expression.
13175     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13176 
13177     ExprResult LHS =
13178         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13179     if (LHS.isInvalid())
13180       return true;
13181 
13182     ExprResult RHS =
13183         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13184     if (RHS.isInvalid())
13185       return true;
13186 
13187     if (!getDerived().AlwaysRebuild() &&
13188         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13189       return E;
13190 
13191     return getDerived().RebuildCXXFoldExpr(
13192         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13193         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13194   }
13195 
13196   // The transform has determined that we should perform an elementwise
13197   // expansion of the pattern. Do so.
13198   ExprResult Result = getDerived().TransformExpr(E->getInit());
13199   if (Result.isInvalid())
13200     return true;
13201   bool LeftFold = E->isLeftFold();
13202 
13203   // If we're retaining an expansion for a right fold, it is the innermost
13204   // component and takes the init (if any).
13205   if (!LeftFold && RetainExpansion) {
13206     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13207 
13208     ExprResult Out = getDerived().TransformExpr(Pattern);
13209     if (Out.isInvalid())
13210       return true;
13211 
13212     Result = getDerived().RebuildCXXFoldExpr(
13213         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13214         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13215     if (Result.isInvalid())
13216       return true;
13217   }
13218 
13219   for (unsigned I = 0; I != *NumExpansions; ++I) {
13220     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13221         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13222     ExprResult Out = getDerived().TransformExpr(Pattern);
13223     if (Out.isInvalid())
13224       return true;
13225 
13226     if (Out.get()->containsUnexpandedParameterPack()) {
13227       // We still have a pack; retain a pack expansion for this slice.
13228       Result = getDerived().RebuildCXXFoldExpr(
13229           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13230           E->getOperator(), E->getEllipsisLoc(),
13231           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13232           OrigNumExpansions);
13233     } else if (Result.isUsable()) {
13234       // We've got down to a single element; build a binary operator.
13235       Expr *LHS = LeftFold ? Result.get() : Out.get();
13236       Expr *RHS = LeftFold ? Out.get() : Result.get();
13237       if (Callee)
13238         Result = getDerived().RebuildCXXOperatorCallExpr(
13239             BinaryOperator::getOverloadedOperator(E->getOperator()),
13240             E->getEllipsisLoc(), Callee, LHS, RHS);
13241       else
13242         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13243                                                     E->getOperator(), LHS, RHS);
13244     } else
13245       Result = Out;
13246 
13247     if (Result.isInvalid())
13248       return true;
13249   }
13250 
13251   // If we're retaining an expansion for a left fold, it is the outermost
13252   // component and takes the complete expansion so far as its init (if any).
13253   if (LeftFold && RetainExpansion) {
13254     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13255 
13256     ExprResult Out = getDerived().TransformExpr(Pattern);
13257     if (Out.isInvalid())
13258       return true;
13259 
13260     Result = getDerived().RebuildCXXFoldExpr(
13261         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13262         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13263     if (Result.isInvalid())
13264       return true;
13265   }
13266 
13267   // If we had no init and an empty pack, and we're not retaining an expansion,
13268   // then produce a fallback value or error.
13269   if (Result.isUnset())
13270     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13271                                                 E->getOperator());
13272 
13273   return Result;
13274 }
13275 
13276 template<typename Derived>
13277 ExprResult
13278 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13279     CXXStdInitializerListExpr *E) {
13280   return getDerived().TransformExpr(E->getSubExpr());
13281 }
13282 
13283 template<typename Derived>
13284 ExprResult
13285 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13286   return SemaRef.MaybeBindToTemporary(E);
13287 }
13288 
13289 template<typename Derived>
13290 ExprResult
13291 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13292   return E;
13293 }
13294 
13295 template<typename Derived>
13296 ExprResult
13297 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13298   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13299   if (SubExpr.isInvalid())
13300     return ExprError();
13301 
13302   if (!getDerived().AlwaysRebuild() &&
13303       SubExpr.get() == E->getSubExpr())
13304     return E;
13305 
13306   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13307 }
13308 
13309 template<typename Derived>
13310 ExprResult
13311 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13312   // Transform each of the elements.
13313   SmallVector<Expr *, 8> Elements;
13314   bool ArgChanged = false;
13315   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13316                                   /*IsCall=*/false, Elements, &ArgChanged))
13317     return ExprError();
13318 
13319   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13320     return SemaRef.MaybeBindToTemporary(E);
13321 
13322   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13323                                               Elements.data(),
13324                                               Elements.size());
13325 }
13326 
13327 template<typename Derived>
13328 ExprResult
13329 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13330                                                     ObjCDictionaryLiteral *E) {
13331   // Transform each of the elements.
13332   SmallVector<ObjCDictionaryElement, 8> Elements;
13333   bool ArgChanged = false;
13334   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13335     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13336 
13337     if (OrigElement.isPackExpansion()) {
13338       // This key/value element is a pack expansion.
13339       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13340       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13341       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13342       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13343 
13344       // Determine whether the set of unexpanded parameter packs can
13345       // and should be expanded.
13346       bool Expand = true;
13347       bool RetainExpansion = false;
13348       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13349       Optional<unsigned> NumExpansions = OrigNumExpansions;
13350       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13351                                OrigElement.Value->getEndLoc());
13352       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13353                                                PatternRange, Unexpanded, Expand,
13354                                                RetainExpansion, NumExpansions))
13355         return ExprError();
13356 
13357       if (!Expand) {
13358         // The transform has determined that we should perform a simple
13359         // transformation on the pack expansion, producing another pack
13360         // expansion.
13361         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13362         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13363         if (Key.isInvalid())
13364           return ExprError();
13365 
13366         if (Key.get() != OrigElement.Key)
13367           ArgChanged = true;
13368 
13369         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13370         if (Value.isInvalid())
13371           return ExprError();
13372 
13373         if (Value.get() != OrigElement.Value)
13374           ArgChanged = true;
13375 
13376         ObjCDictionaryElement Expansion = {
13377           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13378         };
13379         Elements.push_back(Expansion);
13380         continue;
13381       }
13382 
13383       // Record right away that the argument was changed.  This needs
13384       // to happen even if the array expands to nothing.
13385       ArgChanged = true;
13386 
13387       // The transform has determined that we should perform an elementwise
13388       // expansion of the pattern. Do so.
13389       for (unsigned I = 0; I != *NumExpansions; ++I) {
13390         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13391         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13392         if (Key.isInvalid())
13393           return ExprError();
13394 
13395         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13396         if (Value.isInvalid())
13397           return ExprError();
13398 
13399         ObjCDictionaryElement Element = {
13400           Key.get(), Value.get(), SourceLocation(), NumExpansions
13401         };
13402 
13403         // If any unexpanded parameter packs remain, we still have a
13404         // pack expansion.
13405         // FIXME: Can this really happen?
13406         if (Key.get()->containsUnexpandedParameterPack() ||
13407             Value.get()->containsUnexpandedParameterPack())
13408           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13409 
13410         Elements.push_back(Element);
13411       }
13412 
13413       // FIXME: Retain a pack expansion if RetainExpansion is true.
13414 
13415       // We've finished with this pack expansion.
13416       continue;
13417     }
13418 
13419     // Transform and check key.
13420     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13421     if (Key.isInvalid())
13422       return ExprError();
13423 
13424     if (Key.get() != OrigElement.Key)
13425       ArgChanged = true;
13426 
13427     // Transform and check value.
13428     ExprResult Value
13429       = getDerived().TransformExpr(OrigElement.Value);
13430     if (Value.isInvalid())
13431       return ExprError();
13432 
13433     if (Value.get() != OrigElement.Value)
13434       ArgChanged = true;
13435 
13436     ObjCDictionaryElement Element = {
13437       Key.get(), Value.get(), SourceLocation(), None
13438     };
13439     Elements.push_back(Element);
13440   }
13441 
13442   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13443     return SemaRef.MaybeBindToTemporary(E);
13444 
13445   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13446                                                    Elements);
13447 }
13448 
13449 template<typename Derived>
13450 ExprResult
13451 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13452   TypeSourceInfo *EncodedTypeInfo
13453     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13454   if (!EncodedTypeInfo)
13455     return ExprError();
13456 
13457   if (!getDerived().AlwaysRebuild() &&
13458       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13459     return E;
13460 
13461   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13462                                             EncodedTypeInfo,
13463                                             E->getRParenLoc());
13464 }
13465 
13466 template<typename Derived>
13467 ExprResult TreeTransform<Derived>::
13468 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13469   // This is a kind of implicit conversion, and it needs to get dropped
13470   // and recomputed for the same general reasons that ImplicitCastExprs
13471   // do, as well a more specific one: this expression is only valid when
13472   // it appears *immediately* as an argument expression.
13473   return getDerived().TransformExpr(E->getSubExpr());
13474 }
13475 
13476 template<typename Derived>
13477 ExprResult TreeTransform<Derived>::
13478 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13479   TypeSourceInfo *TSInfo
13480     = getDerived().TransformType(E->getTypeInfoAsWritten());
13481   if (!TSInfo)
13482     return ExprError();
13483 
13484   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13485   if (Result.isInvalid())
13486     return ExprError();
13487 
13488   if (!getDerived().AlwaysRebuild() &&
13489       TSInfo == E->getTypeInfoAsWritten() &&
13490       Result.get() == E->getSubExpr())
13491     return E;
13492 
13493   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13494                                       E->getBridgeKeywordLoc(), TSInfo,
13495                                       Result.get());
13496 }
13497 
13498 template <typename Derived>
13499 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13500     ObjCAvailabilityCheckExpr *E) {
13501   return E;
13502 }
13503 
13504 template<typename Derived>
13505 ExprResult
13506 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13507   // Transform arguments.
13508   bool ArgChanged = false;
13509   SmallVector<Expr*, 8> Args;
13510   Args.reserve(E->getNumArgs());
13511   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13512                                   &ArgChanged))
13513     return ExprError();
13514 
13515   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13516     // Class message: transform the receiver type.
13517     TypeSourceInfo *ReceiverTypeInfo
13518       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13519     if (!ReceiverTypeInfo)
13520       return ExprError();
13521 
13522     // If nothing changed, just retain the existing message send.
13523     if (!getDerived().AlwaysRebuild() &&
13524         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13525       return SemaRef.MaybeBindToTemporary(E);
13526 
13527     // Build a new class message send.
13528     SmallVector<SourceLocation, 16> SelLocs;
13529     E->getSelectorLocs(SelLocs);
13530     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13531                                                E->getSelector(),
13532                                                SelLocs,
13533                                                E->getMethodDecl(),
13534                                                E->getLeftLoc(),
13535                                                Args,
13536                                                E->getRightLoc());
13537   }
13538   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13539            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13540     if (!E->getMethodDecl())
13541       return ExprError();
13542 
13543     // Build a new class message send to 'super'.
13544     SmallVector<SourceLocation, 16> SelLocs;
13545     E->getSelectorLocs(SelLocs);
13546     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13547                                                E->getSelector(),
13548                                                SelLocs,
13549                                                E->getReceiverType(),
13550                                                E->getMethodDecl(),
13551                                                E->getLeftLoc(),
13552                                                Args,
13553                                                E->getRightLoc());
13554   }
13555 
13556   // Instance message: transform the receiver
13557   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13558          "Only class and instance messages may be instantiated");
13559   ExprResult Receiver
13560     = getDerived().TransformExpr(E->getInstanceReceiver());
13561   if (Receiver.isInvalid())
13562     return ExprError();
13563 
13564   // If nothing changed, just retain the existing message send.
13565   if (!getDerived().AlwaysRebuild() &&
13566       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13567     return SemaRef.MaybeBindToTemporary(E);
13568 
13569   // Build a new instance message send.
13570   SmallVector<SourceLocation, 16> SelLocs;
13571   E->getSelectorLocs(SelLocs);
13572   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13573                                              E->getSelector(),
13574                                              SelLocs,
13575                                              E->getMethodDecl(),
13576                                              E->getLeftLoc(),
13577                                              Args,
13578                                              E->getRightLoc());
13579 }
13580 
13581 template<typename Derived>
13582 ExprResult
13583 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13584   return E;
13585 }
13586 
13587 template<typename Derived>
13588 ExprResult
13589 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13590   return E;
13591 }
13592 
13593 template<typename Derived>
13594 ExprResult
13595 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13596   // Transform the base expression.
13597   ExprResult Base = getDerived().TransformExpr(E->getBase());
13598   if (Base.isInvalid())
13599     return ExprError();
13600 
13601   // We don't need to transform the ivar; it will never change.
13602 
13603   // If nothing changed, just retain the existing expression.
13604   if (!getDerived().AlwaysRebuild() &&
13605       Base.get() == E->getBase())
13606     return E;
13607 
13608   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13609                                              E->getLocation(),
13610                                              E->isArrow(), E->isFreeIvar());
13611 }
13612 
13613 template<typename Derived>
13614 ExprResult
13615 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13616   // 'super' and types never change. Property never changes. Just
13617   // retain the existing expression.
13618   if (!E->isObjectReceiver())
13619     return E;
13620 
13621   // Transform the base expression.
13622   ExprResult Base = getDerived().TransformExpr(E->getBase());
13623   if (Base.isInvalid())
13624     return ExprError();
13625 
13626   // We don't need to transform the property; it will never change.
13627 
13628   // If nothing changed, just retain the existing expression.
13629   if (!getDerived().AlwaysRebuild() &&
13630       Base.get() == E->getBase())
13631     return E;
13632 
13633   if (E->isExplicitProperty())
13634     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13635                                                    E->getExplicitProperty(),
13636                                                    E->getLocation());
13637 
13638   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13639                                                  SemaRef.Context.PseudoObjectTy,
13640                                                  E->getImplicitPropertyGetter(),
13641                                                  E->getImplicitPropertySetter(),
13642                                                  E->getLocation());
13643 }
13644 
13645 template<typename Derived>
13646 ExprResult
13647 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13648   // Transform the base expression.
13649   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13650   if (Base.isInvalid())
13651     return ExprError();
13652 
13653   // Transform the key expression.
13654   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13655   if (Key.isInvalid())
13656     return ExprError();
13657 
13658   // If nothing changed, just retain the existing expression.
13659   if (!getDerived().AlwaysRebuild() &&
13660       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13661     return E;
13662 
13663   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13664                                                   Base.get(), Key.get(),
13665                                                   E->getAtIndexMethodDecl(),
13666                                                   E->setAtIndexMethodDecl());
13667 }
13668 
13669 template<typename Derived>
13670 ExprResult
13671 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13672   // Transform the base expression.
13673   ExprResult Base = getDerived().TransformExpr(E->getBase());
13674   if (Base.isInvalid())
13675     return ExprError();
13676 
13677   // If nothing changed, just retain the existing expression.
13678   if (!getDerived().AlwaysRebuild() &&
13679       Base.get() == E->getBase())
13680     return E;
13681 
13682   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13683                                          E->getOpLoc(),
13684                                          E->isArrow());
13685 }
13686 
13687 template<typename Derived>
13688 ExprResult
13689 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13690   bool ArgumentChanged = false;
13691   SmallVector<Expr*, 8> SubExprs;
13692   SubExprs.reserve(E->getNumSubExprs());
13693   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13694                                   SubExprs, &ArgumentChanged))
13695     return ExprError();
13696 
13697   if (!getDerived().AlwaysRebuild() &&
13698       !ArgumentChanged)
13699     return E;
13700 
13701   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13702                                                SubExprs,
13703                                                E->getRParenLoc());
13704 }
13705 
13706 template<typename Derived>
13707 ExprResult
13708 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13709   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13710   if (SrcExpr.isInvalid())
13711     return ExprError();
13712 
13713   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13714   if (!Type)
13715     return ExprError();
13716 
13717   if (!getDerived().AlwaysRebuild() &&
13718       Type == E->getTypeSourceInfo() &&
13719       SrcExpr.get() == E->getSrcExpr())
13720     return E;
13721 
13722   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13723                                                SrcExpr.get(), Type,
13724                                                E->getRParenLoc());
13725 }
13726 
13727 template<typename Derived>
13728 ExprResult
13729 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13730   BlockDecl *oldBlock = E->getBlockDecl();
13731 
13732   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13733   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13734 
13735   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13736   blockScope->TheDecl->setBlockMissingReturnType(
13737                          oldBlock->blockMissingReturnType());
13738 
13739   SmallVector<ParmVarDecl*, 4> params;
13740   SmallVector<QualType, 4> paramTypes;
13741 
13742   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13743 
13744   // Parameter substitution.
13745   Sema::ExtParameterInfoBuilder extParamInfos;
13746   if (getDerived().TransformFunctionTypeParams(
13747           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13748           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13749           extParamInfos)) {
13750     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13751     return ExprError();
13752   }
13753 
13754   QualType exprResultType =
13755       getDerived().TransformType(exprFunctionType->getReturnType());
13756 
13757   auto epi = exprFunctionType->getExtProtoInfo();
13758   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13759 
13760   QualType functionType =
13761     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13762   blockScope->FunctionType = functionType;
13763 
13764   // Set the parameters on the block decl.
13765   if (!params.empty())
13766     blockScope->TheDecl->setParams(params);
13767 
13768   if (!oldBlock->blockMissingReturnType()) {
13769     blockScope->HasImplicitReturnType = false;
13770     blockScope->ReturnType = exprResultType;
13771   }
13772 
13773   // Transform the body
13774   StmtResult body = getDerived().TransformStmt(E->getBody());
13775   if (body.isInvalid()) {
13776     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13777     return ExprError();
13778   }
13779 
13780 #ifndef NDEBUG
13781   // In builds with assertions, make sure that we captured everything we
13782   // captured before.
13783   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13784     for (const auto &I : oldBlock->captures()) {
13785       VarDecl *oldCapture = I.getVariable();
13786 
13787       // Ignore parameter packs.
13788       if (oldCapture->isParameterPack())
13789         continue;
13790 
13791       VarDecl *newCapture =
13792         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13793                                                  oldCapture));
13794       assert(blockScope->CaptureMap.count(newCapture));
13795     }
13796     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13797   }
13798 #endif
13799 
13800   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13801                                     /*Scope=*/nullptr);
13802 }
13803 
13804 template<typename Derived>
13805 ExprResult
13806 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13807   llvm_unreachable("Cannot transform asType expressions yet");
13808 }
13809 
13810 template<typename Derived>
13811 ExprResult
13812 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13813   bool ArgumentChanged = false;
13814   SmallVector<Expr*, 8> SubExprs;
13815   SubExprs.reserve(E->getNumSubExprs());
13816   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13817                                   SubExprs, &ArgumentChanged))
13818     return ExprError();
13819 
13820   if (!getDerived().AlwaysRebuild() &&
13821       !ArgumentChanged)
13822     return E;
13823 
13824   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13825                                         E->getOp(), E->getRParenLoc());
13826 }
13827 
13828 //===----------------------------------------------------------------------===//
13829 // Type reconstruction
13830 //===----------------------------------------------------------------------===//
13831 
13832 template<typename Derived>
13833 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13834                                                     SourceLocation Star) {
13835   return SemaRef.BuildPointerType(PointeeType, Star,
13836                                   getDerived().getBaseEntity());
13837 }
13838 
13839 template<typename Derived>
13840 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13841                                                          SourceLocation Star) {
13842   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13843                                        getDerived().getBaseEntity());
13844 }
13845 
13846 template<typename Derived>
13847 QualType
13848 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13849                                              bool WrittenAsLValue,
13850                                              SourceLocation Sigil) {
13851   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13852                                     Sigil, getDerived().getBaseEntity());
13853 }
13854 
13855 template<typename Derived>
13856 QualType
13857 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13858                                                  QualType ClassType,
13859                                                  SourceLocation Sigil) {
13860   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13861                                         getDerived().getBaseEntity());
13862 }
13863 
13864 template<typename Derived>
13865 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13866            const ObjCTypeParamDecl *Decl,
13867            SourceLocation ProtocolLAngleLoc,
13868            ArrayRef<ObjCProtocolDecl *> Protocols,
13869            ArrayRef<SourceLocation> ProtocolLocs,
13870            SourceLocation ProtocolRAngleLoc) {
13871   return SemaRef.BuildObjCTypeParamType(Decl,
13872                                         ProtocolLAngleLoc, Protocols,
13873                                         ProtocolLocs, ProtocolRAngleLoc,
13874                                         /*FailOnError=*/true);
13875 }
13876 
13877 template<typename Derived>
13878 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13879            QualType BaseType,
13880            SourceLocation Loc,
13881            SourceLocation TypeArgsLAngleLoc,
13882            ArrayRef<TypeSourceInfo *> TypeArgs,
13883            SourceLocation TypeArgsRAngleLoc,
13884            SourceLocation ProtocolLAngleLoc,
13885            ArrayRef<ObjCProtocolDecl *> Protocols,
13886            ArrayRef<SourceLocation> ProtocolLocs,
13887            SourceLocation ProtocolRAngleLoc) {
13888   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13889                                      TypeArgs, TypeArgsRAngleLoc,
13890                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13891                                      ProtocolRAngleLoc,
13892                                      /*FailOnError=*/true);
13893 }
13894 
13895 template<typename Derived>
13896 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13897            QualType PointeeType,
13898            SourceLocation Star) {
13899   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13900 }
13901 
13902 template<typename Derived>
13903 QualType
13904 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13905                                          ArrayType::ArraySizeModifier SizeMod,
13906                                          const llvm::APInt *Size,
13907                                          Expr *SizeExpr,
13908                                          unsigned IndexTypeQuals,
13909                                          SourceRange BracketsRange) {
13910   if (SizeExpr || !Size)
13911     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13912                                   IndexTypeQuals, BracketsRange,
13913                                   getDerived().getBaseEntity());
13914 
13915   QualType Types[] = {
13916     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13917     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13918     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13919   };
13920   const unsigned NumTypes = llvm::array_lengthof(Types);
13921   QualType SizeType;
13922   for (unsigned I = 0; I != NumTypes; ++I)
13923     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13924       SizeType = Types[I];
13925       break;
13926     }
13927 
13928   // Note that we can return a VariableArrayType here in the case where
13929   // the element type was a dependent VariableArrayType.
13930   IntegerLiteral *ArraySize
13931       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13932                                /*FIXME*/BracketsRange.getBegin());
13933   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13934                                 IndexTypeQuals, BracketsRange,
13935                                 getDerived().getBaseEntity());
13936 }
13937 
13938 template<typename Derived>
13939 QualType
13940 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
13941                                                  ArrayType::ArraySizeModifier SizeMod,
13942                                                  const llvm::APInt &Size,
13943                                                  Expr *SizeExpr,
13944                                                  unsigned IndexTypeQuals,
13945                                                  SourceRange BracketsRange) {
13946   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
13947                                         IndexTypeQuals, BracketsRange);
13948 }
13949 
13950 template<typename Derived>
13951 QualType
13952 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
13953                                           ArrayType::ArraySizeModifier SizeMod,
13954                                                  unsigned IndexTypeQuals,
13955                                                    SourceRange BracketsRange) {
13956   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
13957                                        IndexTypeQuals, BracketsRange);
13958 }
13959 
13960 template<typename Derived>
13961 QualType
13962 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
13963                                           ArrayType::ArraySizeModifier SizeMod,
13964                                                  Expr *SizeExpr,
13965                                                  unsigned IndexTypeQuals,
13966                                                  SourceRange BracketsRange) {
13967   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13968                                        SizeExpr,
13969                                        IndexTypeQuals, BracketsRange);
13970 }
13971 
13972 template<typename Derived>
13973 QualType
13974 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
13975                                           ArrayType::ArraySizeModifier SizeMod,
13976                                                        Expr *SizeExpr,
13977                                                        unsigned IndexTypeQuals,
13978                                                    SourceRange BracketsRange) {
13979   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13980                                        SizeExpr,
13981                                        IndexTypeQuals, BracketsRange);
13982 }
13983 
13984 template <typename Derived>
13985 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
13986     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
13987   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
13988                                           AttributeLoc);
13989 }
13990 
13991 template <typename Derived>
13992 QualType
13993 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
13994                                           unsigned NumElements,
13995                                           VectorType::VectorKind VecKind) {
13996   // FIXME: semantic checking!
13997   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
13998 }
13999 
14000 template <typename Derived>
14001 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14002     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14003     VectorType::VectorKind VecKind) {
14004   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14005 }
14006 
14007 template<typename Derived>
14008 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14009                                                       unsigned NumElements,
14010                                                  SourceLocation AttributeLoc) {
14011   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14012                           NumElements, true);
14013   IntegerLiteral *VectorSize
14014     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14015                              AttributeLoc);
14016   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14017 }
14018 
14019 template<typename Derived>
14020 QualType
14021 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14022                                                            Expr *SizeExpr,
14023                                                   SourceLocation AttributeLoc) {
14024   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14025 }
14026 
14027 template <typename Derived>
14028 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14029     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14030   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14031                                                NumColumns);
14032 }
14033 
14034 template <typename Derived>
14035 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14036     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14037     SourceLocation AttributeLoc) {
14038   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14039                                  AttributeLoc);
14040 }
14041 
14042 template<typename Derived>
14043 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14044     QualType T,
14045     MutableArrayRef<QualType> ParamTypes,
14046     const FunctionProtoType::ExtProtoInfo &EPI) {
14047   return SemaRef.BuildFunctionType(T, ParamTypes,
14048                                    getDerived().getBaseLocation(),
14049                                    getDerived().getBaseEntity(),
14050                                    EPI);
14051 }
14052 
14053 template<typename Derived>
14054 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14055   return SemaRef.Context.getFunctionNoProtoType(T);
14056 }
14057 
14058 template<typename Derived>
14059 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14060                                                             Decl *D) {
14061   assert(D && "no decl found");
14062   if (D->isInvalidDecl()) return QualType();
14063 
14064   // FIXME: Doesn't account for ObjCInterfaceDecl!
14065   TypeDecl *Ty;
14066   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14067     // A valid resolved using typename pack expansion decl can have multiple
14068     // UsingDecls, but they must each have exactly one type, and it must be
14069     // the same type in every case. But we must have at least one expansion!
14070     if (UPD->expansions().empty()) {
14071       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14072           << UPD->isCXXClassMember() << UPD;
14073       return QualType();
14074     }
14075 
14076     // We might still have some unresolved types. Try to pick a resolved type
14077     // if we can. The final instantiation will check that the remaining
14078     // unresolved types instantiate to the type we pick.
14079     QualType FallbackT;
14080     QualType T;
14081     for (auto *E : UPD->expansions()) {
14082       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14083       if (ThisT.isNull())
14084         continue;
14085       else if (ThisT->getAs<UnresolvedUsingType>())
14086         FallbackT = ThisT;
14087       else if (T.isNull())
14088         T = ThisT;
14089       else
14090         assert(getSema().Context.hasSameType(ThisT, T) &&
14091                "mismatched resolved types in using pack expansion");
14092     }
14093     return T.isNull() ? FallbackT : T;
14094   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14095     assert(Using->hasTypename() &&
14096            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14097 
14098     // A valid resolved using typename decl points to exactly one type decl.
14099     assert(++Using->shadow_begin() == Using->shadow_end());
14100     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
14101   } else {
14102     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14103            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14104     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14105   }
14106 
14107   return SemaRef.Context.getTypeDeclType(Ty);
14108 }
14109 
14110 template<typename Derived>
14111 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14112                                                        SourceLocation Loc) {
14113   return SemaRef.BuildTypeofExprType(E, Loc);
14114 }
14115 
14116 template<typename Derived>
14117 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14118   return SemaRef.Context.getTypeOfType(Underlying);
14119 }
14120 
14121 template<typename Derived>
14122 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14123                                                      SourceLocation Loc) {
14124   return SemaRef.BuildDecltypeType(E, Loc);
14125 }
14126 
14127 template<typename Derived>
14128 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14129                                             UnaryTransformType::UTTKind UKind,
14130                                             SourceLocation Loc) {
14131   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14132 }
14133 
14134 template<typename Derived>
14135 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14136                                                       TemplateName Template,
14137                                              SourceLocation TemplateNameLoc,
14138                                      TemplateArgumentListInfo &TemplateArgs) {
14139   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14140 }
14141 
14142 template<typename Derived>
14143 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14144                                                    SourceLocation KWLoc) {
14145   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14146 }
14147 
14148 template<typename Derived>
14149 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14150                                                  SourceLocation KWLoc,
14151                                                  bool isReadPipe) {
14152   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14153                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14154 }
14155 
14156 template <typename Derived>
14157 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14158                                                    unsigned NumBits,
14159                                                    SourceLocation Loc) {
14160   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14161                         NumBits, true);
14162   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14163                                                 SemaRef.Context.IntTy, Loc);
14164   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14165 }
14166 
14167 template <typename Derived>
14168 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14169     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14170   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14171 }
14172 
14173 template<typename Derived>
14174 TemplateName
14175 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14176                                             bool TemplateKW,
14177                                             TemplateDecl *Template) {
14178   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14179                                                   Template);
14180 }
14181 
14182 template<typename Derived>
14183 TemplateName
14184 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14185                                             SourceLocation TemplateKWLoc,
14186                                             const IdentifierInfo &Name,
14187                                             SourceLocation NameLoc,
14188                                             QualType ObjectType,
14189                                             NamedDecl *FirstQualifierInScope,
14190                                             bool AllowInjectedClassName) {
14191   UnqualifiedId TemplateName;
14192   TemplateName.setIdentifier(&Name, NameLoc);
14193   Sema::TemplateTy Template;
14194   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14195                               TemplateName, ParsedType::make(ObjectType),
14196                               /*EnteringContext=*/false, Template,
14197                               AllowInjectedClassName);
14198   return Template.get();
14199 }
14200 
14201 template<typename Derived>
14202 TemplateName
14203 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14204                                             SourceLocation TemplateKWLoc,
14205                                             OverloadedOperatorKind Operator,
14206                                             SourceLocation NameLoc,
14207                                             QualType ObjectType,
14208                                             bool AllowInjectedClassName) {
14209   UnqualifiedId Name;
14210   // FIXME: Bogus location information.
14211   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14212   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14213   Sema::TemplateTy Template;
14214   getSema().ActOnTemplateName(
14215       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14216       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14217   return Template.get();
14218 }
14219 
14220 template<typename Derived>
14221 ExprResult
14222 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14223                                                    SourceLocation OpLoc,
14224                                                    Expr *OrigCallee,
14225                                                    Expr *First,
14226                                                    Expr *Second) {
14227   Expr *Callee = OrigCallee->IgnoreParenCasts();
14228   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14229 
14230   if (First->getObjectKind() == OK_ObjCProperty) {
14231     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14232     if (BinaryOperator::isAssignmentOp(Opc))
14233       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14234                                                  First, Second);
14235     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14236     if (Result.isInvalid())
14237       return ExprError();
14238     First = Result.get();
14239   }
14240 
14241   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14242     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14243     if (Result.isInvalid())
14244       return ExprError();
14245     Second = Result.get();
14246   }
14247 
14248   // Determine whether this should be a builtin operation.
14249   if (Op == OO_Subscript) {
14250     if (!First->getType()->isOverloadableType() &&
14251         !Second->getType()->isOverloadableType())
14252       return getSema().CreateBuiltinArraySubscriptExpr(
14253           First, Callee->getBeginLoc(), Second, OpLoc);
14254   } else if (Op == OO_Arrow) {
14255     // -> is never a builtin operation.
14256     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14257   } else if (Second == nullptr || isPostIncDec) {
14258     if (!First->getType()->isOverloadableType() ||
14259         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14260       // The argument is not of overloadable type, or this is an expression
14261       // of the form &Class::member, so try to create a built-in unary
14262       // operation.
14263       UnaryOperatorKind Opc
14264         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14265 
14266       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14267     }
14268   } else {
14269     if (!First->getType()->isOverloadableType() &&
14270         !Second->getType()->isOverloadableType()) {
14271       // Neither of the arguments is an overloadable type, so try to
14272       // create a built-in binary operation.
14273       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14274       ExprResult Result
14275         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14276       if (Result.isInvalid())
14277         return ExprError();
14278 
14279       return Result;
14280     }
14281   }
14282 
14283   // Compute the transformed set of functions (and function templates) to be
14284   // used during overload resolution.
14285   UnresolvedSet<16> Functions;
14286   bool RequiresADL;
14287 
14288   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14289     Functions.append(ULE->decls_begin(), ULE->decls_end());
14290     // If the overload could not be resolved in the template definition
14291     // (because we had a dependent argument), ADL is performed as part of
14292     // template instantiation.
14293     RequiresADL = ULE->requiresADL();
14294   } else {
14295     // If we've resolved this to a particular non-member function, just call
14296     // that function. If we resolved it to a member function,
14297     // CreateOverloaded* will find that function for us.
14298     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14299     if (!isa<CXXMethodDecl>(ND))
14300       Functions.addDecl(ND);
14301     RequiresADL = false;
14302   }
14303 
14304   // Add any functions found via argument-dependent lookup.
14305   Expr *Args[2] = { First, Second };
14306   unsigned NumArgs = 1 + (Second != nullptr);
14307 
14308   // Create the overloaded operator invocation for unary operators.
14309   if (NumArgs == 1 || isPostIncDec) {
14310     UnaryOperatorKind Opc
14311       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14312     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14313                                            RequiresADL);
14314   }
14315 
14316   if (Op == OO_Subscript) {
14317     SourceLocation LBrace;
14318     SourceLocation RBrace;
14319 
14320     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14321         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14322         LBrace = SourceLocation::getFromRawEncoding(
14323                     NameLoc.CXXOperatorName.BeginOpNameLoc);
14324         RBrace = SourceLocation::getFromRawEncoding(
14325                     NameLoc.CXXOperatorName.EndOpNameLoc);
14326     } else {
14327       LBrace = Callee->getBeginLoc();
14328       RBrace = OpLoc;
14329     }
14330 
14331     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14332                                                       First, Second);
14333   }
14334 
14335   // Create the overloaded operator invocation for binary operators.
14336   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14337   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14338       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14339   if (Result.isInvalid())
14340     return ExprError();
14341 
14342   return Result;
14343 }
14344 
14345 template<typename Derived>
14346 ExprResult
14347 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14348                                                      SourceLocation OperatorLoc,
14349                                                        bool isArrow,
14350                                                        CXXScopeSpec &SS,
14351                                                      TypeSourceInfo *ScopeType,
14352                                                        SourceLocation CCLoc,
14353                                                        SourceLocation TildeLoc,
14354                                         PseudoDestructorTypeStorage Destroyed) {
14355   QualType BaseType = Base->getType();
14356   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14357       (!isArrow && !BaseType->getAs<RecordType>()) ||
14358       (isArrow && BaseType->getAs<PointerType>() &&
14359        !BaseType->castAs<PointerType>()->getPointeeType()
14360                                               ->template getAs<RecordType>())){
14361     // This pseudo-destructor expression is still a pseudo-destructor.
14362     return SemaRef.BuildPseudoDestructorExpr(
14363         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14364         CCLoc, TildeLoc, Destroyed);
14365   }
14366 
14367   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14368   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14369                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14370   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14371   NameInfo.setNamedTypeInfo(DestroyedType);
14372 
14373   // The scope type is now known to be a valid nested name specifier
14374   // component. Tack it on to the end of the nested name specifier.
14375   if (ScopeType) {
14376     if (!ScopeType->getType()->getAs<TagType>()) {
14377       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14378                      diag::err_expected_class_or_namespace)
14379           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14380       return ExprError();
14381     }
14382     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14383               CCLoc);
14384   }
14385 
14386   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14387   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14388                                             OperatorLoc, isArrow,
14389                                             SS, TemplateKWLoc,
14390                                             /*FIXME: FirstQualifier*/ nullptr,
14391                                             NameInfo,
14392                                             /*TemplateArgs*/ nullptr,
14393                                             /*S*/nullptr);
14394 }
14395 
14396 template<typename Derived>
14397 StmtResult
14398 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14399   SourceLocation Loc = S->getBeginLoc();
14400   CapturedDecl *CD = S->getCapturedDecl();
14401   unsigned NumParams = CD->getNumParams();
14402   unsigned ContextParamPos = CD->getContextParamPosition();
14403   SmallVector<Sema::CapturedParamNameType, 4> Params;
14404   for (unsigned I = 0; I < NumParams; ++I) {
14405     if (I != ContextParamPos) {
14406       Params.push_back(
14407              std::make_pair(
14408                   CD->getParam(I)->getName(),
14409                   getDerived().TransformType(CD->getParam(I)->getType())));
14410     } else {
14411       Params.push_back(std::make_pair(StringRef(), QualType()));
14412     }
14413   }
14414   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14415                                      S->getCapturedRegionKind(), Params);
14416   StmtResult Body;
14417   {
14418     Sema::CompoundScopeRAII CompoundScope(getSema());
14419     Body = getDerived().TransformStmt(S->getCapturedStmt());
14420   }
14421 
14422   if (Body.isInvalid()) {
14423     getSema().ActOnCapturedRegionError();
14424     return StmtError();
14425   }
14426 
14427   return getSema().ActOnCapturedRegionEnd(Body.get());
14428 }
14429 
14430 } // end namespace clang
14431 
14432 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14433