1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Basic/DiagnosticParse.h"
32 #include "clang/Basic/OpenMPKinds.h"
33 #include "clang/Sema/Designator.h"
34 #include "clang/Sema/Lookup.h"
35 #include "clang/Sema/Ownership.h"
36 #include "clang/Sema/ParsedTemplate.h"
37 #include "clang/Sema/ScopeInfo.h"
38 #include "clang/Sema/SemaDiagnostic.h"
39 #include "clang/Sema/SemaInternal.h"
40 #include "llvm/ADT/ArrayRef.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include <algorithm>
43 
44 using namespace llvm::omp;
45 
46 namespace clang {
47 using namespace sema;
48 
49 /// A semantic tree transformation that allows one to transform one
50 /// abstract syntax tree into another.
51 ///
52 /// A new tree transformation is defined by creating a new subclass \c X of
53 /// \c TreeTransform<X> and then overriding certain operations to provide
54 /// behavior specific to that transformation. For example, template
55 /// instantiation is implemented as a tree transformation where the
56 /// transformation of TemplateTypeParmType nodes involves substituting the
57 /// template arguments for their corresponding template parameters; a similar
58 /// transformation is performed for non-type template parameters and
59 /// template template parameters.
60 ///
61 /// This tree-transformation template uses static polymorphism to allow
62 /// subclasses to customize any of its operations. Thus, a subclass can
63 /// override any of the transformation or rebuild operators by providing an
64 /// operation with the same signature as the default implementation. The
65 /// overriding function should not be virtual.
66 ///
67 /// Semantic tree transformations are split into two stages, either of which
68 /// can be replaced by a subclass. The "transform" step transforms an AST node
69 /// or the parts of an AST node using the various transformation functions,
70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
71 /// node of the appropriate kind from the pieces. The default transformation
72 /// routines recursively transform the operands to composite AST nodes (e.g.,
73 /// the pointee type of a PointerType node) and, if any of those operand nodes
74 /// were changed by the transformation, invokes the rebuild operation to create
75 /// a new AST node.
76 ///
77 /// Subclasses can customize the transformation at various levels. The
78 /// most coarse-grained transformations involve replacing TransformType(),
79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
81 /// new implementations.
82 ///
83 /// For more fine-grained transformations, subclasses can replace any of the
84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
86 /// replacing TransformTemplateTypeParmType() allows template instantiation
87 /// to substitute template arguments for their corresponding template
88 /// parameters. Additionally, subclasses can override the \c RebuildXXX
89 /// functions to control how AST nodes are rebuilt when their operands change.
90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
92 /// be able to use more efficient rebuild steps.
93 ///
94 /// There are a handful of other functions that can be overridden, allowing one
95 /// to avoid traversing nodes that don't need any transformation
96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
97 /// operands have not changed (\c AlwaysRebuild()), and customize the
98 /// default locations and entity names used for type-checking
99 /// (\c getBaseLocation(), \c getBaseEntity()).
100 template<typename Derived>
101 class TreeTransform {
102   /// Private RAII object that helps us forget and then re-remember
103   /// the template argument corresponding to a partially-substituted parameter
104   /// pack.
105   class ForgetPartiallySubstitutedPackRAII {
106     Derived &Self;
107     TemplateArgument Old;
108 
109   public:
110     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
111       Old = Self.ForgetPartiallySubstitutedPack();
112     }
113 
114     ~ForgetPartiallySubstitutedPackRAII() {
115       Self.RememberPartiallySubstitutedPack(Old);
116     }
117   };
118 
119 protected:
120   Sema &SemaRef;
121 
122   /// The set of local declarations that have been transformed, for
123   /// cases where we are forced to build new declarations within the transformer
124   /// rather than in the subclass (e.g., lambda closure types).
125   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
126 
127 public:
128   /// Initializes a new tree transformer.
129   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
130 
131   /// Retrieves a reference to the derived class.
132   Derived &getDerived() { return static_cast<Derived&>(*this); }
133 
134   /// Retrieves a reference to the derived class.
135   const Derived &getDerived() const {
136     return static_cast<const Derived&>(*this);
137   }
138 
139   static inline ExprResult Owned(Expr *E) { return E; }
140   static inline StmtResult Owned(Stmt *S) { return S; }
141 
142   /// Retrieves a reference to the semantic analysis object used for
143   /// this tree transform.
144   Sema &getSema() const { return SemaRef; }
145 
146   /// Whether the transformation should always rebuild AST nodes, even
147   /// if none of the children have changed.
148   ///
149   /// Subclasses may override this function to specify when the transformation
150   /// should rebuild all AST nodes.
151   ///
152   /// We must always rebuild all AST nodes when performing variadic template
153   /// pack expansion, in order to avoid violating the AST invariant that each
154   /// statement node appears at most once in its containing declaration.
155   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
156 
157   /// Whether the transformation is forming an expression or statement that
158   /// replaces the original. In this case, we'll reuse mangling numbers from
159   /// existing lambdas.
160   bool ReplacingOriginal() { return false; }
161 
162   /// Wether CXXConstructExpr can be skipped when they are implicit.
163   /// They will be reconstructed when used if needed.
164   /// This is usefull when the user that cause rebuilding of the
165   /// CXXConstructExpr is outside of the expression at which the TreeTransform
166   /// started.
167   bool AllowSkippingCXXConstructExpr() { return true; }
168 
169   /// Returns the location of the entity being transformed, if that
170   /// information was not available elsewhere in the AST.
171   ///
172   /// By default, returns no source-location information. Subclasses can
173   /// provide an alternative implementation that provides better location
174   /// information.
175   SourceLocation getBaseLocation() { return SourceLocation(); }
176 
177   /// Returns the name of the entity being transformed, if that
178   /// information was not available elsewhere in the AST.
179   ///
180   /// By default, returns an empty name. Subclasses can provide an alternative
181   /// implementation with a more precise name.
182   DeclarationName getBaseEntity() { return DeclarationName(); }
183 
184   /// Sets the "base" location and entity when that
185   /// information is known based on another transformation.
186   ///
187   /// By default, the source location and entity are ignored. Subclasses can
188   /// override this function to provide a customized implementation.
189   void setBase(SourceLocation Loc, DeclarationName Entity) { }
190 
191   /// RAII object that temporarily sets the base location and entity
192   /// used for reporting diagnostics in types.
193   class TemporaryBase {
194     TreeTransform &Self;
195     SourceLocation OldLocation;
196     DeclarationName OldEntity;
197 
198   public:
199     TemporaryBase(TreeTransform &Self, SourceLocation Location,
200                   DeclarationName Entity) : Self(Self) {
201       OldLocation = Self.getDerived().getBaseLocation();
202       OldEntity = Self.getDerived().getBaseEntity();
203 
204       if (Location.isValid())
205         Self.getDerived().setBase(Location, Entity);
206     }
207 
208     ~TemporaryBase() {
209       Self.getDerived().setBase(OldLocation, OldEntity);
210     }
211   };
212 
213   /// Determine whether the given type \p T has already been
214   /// transformed.
215   ///
216   /// Subclasses can provide an alternative implementation of this routine
217   /// to short-circuit evaluation when it is known that a given type will
218   /// not change. For example, template instantiation need not traverse
219   /// non-dependent types.
220   bool AlreadyTransformed(QualType T) {
221     return T.isNull();
222   }
223 
224   /// Transform a template parameter depth level.
225   ///
226   /// During a transformation that transforms template parameters, this maps
227   /// an old template parameter depth to a new depth.
228   unsigned TransformTemplateDepth(unsigned Depth) {
229     return Depth;
230   }
231 
232   /// Determine whether the given call argument should be dropped, e.g.,
233   /// because it is a default argument.
234   ///
235   /// Subclasses can provide an alternative implementation of this routine to
236   /// determine which kinds of call arguments get dropped. By default,
237   /// CXXDefaultArgument nodes are dropped (prior to transformation).
238   bool DropCallArgument(Expr *E) {
239     return E->isDefaultArgument();
240   }
241 
242   /// Determine whether we should expand a pack expansion with the
243   /// given set of parameter packs into separate arguments by repeatedly
244   /// transforming the pattern.
245   ///
246   /// By default, the transformer never tries to expand pack expansions.
247   /// Subclasses can override this routine to provide different behavior.
248   ///
249   /// \param EllipsisLoc The location of the ellipsis that identifies the
250   /// pack expansion.
251   ///
252   /// \param PatternRange The source range that covers the entire pattern of
253   /// the pack expansion.
254   ///
255   /// \param Unexpanded The set of unexpanded parameter packs within the
256   /// pattern.
257   ///
258   /// \param ShouldExpand Will be set to \c true if the transformer should
259   /// expand the corresponding pack expansions into separate arguments. When
260   /// set, \c NumExpansions must also be set.
261   ///
262   /// \param RetainExpansion Whether the caller should add an unexpanded
263   /// pack expansion after all of the expanded arguments. This is used
264   /// when extending explicitly-specified template argument packs per
265   /// C++0x [temp.arg.explicit]p9.
266   ///
267   /// \param NumExpansions The number of separate arguments that will be in
268   /// the expanded form of the corresponding pack expansion. This is both an
269   /// input and an output parameter, which can be set by the caller if the
270   /// number of expansions is known a priori (e.g., due to a prior substitution)
271   /// and will be set by the callee when the number of expansions is known.
272   /// The callee must set this value when \c ShouldExpand is \c true; it may
273   /// set this value in other cases.
274   ///
275   /// \returns true if an error occurred (e.g., because the parameter packs
276   /// are to be instantiated with arguments of different lengths), false
277   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
278   /// must be set.
279   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
280                                SourceRange PatternRange,
281                                ArrayRef<UnexpandedParameterPack> Unexpanded,
282                                bool &ShouldExpand,
283                                bool &RetainExpansion,
284                                Optional<unsigned> &NumExpansions) {
285     ShouldExpand = false;
286     return false;
287   }
288 
289   /// "Forget" about the partially-substituted pack template argument,
290   /// when performing an instantiation that must preserve the parameter pack
291   /// use.
292   ///
293   /// This routine is meant to be overridden by the template instantiator.
294   TemplateArgument ForgetPartiallySubstitutedPack() {
295     return TemplateArgument();
296   }
297 
298   /// "Remember" the partially-substituted pack template argument
299   /// after performing an instantiation that must preserve the parameter pack
300   /// use.
301   ///
302   /// This routine is meant to be overridden by the template instantiator.
303   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
304 
305   /// Note to the derived class when a function parameter pack is
306   /// being expanded.
307   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
308 
309   /// Transforms the given type into another type.
310   ///
311   /// By default, this routine transforms a type by creating a
312   /// TypeSourceInfo for it and delegating to the appropriate
313   /// function.  This is expensive, but we don't mind, because
314   /// this method is deprecated anyway;  all users should be
315   /// switched to storing TypeSourceInfos.
316   ///
317   /// \returns the transformed type.
318   QualType TransformType(QualType T);
319 
320   /// Transforms the given type-with-location into a new
321   /// type-with-location.
322   ///
323   /// By default, this routine transforms a type by delegating to the
324   /// appropriate TransformXXXType to build a new type.  Subclasses
325   /// may override this function (to take over all type
326   /// transformations) or some set of the TransformXXXType functions
327   /// to alter the transformation.
328   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
329 
330   /// Transform the given type-with-location into a new
331   /// type, collecting location information in the given builder
332   /// as necessary.
333   ///
334   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
335 
336   /// Transform a type that is permitted to produce a
337   /// DeducedTemplateSpecializationType.
338   ///
339   /// This is used in the (relatively rare) contexts where it is acceptable
340   /// for transformation to produce a class template type with deduced
341   /// template arguments.
342   /// @{
343   QualType TransformTypeWithDeducedTST(QualType T);
344   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
345   /// @}
346 
347   /// The reason why the value of a statement is not discarded, if any.
348   enum StmtDiscardKind {
349     SDK_Discarded,
350     SDK_NotDiscarded,
351     SDK_StmtExprResult,
352   };
353 
354   /// Transform the given statement.
355   ///
356   /// By default, this routine transforms a statement by delegating to the
357   /// appropriate TransformXXXStmt function to transform a specific kind of
358   /// statement or the TransformExpr() function to transform an expression.
359   /// Subclasses may override this function to transform statements using some
360   /// other mechanism.
361   ///
362   /// \returns the transformed statement.
363   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
364 
365   /// Transform the given statement.
366   ///
367   /// By default, this routine transforms a statement by delegating to the
368   /// appropriate TransformOMPXXXClause function to transform a specific kind
369   /// of clause. Subclasses may override this function to transform statements
370   /// using some other mechanism.
371   ///
372   /// \returns the transformed OpenMP clause.
373   OMPClause *TransformOMPClause(OMPClause *S);
374 
375   /// Transform the given attribute.
376   ///
377   /// By default, this routine transforms a statement by delegating to the
378   /// appropriate TransformXXXAttr function to transform a specific kind
379   /// of attribute. Subclasses may override this function to transform
380   /// attributed statements using some other mechanism.
381   ///
382   /// \returns the transformed attribute
383   const Attr *TransformAttr(const Attr *S);
384 
385 /// Transform the specified attribute.
386 ///
387 /// Subclasses should override the transformation of attributes with a pragma
388 /// spelling to transform expressions stored within the attribute.
389 ///
390 /// \returns the transformed attribute.
391 #define ATTR(X)
392 #define PRAGMA_SPELLING_ATTR(X)                                                \
393   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
394 #include "clang/Basic/AttrList.inc"
395 
396   /// Transform the given expression.
397   ///
398   /// By default, this routine transforms an expression by delegating to the
399   /// appropriate TransformXXXExpr function to build a new expression.
400   /// Subclasses may override this function to transform expressions using some
401   /// other mechanism.
402   ///
403   /// \returns the transformed expression.
404   ExprResult TransformExpr(Expr *E);
405 
406   /// Transform the given initializer.
407   ///
408   /// By default, this routine transforms an initializer by stripping off the
409   /// semantic nodes added by initialization, then passing the result to
410   /// TransformExpr or TransformExprs.
411   ///
412   /// \returns the transformed initializer.
413   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
414 
415   /// Transform the given list of expressions.
416   ///
417   /// This routine transforms a list of expressions by invoking
418   /// \c TransformExpr() for each subexpression. However, it also provides
419   /// support for variadic templates by expanding any pack expansions (if the
420   /// derived class permits such expansion) along the way. When pack expansions
421   /// are present, the number of outputs may not equal the number of inputs.
422   ///
423   /// \param Inputs The set of expressions to be transformed.
424   ///
425   /// \param NumInputs The number of expressions in \c Inputs.
426   ///
427   /// \param IsCall If \c true, then this transform is being performed on
428   /// function-call arguments, and any arguments that should be dropped, will
429   /// be.
430   ///
431   /// \param Outputs The transformed input expressions will be added to this
432   /// vector.
433   ///
434   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
435   /// due to transformation.
436   ///
437   /// \returns true if an error occurred, false otherwise.
438   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
439                       SmallVectorImpl<Expr *> &Outputs,
440                       bool *ArgChanged = nullptr);
441 
442   /// Transform the given declaration, which is referenced from a type
443   /// or expression.
444   ///
445   /// By default, acts as the identity function on declarations, unless the
446   /// transformer has had to transform the declaration itself. Subclasses
447   /// may override this function to provide alternate behavior.
448   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
449     llvm::DenseMap<Decl *, Decl *>::iterator Known
450       = TransformedLocalDecls.find(D);
451     if (Known != TransformedLocalDecls.end())
452       return Known->second;
453 
454     return D;
455   }
456 
457   /// Transform the specified condition.
458   ///
459   /// By default, this transforms the variable and expression and rebuilds
460   /// the condition.
461   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
462                                            Expr *Expr,
463                                            Sema::ConditionKind Kind);
464 
465   /// Transform the attributes associated with the given declaration and
466   /// place them on the new declaration.
467   ///
468   /// By default, this operation does nothing. Subclasses may override this
469   /// behavior to transform attributes.
470   void transformAttrs(Decl *Old, Decl *New) { }
471 
472   /// Note that a local declaration has been transformed by this
473   /// transformer.
474   ///
475   /// Local declarations are typically transformed via a call to
476   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
477   /// the transformer itself has to transform the declarations. This routine
478   /// can be overridden by a subclass that keeps track of such mappings.
479   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
480     assert(New.size() == 1 &&
481            "must override transformedLocalDecl if performing pack expansion");
482     TransformedLocalDecls[Old] = New.front();
483   }
484 
485   /// Transform the definition of the given declaration.
486   ///
487   /// By default, invokes TransformDecl() to transform the declaration.
488   /// Subclasses may override this function to provide alternate behavior.
489   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
490     return getDerived().TransformDecl(Loc, D);
491   }
492 
493   /// Transform the given declaration, which was the first part of a
494   /// nested-name-specifier in a member access expression.
495   ///
496   /// This specific declaration transformation only applies to the first
497   /// identifier in a nested-name-specifier of a member access expression, e.g.,
498   /// the \c T in \c x->T::member
499   ///
500   /// By default, invokes TransformDecl() to transform the declaration.
501   /// Subclasses may override this function to provide alternate behavior.
502   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
503     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
504   }
505 
506   /// Transform the set of declarations in an OverloadExpr.
507   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
508                                   LookupResult &R);
509 
510   /// Transform the given nested-name-specifier with source-location
511   /// information.
512   ///
513   /// By default, transforms all of the types and declarations within the
514   /// nested-name-specifier. Subclasses may override this function to provide
515   /// alternate behavior.
516   NestedNameSpecifierLoc
517   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
518                                   QualType ObjectType = QualType(),
519                                   NamedDecl *FirstQualifierInScope = nullptr);
520 
521   /// Transform the given declaration name.
522   ///
523   /// By default, transforms the types of conversion function, constructor,
524   /// and destructor names and then (if needed) rebuilds the declaration name.
525   /// Identifiers and selectors are returned unmodified. Sublcasses may
526   /// override this function to provide alternate behavior.
527   DeclarationNameInfo
528   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
529 
530   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
531       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
532   concepts::TypeRequirement *
533   TransformTypeRequirement(concepts::TypeRequirement *Req);
534   concepts::ExprRequirement *
535   TransformExprRequirement(concepts::ExprRequirement *Req);
536   concepts::NestedRequirement *
537   TransformNestedRequirement(concepts::NestedRequirement *Req);
538 
539   /// Transform the given template name.
540   ///
541   /// \param SS The nested-name-specifier that qualifies the template
542   /// name. This nested-name-specifier must already have been transformed.
543   ///
544   /// \param Name The template name to transform.
545   ///
546   /// \param NameLoc The source location of the template name.
547   ///
548   /// \param ObjectType If we're translating a template name within a member
549   /// access expression, this is the type of the object whose member template
550   /// is being referenced.
551   ///
552   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
553   /// also refers to a name within the current (lexical) scope, this is the
554   /// declaration it refers to.
555   ///
556   /// By default, transforms the template name by transforming the declarations
557   /// and nested-name-specifiers that occur within the template name.
558   /// Subclasses may override this function to provide alternate behavior.
559   TemplateName
560   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
561                         SourceLocation NameLoc,
562                         QualType ObjectType = QualType(),
563                         NamedDecl *FirstQualifierInScope = nullptr,
564                         bool AllowInjectedClassName = false);
565 
566   /// Transform the given template argument.
567   ///
568   /// By default, this operation transforms the type, expression, or
569   /// declaration stored within the template argument and constructs a
570   /// new template argument from the transformed result. Subclasses may
571   /// override this function to provide alternate behavior.
572   ///
573   /// Returns true if there was an error.
574   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
575                                  TemplateArgumentLoc &Output,
576                                  bool Uneval = false);
577 
578   /// Transform the given set of template arguments.
579   ///
580   /// By default, this operation transforms all of the template arguments
581   /// in the input set using \c TransformTemplateArgument(), and appends
582   /// the transformed arguments to the output list.
583   ///
584   /// Note that this overload of \c TransformTemplateArguments() is merely
585   /// a convenience function. Subclasses that wish to override this behavior
586   /// should override the iterator-based member template version.
587   ///
588   /// \param Inputs The set of template arguments to be transformed.
589   ///
590   /// \param NumInputs The number of template arguments in \p Inputs.
591   ///
592   /// \param Outputs The set of transformed template arguments output by this
593   /// routine.
594   ///
595   /// Returns true if an error occurred.
596   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
597                                   unsigned NumInputs,
598                                   TemplateArgumentListInfo &Outputs,
599                                   bool Uneval = false) {
600     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
601                                       Uneval);
602   }
603 
604   /// Transform the given set of template arguments.
605   ///
606   /// By default, this operation transforms all of the template arguments
607   /// in the input set using \c TransformTemplateArgument(), and appends
608   /// the transformed arguments to the output list.
609   ///
610   /// \param First An iterator to the first template argument.
611   ///
612   /// \param Last An iterator one step past the last template argument.
613   ///
614   /// \param Outputs The set of transformed template arguments output by this
615   /// routine.
616   ///
617   /// Returns true if an error occurred.
618   template<typename InputIterator>
619   bool TransformTemplateArguments(InputIterator First,
620                                   InputIterator Last,
621                                   TemplateArgumentListInfo &Outputs,
622                                   bool Uneval = false);
623 
624   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
625   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
626                                  TemplateArgumentLoc &ArgLoc);
627 
628   /// Fakes up a TypeSourceInfo for a type.
629   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
630     return SemaRef.Context.getTrivialTypeSourceInfo(T,
631                        getDerived().getBaseLocation());
632   }
633 
634 #define ABSTRACT_TYPELOC(CLASS, PARENT)
635 #define TYPELOC(CLASS, PARENT)                                   \
636   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
637 #include "clang/AST/TypeLocNodes.def"
638 
639   template<typename Fn>
640   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
641                                       FunctionProtoTypeLoc TL,
642                                       CXXRecordDecl *ThisContext,
643                                       Qualifiers ThisTypeQuals,
644                                       Fn TransformExceptionSpec);
645 
646   bool TransformExceptionSpec(SourceLocation Loc,
647                               FunctionProtoType::ExceptionSpecInfo &ESI,
648                               SmallVectorImpl<QualType> &Exceptions,
649                               bool &Changed);
650 
651   StmtResult TransformSEHHandler(Stmt *Handler);
652 
653   QualType
654   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
655                                       TemplateSpecializationTypeLoc TL,
656                                       TemplateName Template);
657 
658   QualType
659   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
660                                       DependentTemplateSpecializationTypeLoc TL,
661                                                TemplateName Template,
662                                                CXXScopeSpec &SS);
663 
664   QualType TransformDependentTemplateSpecializationType(
665       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
666       NestedNameSpecifierLoc QualifierLoc);
667 
668   /// Transforms the parameters of a function type into the
669   /// given vectors.
670   ///
671   /// The result vectors should be kept in sync; null entries in the
672   /// variables vector are acceptable.
673   ///
674   /// Return true on error.
675   bool TransformFunctionTypeParams(
676       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
677       const QualType *ParamTypes,
678       const FunctionProtoType::ExtParameterInfo *ParamInfos,
679       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
680       Sema::ExtParameterInfoBuilder &PInfos);
681 
682   /// Transforms a single function-type parameter.  Return null
683   /// on error.
684   ///
685   /// \param indexAdjustment - A number to add to the parameter's
686   ///   scope index;  can be negative
687   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
688                                           int indexAdjustment,
689                                           Optional<unsigned> NumExpansions,
690                                           bool ExpectParameterPack);
691 
692   /// Transform the body of a lambda-expression.
693   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
694   /// Alternative implementation of TransformLambdaBody that skips transforming
695   /// the body.
696   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
697 
698   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
699 
700   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
701   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
702 
703   TemplateParameterList *TransformTemplateParameterList(
704         TemplateParameterList *TPL) {
705     return TPL;
706   }
707 
708   ExprResult TransformAddressOfOperand(Expr *E);
709 
710   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
711                                                 bool IsAddressOfOperand,
712                                                 TypeSourceInfo **RecoveryTSI);
713 
714   ExprResult TransformParenDependentScopeDeclRefExpr(
715       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
716       TypeSourceInfo **RecoveryTSI);
717 
718   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
719 
720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
721 // amount of stack usage with clang.
722 #define STMT(Node, Parent)                        \
723   LLVM_ATTRIBUTE_NOINLINE \
724   StmtResult Transform##Node(Node *S);
725 #define VALUESTMT(Node, Parent)                   \
726   LLVM_ATTRIBUTE_NOINLINE \
727   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
728 #define EXPR(Node, Parent)                        \
729   LLVM_ATTRIBUTE_NOINLINE \
730   ExprResult Transform##Node(Node *E);
731 #define ABSTRACT_STMT(Stmt)
732 #include "clang/AST/StmtNodes.inc"
733 
734 #define GEN_CLANG_CLAUSE_CLASS
735 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
736   LLVM_ATTRIBUTE_NOINLINE                                                      \
737   OMPClause *Transform##Class(Class *S);
738 #include "llvm/Frontend/OpenMP/OMP.inc"
739 
740   /// Build a new qualified type given its unqualified type and type location.
741   ///
742   /// By default, this routine adds type qualifiers only to types that can
743   /// have qualifiers, and silently suppresses those qualifiers that are not
744   /// permitted. Subclasses may override this routine to provide different
745   /// behavior.
746   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
747 
748   /// Build a new pointer type given its pointee type.
749   ///
750   /// By default, performs semantic analysis when building the pointer type.
751   /// Subclasses may override this routine to provide different behavior.
752   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
753 
754   /// Build a new block pointer type given its pointee type.
755   ///
756   /// By default, performs semantic analysis when building the block pointer
757   /// type. Subclasses may override this routine to provide different behavior.
758   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
759 
760   /// Build a new reference type given the type it references.
761   ///
762   /// By default, performs semantic analysis when building the
763   /// reference type. Subclasses may override this routine to provide
764   /// different behavior.
765   ///
766   /// \param LValue whether the type was written with an lvalue sigil
767   /// or an rvalue sigil.
768   QualType RebuildReferenceType(QualType ReferentType,
769                                 bool LValue,
770                                 SourceLocation Sigil);
771 
772   /// Build a new member pointer type given the pointee type and the
773   /// class type it refers into.
774   ///
775   /// By default, performs semantic analysis when building the member pointer
776   /// type. Subclasses may override this routine to provide different behavior.
777   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
778                                     SourceLocation Sigil);
779 
780   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
781                                     SourceLocation ProtocolLAngleLoc,
782                                     ArrayRef<ObjCProtocolDecl *> Protocols,
783                                     ArrayRef<SourceLocation> ProtocolLocs,
784                                     SourceLocation ProtocolRAngleLoc);
785 
786   /// Build an Objective-C object type.
787   ///
788   /// By default, performs semantic analysis when building the object type.
789   /// Subclasses may override this routine to provide different behavior.
790   QualType RebuildObjCObjectType(QualType BaseType,
791                                  SourceLocation Loc,
792                                  SourceLocation TypeArgsLAngleLoc,
793                                  ArrayRef<TypeSourceInfo *> TypeArgs,
794                                  SourceLocation TypeArgsRAngleLoc,
795                                  SourceLocation ProtocolLAngleLoc,
796                                  ArrayRef<ObjCProtocolDecl *> Protocols,
797                                  ArrayRef<SourceLocation> ProtocolLocs,
798                                  SourceLocation ProtocolRAngleLoc);
799 
800   /// Build a new Objective-C object pointer type given the pointee type.
801   ///
802   /// By default, directly builds the pointer type, with no additional semantic
803   /// analysis.
804   QualType RebuildObjCObjectPointerType(QualType PointeeType,
805                                         SourceLocation Star);
806 
807   /// Build a new array type given the element type, size
808   /// modifier, size of the array (if known), size expression, and index type
809   /// qualifiers.
810   ///
811   /// By default, performs semantic analysis when building the array type.
812   /// Subclasses may override this routine to provide different behavior.
813   /// Also by default, all of the other Rebuild*Array
814   QualType RebuildArrayType(QualType ElementType,
815                             ArrayType::ArraySizeModifier SizeMod,
816                             const llvm::APInt *Size,
817                             Expr *SizeExpr,
818                             unsigned IndexTypeQuals,
819                             SourceRange BracketsRange);
820 
821   /// Build a new constant array type given the element type, size
822   /// modifier, (known) size of the array, and index type qualifiers.
823   ///
824   /// By default, performs semantic analysis when building the array type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildConstantArrayType(QualType ElementType,
827                                     ArrayType::ArraySizeModifier SizeMod,
828                                     const llvm::APInt &Size,
829                                     Expr *SizeExpr,
830                                     unsigned IndexTypeQuals,
831                                     SourceRange BracketsRange);
832 
833   /// Build a new incomplete array type given the element type, size
834   /// modifier, and index type qualifiers.
835   ///
836   /// By default, performs semantic analysis when building the array type.
837   /// Subclasses may override this routine to provide different behavior.
838   QualType RebuildIncompleteArrayType(QualType ElementType,
839                                       ArrayType::ArraySizeModifier SizeMod,
840                                       unsigned IndexTypeQuals,
841                                       SourceRange BracketsRange);
842 
843   /// Build a new variable-length array type given the element type,
844   /// size modifier, size expression, and index type qualifiers.
845   ///
846   /// By default, performs semantic analysis when building the array type.
847   /// Subclasses may override this routine to provide different behavior.
848   QualType RebuildVariableArrayType(QualType ElementType,
849                                     ArrayType::ArraySizeModifier SizeMod,
850                                     Expr *SizeExpr,
851                                     unsigned IndexTypeQuals,
852                                     SourceRange BracketsRange);
853 
854   /// Build a new dependent-sized array type given the element type,
855   /// size modifier, size expression, and index type qualifiers.
856   ///
857   /// By default, performs semantic analysis when building the array type.
858   /// Subclasses may override this routine to provide different behavior.
859   QualType RebuildDependentSizedArrayType(QualType ElementType,
860                                           ArrayType::ArraySizeModifier SizeMod,
861                                           Expr *SizeExpr,
862                                           unsigned IndexTypeQuals,
863                                           SourceRange BracketsRange);
864 
865   /// Build a new vector type given the element type and
866   /// number of elements.
867   ///
868   /// By default, performs semantic analysis when building the vector type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
871                              VectorType::VectorKind VecKind);
872 
873   /// Build a new potentially dependently-sized extended vector type
874   /// given the element type and number of elements.
875   ///
876   /// By default, performs semantic analysis when building the vector type.
877   /// Subclasses may override this routine to provide different behavior.
878   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
879                                            SourceLocation AttributeLoc,
880                                            VectorType::VectorKind);
881 
882   /// Build a new extended vector type given the element type and
883   /// number of elements.
884   ///
885   /// By default, performs semantic analysis when building the vector type.
886   /// Subclasses may override this routine to provide different behavior.
887   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
888                                 SourceLocation AttributeLoc);
889 
890   /// Build a new potentially dependently-sized extended vector type
891   /// given the element type and number of elements.
892   ///
893   /// By default, performs semantic analysis when building the vector type.
894   /// Subclasses may override this routine to provide different behavior.
895   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
896                                               Expr *SizeExpr,
897                                               SourceLocation AttributeLoc);
898 
899   /// Build a new matrix type given the element type and dimensions.
900   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
901                                      unsigned NumColumns);
902 
903   /// Build a new matrix type given the type and dependently-defined
904   /// dimensions.
905   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
906                                            Expr *ColumnExpr,
907                                            SourceLocation AttributeLoc);
908 
909   /// Build a new DependentAddressSpaceType or return the pointee
910   /// type variable with the correct address space (retrieved from
911   /// AddrSpaceExpr) applied to it. The former will be returned in cases
912   /// where the address space remains dependent.
913   ///
914   /// By default, performs semantic analysis when building the type with address
915   /// space applied. Subclasses may override this routine to provide different
916   /// behavior.
917   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
918                                             Expr *AddrSpaceExpr,
919                                             SourceLocation AttributeLoc);
920 
921   /// Build a new function type.
922   ///
923   /// By default, performs semantic analysis when building the function type.
924   /// Subclasses may override this routine to provide different behavior.
925   QualType RebuildFunctionProtoType(QualType T,
926                                     MutableArrayRef<QualType> ParamTypes,
927                                     const FunctionProtoType::ExtProtoInfo &EPI);
928 
929   /// Build a new unprototyped function type.
930   QualType RebuildFunctionNoProtoType(QualType ResultType);
931 
932   /// Rebuild an unresolved typename type, given the decl that
933   /// the UnresolvedUsingTypenameDecl was transformed to.
934   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
935 
936   /// Build a new typedef type.
937   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
938     return SemaRef.Context.getTypeDeclType(Typedef);
939   }
940 
941   /// Build a new MacroDefined type.
942   QualType RebuildMacroQualifiedType(QualType T,
943                                      const IdentifierInfo *MacroII) {
944     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
945   }
946 
947   /// Build a new class/struct/union type.
948   QualType RebuildRecordType(RecordDecl *Record) {
949     return SemaRef.Context.getTypeDeclType(Record);
950   }
951 
952   /// Build a new Enum type.
953   QualType RebuildEnumType(EnumDecl *Enum) {
954     return SemaRef.Context.getTypeDeclType(Enum);
955   }
956 
957   /// Build a new typeof(expr) type.
958   ///
959   /// By default, performs semantic analysis when building the typeof type.
960   /// Subclasses may override this routine to provide different behavior.
961   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
962 
963   /// Build a new typeof(type) type.
964   ///
965   /// By default, builds a new TypeOfType with the given underlying type.
966   QualType RebuildTypeOfType(QualType Underlying);
967 
968   /// Build a new unary transform type.
969   QualType RebuildUnaryTransformType(QualType BaseType,
970                                      UnaryTransformType::UTTKind UKind,
971                                      SourceLocation Loc);
972 
973   /// Build a new C++11 decltype type.
974   ///
975   /// By default, performs semantic analysis when building the decltype type.
976   /// Subclasses may override this routine to provide different behavior.
977   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
978 
979   /// Build a new C++11 auto type.
980   ///
981   /// By default, builds a new AutoType with the given deduced type.
982   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
983                            ConceptDecl *TypeConstraintConcept,
984                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
985     // Note, IsDependent is always false here: we implicitly convert an 'auto'
986     // which has been deduced to a dependent type into an undeduced 'auto', so
987     // that we'll retry deduction after the transformation.
988     return SemaRef.Context.getAutoType(Deduced, Keyword,
989                                        /*IsDependent*/ false, /*IsPack=*/false,
990                                        TypeConstraintConcept,
991                                        TypeConstraintArgs);
992   }
993 
994   /// By default, builds a new DeducedTemplateSpecializationType with the given
995   /// deduced type.
996   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
997       QualType Deduced) {
998     return SemaRef.Context.getDeducedTemplateSpecializationType(
999         Template, Deduced, /*IsDependent*/ false);
1000   }
1001 
1002   /// Build a new template specialization type.
1003   ///
1004   /// By default, performs semantic analysis when building the template
1005   /// specialization type. Subclasses may override this routine to provide
1006   /// different behavior.
1007   QualType RebuildTemplateSpecializationType(TemplateName Template,
1008                                              SourceLocation TemplateLoc,
1009                                              TemplateArgumentListInfo &Args);
1010 
1011   /// Build a new parenthesized type.
1012   ///
1013   /// By default, builds a new ParenType type from the inner type.
1014   /// Subclasses may override this routine to provide different behavior.
1015   QualType RebuildParenType(QualType InnerType) {
1016     return SemaRef.BuildParenType(InnerType);
1017   }
1018 
1019   /// Build a new qualified name type.
1020   ///
1021   /// By default, builds a new ElaboratedType type from the keyword,
1022   /// the nested-name-specifier and the named type.
1023   /// Subclasses may override this routine to provide different behavior.
1024   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1025                                  ElaboratedTypeKeyword Keyword,
1026                                  NestedNameSpecifierLoc QualifierLoc,
1027                                  QualType Named) {
1028     return SemaRef.Context.getElaboratedType(Keyword,
1029                                          QualifierLoc.getNestedNameSpecifier(),
1030                                              Named);
1031   }
1032 
1033   /// Build a new typename type that refers to a template-id.
1034   ///
1035   /// By default, builds a new DependentNameType type from the
1036   /// nested-name-specifier and the given type. Subclasses may override
1037   /// this routine to provide different behavior.
1038   QualType RebuildDependentTemplateSpecializationType(
1039                                           ElaboratedTypeKeyword Keyword,
1040                                           NestedNameSpecifierLoc QualifierLoc,
1041                                           SourceLocation TemplateKWLoc,
1042                                           const IdentifierInfo *Name,
1043                                           SourceLocation NameLoc,
1044                                           TemplateArgumentListInfo &Args,
1045                                           bool AllowInjectedClassName) {
1046     // Rebuild the template name.
1047     // TODO: avoid TemplateName abstraction
1048     CXXScopeSpec SS;
1049     SS.Adopt(QualifierLoc);
1050     TemplateName InstName = getDerived().RebuildTemplateName(
1051         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1052         AllowInjectedClassName);
1053 
1054     if (InstName.isNull())
1055       return QualType();
1056 
1057     // If it's still dependent, make a dependent specialization.
1058     if (InstName.getAsDependentTemplateName())
1059       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1060                                           QualifierLoc.getNestedNameSpecifier(),
1061                                                                     Name,
1062                                                                     Args);
1063 
1064     // Otherwise, make an elaborated type wrapping a non-dependent
1065     // specialization.
1066     QualType T =
1067     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1068     if (T.isNull()) return QualType();
1069 
1070     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1071       return T;
1072 
1073     return SemaRef.Context.getElaboratedType(Keyword,
1074                                        QualifierLoc.getNestedNameSpecifier(),
1075                                              T);
1076   }
1077 
1078   /// Build a new typename type that refers to an identifier.
1079   ///
1080   /// By default, performs semantic analysis when building the typename type
1081   /// (or elaborated type). Subclasses may override this routine to provide
1082   /// different behavior.
1083   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1084                                     SourceLocation KeywordLoc,
1085                                     NestedNameSpecifierLoc QualifierLoc,
1086                                     const IdentifierInfo *Id,
1087                                     SourceLocation IdLoc,
1088                                     bool DeducedTSTContext) {
1089     CXXScopeSpec SS;
1090     SS.Adopt(QualifierLoc);
1091 
1092     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1093       // If the name is still dependent, just build a new dependent name type.
1094       if (!SemaRef.computeDeclContext(SS))
1095         return SemaRef.Context.getDependentNameType(Keyword,
1096                                           QualifierLoc.getNestedNameSpecifier(),
1097                                                     Id);
1098     }
1099 
1100     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1101       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1102                                        *Id, IdLoc, DeducedTSTContext);
1103     }
1104 
1105     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1106 
1107     // We had a dependent elaborated-type-specifier that has been transformed
1108     // into a non-dependent elaborated-type-specifier. Find the tag we're
1109     // referring to.
1110     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1111     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1112     if (!DC)
1113       return QualType();
1114 
1115     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1116       return QualType();
1117 
1118     TagDecl *Tag = nullptr;
1119     SemaRef.LookupQualifiedName(Result, DC);
1120     switch (Result.getResultKind()) {
1121       case LookupResult::NotFound:
1122       case LookupResult::NotFoundInCurrentInstantiation:
1123         break;
1124 
1125       case LookupResult::Found:
1126         Tag = Result.getAsSingle<TagDecl>();
1127         break;
1128 
1129       case LookupResult::FoundOverloaded:
1130       case LookupResult::FoundUnresolvedValue:
1131         llvm_unreachable("Tag lookup cannot find non-tags");
1132 
1133       case LookupResult::Ambiguous:
1134         // Let the LookupResult structure handle ambiguities.
1135         return QualType();
1136     }
1137 
1138     if (!Tag) {
1139       // Check where the name exists but isn't a tag type and use that to emit
1140       // better diagnostics.
1141       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1142       SemaRef.LookupQualifiedName(Result, DC);
1143       switch (Result.getResultKind()) {
1144         case LookupResult::Found:
1145         case LookupResult::FoundOverloaded:
1146         case LookupResult::FoundUnresolvedValue: {
1147           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1148           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1149           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1150                                                                << NTK << Kind;
1151           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1152           break;
1153         }
1154         default:
1155           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1156               << Kind << Id << DC << QualifierLoc.getSourceRange();
1157           break;
1158       }
1159       return QualType();
1160     }
1161 
1162     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1163                                               IdLoc, Id)) {
1164       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1165       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1166       return QualType();
1167     }
1168 
1169     // Build the elaborated-type-specifier type.
1170     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1171     return SemaRef.Context.getElaboratedType(Keyword,
1172                                          QualifierLoc.getNestedNameSpecifier(),
1173                                              T);
1174   }
1175 
1176   /// Build a new pack expansion type.
1177   ///
1178   /// By default, builds a new PackExpansionType type from the given pattern.
1179   /// Subclasses may override this routine to provide different behavior.
1180   QualType RebuildPackExpansionType(QualType Pattern,
1181                                     SourceRange PatternRange,
1182                                     SourceLocation EllipsisLoc,
1183                                     Optional<unsigned> NumExpansions) {
1184     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1185                                         NumExpansions);
1186   }
1187 
1188   /// Build a new atomic type given its value type.
1189   ///
1190   /// By default, performs semantic analysis when building the atomic type.
1191   /// Subclasses may override this routine to provide different behavior.
1192   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1193 
1194   /// Build a new pipe type given its value type.
1195   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1196                            bool isReadPipe);
1197 
1198    /// Build an extended int given its value type.
1199   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1200                              SourceLocation Loc);
1201 
1202   /// Build a dependent extended int given its value type.
1203   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1204                                       SourceLocation Loc);
1205 
1206   /// Build a new template name given a nested name specifier, a flag
1207   /// indicating whether the "template" keyword was provided, and the template
1208   /// that the template name refers to.
1209   ///
1210   /// By default, builds the new template name directly. Subclasses may override
1211   /// this routine to provide different behavior.
1212   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1213                                    bool TemplateKW,
1214                                    TemplateDecl *Template);
1215 
1216   /// Build a new template name given a nested name specifier and the
1217   /// name that is referred to as a template.
1218   ///
1219   /// By default, performs semantic analysis to determine whether the name can
1220   /// be resolved to a specific template, then builds the appropriate kind of
1221   /// template name. Subclasses may override this routine to provide different
1222   /// behavior.
1223   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1224                                    SourceLocation TemplateKWLoc,
1225                                    const IdentifierInfo &Name,
1226                                    SourceLocation NameLoc, QualType ObjectType,
1227                                    NamedDecl *FirstQualifierInScope,
1228                                    bool AllowInjectedClassName);
1229 
1230   /// Build a new template name given a nested name specifier and the
1231   /// overloaded operator name that is referred to as a template.
1232   ///
1233   /// By default, performs semantic analysis to determine whether the name can
1234   /// be resolved to a specific template, then builds the appropriate kind of
1235   /// template name. Subclasses may override this routine to provide different
1236   /// behavior.
1237   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1238                                    SourceLocation TemplateKWLoc,
1239                                    OverloadedOperatorKind Operator,
1240                                    SourceLocation NameLoc, QualType ObjectType,
1241                                    bool AllowInjectedClassName);
1242 
1243   /// Build a new template name given a template template parameter pack
1244   /// and the
1245   ///
1246   /// By default, performs semantic analysis to determine whether the name can
1247   /// be resolved to a specific template, then builds the appropriate kind of
1248   /// template name. Subclasses may override this routine to provide different
1249   /// behavior.
1250   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1251                                    const TemplateArgument &ArgPack) {
1252     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1253   }
1254 
1255   /// Build a new compound statement.
1256   ///
1257   /// By default, performs semantic analysis to build the new statement.
1258   /// Subclasses may override this routine to provide different behavior.
1259   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1260                                        MultiStmtArg Statements,
1261                                        SourceLocation RBraceLoc,
1262                                        bool IsStmtExpr) {
1263     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1264                                        IsStmtExpr);
1265   }
1266 
1267   /// Build a new case statement.
1268   ///
1269   /// By default, performs semantic analysis to build the new statement.
1270   /// Subclasses may override this routine to provide different behavior.
1271   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1272                                    Expr *LHS,
1273                                    SourceLocation EllipsisLoc,
1274                                    Expr *RHS,
1275                                    SourceLocation ColonLoc) {
1276     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1277                                    ColonLoc);
1278   }
1279 
1280   /// Attach the body to a new case statement.
1281   ///
1282   /// By default, performs semantic analysis to build the new statement.
1283   /// Subclasses may override this routine to provide different behavior.
1284   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1285     getSema().ActOnCaseStmtBody(S, Body);
1286     return S;
1287   }
1288 
1289   /// Build a new default statement.
1290   ///
1291   /// By default, performs semantic analysis to build the new statement.
1292   /// Subclasses may override this routine to provide different behavior.
1293   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1294                                       SourceLocation ColonLoc,
1295                                       Stmt *SubStmt) {
1296     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1297                                       /*CurScope=*/nullptr);
1298   }
1299 
1300   /// Build a new label statement.
1301   ///
1302   /// By default, performs semantic analysis to build the new statement.
1303   /// Subclasses may override this routine to provide different behavior.
1304   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1305                               SourceLocation ColonLoc, Stmt *SubStmt) {
1306     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1307   }
1308 
1309   /// Build a new attributed statement.
1310   ///
1311   /// By default, performs semantic analysis to build the new statement.
1312   /// Subclasses may override this routine to provide different behavior.
1313   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1314                                    ArrayRef<const Attr*> Attrs,
1315                                    Stmt *SubStmt) {
1316     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1317   }
1318 
1319   /// Build a new "if" statement.
1320   ///
1321   /// By default, performs semantic analysis to build the new statement.
1322   /// Subclasses may override this routine to provide different behavior.
1323   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1324                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1325                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1326                            SourceLocation ElseLoc, Stmt *Else) {
1327     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond,
1328                                  RParenLoc, Then, ElseLoc, Else);
1329   }
1330 
1331   /// Start building a new switch statement.
1332   ///
1333   /// By default, performs semantic analysis to build the new statement.
1334   /// Subclasses may override this routine to provide different behavior.
1335   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1336                                     SourceLocation LParenLoc, Stmt *Init,
1337                                     Sema::ConditionResult Cond,
1338                                     SourceLocation RParenLoc) {
1339     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1340                                             RParenLoc);
1341   }
1342 
1343   /// Attach the body to the switch statement.
1344   ///
1345   /// By default, performs semantic analysis to build the new statement.
1346   /// Subclasses may override this routine to provide different behavior.
1347   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1348                                    Stmt *Switch, Stmt *Body) {
1349     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1350   }
1351 
1352   /// Build a new while statement.
1353   ///
1354   /// By default, performs semantic analysis to build the new statement.
1355   /// Subclasses may override this routine to provide different behavior.
1356   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1357                               Sema::ConditionResult Cond,
1358                               SourceLocation RParenLoc, Stmt *Body) {
1359     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1360   }
1361 
1362   /// Build a new do-while statement.
1363   ///
1364   /// By default, performs semantic analysis to build the new statement.
1365   /// Subclasses may override this routine to provide different behavior.
1366   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1367                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1368                            Expr *Cond, SourceLocation RParenLoc) {
1369     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1370                                  Cond, RParenLoc);
1371   }
1372 
1373   /// Build a new for statement.
1374   ///
1375   /// By default, performs semantic analysis to build the new statement.
1376   /// Subclasses may override this routine to provide different behavior.
1377   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1378                             Stmt *Init, Sema::ConditionResult Cond,
1379                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1380                             Stmt *Body) {
1381     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1382                                   Inc, RParenLoc, Body);
1383   }
1384 
1385   /// Build a new goto statement.
1386   ///
1387   /// By default, performs semantic analysis to build the new statement.
1388   /// Subclasses may override this routine to provide different behavior.
1389   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1390                              LabelDecl *Label) {
1391     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1392   }
1393 
1394   /// Build a new indirect goto statement.
1395   ///
1396   /// By default, performs semantic analysis to build the new statement.
1397   /// Subclasses may override this routine to provide different behavior.
1398   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1399                                      SourceLocation StarLoc,
1400                                      Expr *Target) {
1401     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1402   }
1403 
1404   /// Build a new return statement.
1405   ///
1406   /// By default, performs semantic analysis to build the new statement.
1407   /// Subclasses may override this routine to provide different behavior.
1408   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1409     return getSema().BuildReturnStmt(ReturnLoc, Result);
1410   }
1411 
1412   /// Build a new declaration statement.
1413   ///
1414   /// By default, performs semantic analysis to build the new statement.
1415   /// Subclasses may override this routine to provide different behavior.
1416   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1417                              SourceLocation StartLoc, SourceLocation EndLoc) {
1418     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1419     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1420   }
1421 
1422   /// Build a new inline asm statement.
1423   ///
1424   /// By default, performs semantic analysis to build the new statement.
1425   /// Subclasses may override this routine to provide different behavior.
1426   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1427                                bool IsVolatile, unsigned NumOutputs,
1428                                unsigned NumInputs, IdentifierInfo **Names,
1429                                MultiExprArg Constraints, MultiExprArg Exprs,
1430                                Expr *AsmString, MultiExprArg Clobbers,
1431                                unsigned NumLabels,
1432                                SourceLocation RParenLoc) {
1433     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1434                                      NumInputs, Names, Constraints, Exprs,
1435                                      AsmString, Clobbers, NumLabels, RParenLoc);
1436   }
1437 
1438   /// Build a new MS style inline asm statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
1442   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1443                               ArrayRef<Token> AsmToks,
1444                               StringRef AsmString,
1445                               unsigned NumOutputs, unsigned NumInputs,
1446                               ArrayRef<StringRef> Constraints,
1447                               ArrayRef<StringRef> Clobbers,
1448                               ArrayRef<Expr*> Exprs,
1449                               SourceLocation EndLoc) {
1450     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1451                                     NumOutputs, NumInputs,
1452                                     Constraints, Clobbers, Exprs, EndLoc);
1453   }
1454 
1455   /// Build a new co_return statement.
1456   ///
1457   /// By default, performs semantic analysis to build the new statement.
1458   /// Subclasses may override this routine to provide different behavior.
1459   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1460                                  bool IsImplicit) {
1461     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1462   }
1463 
1464   /// Build a new co_await expression.
1465   ///
1466   /// By default, performs semantic analysis to build the new expression.
1467   /// Subclasses may override this routine to provide different behavior.
1468   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1469                                 bool IsImplicit) {
1470     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1471   }
1472 
1473   /// Build a new co_await expression.
1474   ///
1475   /// By default, performs semantic analysis to build the new expression.
1476   /// Subclasses may override this routine to provide different behavior.
1477   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1478                                          Expr *Result,
1479                                          UnresolvedLookupExpr *Lookup) {
1480     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1481   }
1482 
1483   /// Build a new co_yield expression.
1484   ///
1485   /// By default, performs semantic analysis to build the new expression.
1486   /// Subclasses may override this routine to provide different behavior.
1487   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1488     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1489   }
1490 
1491   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1492     return getSema().BuildCoroutineBodyStmt(Args);
1493   }
1494 
1495   /// Build a new Objective-C \@try statement.
1496   ///
1497   /// By default, performs semantic analysis to build the new statement.
1498   /// Subclasses may override this routine to provide different behavior.
1499   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1500                                         Stmt *TryBody,
1501                                         MultiStmtArg CatchStmts,
1502                                         Stmt *Finally) {
1503     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1504                                         Finally);
1505   }
1506 
1507   /// Rebuild an Objective-C exception declaration.
1508   ///
1509   /// By default, performs semantic analysis to build the new declaration.
1510   /// Subclasses may override this routine to provide different behavior.
1511   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1512                                     TypeSourceInfo *TInfo, QualType T) {
1513     return getSema().BuildObjCExceptionDecl(TInfo, T,
1514                                             ExceptionDecl->getInnerLocStart(),
1515                                             ExceptionDecl->getLocation(),
1516                                             ExceptionDecl->getIdentifier());
1517   }
1518 
1519   /// Build a new Objective-C \@catch statement.
1520   ///
1521   /// By default, performs semantic analysis to build the new statement.
1522   /// Subclasses may override this routine to provide different behavior.
1523   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1524                                           SourceLocation RParenLoc,
1525                                           VarDecl *Var,
1526                                           Stmt *Body) {
1527     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1528                                           Var, Body);
1529   }
1530 
1531   /// Build a new Objective-C \@finally statement.
1532   ///
1533   /// By default, performs semantic analysis to build the new statement.
1534   /// Subclasses may override this routine to provide different behavior.
1535   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1536                                             Stmt *Body) {
1537     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1538   }
1539 
1540   /// Build a new Objective-C \@throw statement.
1541   ///
1542   /// By default, performs semantic analysis to build the new statement.
1543   /// Subclasses may override this routine to provide different behavior.
1544   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1545                                           Expr *Operand) {
1546     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1547   }
1548 
1549   /// Build a new OpenMP Canonical loop.
1550   ///
1551   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1552   /// OMPCanonicalLoop.
1553   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1554     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1555   }
1556 
1557   /// Build a new OpenMP executable directive.
1558   ///
1559   /// By default, performs semantic analysis to build the new statement.
1560   /// Subclasses may override this routine to provide different behavior.
1561   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1562                                            DeclarationNameInfo DirName,
1563                                            OpenMPDirectiveKind CancelRegion,
1564                                            ArrayRef<OMPClause *> Clauses,
1565                                            Stmt *AStmt, SourceLocation StartLoc,
1566                                            SourceLocation EndLoc) {
1567     return getSema().ActOnOpenMPExecutableDirective(
1568         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1569   }
1570 
1571   /// Build a new OpenMP 'if' clause.
1572   ///
1573   /// By default, performs semantic analysis to build the new OpenMP clause.
1574   /// Subclasses may override this routine to provide different behavior.
1575   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1576                                 Expr *Condition, SourceLocation StartLoc,
1577                                 SourceLocation LParenLoc,
1578                                 SourceLocation NameModifierLoc,
1579                                 SourceLocation ColonLoc,
1580                                 SourceLocation EndLoc) {
1581     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1582                                          LParenLoc, NameModifierLoc, ColonLoc,
1583                                          EndLoc);
1584   }
1585 
1586   /// Build a new OpenMP 'final' clause.
1587   ///
1588   /// By default, performs semantic analysis to build the new OpenMP clause.
1589   /// Subclasses may override this routine to provide different behavior.
1590   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1591                                    SourceLocation LParenLoc,
1592                                    SourceLocation EndLoc) {
1593     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1594                                             EndLoc);
1595   }
1596 
1597   /// Build a new OpenMP 'num_threads' clause.
1598   ///
1599   /// By default, performs semantic analysis to build the new OpenMP clause.
1600   /// Subclasses may override this routine to provide different behavior.
1601   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1602                                         SourceLocation StartLoc,
1603                                         SourceLocation LParenLoc,
1604                                         SourceLocation EndLoc) {
1605     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1606                                                  LParenLoc, EndLoc);
1607   }
1608 
1609   /// Build a new OpenMP 'safelen' clause.
1610   ///
1611   /// By default, performs semantic analysis to build the new OpenMP clause.
1612   /// Subclasses may override this routine to provide different behavior.
1613   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1614                                      SourceLocation LParenLoc,
1615                                      SourceLocation EndLoc) {
1616     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1617   }
1618 
1619   /// Build a new OpenMP 'simdlen' clause.
1620   ///
1621   /// By default, performs semantic analysis to build the new OpenMP clause.
1622   /// Subclasses may override this routine to provide different behavior.
1623   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1624                                      SourceLocation LParenLoc,
1625                                      SourceLocation EndLoc) {
1626     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1627   }
1628 
1629   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1630                                    SourceLocation StartLoc,
1631                                    SourceLocation LParenLoc,
1632                                    SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1634   }
1635 
1636   /// Build a new OpenMP 'allocator' clause.
1637   ///
1638   /// By default, performs semantic analysis to build the new OpenMP clause.
1639   /// Subclasses may override this routine to provide different behavior.
1640   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1641                                        SourceLocation LParenLoc,
1642                                        SourceLocation EndLoc) {
1643     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1644   }
1645 
1646   /// Build a new OpenMP 'collapse' clause.
1647   ///
1648   /// By default, performs semantic analysis to build the new OpenMP clause.
1649   /// Subclasses may override this routine to provide different behavior.
1650   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1651                                       SourceLocation LParenLoc,
1652                                       SourceLocation EndLoc) {
1653     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1654                                                EndLoc);
1655   }
1656 
1657   /// Build a new OpenMP 'default' clause.
1658   ///
1659   /// By default, performs semantic analysis to build the new OpenMP clause.
1660   /// Subclasses may override this routine to provide different behavior.
1661   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1662                                      SourceLocation StartLoc,
1663                                      SourceLocation LParenLoc,
1664                                      SourceLocation EndLoc) {
1665     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1666                                               StartLoc, LParenLoc, EndLoc);
1667   }
1668 
1669   /// Build a new OpenMP 'proc_bind' clause.
1670   ///
1671   /// By default, performs semantic analysis to build the new OpenMP clause.
1672   /// Subclasses may override this routine to provide different behavior.
1673   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1674                                       SourceLocation KindKwLoc,
1675                                       SourceLocation StartLoc,
1676                                       SourceLocation LParenLoc,
1677                                       SourceLocation EndLoc) {
1678     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1679                                                StartLoc, LParenLoc, EndLoc);
1680   }
1681 
1682   /// Build a new OpenMP 'schedule' clause.
1683   ///
1684   /// By default, performs semantic analysis to build the new OpenMP clause.
1685   /// Subclasses may override this routine to provide different behavior.
1686   OMPClause *RebuildOMPScheduleClause(
1687       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1688       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1689       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1690       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1691     return getSema().ActOnOpenMPScheduleClause(
1692         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1693         CommaLoc, EndLoc);
1694   }
1695 
1696   /// Build a new OpenMP 'ordered' clause.
1697   ///
1698   /// By default, performs semantic analysis to build the new OpenMP clause.
1699   /// Subclasses may override this routine to provide different behavior.
1700   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1701                                      SourceLocation EndLoc,
1702                                      SourceLocation LParenLoc, Expr *Num) {
1703     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1704   }
1705 
1706   /// Build a new OpenMP 'private' clause.
1707   ///
1708   /// By default, performs semantic analysis to build the new OpenMP clause.
1709   /// Subclasses may override this routine to provide different behavior.
1710   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1711                                      SourceLocation StartLoc,
1712                                      SourceLocation LParenLoc,
1713                                      SourceLocation EndLoc) {
1714     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1715                                               EndLoc);
1716   }
1717 
1718   /// Build a new OpenMP 'firstprivate' clause.
1719   ///
1720   /// By default, performs semantic analysis to build the new OpenMP clause.
1721   /// Subclasses may override this routine to provide different behavior.
1722   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1723                                           SourceLocation StartLoc,
1724                                           SourceLocation LParenLoc,
1725                                           SourceLocation EndLoc) {
1726     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1727                                                    EndLoc);
1728   }
1729 
1730   /// Build a new OpenMP 'lastprivate' clause.
1731   ///
1732   /// By default, performs semantic analysis to build the new OpenMP clause.
1733   /// Subclasses may override this routine to provide different behavior.
1734   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1735                                          OpenMPLastprivateModifier LPKind,
1736                                          SourceLocation LPKindLoc,
1737                                          SourceLocation ColonLoc,
1738                                          SourceLocation StartLoc,
1739                                          SourceLocation LParenLoc,
1740                                          SourceLocation EndLoc) {
1741     return getSema().ActOnOpenMPLastprivateClause(
1742         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1743   }
1744 
1745   /// Build a new OpenMP 'shared' clause.
1746   ///
1747   /// By default, performs semantic analysis to build the new OpenMP clause.
1748   /// Subclasses may override this routine to provide different behavior.
1749   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1750                                     SourceLocation StartLoc,
1751                                     SourceLocation LParenLoc,
1752                                     SourceLocation EndLoc) {
1753     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1754                                              EndLoc);
1755   }
1756 
1757   /// Build a new OpenMP 'reduction' clause.
1758   ///
1759   /// By default, performs semantic analysis to build the new statement.
1760   /// Subclasses may override this routine to provide different behavior.
1761   OMPClause *RebuildOMPReductionClause(
1762       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1763       SourceLocation StartLoc, SourceLocation LParenLoc,
1764       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1765       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1766       const DeclarationNameInfo &ReductionId,
1767       ArrayRef<Expr *> UnresolvedReductions) {
1768     return getSema().ActOnOpenMPReductionClause(
1769         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1770         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1771   }
1772 
1773   /// Build a new OpenMP 'task_reduction' clause.
1774   ///
1775   /// By default, performs semantic analysis to build the new statement.
1776   /// Subclasses may override this routine to provide different behavior.
1777   OMPClause *RebuildOMPTaskReductionClause(
1778       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1779       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1780       CXXScopeSpec &ReductionIdScopeSpec,
1781       const DeclarationNameInfo &ReductionId,
1782       ArrayRef<Expr *> UnresolvedReductions) {
1783     return getSema().ActOnOpenMPTaskReductionClause(
1784         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1785         ReductionId, UnresolvedReductions);
1786   }
1787 
1788   /// Build a new OpenMP 'in_reduction' clause.
1789   ///
1790   /// By default, performs semantic analysis to build the new statement.
1791   /// Subclasses may override this routine to provide different behavior.
1792   OMPClause *
1793   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1794                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1795                               SourceLocation EndLoc,
1796                               CXXScopeSpec &ReductionIdScopeSpec,
1797                               const DeclarationNameInfo &ReductionId,
1798                               ArrayRef<Expr *> UnresolvedReductions) {
1799     return getSema().ActOnOpenMPInReductionClause(
1800         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1801         ReductionId, UnresolvedReductions);
1802   }
1803 
1804   /// Build a new OpenMP 'linear' clause.
1805   ///
1806   /// By default, performs semantic analysis to build the new OpenMP clause.
1807   /// Subclasses may override this routine to provide different behavior.
1808   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1809                                     SourceLocation StartLoc,
1810                                     SourceLocation LParenLoc,
1811                                     OpenMPLinearClauseKind Modifier,
1812                                     SourceLocation ModifierLoc,
1813                                     SourceLocation ColonLoc,
1814                                     SourceLocation EndLoc) {
1815     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1816                                              Modifier, ModifierLoc, ColonLoc,
1817                                              EndLoc);
1818   }
1819 
1820   /// Build a new OpenMP 'aligned' clause.
1821   ///
1822   /// By default, performs semantic analysis to build the new OpenMP clause.
1823   /// Subclasses may override this routine to provide different behavior.
1824   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1825                                      SourceLocation StartLoc,
1826                                      SourceLocation LParenLoc,
1827                                      SourceLocation ColonLoc,
1828                                      SourceLocation EndLoc) {
1829     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1830                                               LParenLoc, ColonLoc, EndLoc);
1831   }
1832 
1833   /// Build a new OpenMP 'copyin' clause.
1834   ///
1835   /// By default, performs semantic analysis to build the new OpenMP clause.
1836   /// Subclasses may override this routine to provide different behavior.
1837   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1838                                     SourceLocation StartLoc,
1839                                     SourceLocation LParenLoc,
1840                                     SourceLocation EndLoc) {
1841     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1842                                              EndLoc);
1843   }
1844 
1845   /// Build a new OpenMP 'copyprivate' clause.
1846   ///
1847   /// By default, performs semantic analysis to build the new OpenMP clause.
1848   /// Subclasses may override this routine to provide different behavior.
1849   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1850                                          SourceLocation StartLoc,
1851                                          SourceLocation LParenLoc,
1852                                          SourceLocation EndLoc) {
1853     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1854                                                   EndLoc);
1855   }
1856 
1857   /// Build a new OpenMP 'flush' pseudo clause.
1858   ///
1859   /// By default, performs semantic analysis to build the new OpenMP clause.
1860   /// Subclasses may override this routine to provide different behavior.
1861   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1862                                    SourceLocation StartLoc,
1863                                    SourceLocation LParenLoc,
1864                                    SourceLocation EndLoc) {
1865     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1866                                             EndLoc);
1867   }
1868 
1869   /// Build a new OpenMP 'depobj' pseudo clause.
1870   ///
1871   /// By default, performs semantic analysis to build the new OpenMP clause.
1872   /// Subclasses may override this routine to provide different behavior.
1873   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1874                                     SourceLocation LParenLoc,
1875                                     SourceLocation EndLoc) {
1876     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1877                                              EndLoc);
1878   }
1879 
1880   /// Build a new OpenMP 'depend' pseudo clause.
1881   ///
1882   /// By default, performs semantic analysis to build the new OpenMP clause.
1883   /// Subclasses may override this routine to provide different behavior.
1884   OMPClause *
1885   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1886                          SourceLocation DepLoc, SourceLocation ColonLoc,
1887                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1888                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1889     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1890                                              ColonLoc, VarList, StartLoc,
1891                                              LParenLoc, EndLoc);
1892   }
1893 
1894   /// Build a new OpenMP 'device' clause.
1895   ///
1896   /// By default, performs semantic analysis to build the new statement.
1897   /// Subclasses may override this routine to provide different behavior.
1898   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1899                                     Expr *Device, SourceLocation StartLoc,
1900                                     SourceLocation LParenLoc,
1901                                     SourceLocation ModifierLoc,
1902                                     SourceLocation EndLoc) {
1903     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1904                                              LParenLoc, ModifierLoc, EndLoc);
1905   }
1906 
1907   /// Build a new OpenMP 'map' clause.
1908   ///
1909   /// By default, performs semantic analysis to build the new OpenMP clause.
1910   /// Subclasses may override this routine to provide different behavior.
1911   OMPClause *RebuildOMPMapClause(
1912       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1913       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1914       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1915       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1916       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1917       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1918     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1919                                           MapperIdScopeSpec, MapperId, MapType,
1920                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1921                                           VarList, Locs, UnresolvedMappers);
1922   }
1923 
1924   /// Build a new OpenMP 'allocate' clause.
1925   ///
1926   /// By default, performs semantic analysis to build the new OpenMP clause.
1927   /// Subclasses may override this routine to provide different behavior.
1928   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1929                                       SourceLocation StartLoc,
1930                                       SourceLocation LParenLoc,
1931                                       SourceLocation ColonLoc,
1932                                       SourceLocation EndLoc) {
1933     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1934                                                LParenLoc, ColonLoc, EndLoc);
1935   }
1936 
1937   /// Build a new OpenMP 'num_teams' clause.
1938   ///
1939   /// By default, performs semantic analysis to build the new statement.
1940   /// Subclasses may override this routine to provide different behavior.
1941   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1942                                       SourceLocation LParenLoc,
1943                                       SourceLocation EndLoc) {
1944     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1945                                                EndLoc);
1946   }
1947 
1948   /// Build a new OpenMP 'thread_limit' clause.
1949   ///
1950   /// By default, performs semantic analysis to build the new statement.
1951   /// Subclasses may override this routine to provide different behavior.
1952   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1953                                          SourceLocation StartLoc,
1954                                          SourceLocation LParenLoc,
1955                                          SourceLocation EndLoc) {
1956     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1957                                                   LParenLoc, EndLoc);
1958   }
1959 
1960   /// Build a new OpenMP 'priority' clause.
1961   ///
1962   /// By default, performs semantic analysis to build the new statement.
1963   /// Subclasses may override this routine to provide different behavior.
1964   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1965                                       SourceLocation LParenLoc,
1966                                       SourceLocation EndLoc) {
1967     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1968                                                EndLoc);
1969   }
1970 
1971   /// Build a new OpenMP 'grainsize' clause.
1972   ///
1973   /// By default, performs semantic analysis to build the new statement.
1974   /// Subclasses may override this routine to provide different behavior.
1975   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1976                                        SourceLocation LParenLoc,
1977                                        SourceLocation EndLoc) {
1978     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1979                                                 EndLoc);
1980   }
1981 
1982   /// Build a new OpenMP 'num_tasks' clause.
1983   ///
1984   /// By default, performs semantic analysis to build the new statement.
1985   /// Subclasses may override this routine to provide different behavior.
1986   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1987                                       SourceLocation LParenLoc,
1988                                       SourceLocation EndLoc) {
1989     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1990                                                EndLoc);
1991   }
1992 
1993   /// Build a new OpenMP 'hint' clause.
1994   ///
1995   /// By default, performs semantic analysis to build the new statement.
1996   /// Subclasses may override this routine to provide different behavior.
1997   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1998                                   SourceLocation LParenLoc,
1999                                   SourceLocation EndLoc) {
2000     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2001   }
2002 
2003   /// Build a new OpenMP 'detach' clause.
2004   ///
2005   /// By default, performs semantic analysis to build the new statement.
2006   /// Subclasses may override this routine to provide different behavior.
2007   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2008                                     SourceLocation LParenLoc,
2009                                     SourceLocation EndLoc) {
2010     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2011   }
2012 
2013   /// Build a new OpenMP 'dist_schedule' clause.
2014   ///
2015   /// By default, performs semantic analysis to build the new OpenMP clause.
2016   /// Subclasses may override this routine to provide different behavior.
2017   OMPClause *
2018   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2019                                Expr *ChunkSize, SourceLocation StartLoc,
2020                                SourceLocation LParenLoc, SourceLocation KindLoc,
2021                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2022     return getSema().ActOnOpenMPDistScheduleClause(
2023         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2024   }
2025 
2026   /// Build a new OpenMP 'to' clause.
2027   ///
2028   /// By default, performs semantic analysis to build the new statement.
2029   /// Subclasses may override this routine to provide different behavior.
2030   OMPClause *
2031   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2032                      ArrayRef<SourceLocation> MotionModifiersLoc,
2033                      CXXScopeSpec &MapperIdScopeSpec,
2034                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2035                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2036                      ArrayRef<Expr *> UnresolvedMappers) {
2037     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2038                                          MapperIdScopeSpec, MapperId, ColonLoc,
2039                                          VarList, Locs, UnresolvedMappers);
2040   }
2041 
2042   /// Build a new OpenMP 'from' clause.
2043   ///
2044   /// By default, performs semantic analysis to build the new statement.
2045   /// Subclasses may override this routine to provide different behavior.
2046   OMPClause *
2047   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2048                        ArrayRef<SourceLocation> MotionModifiersLoc,
2049                        CXXScopeSpec &MapperIdScopeSpec,
2050                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2051                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2052                        ArrayRef<Expr *> UnresolvedMappers) {
2053     return getSema().ActOnOpenMPFromClause(
2054         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2055         ColonLoc, VarList, Locs, UnresolvedMappers);
2056   }
2057 
2058   /// Build a new OpenMP 'use_device_ptr' clause.
2059   ///
2060   /// By default, performs semantic analysis to build the new OpenMP clause.
2061   /// Subclasses may override this routine to provide different behavior.
2062   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2063                                           const OMPVarListLocTy &Locs) {
2064     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2065   }
2066 
2067   /// Build a new OpenMP 'use_device_addr' clause.
2068   ///
2069   /// By default, performs semantic analysis to build the new OpenMP clause.
2070   /// Subclasses may override this routine to provide different behavior.
2071   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2072                                            const OMPVarListLocTy &Locs) {
2073     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2074   }
2075 
2076   /// Build a new OpenMP 'is_device_ptr' clause.
2077   ///
2078   /// By default, performs semantic analysis to build the new OpenMP clause.
2079   /// Subclasses may override this routine to provide different behavior.
2080   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2081                                          const OMPVarListLocTy &Locs) {
2082     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2083   }
2084 
2085   /// Build a new OpenMP 'defaultmap' clause.
2086   ///
2087   /// By default, performs semantic analysis to build the new OpenMP clause.
2088   /// Subclasses may override this routine to provide different behavior.
2089   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2090                                         OpenMPDefaultmapClauseKind Kind,
2091                                         SourceLocation StartLoc,
2092                                         SourceLocation LParenLoc,
2093                                         SourceLocation MLoc,
2094                                         SourceLocation KindLoc,
2095                                         SourceLocation EndLoc) {
2096     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2097                                                  MLoc, KindLoc, EndLoc);
2098   }
2099 
2100   /// Build a new OpenMP 'nontemporal' clause.
2101   ///
2102   /// By default, performs semantic analysis to build the new OpenMP clause.
2103   /// Subclasses may override this routine to provide different behavior.
2104   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2105                                          SourceLocation StartLoc,
2106                                          SourceLocation LParenLoc,
2107                                          SourceLocation EndLoc) {
2108     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2109                                                   EndLoc);
2110   }
2111 
2112   /// Build a new OpenMP 'inclusive' clause.
2113   ///
2114   /// By default, performs semantic analysis to build the new OpenMP clause.
2115   /// Subclasses may override this routine to provide different behavior.
2116   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2117                                        SourceLocation StartLoc,
2118                                        SourceLocation LParenLoc,
2119                                        SourceLocation EndLoc) {
2120     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2121                                                 EndLoc);
2122   }
2123 
2124   /// Build a new OpenMP 'exclusive' clause.
2125   ///
2126   /// By default, performs semantic analysis to build the new OpenMP clause.
2127   /// Subclasses may override this routine to provide different behavior.
2128   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2129                                        SourceLocation StartLoc,
2130                                        SourceLocation LParenLoc,
2131                                        SourceLocation EndLoc) {
2132     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2133                                                 EndLoc);
2134   }
2135 
2136   /// Build a new OpenMP 'uses_allocators' clause.
2137   ///
2138   /// By default, performs semantic analysis to build the new OpenMP clause.
2139   /// Subclasses may override this routine to provide different behavior.
2140   OMPClause *RebuildOMPUsesAllocatorsClause(
2141       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2142       SourceLocation LParenLoc, SourceLocation EndLoc) {
2143     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2144                                                     Data);
2145   }
2146 
2147   /// Build a new OpenMP 'affinity' clause.
2148   ///
2149   /// By default, performs semantic analysis to build the new OpenMP clause.
2150   /// Subclasses may override this routine to provide different behavior.
2151   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2152                                       SourceLocation LParenLoc,
2153                                       SourceLocation ColonLoc,
2154                                       SourceLocation EndLoc, Expr *Modifier,
2155                                       ArrayRef<Expr *> Locators) {
2156     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2157                                                EndLoc, Modifier, Locators);
2158   }
2159 
2160   /// Build a new OpenMP 'order' clause.
2161   ///
2162   /// By default, performs semantic analysis to build the new OpenMP clause.
2163   /// Subclasses may override this routine to provide different behavior.
2164   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2165                                    SourceLocation KindKwLoc,
2166                                    SourceLocation StartLoc,
2167                                    SourceLocation LParenLoc,
2168                                    SourceLocation EndLoc) {
2169     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2170                                             LParenLoc, EndLoc);
2171   }
2172 
2173   /// Build a new OpenMP 'init' clause.
2174   ///
2175   /// By default, performs semantic analysis to build the new OpenMP clause.
2176   /// Subclasses may override this routine to provide different behavior.
2177   OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs,
2178                                   bool IsTarget, bool IsTargetSync,
2179                                   SourceLocation StartLoc,
2180                                   SourceLocation LParenLoc,
2181                                   SourceLocation VarLoc,
2182                                   SourceLocation EndLoc) {
2183     return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget,
2184                                            IsTargetSync, StartLoc, LParenLoc,
2185                                            VarLoc, EndLoc);
2186   }
2187 
2188   /// Build a new OpenMP 'use' clause.
2189   ///
2190   /// By default, performs semantic analysis to build the new OpenMP clause.
2191   /// Subclasses may override this routine to provide different behavior.
2192   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2193                                  SourceLocation LParenLoc,
2194                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2195     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2196                                           VarLoc, EndLoc);
2197   }
2198 
2199   /// Build a new OpenMP 'destroy' clause.
2200   ///
2201   /// By default, performs semantic analysis to build the new OpenMP clause.
2202   /// Subclasses may override this routine to provide different behavior.
2203   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2204                                      SourceLocation LParenLoc,
2205                                      SourceLocation VarLoc,
2206                                      SourceLocation EndLoc) {
2207     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2208                                               VarLoc, EndLoc);
2209   }
2210 
2211   /// Build a new OpenMP 'novariants' clause.
2212   ///
2213   /// By default, performs semantic analysis to build the new OpenMP clause.
2214   /// Subclasses may override this routine to provide different behavior.
2215   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2216                                         SourceLocation StartLoc,
2217                                         SourceLocation LParenLoc,
2218                                         SourceLocation EndLoc) {
2219     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2220                                                  EndLoc);
2221   }
2222 
2223   /// Rebuild the operand to an Objective-C \@synchronized statement.
2224   ///
2225   /// By default, performs semantic analysis to build the new statement.
2226   /// Subclasses may override this routine to provide different behavior.
2227   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2228                                               Expr *object) {
2229     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2230   }
2231 
2232   /// Build a new Objective-C \@synchronized statement.
2233   ///
2234   /// By default, performs semantic analysis to build the new statement.
2235   /// Subclasses may override this routine to provide different behavior.
2236   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2237                                            Expr *Object, Stmt *Body) {
2238     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2239   }
2240 
2241   /// Build a new Objective-C \@autoreleasepool statement.
2242   ///
2243   /// By default, performs semantic analysis to build the new statement.
2244   /// Subclasses may override this routine to provide different behavior.
2245   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2246                                             Stmt *Body) {
2247     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2248   }
2249 
2250   /// Build a new Objective-C fast enumeration statement.
2251   ///
2252   /// By default, performs semantic analysis to build the new statement.
2253   /// Subclasses may override this routine to provide different behavior.
2254   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2255                                           Stmt *Element,
2256                                           Expr *Collection,
2257                                           SourceLocation RParenLoc,
2258                                           Stmt *Body) {
2259     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2260                                                 Element,
2261                                                 Collection,
2262                                                 RParenLoc);
2263     if (ForEachStmt.isInvalid())
2264       return StmtError();
2265 
2266     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2267   }
2268 
2269   /// Build a new C++ exception declaration.
2270   ///
2271   /// By default, performs semantic analysis to build the new decaration.
2272   /// Subclasses may override this routine to provide different behavior.
2273   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2274                                 TypeSourceInfo *Declarator,
2275                                 SourceLocation StartLoc,
2276                                 SourceLocation IdLoc,
2277                                 IdentifierInfo *Id) {
2278     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2279                                                        StartLoc, IdLoc, Id);
2280     if (Var)
2281       getSema().CurContext->addDecl(Var);
2282     return Var;
2283   }
2284 
2285   /// Build a new C++ catch statement.
2286   ///
2287   /// By default, performs semantic analysis to build the new statement.
2288   /// Subclasses may override this routine to provide different behavior.
2289   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2290                                  VarDecl *ExceptionDecl,
2291                                  Stmt *Handler) {
2292     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2293                                                       Handler));
2294   }
2295 
2296   /// Build a new C++ try statement.
2297   ///
2298   /// By default, performs semantic analysis to build the new statement.
2299   /// Subclasses may override this routine to provide different behavior.
2300   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2301                                ArrayRef<Stmt *> Handlers) {
2302     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2303   }
2304 
2305   /// Build a new C++0x range-based for statement.
2306   ///
2307   /// By default, performs semantic analysis to build the new statement.
2308   /// Subclasses may override this routine to provide different behavior.
2309   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2310                                     SourceLocation CoawaitLoc, Stmt *Init,
2311                                     SourceLocation ColonLoc, Stmt *Range,
2312                                     Stmt *Begin, Stmt *End, Expr *Cond,
2313                                     Expr *Inc, Stmt *LoopVar,
2314                                     SourceLocation RParenLoc) {
2315     // If we've just learned that the range is actually an Objective-C
2316     // collection, treat this as an Objective-C fast enumeration loop.
2317     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2318       if (RangeStmt->isSingleDecl()) {
2319         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2320           if (RangeVar->isInvalidDecl())
2321             return StmtError();
2322 
2323           Expr *RangeExpr = RangeVar->getInit();
2324           if (!RangeExpr->isTypeDependent() &&
2325               RangeExpr->getType()->isObjCObjectPointerType()) {
2326             // FIXME: Support init-statements in Objective-C++20 ranged for
2327             // statement.
2328             if (Init) {
2329               return SemaRef.Diag(Init->getBeginLoc(),
2330                                   diag::err_objc_for_range_init_stmt)
2331                          << Init->getSourceRange();
2332             }
2333             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2334                                                         RangeExpr, RParenLoc);
2335           }
2336         }
2337       }
2338     }
2339 
2340     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2341                                           Range, Begin, End, Cond, Inc, LoopVar,
2342                                           RParenLoc, Sema::BFRK_Rebuild);
2343   }
2344 
2345   /// Build a new C++0x range-based for statement.
2346   ///
2347   /// By default, performs semantic analysis to build the new statement.
2348   /// Subclasses may override this routine to provide different behavior.
2349   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2350                                           bool IsIfExists,
2351                                           NestedNameSpecifierLoc QualifierLoc,
2352                                           DeclarationNameInfo NameInfo,
2353                                           Stmt *Nested) {
2354     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2355                                                 QualifierLoc, NameInfo, Nested);
2356   }
2357 
2358   /// Attach body to a C++0x range-based for statement.
2359   ///
2360   /// By default, performs semantic analysis to finish the new statement.
2361   /// Subclasses may override this routine to provide different behavior.
2362   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2363     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2364   }
2365 
2366   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2367                                Stmt *TryBlock, Stmt *Handler) {
2368     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2369   }
2370 
2371   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2372                                   Stmt *Block) {
2373     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2374   }
2375 
2376   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2377     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2378   }
2379 
2380   /// Build a new predefined 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 RebuildPredefinedExpr(SourceLocation Loc,
2385                                    PredefinedExpr::IdentKind IK) {
2386     return getSema().BuildPredefinedExpr(Loc, IK);
2387   }
2388 
2389   /// Build a new expression that references a declaration.
2390   ///
2391   /// By default, performs semantic analysis to build the new expression.
2392   /// Subclasses may override this routine to provide different behavior.
2393   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2394                                         LookupResult &R,
2395                                         bool RequiresADL) {
2396     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2397   }
2398 
2399 
2400   /// Build a new expression that references a declaration.
2401   ///
2402   /// By default, performs semantic analysis to build the new expression.
2403   /// Subclasses may override this routine to provide different behavior.
2404   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2405                                 ValueDecl *VD,
2406                                 const DeclarationNameInfo &NameInfo,
2407                                 NamedDecl *Found,
2408                                 TemplateArgumentListInfo *TemplateArgs) {
2409     CXXScopeSpec SS;
2410     SS.Adopt(QualifierLoc);
2411     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2412                                               TemplateArgs);
2413   }
2414 
2415   /// Build a new expression in parentheses.
2416   ///
2417   /// By default, performs semantic analysis to build the new expression.
2418   /// Subclasses may override this routine to provide different behavior.
2419   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2420                                     SourceLocation RParen) {
2421     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2422   }
2423 
2424   /// Build a new pseudo-destructor expression.
2425   ///
2426   /// By default, performs semantic analysis to build the new expression.
2427   /// Subclasses may override this routine to provide different behavior.
2428   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2429                                             SourceLocation OperatorLoc,
2430                                             bool isArrow,
2431                                             CXXScopeSpec &SS,
2432                                             TypeSourceInfo *ScopeType,
2433                                             SourceLocation CCLoc,
2434                                             SourceLocation TildeLoc,
2435                                         PseudoDestructorTypeStorage Destroyed);
2436 
2437   /// Build a new unary operator expression.
2438   ///
2439   /// By default, performs semantic analysis to build the new expression.
2440   /// Subclasses may override this routine to provide different behavior.
2441   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2442                                         UnaryOperatorKind Opc,
2443                                         Expr *SubExpr) {
2444     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2445   }
2446 
2447   /// Build a new builtin offsetof expression.
2448   ///
2449   /// By default, performs semantic analysis to build the new expression.
2450   /// Subclasses may override this routine to provide different behavior.
2451   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2452                                  TypeSourceInfo *Type,
2453                                  ArrayRef<Sema::OffsetOfComponent> Components,
2454                                  SourceLocation RParenLoc) {
2455     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2456                                           RParenLoc);
2457   }
2458 
2459   /// Build a new sizeof, alignof or vec_step expression with a
2460   /// type argument.
2461   ///
2462   /// By default, performs semantic analysis to build the new expression.
2463   /// Subclasses may override this routine to provide different behavior.
2464   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2465                                          SourceLocation OpLoc,
2466                                          UnaryExprOrTypeTrait ExprKind,
2467                                          SourceRange R) {
2468     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2469   }
2470 
2471   /// Build a new sizeof, alignof or vec step expression with an
2472   /// expression argument.
2473   ///
2474   /// By default, performs semantic analysis to build the new expression.
2475   /// Subclasses may override this routine to provide different behavior.
2476   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2477                                          UnaryExprOrTypeTrait ExprKind,
2478                                          SourceRange R) {
2479     ExprResult Result
2480       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2481     if (Result.isInvalid())
2482       return ExprError();
2483 
2484     return Result;
2485   }
2486 
2487   /// Build a new array subscript expression.
2488   ///
2489   /// By default, performs semantic analysis to build the new expression.
2490   /// Subclasses may override this routine to provide different behavior.
2491   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2492                                              SourceLocation LBracketLoc,
2493                                              Expr *RHS,
2494                                              SourceLocation RBracketLoc) {
2495     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2496                                              LBracketLoc, RHS,
2497                                              RBracketLoc);
2498   }
2499 
2500   /// Build a new matrix subscript expression.
2501   ///
2502   /// By default, performs semantic analysis to build the new expression.
2503   /// Subclasses may override this routine to provide different behavior.
2504   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2505                                         Expr *ColumnIdx,
2506                                         SourceLocation RBracketLoc) {
2507     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2508                                                       RBracketLoc);
2509   }
2510 
2511   /// Build a new array section expression.
2512   ///
2513   /// By default, performs semantic analysis to build the new expression.
2514   /// Subclasses may override this routine to provide different behavior.
2515   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2516                                         Expr *LowerBound,
2517                                         SourceLocation ColonLocFirst,
2518                                         SourceLocation ColonLocSecond,
2519                                         Expr *Length, Expr *Stride,
2520                                         SourceLocation RBracketLoc) {
2521     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2522                                               ColonLocFirst, ColonLocSecond,
2523                                               Length, Stride, RBracketLoc);
2524   }
2525 
2526   /// Build a new array shaping expression.
2527   ///
2528   /// By default, performs semantic analysis to build the new expression.
2529   /// Subclasses may override this routine to provide different behavior.
2530   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2531                                         SourceLocation RParenLoc,
2532                                         ArrayRef<Expr *> Dims,
2533                                         ArrayRef<SourceRange> BracketsRanges) {
2534     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2535                                               BracketsRanges);
2536   }
2537 
2538   /// Build a new iterator expression.
2539   ///
2540   /// By default, performs semantic analysis to build the new expression.
2541   /// Subclasses may override this routine to provide different behavior.
2542   ExprResult RebuildOMPIteratorExpr(
2543       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2544       ArrayRef<Sema::OMPIteratorData> Data) {
2545     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2546                                           LLoc, RLoc, Data);
2547   }
2548 
2549   /// Build a new call expression.
2550   ///
2551   /// By default, performs semantic analysis to build the new expression.
2552   /// Subclasses may override this routine to provide different behavior.
2553   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2554                                    MultiExprArg Args,
2555                                    SourceLocation RParenLoc,
2556                                    Expr *ExecConfig = nullptr) {
2557     return getSema().ActOnCallExpr(
2558         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2559   }
2560 
2561   /// Build a new member access expression.
2562   ///
2563   /// By default, performs semantic analysis to build the new expression.
2564   /// Subclasses may override this routine to provide different behavior.
2565   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2566                                bool isArrow,
2567                                NestedNameSpecifierLoc QualifierLoc,
2568                                SourceLocation TemplateKWLoc,
2569                                const DeclarationNameInfo &MemberNameInfo,
2570                                ValueDecl *Member,
2571                                NamedDecl *FoundDecl,
2572                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2573                                NamedDecl *FirstQualifierInScope) {
2574     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2575                                                                       isArrow);
2576     if (!Member->getDeclName()) {
2577       // We have a reference to an unnamed field.  This is always the
2578       // base of an anonymous struct/union member access, i.e. the
2579       // field is always of record type.
2580       assert(Member->getType()->isRecordType() &&
2581              "unnamed member not of record type?");
2582 
2583       BaseResult =
2584         getSema().PerformObjectMemberConversion(BaseResult.get(),
2585                                                 QualifierLoc.getNestedNameSpecifier(),
2586                                                 FoundDecl, Member);
2587       if (BaseResult.isInvalid())
2588         return ExprError();
2589       Base = BaseResult.get();
2590 
2591       CXXScopeSpec EmptySS;
2592       return getSema().BuildFieldReferenceExpr(
2593           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2594           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2595     }
2596 
2597     CXXScopeSpec SS;
2598     SS.Adopt(QualifierLoc);
2599 
2600     Base = BaseResult.get();
2601     QualType BaseType = Base->getType();
2602 
2603     if (isArrow && !BaseType->isPointerType())
2604       return ExprError();
2605 
2606     // FIXME: this involves duplicating earlier analysis in a lot of
2607     // cases; we should avoid this when possible.
2608     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2609     R.addDecl(FoundDecl);
2610     R.resolveKind();
2611 
2612     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2613                                               SS, TemplateKWLoc,
2614                                               FirstQualifierInScope,
2615                                               R, ExplicitTemplateArgs,
2616                                               /*S*/nullptr);
2617   }
2618 
2619   /// Build a new binary operator expression.
2620   ///
2621   /// By default, performs semantic analysis to build the new expression.
2622   /// Subclasses may override this routine to provide different behavior.
2623   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2624                                          BinaryOperatorKind Opc,
2625                                          Expr *LHS, Expr *RHS) {
2626     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2627   }
2628 
2629   /// Build a new rewritten operator expression.
2630   ///
2631   /// By default, performs semantic analysis to build the new expression.
2632   /// Subclasses may override this routine to provide different behavior.
2633   ExprResult RebuildCXXRewrittenBinaryOperator(
2634       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2635       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2636     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2637                                            RHS, /*RequiresADL*/false);
2638   }
2639 
2640   /// Build a new conditional operator 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 RebuildConditionalOperator(Expr *Cond,
2645                                         SourceLocation QuestionLoc,
2646                                         Expr *LHS,
2647                                         SourceLocation ColonLoc,
2648                                         Expr *RHS) {
2649     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2650                                         LHS, RHS);
2651   }
2652 
2653   /// Build a new C-style cast expression.
2654   ///
2655   /// By default, performs semantic analysis to build the new expression.
2656   /// Subclasses may override this routine to provide different behavior.
2657   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2658                                          TypeSourceInfo *TInfo,
2659                                          SourceLocation RParenLoc,
2660                                          Expr *SubExpr) {
2661     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2662                                          SubExpr);
2663   }
2664 
2665   /// Build a new compound literal expression.
2666   ///
2667   /// By default, performs semantic analysis to build the new expression.
2668   /// Subclasses may override this routine to provide different behavior.
2669   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2670                                               TypeSourceInfo *TInfo,
2671                                               SourceLocation RParenLoc,
2672                                               Expr *Init) {
2673     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2674                                               Init);
2675   }
2676 
2677   /// Build a new extended vector element access expression.
2678   ///
2679   /// By default, performs semantic analysis to build the new expression.
2680   /// Subclasses may override this routine to provide different behavior.
2681   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2682                                                SourceLocation OpLoc,
2683                                                SourceLocation AccessorLoc,
2684                                                IdentifierInfo &Accessor) {
2685 
2686     CXXScopeSpec SS;
2687     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2688     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2689                                               OpLoc, /*IsArrow*/ false,
2690                                               SS, SourceLocation(),
2691                                               /*FirstQualifierInScope*/ nullptr,
2692                                               NameInfo,
2693                                               /* TemplateArgs */ nullptr,
2694                                               /*S*/ nullptr);
2695   }
2696 
2697   /// Build a new initializer list expression.
2698   ///
2699   /// By default, performs semantic analysis to build the new expression.
2700   /// Subclasses may override this routine to provide different behavior.
2701   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2702                              MultiExprArg Inits,
2703                              SourceLocation RBraceLoc) {
2704     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2705   }
2706 
2707   /// Build a new designated initializer expression.
2708   ///
2709   /// By default, performs semantic analysis to build the new expression.
2710   /// Subclasses may override this routine to provide different behavior.
2711   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2712                                              MultiExprArg ArrayExprs,
2713                                              SourceLocation EqualOrColonLoc,
2714                                              bool GNUSyntax,
2715                                              Expr *Init) {
2716     ExprResult Result
2717       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2718                                            Init);
2719     if (Result.isInvalid())
2720       return ExprError();
2721 
2722     return Result;
2723   }
2724 
2725   /// Build a new value-initialized expression.
2726   ///
2727   /// By default, builds the implicit value initialization without performing
2728   /// any semantic analysis. Subclasses may override this routine to provide
2729   /// different behavior.
2730   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2731     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2732   }
2733 
2734   /// Build a new \c va_arg expression.
2735   ///
2736   /// By default, performs semantic analysis to build the new expression.
2737   /// Subclasses may override this routine to provide different behavior.
2738   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2739                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2740                                     SourceLocation RParenLoc) {
2741     return getSema().BuildVAArgExpr(BuiltinLoc,
2742                                     SubExpr, TInfo,
2743                                     RParenLoc);
2744   }
2745 
2746   /// Build a new expression list in parentheses.
2747   ///
2748   /// By default, performs semantic analysis to build the new expression.
2749   /// Subclasses may override this routine to provide different behavior.
2750   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2751                                   MultiExprArg SubExprs,
2752                                   SourceLocation RParenLoc) {
2753     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2754   }
2755 
2756   /// Build a new address-of-label expression.
2757   ///
2758   /// By default, performs semantic analysis, using the name of the label
2759   /// rather than attempting to map the label statement itself.
2760   /// Subclasses may override this routine to provide different behavior.
2761   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2762                                   SourceLocation LabelLoc, LabelDecl *Label) {
2763     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2764   }
2765 
2766   /// Build a new GNU statement expression.
2767   ///
2768   /// By default, performs semantic analysis to build the new expression.
2769   /// Subclasses may override this routine to provide different behavior.
2770   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2771                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2772     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2773                                    TemplateDepth);
2774   }
2775 
2776   /// Build a new __builtin_choose_expr expression.
2777   ///
2778   /// By default, performs semantic analysis to build the new expression.
2779   /// Subclasses may override this routine to provide different behavior.
2780   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2781                                      Expr *Cond, Expr *LHS, Expr *RHS,
2782                                      SourceLocation RParenLoc) {
2783     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2784                                    Cond, LHS, RHS,
2785                                    RParenLoc);
2786   }
2787 
2788   /// Build a new generic selection expression.
2789   ///
2790   /// By default, performs semantic analysis to build the new expression.
2791   /// Subclasses may override this routine to provide different behavior.
2792   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2793                                          SourceLocation DefaultLoc,
2794                                          SourceLocation RParenLoc,
2795                                          Expr *ControllingExpr,
2796                                          ArrayRef<TypeSourceInfo *> Types,
2797                                          ArrayRef<Expr *> Exprs) {
2798     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2799                                                 ControllingExpr, Types, Exprs);
2800   }
2801 
2802   /// Build a new overloaded operator call expression.
2803   ///
2804   /// By default, performs semantic analysis to build the new expression.
2805   /// The semantic analysis provides the behavior of template instantiation,
2806   /// copying with transformations that turn what looks like an overloaded
2807   /// operator call into a use of a builtin operator, performing
2808   /// argument-dependent lookup, etc. Subclasses may override this routine to
2809   /// provide different behavior.
2810   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2811                                               SourceLocation OpLoc,
2812                                               Expr *Callee,
2813                                               Expr *First,
2814                                               Expr *Second);
2815 
2816   /// Build a new C++ "named" cast expression, such as static_cast or
2817   /// reinterpret_cast.
2818   ///
2819   /// By default, this routine dispatches to one of the more-specific routines
2820   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2821   /// Subclasses may override this routine to provide different behavior.
2822   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2823                                            Stmt::StmtClass Class,
2824                                            SourceLocation LAngleLoc,
2825                                            TypeSourceInfo *TInfo,
2826                                            SourceLocation RAngleLoc,
2827                                            SourceLocation LParenLoc,
2828                                            Expr *SubExpr,
2829                                            SourceLocation RParenLoc) {
2830     switch (Class) {
2831     case Stmt::CXXStaticCastExprClass:
2832       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2833                                                    RAngleLoc, LParenLoc,
2834                                                    SubExpr, RParenLoc);
2835 
2836     case Stmt::CXXDynamicCastExprClass:
2837       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2838                                                     RAngleLoc, LParenLoc,
2839                                                     SubExpr, RParenLoc);
2840 
2841     case Stmt::CXXReinterpretCastExprClass:
2842       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2843                                                         RAngleLoc, LParenLoc,
2844                                                         SubExpr,
2845                                                         RParenLoc);
2846 
2847     case Stmt::CXXConstCastExprClass:
2848       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2849                                                    RAngleLoc, LParenLoc,
2850                                                    SubExpr, RParenLoc);
2851 
2852     case Stmt::CXXAddrspaceCastExprClass:
2853       return getDerived().RebuildCXXAddrspaceCastExpr(
2854           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2855 
2856     default:
2857       llvm_unreachable("Invalid C++ named cast");
2858     }
2859   }
2860 
2861   /// Build a new C++ static_cast expression.
2862   ///
2863   /// By default, performs semantic analysis to build the new expression.
2864   /// Subclasses may override this routine to provide different behavior.
2865   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2866                                             SourceLocation LAngleLoc,
2867                                             TypeSourceInfo *TInfo,
2868                                             SourceLocation RAngleLoc,
2869                                             SourceLocation LParenLoc,
2870                                             Expr *SubExpr,
2871                                             SourceLocation RParenLoc) {
2872     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2873                                        TInfo, SubExpr,
2874                                        SourceRange(LAngleLoc, RAngleLoc),
2875                                        SourceRange(LParenLoc, RParenLoc));
2876   }
2877 
2878   /// Build a new C++ dynamic_cast expression.
2879   ///
2880   /// By default, performs semantic analysis to build the new expression.
2881   /// Subclasses may override this routine to provide different behavior.
2882   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2883                                              SourceLocation LAngleLoc,
2884                                              TypeSourceInfo *TInfo,
2885                                              SourceLocation RAngleLoc,
2886                                              SourceLocation LParenLoc,
2887                                              Expr *SubExpr,
2888                                              SourceLocation RParenLoc) {
2889     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2890                                        TInfo, SubExpr,
2891                                        SourceRange(LAngleLoc, RAngleLoc),
2892                                        SourceRange(LParenLoc, RParenLoc));
2893   }
2894 
2895   /// Build a new C++ reinterpret_cast expression.
2896   ///
2897   /// By default, performs semantic analysis to build the new expression.
2898   /// Subclasses may override this routine to provide different behavior.
2899   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2900                                                  SourceLocation LAngleLoc,
2901                                                  TypeSourceInfo *TInfo,
2902                                                  SourceLocation RAngleLoc,
2903                                                  SourceLocation LParenLoc,
2904                                                  Expr *SubExpr,
2905                                                  SourceLocation RParenLoc) {
2906     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2907                                        TInfo, SubExpr,
2908                                        SourceRange(LAngleLoc, RAngleLoc),
2909                                        SourceRange(LParenLoc, RParenLoc));
2910   }
2911 
2912   /// Build a new C++ const_cast expression.
2913   ///
2914   /// By default, performs semantic analysis to build the new expression.
2915   /// Subclasses may override this routine to provide different behavior.
2916   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2917                                            SourceLocation LAngleLoc,
2918                                            TypeSourceInfo *TInfo,
2919                                            SourceLocation RAngleLoc,
2920                                            SourceLocation LParenLoc,
2921                                            Expr *SubExpr,
2922                                            SourceLocation RParenLoc) {
2923     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2924                                        TInfo, SubExpr,
2925                                        SourceRange(LAngleLoc, RAngleLoc),
2926                                        SourceRange(LParenLoc, RParenLoc));
2927   }
2928 
2929   ExprResult
2930   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2931                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2932                               SourceLocation LParenLoc, Expr *SubExpr,
2933                               SourceLocation RParenLoc) {
2934     return getSema().BuildCXXNamedCast(
2935         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2936         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2937   }
2938 
2939   /// Build a new C++ functional-style cast expression.
2940   ///
2941   /// By default, performs semantic analysis to build the new expression.
2942   /// Subclasses may override this routine to provide different behavior.
2943   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2944                                           SourceLocation LParenLoc,
2945                                           Expr *Sub,
2946                                           SourceLocation RParenLoc,
2947                                           bool ListInitialization) {
2948     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2949                                                MultiExprArg(&Sub, 1), RParenLoc,
2950                                                ListInitialization);
2951   }
2952 
2953   /// Build a new C++ __builtin_bit_cast expression.
2954   ///
2955   /// By default, performs semantic analysis to build the new expression.
2956   /// Subclasses may override this routine to provide different behavior.
2957   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2958                                        TypeSourceInfo *TSI, Expr *Sub,
2959                                        SourceLocation RParenLoc) {
2960     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2961   }
2962 
2963   /// Build a new C++ typeid(type) expression.
2964   ///
2965   /// By default, performs semantic analysis to build the new expression.
2966   /// Subclasses may override this routine to provide different behavior.
2967   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2968                                         SourceLocation TypeidLoc,
2969                                         TypeSourceInfo *Operand,
2970                                         SourceLocation RParenLoc) {
2971     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2972                                     RParenLoc);
2973   }
2974 
2975 
2976   /// Build a new C++ typeid(expr) expression.
2977   ///
2978   /// By default, performs semantic analysis to build the new expression.
2979   /// Subclasses may override this routine to provide different behavior.
2980   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2981                                         SourceLocation TypeidLoc,
2982                                         Expr *Operand,
2983                                         SourceLocation RParenLoc) {
2984     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2985                                     RParenLoc);
2986   }
2987 
2988   /// Build a new C++ __uuidof(type) expression.
2989   ///
2990   /// By default, performs semantic analysis to build the new expression.
2991   /// Subclasses may override this routine to provide different behavior.
2992   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2993                                   TypeSourceInfo *Operand,
2994                                   SourceLocation RParenLoc) {
2995     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2996   }
2997 
2998   /// Build a new C++ __uuidof(expr) expression.
2999   ///
3000   /// By default, performs semantic analysis to build the new expression.
3001   /// Subclasses may override this routine to provide different behavior.
3002   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3003                                   Expr *Operand, SourceLocation RParenLoc) {
3004     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3005   }
3006 
3007   /// Build a new C++ "this" expression.
3008   ///
3009   /// By default, builds a new "this" expression without performing any
3010   /// semantic analysis. Subclasses may override this routine to provide
3011   /// different behavior.
3012   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3013                                 QualType ThisType,
3014                                 bool isImplicit) {
3015     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3016   }
3017 
3018   /// Build a new C++ throw expression.
3019   ///
3020   /// By default, performs semantic analysis to build the new expression.
3021   /// Subclasses may override this routine to provide different behavior.
3022   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3023                                  bool IsThrownVariableInScope) {
3024     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3025   }
3026 
3027   /// Build a new C++ default-argument expression.
3028   ///
3029   /// By default, builds a new default-argument expression, which does not
3030   /// require any semantic analysis. Subclasses may override this routine to
3031   /// provide different behavior.
3032   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3033     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3034                                      getSema().CurContext);
3035   }
3036 
3037   /// Build a new C++11 default-initialization expression.
3038   ///
3039   /// By default, builds a new default field initialization expression, which
3040   /// does not require any semantic analysis. Subclasses may override this
3041   /// routine to provide different behavior.
3042   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3043                                        FieldDecl *Field) {
3044     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3045                                       getSema().CurContext);
3046   }
3047 
3048   /// Build a new C++ zero-initialization expression.
3049   ///
3050   /// By default, performs semantic analysis to build the new expression.
3051   /// Subclasses may override this routine to provide different behavior.
3052   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3053                                            SourceLocation LParenLoc,
3054                                            SourceLocation RParenLoc) {
3055     return getSema().BuildCXXTypeConstructExpr(
3056         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3057   }
3058 
3059   /// Build a new C++ "new" expression.
3060   ///
3061   /// By default, performs semantic analysis to build the new expression.
3062   /// Subclasses may override this routine to provide different behavior.
3063   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3064                                bool UseGlobal,
3065                                SourceLocation PlacementLParen,
3066                                MultiExprArg PlacementArgs,
3067                                SourceLocation PlacementRParen,
3068                                SourceRange TypeIdParens,
3069                                QualType AllocatedType,
3070                                TypeSourceInfo *AllocatedTypeInfo,
3071                                Optional<Expr *> ArraySize,
3072                                SourceRange DirectInitRange,
3073                                Expr *Initializer) {
3074     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3075                                  PlacementLParen,
3076                                  PlacementArgs,
3077                                  PlacementRParen,
3078                                  TypeIdParens,
3079                                  AllocatedType,
3080                                  AllocatedTypeInfo,
3081                                  ArraySize,
3082                                  DirectInitRange,
3083                                  Initializer);
3084   }
3085 
3086   /// Build a new C++ "delete" expression.
3087   ///
3088   /// By default, performs semantic analysis to build the new expression.
3089   /// Subclasses may override this routine to provide different behavior.
3090   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3091                                         bool IsGlobalDelete,
3092                                         bool IsArrayForm,
3093                                         Expr *Operand) {
3094     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3095                                     Operand);
3096   }
3097 
3098   /// Build a new type trait expression.
3099   ///
3100   /// By default, performs semantic analysis to build the new expression.
3101   /// Subclasses may override this routine to provide different behavior.
3102   ExprResult RebuildTypeTrait(TypeTrait Trait,
3103                               SourceLocation StartLoc,
3104                               ArrayRef<TypeSourceInfo *> Args,
3105                               SourceLocation RParenLoc) {
3106     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3107   }
3108 
3109   /// Build a new array type trait expression.
3110   ///
3111   /// By default, performs semantic analysis to build the new expression.
3112   /// Subclasses may override this routine to provide different behavior.
3113   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3114                                    SourceLocation StartLoc,
3115                                    TypeSourceInfo *TSInfo,
3116                                    Expr *DimExpr,
3117                                    SourceLocation RParenLoc) {
3118     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3119   }
3120 
3121   /// Build a new expression trait expression.
3122   ///
3123   /// By default, performs semantic analysis to build the new expression.
3124   /// Subclasses may override this routine to provide different behavior.
3125   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3126                                    SourceLocation StartLoc,
3127                                    Expr *Queried,
3128                                    SourceLocation RParenLoc) {
3129     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3130   }
3131 
3132   /// Build a new (previously unresolved) declaration reference
3133   /// expression.
3134   ///
3135   /// By default, performs semantic analysis to build the new expression.
3136   /// Subclasses may override this routine to provide different behavior.
3137   ExprResult RebuildDependentScopeDeclRefExpr(
3138                                           NestedNameSpecifierLoc QualifierLoc,
3139                                           SourceLocation TemplateKWLoc,
3140                                        const DeclarationNameInfo &NameInfo,
3141                               const TemplateArgumentListInfo *TemplateArgs,
3142                                           bool IsAddressOfOperand,
3143                                           TypeSourceInfo **RecoveryTSI) {
3144     CXXScopeSpec SS;
3145     SS.Adopt(QualifierLoc);
3146 
3147     if (TemplateArgs || TemplateKWLoc.isValid())
3148       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3149                                                     TemplateArgs);
3150 
3151     return getSema().BuildQualifiedDeclarationNameExpr(
3152         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3153   }
3154 
3155   /// Build a new template-id expression.
3156   ///
3157   /// By default, performs semantic analysis to build the new expression.
3158   /// Subclasses may override this routine to provide different behavior.
3159   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3160                                    SourceLocation TemplateKWLoc,
3161                                    LookupResult &R,
3162                                    bool RequiresADL,
3163                               const TemplateArgumentListInfo *TemplateArgs) {
3164     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3165                                          TemplateArgs);
3166   }
3167 
3168   /// Build a new object-construction expression.
3169   ///
3170   /// By default, performs semantic analysis to build the new expression.
3171   /// Subclasses may override this routine to provide different behavior.
3172   ExprResult RebuildCXXConstructExpr(QualType T,
3173                                      SourceLocation Loc,
3174                                      CXXConstructorDecl *Constructor,
3175                                      bool IsElidable,
3176                                      MultiExprArg Args,
3177                                      bool HadMultipleCandidates,
3178                                      bool ListInitialization,
3179                                      bool StdInitListInitialization,
3180                                      bool RequiresZeroInit,
3181                              CXXConstructExpr::ConstructionKind ConstructKind,
3182                                      SourceRange ParenRange) {
3183     // Reconstruct the constructor we originally found, which might be
3184     // different if this is a call to an inherited constructor.
3185     CXXConstructorDecl *FoundCtor = Constructor;
3186     if (Constructor->isInheritingConstructor())
3187       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3188 
3189     SmallVector<Expr *, 8> ConvertedArgs;
3190     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3191                                           ConvertedArgs))
3192       return ExprError();
3193 
3194     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3195                                            IsElidable,
3196                                            ConvertedArgs,
3197                                            HadMultipleCandidates,
3198                                            ListInitialization,
3199                                            StdInitListInitialization,
3200                                            RequiresZeroInit, ConstructKind,
3201                                            ParenRange);
3202   }
3203 
3204   /// Build a new implicit construction via inherited constructor
3205   /// expression.
3206   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3207                                              CXXConstructorDecl *Constructor,
3208                                              bool ConstructsVBase,
3209                                              bool InheritedFromVBase) {
3210     return new (getSema().Context) CXXInheritedCtorInitExpr(
3211         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3212   }
3213 
3214   /// Build a new object-construction expression.
3215   ///
3216   /// By default, performs semantic analysis to build the new expression.
3217   /// Subclasses may override this routine to provide different behavior.
3218   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3219                                            SourceLocation LParenOrBraceLoc,
3220                                            MultiExprArg Args,
3221                                            SourceLocation RParenOrBraceLoc,
3222                                            bool ListInitialization) {
3223     return getSema().BuildCXXTypeConstructExpr(
3224         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3225   }
3226 
3227   /// Build a new object-construction expression.
3228   ///
3229   /// By default, performs semantic analysis to build the new expression.
3230   /// Subclasses may override this routine to provide different behavior.
3231   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3232                                                SourceLocation LParenLoc,
3233                                                MultiExprArg Args,
3234                                                SourceLocation RParenLoc,
3235                                                bool ListInitialization) {
3236     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3237                                                RParenLoc, ListInitialization);
3238   }
3239 
3240   /// Build a new member reference expression.
3241   ///
3242   /// By default, performs semantic analysis to build the new expression.
3243   /// Subclasses may override this routine to provide different behavior.
3244   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3245                                                 QualType BaseType,
3246                                                 bool IsArrow,
3247                                                 SourceLocation OperatorLoc,
3248                                           NestedNameSpecifierLoc QualifierLoc,
3249                                                 SourceLocation TemplateKWLoc,
3250                                             NamedDecl *FirstQualifierInScope,
3251                                    const DeclarationNameInfo &MemberNameInfo,
3252                               const TemplateArgumentListInfo *TemplateArgs) {
3253     CXXScopeSpec SS;
3254     SS.Adopt(QualifierLoc);
3255 
3256     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3257                                             OperatorLoc, IsArrow,
3258                                             SS, TemplateKWLoc,
3259                                             FirstQualifierInScope,
3260                                             MemberNameInfo,
3261                                             TemplateArgs, /*S*/nullptr);
3262   }
3263 
3264   /// Build a new member reference expression.
3265   ///
3266   /// By default, performs semantic analysis to build the new expression.
3267   /// Subclasses may override this routine to provide different behavior.
3268   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3269                                          SourceLocation OperatorLoc,
3270                                          bool IsArrow,
3271                                          NestedNameSpecifierLoc QualifierLoc,
3272                                          SourceLocation TemplateKWLoc,
3273                                          NamedDecl *FirstQualifierInScope,
3274                                          LookupResult &R,
3275                                 const TemplateArgumentListInfo *TemplateArgs) {
3276     CXXScopeSpec SS;
3277     SS.Adopt(QualifierLoc);
3278 
3279     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3280                                             OperatorLoc, IsArrow,
3281                                             SS, TemplateKWLoc,
3282                                             FirstQualifierInScope,
3283                                             R, TemplateArgs, /*S*/nullptr);
3284   }
3285 
3286   /// Build a new noexcept expression.
3287   ///
3288   /// By default, performs semantic analysis to build the new expression.
3289   /// Subclasses may override this routine to provide different behavior.
3290   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3291     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3292   }
3293 
3294   /// Build a new expression to compute the length of a parameter pack.
3295   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3296                                    NamedDecl *Pack,
3297                                    SourceLocation PackLoc,
3298                                    SourceLocation RParenLoc,
3299                                    Optional<unsigned> Length,
3300                                    ArrayRef<TemplateArgument> PartialArgs) {
3301     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3302                                   RParenLoc, Length, PartialArgs);
3303   }
3304 
3305   /// Build a new expression representing a call to a source location
3306   ///  builtin.
3307   ///
3308   /// By default, performs semantic analysis to build the new expression.
3309   /// Subclasses may override this routine to provide different behavior.
3310   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3311                                   SourceLocation BuiltinLoc,
3312                                   SourceLocation RPLoc,
3313                                   DeclContext *ParentContext) {
3314     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3315   }
3316 
3317   /// 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 RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3322       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3323       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3324       TemplateArgumentListInfo *TALI) {
3325     CXXScopeSpec SS;
3326     SS.Adopt(NNS);
3327     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3328                                                          ConceptNameInfo,
3329                                                          FoundDecl,
3330                                                          NamedConcept, TALI);
3331     if (Result.isInvalid())
3332       return ExprError();
3333     return Result;
3334   }
3335 
3336   /// \brief Build a new requires expression.
3337   ///
3338   /// By default, performs semantic analysis to build the new expression.
3339   /// Subclasses may override this routine to provide different behavior.
3340   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3341                                  RequiresExprBodyDecl *Body,
3342                                  ArrayRef<ParmVarDecl *> LocalParameters,
3343                                  ArrayRef<concepts::Requirement *> Requirements,
3344                                  SourceLocation ClosingBraceLoc) {
3345     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3346                                 LocalParameters, Requirements, ClosingBraceLoc);
3347   }
3348 
3349   concepts::TypeRequirement *
3350   RebuildTypeRequirement(
3351       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3352     return SemaRef.BuildTypeRequirement(SubstDiag);
3353   }
3354 
3355   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3356     return SemaRef.BuildTypeRequirement(T);
3357   }
3358 
3359   concepts::ExprRequirement *
3360   RebuildExprRequirement(
3361       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3362       SourceLocation NoexceptLoc,
3363       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3364     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3365                                         std::move(Ret));
3366   }
3367 
3368   concepts::ExprRequirement *
3369   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3370                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3371     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3372                                         std::move(Ret));
3373   }
3374 
3375   concepts::NestedRequirement *
3376   RebuildNestedRequirement(
3377       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3378     return SemaRef.BuildNestedRequirement(SubstDiag);
3379   }
3380 
3381   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3382     return SemaRef.BuildNestedRequirement(Constraint);
3383   }
3384 
3385   /// \brief Build a new Objective-C boxed expression.
3386   ///
3387   /// By default, performs semantic analysis to build the new expression.
3388   /// Subclasses may override this routine to provide different behavior.
3389   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3390     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3391   }
3392 
3393   /// Build a new Objective-C array literal.
3394   ///
3395   /// By default, performs semantic analysis to build the new expression.
3396   /// Subclasses may override this routine to provide different behavior.
3397   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3398                                      Expr **Elements, unsigned NumElements) {
3399     return getSema().BuildObjCArrayLiteral(Range,
3400                                            MultiExprArg(Elements, NumElements));
3401   }
3402 
3403   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3404                                          Expr *Base, Expr *Key,
3405                                          ObjCMethodDecl *getterMethod,
3406                                          ObjCMethodDecl *setterMethod) {
3407     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3408                                                    getterMethod, setterMethod);
3409   }
3410 
3411   /// Build a new Objective-C dictionary literal.
3412   ///
3413   /// By default, performs semantic analysis to build the new expression.
3414   /// Subclasses may override this routine to provide different behavior.
3415   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3416                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3417     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3418   }
3419 
3420   /// Build a new Objective-C \@encode expression.
3421   ///
3422   /// By default, performs semantic analysis to build the new expression.
3423   /// Subclasses may override this routine to provide different behavior.
3424   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3425                                          TypeSourceInfo *EncodeTypeInfo,
3426                                          SourceLocation RParenLoc) {
3427     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3428   }
3429 
3430   /// Build a new Objective-C class message.
3431   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3432                                           Selector Sel,
3433                                           ArrayRef<SourceLocation> SelectorLocs,
3434                                           ObjCMethodDecl *Method,
3435                                           SourceLocation LBracLoc,
3436                                           MultiExprArg Args,
3437                                           SourceLocation RBracLoc) {
3438     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3439                                      ReceiverTypeInfo->getType(),
3440                                      /*SuperLoc=*/SourceLocation(),
3441                                      Sel, Method, LBracLoc, SelectorLocs,
3442                                      RBracLoc, Args);
3443   }
3444 
3445   /// Build a new Objective-C instance message.
3446   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3447                                           Selector Sel,
3448                                           ArrayRef<SourceLocation> SelectorLocs,
3449                                           ObjCMethodDecl *Method,
3450                                           SourceLocation LBracLoc,
3451                                           MultiExprArg Args,
3452                                           SourceLocation RBracLoc) {
3453     return SemaRef.BuildInstanceMessage(Receiver,
3454                                         Receiver->getType(),
3455                                         /*SuperLoc=*/SourceLocation(),
3456                                         Sel, Method, LBracLoc, SelectorLocs,
3457                                         RBracLoc, Args);
3458   }
3459 
3460   /// Build a new Objective-C instance/class message to 'super'.
3461   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3462                                     Selector Sel,
3463                                     ArrayRef<SourceLocation> SelectorLocs,
3464                                     QualType SuperType,
3465                                     ObjCMethodDecl *Method,
3466                                     SourceLocation LBracLoc,
3467                                     MultiExprArg Args,
3468                                     SourceLocation RBracLoc) {
3469     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3470                                           SuperType,
3471                                           SuperLoc,
3472                                           Sel, Method, LBracLoc, SelectorLocs,
3473                                           RBracLoc, Args)
3474                                       : SemaRef.BuildClassMessage(nullptr,
3475                                           SuperType,
3476                                           SuperLoc,
3477                                           Sel, Method, LBracLoc, SelectorLocs,
3478                                           RBracLoc, Args);
3479 
3480 
3481   }
3482 
3483   /// Build a new Objective-C ivar reference expression.
3484   ///
3485   /// By default, performs semantic analysis to build the new expression.
3486   /// Subclasses may override this routine to provide different behavior.
3487   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3488                                           SourceLocation IvarLoc,
3489                                           bool IsArrow, bool IsFreeIvar) {
3490     CXXScopeSpec SS;
3491     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3492     ExprResult Result = getSema().BuildMemberReferenceExpr(
3493         BaseArg, BaseArg->getType(),
3494         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3495         /*FirstQualifierInScope=*/nullptr, NameInfo,
3496         /*TemplateArgs=*/nullptr,
3497         /*S=*/nullptr);
3498     if (IsFreeIvar && Result.isUsable())
3499       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3500     return Result;
3501   }
3502 
3503   /// Build a new Objective-C property reference expression.
3504   ///
3505   /// By default, performs semantic analysis to build the new expression.
3506   /// Subclasses may override this routine to provide different behavior.
3507   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3508                                         ObjCPropertyDecl *Property,
3509                                         SourceLocation PropertyLoc) {
3510     CXXScopeSpec SS;
3511     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3512     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3513                                               /*FIXME:*/PropertyLoc,
3514                                               /*IsArrow=*/false,
3515                                               SS, SourceLocation(),
3516                                               /*FirstQualifierInScope=*/nullptr,
3517                                               NameInfo,
3518                                               /*TemplateArgs=*/nullptr,
3519                                               /*S=*/nullptr);
3520   }
3521 
3522   /// Build a new Objective-C property reference expression.
3523   ///
3524   /// By default, performs semantic analysis to build the new expression.
3525   /// Subclasses may override this routine to provide different behavior.
3526   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3527                                         ObjCMethodDecl *Getter,
3528                                         ObjCMethodDecl *Setter,
3529                                         SourceLocation PropertyLoc) {
3530     // Since these expressions can only be value-dependent, we do not
3531     // need to perform semantic analysis again.
3532     return Owned(
3533       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3534                                                   VK_LValue, OK_ObjCProperty,
3535                                                   PropertyLoc, Base));
3536   }
3537 
3538   /// Build a new Objective-C "isa" expression.
3539   ///
3540   /// By default, performs semantic analysis to build the new expression.
3541   /// Subclasses may override this routine to provide different behavior.
3542   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3543                                 SourceLocation OpLoc, bool IsArrow) {
3544     CXXScopeSpec SS;
3545     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3546     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3547                                               OpLoc, IsArrow,
3548                                               SS, SourceLocation(),
3549                                               /*FirstQualifierInScope=*/nullptr,
3550                                               NameInfo,
3551                                               /*TemplateArgs=*/nullptr,
3552                                               /*S=*/nullptr);
3553   }
3554 
3555   /// Build a new shuffle vector expression.
3556   ///
3557   /// By default, performs semantic analysis to build the new expression.
3558   /// Subclasses may override this routine to provide different behavior.
3559   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3560                                       MultiExprArg SubExprs,
3561                                       SourceLocation RParenLoc) {
3562     // Find the declaration for __builtin_shufflevector
3563     const IdentifierInfo &Name
3564       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3565     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3566     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3567     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3568 
3569     // Build a reference to the __builtin_shufflevector builtin
3570     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3571     Expr *Callee = new (SemaRef.Context)
3572         DeclRefExpr(SemaRef.Context, Builtin, false,
3573                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3574     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3575     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3576                                        CK_BuiltinFnToFnPtr).get();
3577 
3578     // Build the CallExpr
3579     ExprResult TheCall = CallExpr::Create(
3580         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3581         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3582         FPOptionsOverride());
3583 
3584     // Type-check the __builtin_shufflevector expression.
3585     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3586   }
3587 
3588   /// Build a new convert vector expression.
3589   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3590                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3591                                       SourceLocation RParenLoc) {
3592     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3593                                          BuiltinLoc, RParenLoc);
3594   }
3595 
3596   /// Build a new template argument pack expansion.
3597   ///
3598   /// By default, performs semantic analysis to build a new pack expansion
3599   /// for a template argument. Subclasses may override this routine to provide
3600   /// different behavior.
3601   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3602                                            SourceLocation EllipsisLoc,
3603                                            Optional<unsigned> NumExpansions) {
3604     switch (Pattern.getArgument().getKind()) {
3605     case TemplateArgument::Expression: {
3606       ExprResult Result
3607         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3608                                        EllipsisLoc, NumExpansions);
3609       if (Result.isInvalid())
3610         return TemplateArgumentLoc();
3611 
3612       return TemplateArgumentLoc(Result.get(), Result.get());
3613     }
3614 
3615     case TemplateArgument::Template:
3616       return TemplateArgumentLoc(
3617           SemaRef.Context,
3618           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3619                            NumExpansions),
3620           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3621           EllipsisLoc);
3622 
3623     case TemplateArgument::Null:
3624     case TemplateArgument::Integral:
3625     case TemplateArgument::Declaration:
3626     case TemplateArgument::Pack:
3627     case TemplateArgument::TemplateExpansion:
3628     case TemplateArgument::NullPtr:
3629       llvm_unreachable("Pack expansion pattern has no parameter packs");
3630 
3631     case TemplateArgument::Type:
3632       if (TypeSourceInfo *Expansion
3633             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3634                                            EllipsisLoc,
3635                                            NumExpansions))
3636         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3637                                    Expansion);
3638       break;
3639     }
3640 
3641     return TemplateArgumentLoc();
3642   }
3643 
3644   /// Build a new expression pack expansion.
3645   ///
3646   /// By default, performs semantic analysis to build a new pack expansion
3647   /// for an expression. Subclasses may override this routine to provide
3648   /// different behavior.
3649   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3650                                   Optional<unsigned> NumExpansions) {
3651     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3652   }
3653 
3654   /// Build a new C++1z fold-expression.
3655   ///
3656   /// By default, performs semantic analysis in order to build a new fold
3657   /// expression.
3658   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3659                                 SourceLocation LParenLoc, Expr *LHS,
3660                                 BinaryOperatorKind Operator,
3661                                 SourceLocation EllipsisLoc, Expr *RHS,
3662                                 SourceLocation RParenLoc,
3663                                 Optional<unsigned> NumExpansions) {
3664     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3665                                       EllipsisLoc, RHS, RParenLoc,
3666                                       NumExpansions);
3667   }
3668 
3669   /// Build an empty C++1z fold-expression with the given operator.
3670   ///
3671   /// By default, produces the fallback value for the fold-expression, or
3672   /// produce an error if there is no fallback value.
3673   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3674                                      BinaryOperatorKind Operator) {
3675     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3676   }
3677 
3678   /// Build a new atomic operation expression.
3679   ///
3680   /// By default, performs semantic analysis to build the new expression.
3681   /// Subclasses may override this routine to provide different behavior.
3682   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3683                                AtomicExpr::AtomicOp Op,
3684                                SourceLocation RParenLoc) {
3685     // Use this for all of the locations, since we don't know the difference
3686     // between the call and the expr at this point.
3687     SourceRange Range{BuiltinLoc, RParenLoc};
3688     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3689                                      Sema::AtomicArgumentOrder::AST);
3690   }
3691 
3692   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3693                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3694     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3695   }
3696 
3697 private:
3698   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3699                                      QualType ObjectType,
3700                                      NamedDecl *FirstQualifierInScope,
3701                                      CXXScopeSpec &SS);
3702 
3703   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3704                                              QualType ObjectType,
3705                                              NamedDecl *FirstQualifierInScope,
3706                                              CXXScopeSpec &SS);
3707 
3708   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3709                                             NamedDecl *FirstQualifierInScope,
3710                                             CXXScopeSpec &SS);
3711 
3712   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3713                                       DependentNameTypeLoc TL,
3714                                       bool DeducibleTSTContext);
3715 };
3716 
3717 template <typename Derived>
3718 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3719   if (!S)
3720     return S;
3721 
3722   switch (S->getStmtClass()) {
3723   case Stmt::NoStmtClass: break;
3724 
3725   // Transform individual statement nodes
3726   // Pass SDK into statements that can produce a value
3727 #define STMT(Node, Parent)                                              \
3728   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3729 #define VALUESTMT(Node, Parent)                                         \
3730   case Stmt::Node##Class:                                               \
3731     return getDerived().Transform##Node(cast<Node>(S), SDK);
3732 #define ABSTRACT_STMT(Node)
3733 #define EXPR(Node, Parent)
3734 #include "clang/AST/StmtNodes.inc"
3735 
3736   // Transform expressions by calling TransformExpr.
3737 #define STMT(Node, Parent)
3738 #define ABSTRACT_STMT(Stmt)
3739 #define EXPR(Node, Parent) case Stmt::Node##Class:
3740 #include "clang/AST/StmtNodes.inc"
3741     {
3742       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3743 
3744       if (SDK == SDK_StmtExprResult)
3745         E = getSema().ActOnStmtExprResult(E);
3746       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3747     }
3748   }
3749 
3750   return S;
3751 }
3752 
3753 template<typename Derived>
3754 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3755   if (!S)
3756     return S;
3757 
3758   switch (S->getClauseKind()) {
3759   default: break;
3760   // Transform individual clause nodes
3761 #define GEN_CLANG_CLAUSE_CLASS
3762 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3763   case Enum:                                                                   \
3764     return getDerived().Transform##Class(cast<Class>(S));
3765 #include "llvm/Frontend/OpenMP/OMP.inc"
3766   }
3767 
3768   return S;
3769 }
3770 
3771 
3772 template<typename Derived>
3773 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3774   if (!E)
3775     return E;
3776 
3777   switch (E->getStmtClass()) {
3778     case Stmt::NoStmtClass: break;
3779 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3780 #define ABSTRACT_STMT(Stmt)
3781 #define EXPR(Node, Parent)                                              \
3782     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3783 #include "clang/AST/StmtNodes.inc"
3784   }
3785 
3786   return E;
3787 }
3788 
3789 template<typename Derived>
3790 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3791                                                         bool NotCopyInit) {
3792   // Initializers are instantiated like expressions, except that various outer
3793   // layers are stripped.
3794   if (!Init)
3795     return Init;
3796 
3797   if (auto *FE = dyn_cast<FullExpr>(Init))
3798     Init = FE->getSubExpr();
3799 
3800   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3801     Init = AIL->getCommonExpr();
3802 
3803   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3804     Init = MTE->getSubExpr();
3805 
3806   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3807     Init = Binder->getSubExpr();
3808 
3809   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3810     Init = ICE->getSubExprAsWritten();
3811 
3812   if (CXXStdInitializerListExpr *ILE =
3813           dyn_cast<CXXStdInitializerListExpr>(Init))
3814     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3815 
3816   // If this is copy-initialization, we only need to reconstruct
3817   // InitListExprs. Other forms of copy-initialization will be a no-op if
3818   // the initializer is already the right type.
3819   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3820   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3821     return getDerived().TransformExpr(Init);
3822 
3823   // Revert value-initialization back to empty parens.
3824   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3825     SourceRange Parens = VIE->getSourceRange();
3826     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3827                                              Parens.getEnd());
3828   }
3829 
3830   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3831   if (isa<ImplicitValueInitExpr>(Init))
3832     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3833                                              SourceLocation());
3834 
3835   // Revert initialization by constructor back to a parenthesized or braced list
3836   // of expressions. Any other form of initializer can just be reused directly.
3837   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3838     return getDerived().TransformExpr(Init);
3839 
3840   // If the initialization implicitly converted an initializer list to a
3841   // std::initializer_list object, unwrap the std::initializer_list too.
3842   if (Construct && Construct->isStdInitListInitialization())
3843     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3844 
3845   // Enter a list-init context if this was list initialization.
3846   EnterExpressionEvaluationContext Context(
3847       getSema(), EnterExpressionEvaluationContext::InitList,
3848       Construct->isListInitialization());
3849 
3850   SmallVector<Expr*, 8> NewArgs;
3851   bool ArgChanged = false;
3852   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3853                                   /*IsCall*/true, NewArgs, &ArgChanged))
3854     return ExprError();
3855 
3856   // If this was list initialization, revert to syntactic list form.
3857   if (Construct->isListInitialization())
3858     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3859                                         Construct->getEndLoc());
3860 
3861   // Build a ParenListExpr to represent anything else.
3862   SourceRange Parens = Construct->getParenOrBraceRange();
3863   if (Parens.isInvalid()) {
3864     // This was a variable declaration's initialization for which no initializer
3865     // was specified.
3866     assert(NewArgs.empty() &&
3867            "no parens or braces but have direct init with arguments?");
3868     return ExprEmpty();
3869   }
3870   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3871                                            Parens.getEnd());
3872 }
3873 
3874 template<typename Derived>
3875 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3876                                             unsigned NumInputs,
3877                                             bool IsCall,
3878                                       SmallVectorImpl<Expr *> &Outputs,
3879                                             bool *ArgChanged) {
3880   for (unsigned I = 0; I != NumInputs; ++I) {
3881     // If requested, drop call arguments that need to be dropped.
3882     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3883       if (ArgChanged)
3884         *ArgChanged = true;
3885 
3886       break;
3887     }
3888 
3889     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3890       Expr *Pattern = Expansion->getPattern();
3891 
3892       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3893       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3894       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3895 
3896       // Determine whether the set of unexpanded parameter packs can and should
3897       // be expanded.
3898       bool Expand = true;
3899       bool RetainExpansion = false;
3900       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3901       Optional<unsigned> NumExpansions = OrigNumExpansions;
3902       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3903                                                Pattern->getSourceRange(),
3904                                                Unexpanded,
3905                                                Expand, RetainExpansion,
3906                                                NumExpansions))
3907         return true;
3908 
3909       if (!Expand) {
3910         // The transform has determined that we should perform a simple
3911         // transformation on the pack expansion, producing another pack
3912         // expansion.
3913         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3914         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3915         if (OutPattern.isInvalid())
3916           return true;
3917 
3918         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3919                                                 Expansion->getEllipsisLoc(),
3920                                                            NumExpansions);
3921         if (Out.isInvalid())
3922           return true;
3923 
3924         if (ArgChanged)
3925           *ArgChanged = true;
3926         Outputs.push_back(Out.get());
3927         continue;
3928       }
3929 
3930       // Record right away that the argument was changed.  This needs
3931       // to happen even if the array expands to nothing.
3932       if (ArgChanged) *ArgChanged = true;
3933 
3934       // The transform has determined that we should perform an elementwise
3935       // expansion of the pattern. Do so.
3936       for (unsigned I = 0; I != *NumExpansions; ++I) {
3937         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3938         ExprResult Out = getDerived().TransformExpr(Pattern);
3939         if (Out.isInvalid())
3940           return true;
3941 
3942         if (Out.get()->containsUnexpandedParameterPack()) {
3943           Out = getDerived().RebuildPackExpansion(
3944               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3945           if (Out.isInvalid())
3946             return true;
3947         }
3948 
3949         Outputs.push_back(Out.get());
3950       }
3951 
3952       // If we're supposed to retain a pack expansion, do so by temporarily
3953       // forgetting the partially-substituted parameter pack.
3954       if (RetainExpansion) {
3955         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3956 
3957         ExprResult Out = getDerived().TransformExpr(Pattern);
3958         if (Out.isInvalid())
3959           return true;
3960 
3961         Out = getDerived().RebuildPackExpansion(
3962             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3963         if (Out.isInvalid())
3964           return true;
3965 
3966         Outputs.push_back(Out.get());
3967       }
3968 
3969       continue;
3970     }
3971 
3972     ExprResult Result =
3973       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3974              : getDerived().TransformExpr(Inputs[I]);
3975     if (Result.isInvalid())
3976       return true;
3977 
3978     if (Result.get() != Inputs[I] && ArgChanged)
3979       *ArgChanged = true;
3980 
3981     Outputs.push_back(Result.get());
3982   }
3983 
3984   return false;
3985 }
3986 
3987 template <typename Derived>
3988 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3989     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3990   if (Var) {
3991     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3992         getDerived().TransformDefinition(Var->getLocation(), Var));
3993 
3994     if (!ConditionVar)
3995       return Sema::ConditionError();
3996 
3997     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3998   }
3999 
4000   if (Expr) {
4001     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4002 
4003     if (CondExpr.isInvalid())
4004       return Sema::ConditionError();
4005 
4006     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
4007   }
4008 
4009   return Sema::ConditionResult();
4010 }
4011 
4012 template<typename Derived>
4013 NestedNameSpecifierLoc
4014 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4015                                                     NestedNameSpecifierLoc NNS,
4016                                                      QualType ObjectType,
4017                                              NamedDecl *FirstQualifierInScope) {
4018   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4019   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4020        Qualifier = Qualifier.getPrefix())
4021     Qualifiers.push_back(Qualifier);
4022 
4023   CXXScopeSpec SS;
4024   while (!Qualifiers.empty()) {
4025     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4026     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4027 
4028     switch (QNNS->getKind()) {
4029     case NestedNameSpecifier::Identifier: {
4030       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4031                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
4032       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4033                                               SS, FirstQualifierInScope, false))
4034         return NestedNameSpecifierLoc();
4035     }
4036       break;
4037 
4038     case NestedNameSpecifier::Namespace: {
4039       NamespaceDecl *NS
4040         = cast_or_null<NamespaceDecl>(
4041                                     getDerived().TransformDecl(
4042                                                           Q.getLocalBeginLoc(),
4043                                                        QNNS->getAsNamespace()));
4044       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4045       break;
4046     }
4047 
4048     case NestedNameSpecifier::NamespaceAlias: {
4049       NamespaceAliasDecl *Alias
4050         = cast_or_null<NamespaceAliasDecl>(
4051                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
4052                                                  QNNS->getAsNamespaceAlias()));
4053       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4054                 Q.getLocalEndLoc());
4055       break;
4056     }
4057 
4058     case NestedNameSpecifier::Global:
4059       // There is no meaningful transformation that one could perform on the
4060       // global scope.
4061       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4062       break;
4063 
4064     case NestedNameSpecifier::Super: {
4065       CXXRecordDecl *RD =
4066           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4067               SourceLocation(), QNNS->getAsRecordDecl()));
4068       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4069       break;
4070     }
4071 
4072     case NestedNameSpecifier::TypeSpecWithTemplate:
4073     case NestedNameSpecifier::TypeSpec: {
4074       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4075                                               FirstQualifierInScope, SS);
4076 
4077       if (!TL)
4078         return NestedNameSpecifierLoc();
4079 
4080       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4081           (SemaRef.getLangOpts().CPlusPlus11 &&
4082            TL.getType()->isEnumeralType())) {
4083         assert(!TL.getType().hasLocalQualifiers() &&
4084                "Can't get cv-qualifiers here");
4085         if (TL.getType()->isEnumeralType())
4086           SemaRef.Diag(TL.getBeginLoc(),
4087                        diag::warn_cxx98_compat_enum_nested_name_spec);
4088         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
4089                   Q.getLocalEndLoc());
4090         break;
4091       }
4092       // If the nested-name-specifier is an invalid type def, don't emit an
4093       // error because a previous error should have already been emitted.
4094       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4095       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4096         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4097           << TL.getType() << SS.getRange();
4098       }
4099       return NestedNameSpecifierLoc();
4100     }
4101     }
4102 
4103     // The qualifier-in-scope and object type only apply to the leftmost entity.
4104     FirstQualifierInScope = nullptr;
4105     ObjectType = QualType();
4106   }
4107 
4108   // Don't rebuild the nested-name-specifier if we don't have to.
4109   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4110       !getDerived().AlwaysRebuild())
4111     return NNS;
4112 
4113   // If we can re-use the source-location data from the original
4114   // nested-name-specifier, do so.
4115   if (SS.location_size() == NNS.getDataLength() &&
4116       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4117     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4118 
4119   // Allocate new nested-name-specifier location information.
4120   return SS.getWithLocInContext(SemaRef.Context);
4121 }
4122 
4123 template<typename Derived>
4124 DeclarationNameInfo
4125 TreeTransform<Derived>
4126 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4127   DeclarationName Name = NameInfo.getName();
4128   if (!Name)
4129     return DeclarationNameInfo();
4130 
4131   switch (Name.getNameKind()) {
4132   case DeclarationName::Identifier:
4133   case DeclarationName::ObjCZeroArgSelector:
4134   case DeclarationName::ObjCOneArgSelector:
4135   case DeclarationName::ObjCMultiArgSelector:
4136   case DeclarationName::CXXOperatorName:
4137   case DeclarationName::CXXLiteralOperatorName:
4138   case DeclarationName::CXXUsingDirective:
4139     return NameInfo;
4140 
4141   case DeclarationName::CXXDeductionGuideName: {
4142     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4143     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4144         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4145     if (!NewTemplate)
4146       return DeclarationNameInfo();
4147 
4148     DeclarationNameInfo NewNameInfo(NameInfo);
4149     NewNameInfo.setName(
4150         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4151     return NewNameInfo;
4152   }
4153 
4154   case DeclarationName::CXXConstructorName:
4155   case DeclarationName::CXXDestructorName:
4156   case DeclarationName::CXXConversionFunctionName: {
4157     TypeSourceInfo *NewTInfo;
4158     CanQualType NewCanTy;
4159     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4160       NewTInfo = getDerived().TransformType(OldTInfo);
4161       if (!NewTInfo)
4162         return DeclarationNameInfo();
4163       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4164     }
4165     else {
4166       NewTInfo = nullptr;
4167       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4168       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4169       if (NewT.isNull())
4170         return DeclarationNameInfo();
4171       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4172     }
4173 
4174     DeclarationName NewName
4175       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4176                                                            NewCanTy);
4177     DeclarationNameInfo NewNameInfo(NameInfo);
4178     NewNameInfo.setName(NewName);
4179     NewNameInfo.setNamedTypeInfo(NewTInfo);
4180     return NewNameInfo;
4181   }
4182   }
4183 
4184   llvm_unreachable("Unknown name kind.");
4185 }
4186 
4187 template<typename Derived>
4188 TemplateName
4189 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4190                                               TemplateName Name,
4191                                               SourceLocation NameLoc,
4192                                               QualType ObjectType,
4193                                               NamedDecl *FirstQualifierInScope,
4194                                               bool AllowInjectedClassName) {
4195   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4196     TemplateDecl *Template = QTN->getTemplateDecl();
4197     assert(Template && "qualified template name must refer to a template");
4198 
4199     TemplateDecl *TransTemplate
4200       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4201                                                               Template));
4202     if (!TransTemplate)
4203       return TemplateName();
4204 
4205     if (!getDerived().AlwaysRebuild() &&
4206         SS.getScopeRep() == QTN->getQualifier() &&
4207         TransTemplate == Template)
4208       return Name;
4209 
4210     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4211                                             TransTemplate);
4212   }
4213 
4214   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4215     if (SS.getScopeRep()) {
4216       // These apply to the scope specifier, not the template.
4217       ObjectType = QualType();
4218       FirstQualifierInScope = nullptr;
4219     }
4220 
4221     if (!getDerived().AlwaysRebuild() &&
4222         SS.getScopeRep() == DTN->getQualifier() &&
4223         ObjectType.isNull())
4224       return Name;
4225 
4226     // FIXME: Preserve the location of the "template" keyword.
4227     SourceLocation TemplateKWLoc = NameLoc;
4228 
4229     if (DTN->isIdentifier()) {
4230       return getDerived().RebuildTemplateName(SS,
4231                                               TemplateKWLoc,
4232                                               *DTN->getIdentifier(),
4233                                               NameLoc,
4234                                               ObjectType,
4235                                               FirstQualifierInScope,
4236                                               AllowInjectedClassName);
4237     }
4238 
4239     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4240                                             DTN->getOperator(), NameLoc,
4241                                             ObjectType, AllowInjectedClassName);
4242   }
4243 
4244   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4245     TemplateDecl *TransTemplate
4246       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4247                                                               Template));
4248     if (!TransTemplate)
4249       return TemplateName();
4250 
4251     if (!getDerived().AlwaysRebuild() &&
4252         TransTemplate == Template)
4253       return Name;
4254 
4255     return TemplateName(TransTemplate);
4256   }
4257 
4258   if (SubstTemplateTemplateParmPackStorage *SubstPack
4259       = Name.getAsSubstTemplateTemplateParmPack()) {
4260     TemplateTemplateParmDecl *TransParam
4261     = cast_or_null<TemplateTemplateParmDecl>(
4262             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4263     if (!TransParam)
4264       return TemplateName();
4265 
4266     if (!getDerived().AlwaysRebuild() &&
4267         TransParam == SubstPack->getParameterPack())
4268       return Name;
4269 
4270     return getDerived().RebuildTemplateName(TransParam,
4271                                             SubstPack->getArgumentPack());
4272   }
4273 
4274   // These should be getting filtered out before they reach the AST.
4275   llvm_unreachable("overloaded function decl survived to here");
4276 }
4277 
4278 template<typename Derived>
4279 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4280                                          const TemplateArgument &Arg,
4281                                          TemplateArgumentLoc &Output) {
4282   Output = getSema().getTrivialTemplateArgumentLoc(
4283       Arg, QualType(), getDerived().getBaseLocation());
4284 }
4285 
4286 template<typename Derived>
4287 bool TreeTransform<Derived>::TransformTemplateArgument(
4288                                          const TemplateArgumentLoc &Input,
4289                                          TemplateArgumentLoc &Output, bool Uneval) {
4290   const TemplateArgument &Arg = Input.getArgument();
4291   switch (Arg.getKind()) {
4292   case TemplateArgument::Null:
4293   case TemplateArgument::Pack:
4294     llvm_unreachable("Unexpected TemplateArgument");
4295 
4296   case TemplateArgument::Integral:
4297   case TemplateArgument::NullPtr:
4298   case TemplateArgument::Declaration: {
4299     // Transform a resolved template argument straight to a resolved template
4300     // argument. We get here when substituting into an already-substituted
4301     // template type argument during concept satisfaction checking.
4302     QualType T = Arg.getNonTypeTemplateArgumentType();
4303     QualType NewT = getDerived().TransformType(T);
4304     if (NewT.isNull())
4305       return true;
4306 
4307     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4308                        ? Arg.getAsDecl()
4309                        : nullptr;
4310     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4311                               getDerived().getBaseLocation(), D))
4312                         : nullptr;
4313     if (D && !NewD)
4314       return true;
4315 
4316     if (NewT == T && D == NewD)
4317       Output = Input;
4318     else if (Arg.getKind() == TemplateArgument::Integral)
4319       Output = TemplateArgumentLoc(
4320           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4321           TemplateArgumentLocInfo());
4322     else if (Arg.getKind() == TemplateArgument::NullPtr)
4323       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4324                                    TemplateArgumentLocInfo());
4325     else
4326       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4327                                    TemplateArgumentLocInfo());
4328 
4329     return false;
4330   }
4331 
4332   case TemplateArgument::Type: {
4333     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4334     if (!DI)
4335       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4336 
4337     DI = getDerived().TransformType(DI);
4338     if (!DI) return true;
4339 
4340     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4341     return false;
4342   }
4343 
4344   case TemplateArgument::Template: {
4345     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4346     if (QualifierLoc) {
4347       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4348       if (!QualifierLoc)
4349         return true;
4350     }
4351 
4352     CXXScopeSpec SS;
4353     SS.Adopt(QualifierLoc);
4354     TemplateName Template
4355       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4356                                            Input.getTemplateNameLoc());
4357     if (Template.isNull())
4358       return true;
4359 
4360     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4361                                  QualifierLoc, Input.getTemplateNameLoc());
4362     return false;
4363   }
4364 
4365   case TemplateArgument::TemplateExpansion:
4366     llvm_unreachable("Caller should expand pack expansions");
4367 
4368   case TemplateArgument::Expression: {
4369     // Template argument expressions are constant expressions.
4370     EnterExpressionEvaluationContext Unevaluated(
4371         getSema(),
4372         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4373                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4374         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4375         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4376 
4377     Expr *InputExpr = Input.getSourceExpression();
4378     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4379 
4380     ExprResult E = getDerived().TransformExpr(InputExpr);
4381     E = SemaRef.ActOnConstantExpression(E);
4382     if (E.isInvalid()) return true;
4383     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4384     return false;
4385   }
4386   }
4387 
4388   // Work around bogus GCC warning
4389   return true;
4390 }
4391 
4392 /// Iterator adaptor that invents template argument location information
4393 /// for each of the template arguments in its underlying iterator.
4394 template<typename Derived, typename InputIterator>
4395 class TemplateArgumentLocInventIterator {
4396   TreeTransform<Derived> &Self;
4397   InputIterator Iter;
4398 
4399 public:
4400   typedef TemplateArgumentLoc value_type;
4401   typedef TemplateArgumentLoc reference;
4402   typedef typename std::iterator_traits<InputIterator>::difference_type
4403     difference_type;
4404   typedef std::input_iterator_tag iterator_category;
4405 
4406   class pointer {
4407     TemplateArgumentLoc Arg;
4408 
4409   public:
4410     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4411 
4412     const TemplateArgumentLoc *operator->() const { return &Arg; }
4413   };
4414 
4415   TemplateArgumentLocInventIterator() { }
4416 
4417   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4418                                              InputIterator Iter)
4419     : Self(Self), Iter(Iter) { }
4420 
4421   TemplateArgumentLocInventIterator &operator++() {
4422     ++Iter;
4423     return *this;
4424   }
4425 
4426   TemplateArgumentLocInventIterator operator++(int) {
4427     TemplateArgumentLocInventIterator Old(*this);
4428     ++(*this);
4429     return Old;
4430   }
4431 
4432   reference operator*() const {
4433     TemplateArgumentLoc Result;
4434     Self.InventTemplateArgumentLoc(*Iter, Result);
4435     return Result;
4436   }
4437 
4438   pointer operator->() const { return pointer(**this); }
4439 
4440   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4441                          const TemplateArgumentLocInventIterator &Y) {
4442     return X.Iter == Y.Iter;
4443   }
4444 
4445   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4446                          const TemplateArgumentLocInventIterator &Y) {
4447     return X.Iter != Y.Iter;
4448   }
4449 };
4450 
4451 template<typename Derived>
4452 template<typename InputIterator>
4453 bool TreeTransform<Derived>::TransformTemplateArguments(
4454     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4455     bool Uneval) {
4456   for (; First != Last; ++First) {
4457     TemplateArgumentLoc Out;
4458     TemplateArgumentLoc In = *First;
4459 
4460     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4461       // Unpack argument packs, which we translate them into separate
4462       // arguments.
4463       // FIXME: We could do much better if we could guarantee that the
4464       // TemplateArgumentLocInfo for the pack expansion would be usable for
4465       // all of the template arguments in the argument pack.
4466       typedef TemplateArgumentLocInventIterator<Derived,
4467                                                 TemplateArgument::pack_iterator>
4468         PackLocIterator;
4469       if (TransformTemplateArguments(PackLocIterator(*this,
4470                                                  In.getArgument().pack_begin()),
4471                                      PackLocIterator(*this,
4472                                                    In.getArgument().pack_end()),
4473                                      Outputs, Uneval))
4474         return true;
4475 
4476       continue;
4477     }
4478 
4479     if (In.getArgument().isPackExpansion()) {
4480       // We have a pack expansion, for which we will be substituting into
4481       // the pattern.
4482       SourceLocation Ellipsis;
4483       Optional<unsigned> OrigNumExpansions;
4484       TemplateArgumentLoc Pattern
4485         = getSema().getTemplateArgumentPackExpansionPattern(
4486               In, Ellipsis, OrigNumExpansions);
4487 
4488       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4489       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4490       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4491 
4492       // Determine whether the set of unexpanded parameter packs can and should
4493       // be expanded.
4494       bool Expand = true;
4495       bool RetainExpansion = false;
4496       Optional<unsigned> NumExpansions = OrigNumExpansions;
4497       if (getDerived().TryExpandParameterPacks(Ellipsis,
4498                                                Pattern.getSourceRange(),
4499                                                Unexpanded,
4500                                                Expand,
4501                                                RetainExpansion,
4502                                                NumExpansions))
4503         return true;
4504 
4505       if (!Expand) {
4506         // The transform has determined that we should perform a simple
4507         // transformation on the pack expansion, producing another pack
4508         // expansion.
4509         TemplateArgumentLoc OutPattern;
4510         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4511         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4512           return true;
4513 
4514         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4515                                                 NumExpansions);
4516         if (Out.getArgument().isNull())
4517           return true;
4518 
4519         Outputs.addArgument(Out);
4520         continue;
4521       }
4522 
4523       // The transform has determined that we should perform an elementwise
4524       // expansion of the pattern. Do so.
4525       for (unsigned I = 0; I != *NumExpansions; ++I) {
4526         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4527 
4528         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4529           return true;
4530 
4531         if (Out.getArgument().containsUnexpandedParameterPack()) {
4532           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4533                                                   OrigNumExpansions);
4534           if (Out.getArgument().isNull())
4535             return true;
4536         }
4537 
4538         Outputs.addArgument(Out);
4539       }
4540 
4541       // If we're supposed to retain a pack expansion, do so by temporarily
4542       // forgetting the partially-substituted parameter pack.
4543       if (RetainExpansion) {
4544         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4545 
4546         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4547           return true;
4548 
4549         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4550                                                 OrigNumExpansions);
4551         if (Out.getArgument().isNull())
4552           return true;
4553 
4554         Outputs.addArgument(Out);
4555       }
4556 
4557       continue;
4558     }
4559 
4560     // The simple case:
4561     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4562       return true;
4563 
4564     Outputs.addArgument(Out);
4565   }
4566 
4567   return false;
4568 
4569 }
4570 
4571 //===----------------------------------------------------------------------===//
4572 // Type transformation
4573 //===----------------------------------------------------------------------===//
4574 
4575 template<typename Derived>
4576 QualType TreeTransform<Derived>::TransformType(QualType T) {
4577   if (getDerived().AlreadyTransformed(T))
4578     return T;
4579 
4580   // Temporary workaround.  All of these transformations should
4581   // eventually turn into transformations on TypeLocs.
4582   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4583                                                 getDerived().getBaseLocation());
4584 
4585   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4586 
4587   if (!NewDI)
4588     return QualType();
4589 
4590   return NewDI->getType();
4591 }
4592 
4593 template<typename Derived>
4594 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4595   // Refine the base location to the type's location.
4596   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4597                        getDerived().getBaseEntity());
4598   if (getDerived().AlreadyTransformed(DI->getType()))
4599     return DI;
4600 
4601   TypeLocBuilder TLB;
4602 
4603   TypeLoc TL = DI->getTypeLoc();
4604   TLB.reserve(TL.getFullDataSize());
4605 
4606   QualType Result = getDerived().TransformType(TLB, TL);
4607   if (Result.isNull())
4608     return nullptr;
4609 
4610   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4611 }
4612 
4613 template<typename Derived>
4614 QualType
4615 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4616   switch (T.getTypeLocClass()) {
4617 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4618 #define TYPELOC(CLASS, PARENT)                                                 \
4619   case TypeLoc::CLASS:                                                         \
4620     return getDerived().Transform##CLASS##Type(TLB,                            \
4621                                                T.castAs<CLASS##TypeLoc>());
4622 #include "clang/AST/TypeLocNodes.def"
4623   }
4624 
4625   llvm_unreachable("unhandled type loc!");
4626 }
4627 
4628 template<typename Derived>
4629 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4630   if (!isa<DependentNameType>(T))
4631     return TransformType(T);
4632 
4633   if (getDerived().AlreadyTransformed(T))
4634     return T;
4635   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4636                                                 getDerived().getBaseLocation());
4637   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4638   return NewDI ? NewDI->getType() : QualType();
4639 }
4640 
4641 template<typename Derived>
4642 TypeSourceInfo *
4643 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4644   if (!isa<DependentNameType>(DI->getType()))
4645     return TransformType(DI);
4646 
4647   // Refine the base location to the type's location.
4648   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4649                        getDerived().getBaseEntity());
4650   if (getDerived().AlreadyTransformed(DI->getType()))
4651     return DI;
4652 
4653   TypeLocBuilder TLB;
4654 
4655   TypeLoc TL = DI->getTypeLoc();
4656   TLB.reserve(TL.getFullDataSize());
4657 
4658   auto QTL = TL.getAs<QualifiedTypeLoc>();
4659   if (QTL)
4660     TL = QTL.getUnqualifiedLoc();
4661 
4662   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4663 
4664   QualType Result = getDerived().TransformDependentNameType(
4665       TLB, DNTL, /*DeducedTSTContext*/true);
4666   if (Result.isNull())
4667     return nullptr;
4668 
4669   if (QTL) {
4670     Result = getDerived().RebuildQualifiedType(Result, QTL);
4671     if (Result.isNull())
4672       return nullptr;
4673     TLB.TypeWasModifiedSafely(Result);
4674   }
4675 
4676   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4677 }
4678 
4679 template<typename Derived>
4680 QualType
4681 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4682                                                QualifiedTypeLoc T) {
4683   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4684   if (Result.isNull())
4685     return QualType();
4686 
4687   Result = getDerived().RebuildQualifiedType(Result, T);
4688 
4689   if (Result.isNull())
4690     return QualType();
4691 
4692   // RebuildQualifiedType might have updated the type, but not in a way
4693   // that invalidates the TypeLoc. (There's no location information for
4694   // qualifiers.)
4695   TLB.TypeWasModifiedSafely(Result);
4696 
4697   return Result;
4698 }
4699 
4700 template <typename Derived>
4701 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4702                                                       QualifiedTypeLoc TL) {
4703 
4704   SourceLocation Loc = TL.getBeginLoc();
4705   Qualifiers Quals = TL.getType().getLocalQualifiers();
4706 
4707   if (((T.getAddressSpace() != LangAS::Default &&
4708         Quals.getAddressSpace() != LangAS::Default)) &&
4709       T.getAddressSpace() != Quals.getAddressSpace()) {
4710     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4711         << TL.getType() << T;
4712     return QualType();
4713   }
4714 
4715   // C++ [dcl.fct]p7:
4716   //   [When] adding cv-qualifications on top of the function type [...] the
4717   //   cv-qualifiers are ignored.
4718   if (T->isFunctionType()) {
4719     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4720                                                      Quals.getAddressSpace());
4721     return T;
4722   }
4723 
4724   // C++ [dcl.ref]p1:
4725   //   when the cv-qualifiers are introduced through the use of a typedef-name
4726   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4727   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4728   // applied to a reference type.
4729   if (T->isReferenceType()) {
4730     // The only qualifier that applies to a reference type is restrict.
4731     if (!Quals.hasRestrict())
4732       return T;
4733     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4734   }
4735 
4736   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4737   // resulting type.
4738   if (Quals.hasObjCLifetime()) {
4739     if (!T->isObjCLifetimeType() && !T->isDependentType())
4740       Quals.removeObjCLifetime();
4741     else if (T.getObjCLifetime()) {
4742       // Objective-C ARC:
4743       //   A lifetime qualifier applied to a substituted template parameter
4744       //   overrides the lifetime qualifier from the template argument.
4745       const AutoType *AutoTy;
4746       if (const SubstTemplateTypeParmType *SubstTypeParam
4747                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4748         QualType Replacement = SubstTypeParam->getReplacementType();
4749         Qualifiers Qs = Replacement.getQualifiers();
4750         Qs.removeObjCLifetime();
4751         Replacement = SemaRef.Context.getQualifiedType(
4752             Replacement.getUnqualifiedType(), Qs);
4753         T = SemaRef.Context.getSubstTemplateTypeParmType(
4754             SubstTypeParam->getReplacedParameter(), Replacement);
4755       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4756         // 'auto' types behave the same way as template parameters.
4757         QualType Deduced = AutoTy->getDeducedType();
4758         Qualifiers Qs = Deduced.getQualifiers();
4759         Qs.removeObjCLifetime();
4760         Deduced =
4761             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4762         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4763                                         AutoTy->isDependentType(),
4764                                         /*isPack=*/false,
4765                                         AutoTy->getTypeConstraintConcept(),
4766                                         AutoTy->getTypeConstraintArguments());
4767       } else {
4768         // Otherwise, complain about the addition of a qualifier to an
4769         // already-qualified type.
4770         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4771         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4772         Quals.removeObjCLifetime();
4773       }
4774     }
4775   }
4776 
4777   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4778 }
4779 
4780 template<typename Derived>
4781 TypeLoc
4782 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4783                                                    QualType ObjectType,
4784                                                    NamedDecl *UnqualLookup,
4785                                                    CXXScopeSpec &SS) {
4786   if (getDerived().AlreadyTransformed(TL.getType()))
4787     return TL;
4788 
4789   TypeSourceInfo *TSI =
4790       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4791   if (TSI)
4792     return TSI->getTypeLoc();
4793   return TypeLoc();
4794 }
4795 
4796 template<typename Derived>
4797 TypeSourceInfo *
4798 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4799                                                    QualType ObjectType,
4800                                                    NamedDecl *UnqualLookup,
4801                                                    CXXScopeSpec &SS) {
4802   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4803     return TSInfo;
4804 
4805   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4806                                    UnqualLookup, SS);
4807 }
4808 
4809 template <typename Derived>
4810 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4811     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4812     CXXScopeSpec &SS) {
4813   QualType T = TL.getType();
4814   assert(!getDerived().AlreadyTransformed(T));
4815 
4816   TypeLocBuilder TLB;
4817   QualType Result;
4818 
4819   if (isa<TemplateSpecializationType>(T)) {
4820     TemplateSpecializationTypeLoc SpecTL =
4821         TL.castAs<TemplateSpecializationTypeLoc>();
4822 
4823     TemplateName Template = getDerived().TransformTemplateName(
4824         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4825         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4826     if (Template.isNull())
4827       return nullptr;
4828 
4829     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4830                                                               Template);
4831   } else if (isa<DependentTemplateSpecializationType>(T)) {
4832     DependentTemplateSpecializationTypeLoc SpecTL =
4833         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4834 
4835     TemplateName Template
4836       = getDerived().RebuildTemplateName(SS,
4837                                          SpecTL.getTemplateKeywordLoc(),
4838                                          *SpecTL.getTypePtr()->getIdentifier(),
4839                                          SpecTL.getTemplateNameLoc(),
4840                                          ObjectType, UnqualLookup,
4841                                          /*AllowInjectedClassName*/true);
4842     if (Template.isNull())
4843       return nullptr;
4844 
4845     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4846                                                                        SpecTL,
4847                                                                        Template,
4848                                                                        SS);
4849   } else {
4850     // Nothing special needs to be done for these.
4851     Result = getDerived().TransformType(TLB, TL);
4852   }
4853 
4854   if (Result.isNull())
4855     return nullptr;
4856 
4857   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4858 }
4859 
4860 template <class TyLoc> static inline
4861 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4862   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4863   NewT.setNameLoc(T.getNameLoc());
4864   return T.getType();
4865 }
4866 
4867 template<typename Derived>
4868 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4869                                                       BuiltinTypeLoc T) {
4870   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4871   NewT.setBuiltinLoc(T.getBuiltinLoc());
4872   if (T.needsExtraLocalData())
4873     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4874   return T.getType();
4875 }
4876 
4877 template<typename Derived>
4878 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4879                                                       ComplexTypeLoc T) {
4880   // FIXME: recurse?
4881   return TransformTypeSpecType(TLB, T);
4882 }
4883 
4884 template <typename Derived>
4885 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4886                                                        AdjustedTypeLoc TL) {
4887   // Adjustments applied during transformation are handled elsewhere.
4888   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4889 }
4890 
4891 template<typename Derived>
4892 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4893                                                       DecayedTypeLoc TL) {
4894   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4895   if (OriginalType.isNull())
4896     return QualType();
4897 
4898   QualType Result = TL.getType();
4899   if (getDerived().AlwaysRebuild() ||
4900       OriginalType != TL.getOriginalLoc().getType())
4901     Result = SemaRef.Context.getDecayedType(OriginalType);
4902   TLB.push<DecayedTypeLoc>(Result);
4903   // Nothing to set for DecayedTypeLoc.
4904   return Result;
4905 }
4906 
4907 template<typename Derived>
4908 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4909                                                       PointerTypeLoc TL) {
4910   QualType PointeeType
4911     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4912   if (PointeeType.isNull())
4913     return QualType();
4914 
4915   QualType Result = TL.getType();
4916   if (PointeeType->getAs<ObjCObjectType>()) {
4917     // A dependent pointer type 'T *' has is being transformed such
4918     // that an Objective-C class type is being replaced for 'T'. The
4919     // resulting pointer type is an ObjCObjectPointerType, not a
4920     // PointerType.
4921     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4922 
4923     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4924     NewT.setStarLoc(TL.getStarLoc());
4925     return Result;
4926   }
4927 
4928   if (getDerived().AlwaysRebuild() ||
4929       PointeeType != TL.getPointeeLoc().getType()) {
4930     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4931     if (Result.isNull())
4932       return QualType();
4933   }
4934 
4935   // Objective-C ARC can add lifetime qualifiers to the type that we're
4936   // pointing to.
4937   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4938 
4939   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4940   NewT.setSigilLoc(TL.getSigilLoc());
4941   return Result;
4942 }
4943 
4944 template<typename Derived>
4945 QualType
4946 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4947                                                   BlockPointerTypeLoc TL) {
4948   QualType PointeeType
4949     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4950   if (PointeeType.isNull())
4951     return QualType();
4952 
4953   QualType Result = TL.getType();
4954   if (getDerived().AlwaysRebuild() ||
4955       PointeeType != TL.getPointeeLoc().getType()) {
4956     Result = getDerived().RebuildBlockPointerType(PointeeType,
4957                                                   TL.getSigilLoc());
4958     if (Result.isNull())
4959       return QualType();
4960   }
4961 
4962   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4963   NewT.setSigilLoc(TL.getSigilLoc());
4964   return Result;
4965 }
4966 
4967 /// Transforms a reference type.  Note that somewhat paradoxically we
4968 /// don't care whether the type itself is an l-value type or an r-value
4969 /// type;  we only care if the type was *written* as an l-value type
4970 /// or an r-value type.
4971 template<typename Derived>
4972 QualType
4973 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4974                                                ReferenceTypeLoc TL) {
4975   const ReferenceType *T = TL.getTypePtr();
4976 
4977   // Note that this works with the pointee-as-written.
4978   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4979   if (PointeeType.isNull())
4980     return QualType();
4981 
4982   QualType Result = TL.getType();
4983   if (getDerived().AlwaysRebuild() ||
4984       PointeeType != T->getPointeeTypeAsWritten()) {
4985     Result = getDerived().RebuildReferenceType(PointeeType,
4986                                                T->isSpelledAsLValue(),
4987                                                TL.getSigilLoc());
4988     if (Result.isNull())
4989       return QualType();
4990   }
4991 
4992   // Objective-C ARC can add lifetime qualifiers to the type that we're
4993   // referring to.
4994   TLB.TypeWasModifiedSafely(
4995       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4996 
4997   // r-value references can be rebuilt as l-value references.
4998   ReferenceTypeLoc NewTL;
4999   if (isa<LValueReferenceType>(Result))
5000     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5001   else
5002     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5003   NewTL.setSigilLoc(TL.getSigilLoc());
5004 
5005   return Result;
5006 }
5007 
5008 template<typename Derived>
5009 QualType
5010 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5011                                                  LValueReferenceTypeLoc TL) {
5012   return TransformReferenceType(TLB, TL);
5013 }
5014 
5015 template<typename Derived>
5016 QualType
5017 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5018                                                  RValueReferenceTypeLoc TL) {
5019   return TransformReferenceType(TLB, TL);
5020 }
5021 
5022 template<typename Derived>
5023 QualType
5024 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5025                                                    MemberPointerTypeLoc TL) {
5026   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5027   if (PointeeType.isNull())
5028     return QualType();
5029 
5030   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5031   TypeSourceInfo *NewClsTInfo = nullptr;
5032   if (OldClsTInfo) {
5033     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5034     if (!NewClsTInfo)
5035       return QualType();
5036   }
5037 
5038   const MemberPointerType *T = TL.getTypePtr();
5039   QualType OldClsType = QualType(T->getClass(), 0);
5040   QualType NewClsType;
5041   if (NewClsTInfo)
5042     NewClsType = NewClsTInfo->getType();
5043   else {
5044     NewClsType = getDerived().TransformType(OldClsType);
5045     if (NewClsType.isNull())
5046       return QualType();
5047   }
5048 
5049   QualType Result = TL.getType();
5050   if (getDerived().AlwaysRebuild() ||
5051       PointeeType != T->getPointeeType() ||
5052       NewClsType != OldClsType) {
5053     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5054                                                    TL.getStarLoc());
5055     if (Result.isNull())
5056       return QualType();
5057   }
5058 
5059   // If we had to adjust the pointee type when building a member pointer, make
5060   // sure to push TypeLoc info for it.
5061   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5062   if (MPT && PointeeType != MPT->getPointeeType()) {
5063     assert(isa<AdjustedType>(MPT->getPointeeType()));
5064     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5065   }
5066 
5067   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5068   NewTL.setSigilLoc(TL.getSigilLoc());
5069   NewTL.setClassTInfo(NewClsTInfo);
5070 
5071   return Result;
5072 }
5073 
5074 template<typename Derived>
5075 QualType
5076 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5077                                                    ConstantArrayTypeLoc TL) {
5078   const ConstantArrayType *T = TL.getTypePtr();
5079   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5080   if (ElementType.isNull())
5081     return QualType();
5082 
5083   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5084   Expr *OldSize = TL.getSizeExpr();
5085   if (!OldSize)
5086     OldSize = const_cast<Expr*>(T->getSizeExpr());
5087   Expr *NewSize = nullptr;
5088   if (OldSize) {
5089     EnterExpressionEvaluationContext Unevaluated(
5090         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5091     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5092     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5093   }
5094 
5095   QualType Result = TL.getType();
5096   if (getDerived().AlwaysRebuild() ||
5097       ElementType != T->getElementType() ||
5098       (T->getSizeExpr() && NewSize != OldSize)) {
5099     Result = getDerived().RebuildConstantArrayType(ElementType,
5100                                                    T->getSizeModifier(),
5101                                                    T->getSize(), NewSize,
5102                                              T->getIndexTypeCVRQualifiers(),
5103                                                    TL.getBracketsRange());
5104     if (Result.isNull())
5105       return QualType();
5106   }
5107 
5108   // We might have either a ConstantArrayType or a VariableArrayType now:
5109   // a ConstantArrayType is allowed to have an element type which is a
5110   // VariableArrayType if the type is dependent.  Fortunately, all array
5111   // types have the same location layout.
5112   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5113   NewTL.setLBracketLoc(TL.getLBracketLoc());
5114   NewTL.setRBracketLoc(TL.getRBracketLoc());
5115   NewTL.setSizeExpr(NewSize);
5116 
5117   return Result;
5118 }
5119 
5120 template<typename Derived>
5121 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5122                                               TypeLocBuilder &TLB,
5123                                               IncompleteArrayTypeLoc TL) {
5124   const IncompleteArrayType *T = TL.getTypePtr();
5125   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5126   if (ElementType.isNull())
5127     return QualType();
5128 
5129   QualType Result = TL.getType();
5130   if (getDerived().AlwaysRebuild() ||
5131       ElementType != T->getElementType()) {
5132     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5133                                                      T->getSizeModifier(),
5134                                            T->getIndexTypeCVRQualifiers(),
5135                                                      TL.getBracketsRange());
5136     if (Result.isNull())
5137       return QualType();
5138   }
5139 
5140   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5141   NewTL.setLBracketLoc(TL.getLBracketLoc());
5142   NewTL.setRBracketLoc(TL.getRBracketLoc());
5143   NewTL.setSizeExpr(nullptr);
5144 
5145   return Result;
5146 }
5147 
5148 template<typename Derived>
5149 QualType
5150 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5151                                                    VariableArrayTypeLoc TL) {
5152   const VariableArrayType *T = TL.getTypePtr();
5153   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5154   if (ElementType.isNull())
5155     return QualType();
5156 
5157   ExprResult SizeResult;
5158   {
5159     EnterExpressionEvaluationContext Context(
5160         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5161     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5162   }
5163   if (SizeResult.isInvalid())
5164     return QualType();
5165   SizeResult =
5166       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5167   if (SizeResult.isInvalid())
5168     return QualType();
5169 
5170   Expr *Size = SizeResult.get();
5171 
5172   QualType Result = TL.getType();
5173   if (getDerived().AlwaysRebuild() ||
5174       ElementType != T->getElementType() ||
5175       Size != T->getSizeExpr()) {
5176     Result = getDerived().RebuildVariableArrayType(ElementType,
5177                                                    T->getSizeModifier(),
5178                                                    Size,
5179                                              T->getIndexTypeCVRQualifiers(),
5180                                                    TL.getBracketsRange());
5181     if (Result.isNull())
5182       return QualType();
5183   }
5184 
5185   // We might have constant size array now, but fortunately it has the same
5186   // location layout.
5187   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5188   NewTL.setLBracketLoc(TL.getLBracketLoc());
5189   NewTL.setRBracketLoc(TL.getRBracketLoc());
5190   NewTL.setSizeExpr(Size);
5191 
5192   return Result;
5193 }
5194 
5195 template<typename Derived>
5196 QualType
5197 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5198                                              DependentSizedArrayTypeLoc TL) {
5199   const DependentSizedArrayType *T = TL.getTypePtr();
5200   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5201   if (ElementType.isNull())
5202     return QualType();
5203 
5204   // Array bounds are constant expressions.
5205   EnterExpressionEvaluationContext Unevaluated(
5206       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5207 
5208   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5209   Expr *origSize = TL.getSizeExpr();
5210   if (!origSize) origSize = T->getSizeExpr();
5211 
5212   ExprResult sizeResult
5213     = getDerived().TransformExpr(origSize);
5214   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5215   if (sizeResult.isInvalid())
5216     return QualType();
5217 
5218   Expr *size = sizeResult.get();
5219 
5220   QualType Result = TL.getType();
5221   if (getDerived().AlwaysRebuild() ||
5222       ElementType != T->getElementType() ||
5223       size != origSize) {
5224     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5225                                                          T->getSizeModifier(),
5226                                                          size,
5227                                                 T->getIndexTypeCVRQualifiers(),
5228                                                         TL.getBracketsRange());
5229     if (Result.isNull())
5230       return QualType();
5231   }
5232 
5233   // We might have any sort of array type now, but fortunately they
5234   // all have the same location layout.
5235   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5236   NewTL.setLBracketLoc(TL.getLBracketLoc());
5237   NewTL.setRBracketLoc(TL.getRBracketLoc());
5238   NewTL.setSizeExpr(size);
5239 
5240   return Result;
5241 }
5242 
5243 template <typename Derived>
5244 QualType TreeTransform<Derived>::TransformDependentVectorType(
5245     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5246   const DependentVectorType *T = TL.getTypePtr();
5247   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5248   if (ElementType.isNull())
5249     return QualType();
5250 
5251   EnterExpressionEvaluationContext Unevaluated(
5252       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5253 
5254   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5255   Size = SemaRef.ActOnConstantExpression(Size);
5256   if (Size.isInvalid())
5257     return QualType();
5258 
5259   QualType Result = TL.getType();
5260   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5261       Size.get() != T->getSizeExpr()) {
5262     Result = getDerived().RebuildDependentVectorType(
5263         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5264     if (Result.isNull())
5265       return QualType();
5266   }
5267 
5268   // Result might be dependent or not.
5269   if (isa<DependentVectorType>(Result)) {
5270     DependentVectorTypeLoc NewTL =
5271         TLB.push<DependentVectorTypeLoc>(Result);
5272     NewTL.setNameLoc(TL.getNameLoc());
5273   } else {
5274     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5275     NewTL.setNameLoc(TL.getNameLoc());
5276   }
5277 
5278   return Result;
5279 }
5280 
5281 template<typename Derived>
5282 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5283                                       TypeLocBuilder &TLB,
5284                                       DependentSizedExtVectorTypeLoc TL) {
5285   const DependentSizedExtVectorType *T = TL.getTypePtr();
5286 
5287   // FIXME: ext vector locs should be nested
5288   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5289   if (ElementType.isNull())
5290     return QualType();
5291 
5292   // Vector sizes are constant expressions.
5293   EnterExpressionEvaluationContext Unevaluated(
5294       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5295 
5296   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5297   Size = SemaRef.ActOnConstantExpression(Size);
5298   if (Size.isInvalid())
5299     return QualType();
5300 
5301   QualType Result = TL.getType();
5302   if (getDerived().AlwaysRebuild() ||
5303       ElementType != T->getElementType() ||
5304       Size.get() != T->getSizeExpr()) {
5305     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5306                                                              Size.get(),
5307                                                          T->getAttributeLoc());
5308     if (Result.isNull())
5309       return QualType();
5310   }
5311 
5312   // Result might be dependent or not.
5313   if (isa<DependentSizedExtVectorType>(Result)) {
5314     DependentSizedExtVectorTypeLoc NewTL
5315       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5316     NewTL.setNameLoc(TL.getNameLoc());
5317   } else {
5318     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5319     NewTL.setNameLoc(TL.getNameLoc());
5320   }
5321 
5322   return Result;
5323 }
5324 
5325 template <typename Derived>
5326 QualType
5327 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5328                                                     ConstantMatrixTypeLoc TL) {
5329   const ConstantMatrixType *T = TL.getTypePtr();
5330   QualType ElementType = getDerived().TransformType(T->getElementType());
5331   if (ElementType.isNull())
5332     return QualType();
5333 
5334   QualType Result = TL.getType();
5335   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5336     Result = getDerived().RebuildConstantMatrixType(
5337         ElementType, T->getNumRows(), T->getNumColumns());
5338     if (Result.isNull())
5339       return QualType();
5340   }
5341 
5342   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5343   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5344   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5345   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5346   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5347 
5348   return Result;
5349 }
5350 
5351 template <typename Derived>
5352 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5353     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5354   const DependentSizedMatrixType *T = TL.getTypePtr();
5355 
5356   QualType ElementType = getDerived().TransformType(T->getElementType());
5357   if (ElementType.isNull()) {
5358     return QualType();
5359   }
5360 
5361   // Matrix dimensions are constant expressions.
5362   EnterExpressionEvaluationContext Unevaluated(
5363       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5364 
5365   Expr *origRows = TL.getAttrRowOperand();
5366   if (!origRows)
5367     origRows = T->getRowExpr();
5368   Expr *origColumns = TL.getAttrColumnOperand();
5369   if (!origColumns)
5370     origColumns = T->getColumnExpr();
5371 
5372   ExprResult rowResult = getDerived().TransformExpr(origRows);
5373   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5374   if (rowResult.isInvalid())
5375     return QualType();
5376 
5377   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5378   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5379   if (columnResult.isInvalid())
5380     return QualType();
5381 
5382   Expr *rows = rowResult.get();
5383   Expr *columns = columnResult.get();
5384 
5385   QualType Result = TL.getType();
5386   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5387       rows != origRows || columns != origColumns) {
5388     Result = getDerived().RebuildDependentSizedMatrixType(
5389         ElementType, rows, columns, T->getAttributeLoc());
5390 
5391     if (Result.isNull())
5392       return QualType();
5393   }
5394 
5395   // We might have any sort of matrix type now, but fortunately they
5396   // all have the same location layout.
5397   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5398   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5399   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5400   NewTL.setAttrRowOperand(rows);
5401   NewTL.setAttrColumnOperand(columns);
5402   return Result;
5403 }
5404 
5405 template <typename Derived>
5406 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5407     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5408   const DependentAddressSpaceType *T = TL.getTypePtr();
5409 
5410   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5411 
5412   if (pointeeType.isNull())
5413     return QualType();
5414 
5415   // Address spaces are constant expressions.
5416   EnterExpressionEvaluationContext Unevaluated(
5417       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5418 
5419   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5420   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5421   if (AddrSpace.isInvalid())
5422     return QualType();
5423 
5424   QualType Result = TL.getType();
5425   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5426       AddrSpace.get() != T->getAddrSpaceExpr()) {
5427     Result = getDerived().RebuildDependentAddressSpaceType(
5428         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5429     if (Result.isNull())
5430       return QualType();
5431   }
5432 
5433   // Result might be dependent or not.
5434   if (isa<DependentAddressSpaceType>(Result)) {
5435     DependentAddressSpaceTypeLoc NewTL =
5436         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5437 
5438     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5439     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5440     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5441 
5442   } else {
5443     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5444         Result, getDerived().getBaseLocation());
5445     TransformType(TLB, DI->getTypeLoc());
5446   }
5447 
5448   return Result;
5449 }
5450 
5451 template <typename Derived>
5452 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5453                                                      VectorTypeLoc TL) {
5454   const VectorType *T = TL.getTypePtr();
5455   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5456   if (ElementType.isNull())
5457     return QualType();
5458 
5459   QualType Result = TL.getType();
5460   if (getDerived().AlwaysRebuild() ||
5461       ElementType != T->getElementType()) {
5462     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5463                                             T->getVectorKind());
5464     if (Result.isNull())
5465       return QualType();
5466   }
5467 
5468   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5469   NewTL.setNameLoc(TL.getNameLoc());
5470 
5471   return Result;
5472 }
5473 
5474 template<typename Derived>
5475 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5476                                                         ExtVectorTypeLoc TL) {
5477   const VectorType *T = TL.getTypePtr();
5478   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5479   if (ElementType.isNull())
5480     return QualType();
5481 
5482   QualType Result = TL.getType();
5483   if (getDerived().AlwaysRebuild() ||
5484       ElementType != T->getElementType()) {
5485     Result = getDerived().RebuildExtVectorType(ElementType,
5486                                                T->getNumElements(),
5487                                                /*FIXME*/ SourceLocation());
5488     if (Result.isNull())
5489       return QualType();
5490   }
5491 
5492   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5493   NewTL.setNameLoc(TL.getNameLoc());
5494 
5495   return Result;
5496 }
5497 
5498 template <typename Derived>
5499 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5500     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5501     bool ExpectParameterPack) {
5502   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5503   TypeSourceInfo *NewDI = nullptr;
5504 
5505   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5506     // If we're substituting into a pack expansion type and we know the
5507     // length we want to expand to, just substitute for the pattern.
5508     TypeLoc OldTL = OldDI->getTypeLoc();
5509     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5510 
5511     TypeLocBuilder TLB;
5512     TypeLoc NewTL = OldDI->getTypeLoc();
5513     TLB.reserve(NewTL.getFullDataSize());
5514 
5515     QualType Result = getDerived().TransformType(TLB,
5516                                                OldExpansionTL.getPatternLoc());
5517     if (Result.isNull())
5518       return nullptr;
5519 
5520     Result = RebuildPackExpansionType(Result,
5521                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5522                                       OldExpansionTL.getEllipsisLoc(),
5523                                       NumExpansions);
5524     if (Result.isNull())
5525       return nullptr;
5526 
5527     PackExpansionTypeLoc NewExpansionTL
5528       = TLB.push<PackExpansionTypeLoc>(Result);
5529     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5530     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5531   } else
5532     NewDI = getDerived().TransformType(OldDI);
5533   if (!NewDI)
5534     return nullptr;
5535 
5536   if (NewDI == OldDI && indexAdjustment == 0)
5537     return OldParm;
5538 
5539   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5540                                              OldParm->getDeclContext(),
5541                                              OldParm->getInnerLocStart(),
5542                                              OldParm->getLocation(),
5543                                              OldParm->getIdentifier(),
5544                                              NewDI->getType(),
5545                                              NewDI,
5546                                              OldParm->getStorageClass(),
5547                                              /* DefArg */ nullptr);
5548   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5549                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5550   transformedLocalDecl(OldParm, {newParm});
5551   return newParm;
5552 }
5553 
5554 template <typename Derived>
5555 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5556     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5557     const QualType *ParamTypes,
5558     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5559     SmallVectorImpl<QualType> &OutParamTypes,
5560     SmallVectorImpl<ParmVarDecl *> *PVars,
5561     Sema::ExtParameterInfoBuilder &PInfos) {
5562   int indexAdjustment = 0;
5563 
5564   unsigned NumParams = Params.size();
5565   for (unsigned i = 0; i != NumParams; ++i) {
5566     if (ParmVarDecl *OldParm = Params[i]) {
5567       assert(OldParm->getFunctionScopeIndex() == i);
5568 
5569       Optional<unsigned> NumExpansions;
5570       ParmVarDecl *NewParm = nullptr;
5571       if (OldParm->isParameterPack()) {
5572         // We have a function parameter pack that may need to be expanded.
5573         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5574 
5575         // Find the parameter packs that could be expanded.
5576         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5577         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5578         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5579         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5580 
5581         // Determine whether we should expand the parameter packs.
5582         bool ShouldExpand = false;
5583         bool RetainExpansion = false;
5584         Optional<unsigned> OrigNumExpansions;
5585         if (Unexpanded.size() > 0) {
5586           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5587           NumExpansions = OrigNumExpansions;
5588           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5589                                                    Pattern.getSourceRange(),
5590                                                    Unexpanded,
5591                                                    ShouldExpand,
5592                                                    RetainExpansion,
5593                                                    NumExpansions)) {
5594             return true;
5595           }
5596         } else {
5597 #ifndef NDEBUG
5598           const AutoType *AT =
5599               Pattern.getType().getTypePtr()->getContainedAutoType();
5600           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5601                  "Could not find parameter packs or undeduced auto type!");
5602 #endif
5603         }
5604 
5605         if (ShouldExpand) {
5606           // Expand the function parameter pack into multiple, separate
5607           // parameters.
5608           getDerived().ExpandingFunctionParameterPack(OldParm);
5609           for (unsigned I = 0; I != *NumExpansions; ++I) {
5610             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5611             ParmVarDecl *NewParm
5612               = getDerived().TransformFunctionTypeParam(OldParm,
5613                                                         indexAdjustment++,
5614                                                         OrigNumExpansions,
5615                                                 /*ExpectParameterPack=*/false);
5616             if (!NewParm)
5617               return true;
5618 
5619             if (ParamInfos)
5620               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5621             OutParamTypes.push_back(NewParm->getType());
5622             if (PVars)
5623               PVars->push_back(NewParm);
5624           }
5625 
5626           // If we're supposed to retain a pack expansion, do so by temporarily
5627           // forgetting the partially-substituted parameter pack.
5628           if (RetainExpansion) {
5629             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5630             ParmVarDecl *NewParm
5631               = getDerived().TransformFunctionTypeParam(OldParm,
5632                                                         indexAdjustment++,
5633                                                         OrigNumExpansions,
5634                                                 /*ExpectParameterPack=*/false);
5635             if (!NewParm)
5636               return true;
5637 
5638             if (ParamInfos)
5639               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5640             OutParamTypes.push_back(NewParm->getType());
5641             if (PVars)
5642               PVars->push_back(NewParm);
5643           }
5644 
5645           // The next parameter should have the same adjustment as the
5646           // last thing we pushed, but we post-incremented indexAdjustment
5647           // on every push.  Also, if we push nothing, the adjustment should
5648           // go down by one.
5649           indexAdjustment--;
5650 
5651           // We're done with the pack expansion.
5652           continue;
5653         }
5654 
5655         // We'll substitute the parameter now without expanding the pack
5656         // expansion.
5657         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5658         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5659                                                           indexAdjustment,
5660                                                           NumExpansions,
5661                                                   /*ExpectParameterPack=*/true);
5662         assert(NewParm->isParameterPack() &&
5663                "Parameter pack no longer a parameter pack after "
5664                "transformation.");
5665       } else {
5666         NewParm = getDerived().TransformFunctionTypeParam(
5667             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5668       }
5669 
5670       if (!NewParm)
5671         return true;
5672 
5673       if (ParamInfos)
5674         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5675       OutParamTypes.push_back(NewParm->getType());
5676       if (PVars)
5677         PVars->push_back(NewParm);
5678       continue;
5679     }
5680 
5681     // Deal with the possibility that we don't have a parameter
5682     // declaration for this parameter.
5683     QualType OldType = ParamTypes[i];
5684     bool IsPackExpansion = false;
5685     Optional<unsigned> NumExpansions;
5686     QualType NewType;
5687     if (const PackExpansionType *Expansion
5688                                        = dyn_cast<PackExpansionType>(OldType)) {
5689       // We have a function parameter pack that may need to be expanded.
5690       QualType Pattern = Expansion->getPattern();
5691       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5692       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5693 
5694       // Determine whether we should expand the parameter packs.
5695       bool ShouldExpand = false;
5696       bool RetainExpansion = false;
5697       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5698                                                Unexpanded,
5699                                                ShouldExpand,
5700                                                RetainExpansion,
5701                                                NumExpansions)) {
5702         return true;
5703       }
5704 
5705       if (ShouldExpand) {
5706         // Expand the function parameter pack into multiple, separate
5707         // parameters.
5708         for (unsigned I = 0; I != *NumExpansions; ++I) {
5709           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5710           QualType NewType = getDerived().TransformType(Pattern);
5711           if (NewType.isNull())
5712             return true;
5713 
5714           if (NewType->containsUnexpandedParameterPack()) {
5715             NewType =
5716                 getSema().getASTContext().getPackExpansionType(NewType, None);
5717 
5718             if (NewType.isNull())
5719               return true;
5720           }
5721 
5722           if (ParamInfos)
5723             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5724           OutParamTypes.push_back(NewType);
5725           if (PVars)
5726             PVars->push_back(nullptr);
5727         }
5728 
5729         // We're done with the pack expansion.
5730         continue;
5731       }
5732 
5733       // If we're supposed to retain a pack expansion, do so by temporarily
5734       // forgetting the partially-substituted parameter pack.
5735       if (RetainExpansion) {
5736         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5737         QualType NewType = getDerived().TransformType(Pattern);
5738         if (NewType.isNull())
5739           return true;
5740 
5741         if (ParamInfos)
5742           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5743         OutParamTypes.push_back(NewType);
5744         if (PVars)
5745           PVars->push_back(nullptr);
5746       }
5747 
5748       // We'll substitute the parameter now without expanding the pack
5749       // expansion.
5750       OldType = Expansion->getPattern();
5751       IsPackExpansion = true;
5752       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5753       NewType = getDerived().TransformType(OldType);
5754     } else {
5755       NewType = getDerived().TransformType(OldType);
5756     }
5757 
5758     if (NewType.isNull())
5759       return true;
5760 
5761     if (IsPackExpansion)
5762       NewType = getSema().Context.getPackExpansionType(NewType,
5763                                                        NumExpansions);
5764 
5765     if (ParamInfos)
5766       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5767     OutParamTypes.push_back(NewType);
5768     if (PVars)
5769       PVars->push_back(nullptr);
5770   }
5771 
5772 #ifndef NDEBUG
5773   if (PVars) {
5774     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5775       if (ParmVarDecl *parm = (*PVars)[i])
5776         assert(parm->getFunctionScopeIndex() == i);
5777   }
5778 #endif
5779 
5780   return false;
5781 }
5782 
5783 template<typename Derived>
5784 QualType
5785 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5786                                                    FunctionProtoTypeLoc TL) {
5787   SmallVector<QualType, 4> ExceptionStorage;
5788   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5789   return getDerived().TransformFunctionProtoType(
5790       TLB, TL, nullptr, Qualifiers(),
5791       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5792         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5793                                             ExceptionStorage, Changed);
5794       });
5795 }
5796 
5797 template<typename Derived> template<typename Fn>
5798 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5799     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5800     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5801 
5802   // Transform the parameters and return type.
5803   //
5804   // We are required to instantiate the params and return type in source order.
5805   // When the function has a trailing return type, we instantiate the
5806   // parameters before the return type,  since the return type can then refer
5807   // to the parameters themselves (via decltype, sizeof, etc.).
5808   //
5809   SmallVector<QualType, 4> ParamTypes;
5810   SmallVector<ParmVarDecl*, 4> ParamDecls;
5811   Sema::ExtParameterInfoBuilder ExtParamInfos;
5812   const FunctionProtoType *T = TL.getTypePtr();
5813 
5814   QualType ResultType;
5815 
5816   if (T->hasTrailingReturn()) {
5817     if (getDerived().TransformFunctionTypeParams(
5818             TL.getBeginLoc(), TL.getParams(),
5819             TL.getTypePtr()->param_type_begin(),
5820             T->getExtParameterInfosOrNull(),
5821             ParamTypes, &ParamDecls, ExtParamInfos))
5822       return QualType();
5823 
5824     {
5825       // C++11 [expr.prim.general]p3:
5826       //   If a declaration declares a member function or member function
5827       //   template of a class X, the expression this is a prvalue of type
5828       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5829       //   and the end of the function-definition, member-declarator, or
5830       //   declarator.
5831       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5832 
5833       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5834       if (ResultType.isNull())
5835         return QualType();
5836     }
5837   }
5838   else {
5839     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5840     if (ResultType.isNull())
5841       return QualType();
5842 
5843     if (getDerived().TransformFunctionTypeParams(
5844             TL.getBeginLoc(), TL.getParams(),
5845             TL.getTypePtr()->param_type_begin(),
5846             T->getExtParameterInfosOrNull(),
5847             ParamTypes, &ParamDecls, ExtParamInfos))
5848       return QualType();
5849   }
5850 
5851   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5852 
5853   bool EPIChanged = false;
5854   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5855     return QualType();
5856 
5857   // Handle extended parameter information.
5858   if (auto NewExtParamInfos =
5859         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5860     if (!EPI.ExtParameterInfos ||
5861         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5862           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5863       EPIChanged = true;
5864     }
5865     EPI.ExtParameterInfos = NewExtParamInfos;
5866   } else if (EPI.ExtParameterInfos) {
5867     EPIChanged = true;
5868     EPI.ExtParameterInfos = nullptr;
5869   }
5870 
5871   QualType Result = TL.getType();
5872   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5873       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5874     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5875     if (Result.isNull())
5876       return QualType();
5877   }
5878 
5879   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5880   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5881   NewTL.setLParenLoc(TL.getLParenLoc());
5882   NewTL.setRParenLoc(TL.getRParenLoc());
5883   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5884   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5885   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5886     NewTL.setParam(i, ParamDecls[i]);
5887 
5888   return Result;
5889 }
5890 
5891 template<typename Derived>
5892 bool TreeTransform<Derived>::TransformExceptionSpec(
5893     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5894     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5895   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5896 
5897   // Instantiate a dynamic noexcept expression, if any.
5898   if (isComputedNoexcept(ESI.Type)) {
5899     EnterExpressionEvaluationContext Unevaluated(
5900         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5901     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5902     if (NoexceptExpr.isInvalid())
5903       return true;
5904 
5905     ExceptionSpecificationType EST = ESI.Type;
5906     NoexceptExpr =
5907         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5908     if (NoexceptExpr.isInvalid())
5909       return true;
5910 
5911     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5912       Changed = true;
5913     ESI.NoexceptExpr = NoexceptExpr.get();
5914     ESI.Type = EST;
5915   }
5916 
5917   if (ESI.Type != EST_Dynamic)
5918     return false;
5919 
5920   // Instantiate a dynamic exception specification's type.
5921   for (QualType T : ESI.Exceptions) {
5922     if (const PackExpansionType *PackExpansion =
5923             T->getAs<PackExpansionType>()) {
5924       Changed = true;
5925 
5926       // We have a pack expansion. Instantiate it.
5927       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5928       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5929                                               Unexpanded);
5930       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5931 
5932       // Determine whether the set of unexpanded parameter packs can and
5933       // should
5934       // be expanded.
5935       bool Expand = false;
5936       bool RetainExpansion = false;
5937       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5938       // FIXME: Track the location of the ellipsis (and track source location
5939       // information for the types in the exception specification in general).
5940       if (getDerived().TryExpandParameterPacks(
5941               Loc, SourceRange(), Unexpanded, Expand,
5942               RetainExpansion, NumExpansions))
5943         return true;
5944 
5945       if (!Expand) {
5946         // We can't expand this pack expansion into separate arguments yet;
5947         // just substitute into the pattern and create a new pack expansion
5948         // type.
5949         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5950         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5951         if (U.isNull())
5952           return true;
5953 
5954         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5955         Exceptions.push_back(U);
5956         continue;
5957       }
5958 
5959       // Substitute into the pack expansion pattern for each slice of the
5960       // pack.
5961       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5962         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5963 
5964         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5965         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5966           return true;
5967 
5968         Exceptions.push_back(U);
5969       }
5970     } else {
5971       QualType U = getDerived().TransformType(T);
5972       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5973         return true;
5974       if (T != U)
5975         Changed = true;
5976 
5977       Exceptions.push_back(U);
5978     }
5979   }
5980 
5981   ESI.Exceptions = Exceptions;
5982   if (ESI.Exceptions.empty())
5983     ESI.Type = EST_DynamicNone;
5984   return false;
5985 }
5986 
5987 template<typename Derived>
5988 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5989                                                  TypeLocBuilder &TLB,
5990                                                  FunctionNoProtoTypeLoc TL) {
5991   const FunctionNoProtoType *T = TL.getTypePtr();
5992   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5993   if (ResultType.isNull())
5994     return QualType();
5995 
5996   QualType Result = TL.getType();
5997   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5998     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5999 
6000   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6001   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6002   NewTL.setLParenLoc(TL.getLParenLoc());
6003   NewTL.setRParenLoc(TL.getRParenLoc());
6004   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6005 
6006   return Result;
6007 }
6008 
6009 template<typename Derived> QualType
6010 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
6011                                                  UnresolvedUsingTypeLoc TL) {
6012   const UnresolvedUsingType *T = TL.getTypePtr();
6013   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6014   if (!D)
6015     return QualType();
6016 
6017   QualType Result = TL.getType();
6018   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6019     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6020     if (Result.isNull())
6021       return QualType();
6022   }
6023 
6024   // We might get an arbitrary type spec type back.  We should at
6025   // least always get a type spec type, though.
6026   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6027   NewTL.setNameLoc(TL.getNameLoc());
6028 
6029   return Result;
6030 }
6031 
6032 template<typename Derived>
6033 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6034                                                       TypedefTypeLoc TL) {
6035   const TypedefType *T = TL.getTypePtr();
6036   TypedefNameDecl *Typedef
6037     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6038                                                                T->getDecl()));
6039   if (!Typedef)
6040     return QualType();
6041 
6042   QualType Result = TL.getType();
6043   if (getDerived().AlwaysRebuild() ||
6044       Typedef != T->getDecl()) {
6045     Result = getDerived().RebuildTypedefType(Typedef);
6046     if (Result.isNull())
6047       return QualType();
6048   }
6049 
6050   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6051   NewTL.setNameLoc(TL.getNameLoc());
6052 
6053   return Result;
6054 }
6055 
6056 template<typename Derived>
6057 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6058                                                       TypeOfExprTypeLoc TL) {
6059   // typeof expressions are not potentially evaluated contexts
6060   EnterExpressionEvaluationContext Unevaluated(
6061       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6062       Sema::ReuseLambdaContextDecl);
6063 
6064   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6065   if (E.isInvalid())
6066     return QualType();
6067 
6068   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6069   if (E.isInvalid())
6070     return QualType();
6071 
6072   QualType Result = TL.getType();
6073   if (getDerived().AlwaysRebuild() ||
6074       E.get() != TL.getUnderlyingExpr()) {
6075     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6076     if (Result.isNull())
6077       return QualType();
6078   }
6079   else E.get();
6080 
6081   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6082   NewTL.setTypeofLoc(TL.getTypeofLoc());
6083   NewTL.setLParenLoc(TL.getLParenLoc());
6084   NewTL.setRParenLoc(TL.getRParenLoc());
6085 
6086   return Result;
6087 }
6088 
6089 template<typename Derived>
6090 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6091                                                      TypeOfTypeLoc TL) {
6092   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6093   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6094   if (!New_Under_TI)
6095     return QualType();
6096 
6097   QualType Result = TL.getType();
6098   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6099     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6100     if (Result.isNull())
6101       return QualType();
6102   }
6103 
6104   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6105   NewTL.setTypeofLoc(TL.getTypeofLoc());
6106   NewTL.setLParenLoc(TL.getLParenLoc());
6107   NewTL.setRParenLoc(TL.getRParenLoc());
6108   NewTL.setUnderlyingTInfo(New_Under_TI);
6109 
6110   return Result;
6111 }
6112 
6113 template<typename Derived>
6114 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6115                                                        DecltypeTypeLoc TL) {
6116   const DecltypeType *T = TL.getTypePtr();
6117 
6118   // decltype expressions are not potentially evaluated contexts
6119   EnterExpressionEvaluationContext Unevaluated(
6120       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6121       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6122 
6123   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6124   if (E.isInvalid())
6125     return QualType();
6126 
6127   E = getSema().ActOnDecltypeExpression(E.get());
6128   if (E.isInvalid())
6129     return QualType();
6130 
6131   QualType Result = TL.getType();
6132   if (getDerived().AlwaysRebuild() ||
6133       E.get() != T->getUnderlyingExpr()) {
6134     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6135     if (Result.isNull())
6136       return QualType();
6137   }
6138   else E.get();
6139 
6140   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6141   NewTL.setNameLoc(TL.getNameLoc());
6142 
6143   return Result;
6144 }
6145 
6146 template<typename Derived>
6147 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6148                                                             TypeLocBuilder &TLB,
6149                                                      UnaryTransformTypeLoc TL) {
6150   QualType Result = TL.getType();
6151   if (Result->isDependentType()) {
6152     const UnaryTransformType *T = TL.getTypePtr();
6153     QualType NewBase =
6154       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6155     Result = getDerived().RebuildUnaryTransformType(NewBase,
6156                                                     T->getUTTKind(),
6157                                                     TL.getKWLoc());
6158     if (Result.isNull())
6159       return QualType();
6160   }
6161 
6162   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6163   NewTL.setKWLoc(TL.getKWLoc());
6164   NewTL.setParensRange(TL.getParensRange());
6165   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6166   return Result;
6167 }
6168 
6169 template<typename Derived>
6170 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6171     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6172   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6173 
6174   CXXScopeSpec SS;
6175   TemplateName TemplateName = getDerived().TransformTemplateName(
6176       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6177   if (TemplateName.isNull())
6178     return QualType();
6179 
6180   QualType OldDeduced = T->getDeducedType();
6181   QualType NewDeduced;
6182   if (!OldDeduced.isNull()) {
6183     NewDeduced = getDerived().TransformType(OldDeduced);
6184     if (NewDeduced.isNull())
6185       return QualType();
6186   }
6187 
6188   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6189       TemplateName, NewDeduced);
6190   if (Result.isNull())
6191     return QualType();
6192 
6193   DeducedTemplateSpecializationTypeLoc NewTL =
6194       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6195   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6196 
6197   return Result;
6198 }
6199 
6200 template<typename Derived>
6201 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6202                                                      RecordTypeLoc TL) {
6203   const RecordType *T = TL.getTypePtr();
6204   RecordDecl *Record
6205     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6206                                                           T->getDecl()));
6207   if (!Record)
6208     return QualType();
6209 
6210   QualType Result = TL.getType();
6211   if (getDerived().AlwaysRebuild() ||
6212       Record != T->getDecl()) {
6213     Result = getDerived().RebuildRecordType(Record);
6214     if (Result.isNull())
6215       return QualType();
6216   }
6217 
6218   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6219   NewTL.setNameLoc(TL.getNameLoc());
6220 
6221   return Result;
6222 }
6223 
6224 template<typename Derived>
6225 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6226                                                    EnumTypeLoc TL) {
6227   const EnumType *T = TL.getTypePtr();
6228   EnumDecl *Enum
6229     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6230                                                         T->getDecl()));
6231   if (!Enum)
6232     return QualType();
6233 
6234   QualType Result = TL.getType();
6235   if (getDerived().AlwaysRebuild() ||
6236       Enum != T->getDecl()) {
6237     Result = getDerived().RebuildEnumType(Enum);
6238     if (Result.isNull())
6239       return QualType();
6240   }
6241 
6242   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6243   NewTL.setNameLoc(TL.getNameLoc());
6244 
6245   return Result;
6246 }
6247 
6248 template<typename Derived>
6249 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6250                                          TypeLocBuilder &TLB,
6251                                          InjectedClassNameTypeLoc TL) {
6252   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6253                                        TL.getTypePtr()->getDecl());
6254   if (!D) return QualType();
6255 
6256   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6257   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6258   return T;
6259 }
6260 
6261 template<typename Derived>
6262 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6263                                                 TypeLocBuilder &TLB,
6264                                                 TemplateTypeParmTypeLoc TL) {
6265   return TransformTypeSpecType(TLB, TL);
6266 }
6267 
6268 template<typename Derived>
6269 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6270                                          TypeLocBuilder &TLB,
6271                                          SubstTemplateTypeParmTypeLoc TL) {
6272   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6273 
6274   // Substitute into the replacement type, which itself might involve something
6275   // that needs to be transformed. This only tends to occur with default
6276   // template arguments of template template parameters.
6277   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6278   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6279   if (Replacement.isNull())
6280     return QualType();
6281 
6282   // Always canonicalize the replacement type.
6283   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6284   QualType Result
6285     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6286                                                    Replacement);
6287 
6288   // Propagate type-source information.
6289   SubstTemplateTypeParmTypeLoc NewTL
6290     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6291   NewTL.setNameLoc(TL.getNameLoc());
6292   return Result;
6293 
6294 }
6295 
6296 template<typename Derived>
6297 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6298                                           TypeLocBuilder &TLB,
6299                                           SubstTemplateTypeParmPackTypeLoc TL) {
6300   return TransformTypeSpecType(TLB, TL);
6301 }
6302 
6303 template<typename Derived>
6304 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6305                                                         TypeLocBuilder &TLB,
6306                                            TemplateSpecializationTypeLoc TL) {
6307   const TemplateSpecializationType *T = TL.getTypePtr();
6308 
6309   // The nested-name-specifier never matters in a TemplateSpecializationType,
6310   // because we can't have a dependent nested-name-specifier anyway.
6311   CXXScopeSpec SS;
6312   TemplateName Template
6313     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6314                                          TL.getTemplateNameLoc());
6315   if (Template.isNull())
6316     return QualType();
6317 
6318   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6319 }
6320 
6321 template<typename Derived>
6322 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6323                                                      AtomicTypeLoc TL) {
6324   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6325   if (ValueType.isNull())
6326     return QualType();
6327 
6328   QualType Result = TL.getType();
6329   if (getDerived().AlwaysRebuild() ||
6330       ValueType != TL.getValueLoc().getType()) {
6331     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6332     if (Result.isNull())
6333       return QualType();
6334   }
6335 
6336   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6337   NewTL.setKWLoc(TL.getKWLoc());
6338   NewTL.setLParenLoc(TL.getLParenLoc());
6339   NewTL.setRParenLoc(TL.getRParenLoc());
6340 
6341   return Result;
6342 }
6343 
6344 template <typename Derived>
6345 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6346                                                    PipeTypeLoc TL) {
6347   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6348   if (ValueType.isNull())
6349     return QualType();
6350 
6351   QualType Result = TL.getType();
6352   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6353     const PipeType *PT = Result->castAs<PipeType>();
6354     bool isReadPipe = PT->isReadOnly();
6355     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6356     if (Result.isNull())
6357       return QualType();
6358   }
6359 
6360   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6361   NewTL.setKWLoc(TL.getKWLoc());
6362 
6363   return Result;
6364 }
6365 
6366 template <typename Derived>
6367 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6368                                                      ExtIntTypeLoc TL) {
6369   const ExtIntType *EIT = TL.getTypePtr();
6370   QualType Result = TL.getType();
6371 
6372   if (getDerived().AlwaysRebuild()) {
6373     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6374                                             EIT->getNumBits(), TL.getNameLoc());
6375     if (Result.isNull())
6376       return QualType();
6377   }
6378 
6379   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6380   NewTL.setNameLoc(TL.getNameLoc());
6381   return Result;
6382 }
6383 
6384 template <typename Derived>
6385 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6386     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6387   const DependentExtIntType *EIT = TL.getTypePtr();
6388 
6389   EnterExpressionEvaluationContext Unevaluated(
6390       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6391   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6392   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6393 
6394   if (BitsExpr.isInvalid())
6395     return QualType();
6396 
6397   QualType Result = TL.getType();
6398 
6399   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6400     Result = getDerived().RebuildDependentExtIntType(
6401         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6402 
6403     if (Result.isNull())
6404       return QualType();
6405   }
6406 
6407   if (isa<DependentExtIntType>(Result)) {
6408     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6409     NewTL.setNameLoc(TL.getNameLoc());
6410   } else {
6411     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6412     NewTL.setNameLoc(TL.getNameLoc());
6413   }
6414   return Result;
6415 }
6416 
6417   /// Simple iterator that traverses the template arguments in a
6418   /// container that provides a \c getArgLoc() member function.
6419   ///
6420   /// This iterator is intended to be used with the iterator form of
6421   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6422   template<typename ArgLocContainer>
6423   class TemplateArgumentLocContainerIterator {
6424     ArgLocContainer *Container;
6425     unsigned Index;
6426 
6427   public:
6428     typedef TemplateArgumentLoc value_type;
6429     typedef TemplateArgumentLoc reference;
6430     typedef int difference_type;
6431     typedef std::input_iterator_tag iterator_category;
6432 
6433     class pointer {
6434       TemplateArgumentLoc Arg;
6435 
6436     public:
6437       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6438 
6439       const TemplateArgumentLoc *operator->() const {
6440         return &Arg;
6441       }
6442     };
6443 
6444 
6445     TemplateArgumentLocContainerIterator() {}
6446 
6447     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6448                                  unsigned Index)
6449       : Container(&Container), Index(Index) { }
6450 
6451     TemplateArgumentLocContainerIterator &operator++() {
6452       ++Index;
6453       return *this;
6454     }
6455 
6456     TemplateArgumentLocContainerIterator operator++(int) {
6457       TemplateArgumentLocContainerIterator Old(*this);
6458       ++(*this);
6459       return Old;
6460     }
6461 
6462     TemplateArgumentLoc operator*() const {
6463       return Container->getArgLoc(Index);
6464     }
6465 
6466     pointer operator->() const {
6467       return pointer(Container->getArgLoc(Index));
6468     }
6469 
6470     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6471                            const TemplateArgumentLocContainerIterator &Y) {
6472       return X.Container == Y.Container && X.Index == Y.Index;
6473     }
6474 
6475     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6476                            const TemplateArgumentLocContainerIterator &Y) {
6477       return !(X == Y);
6478     }
6479   };
6480 
6481 template<typename Derived>
6482 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6483                                                    AutoTypeLoc TL) {
6484   const AutoType *T = TL.getTypePtr();
6485   QualType OldDeduced = T->getDeducedType();
6486   QualType NewDeduced;
6487   if (!OldDeduced.isNull()) {
6488     NewDeduced = getDerived().TransformType(OldDeduced);
6489     if (NewDeduced.isNull())
6490       return QualType();
6491   }
6492 
6493   ConceptDecl *NewCD = nullptr;
6494   TemplateArgumentListInfo NewTemplateArgs;
6495   NestedNameSpecifierLoc NewNestedNameSpec;
6496   if (TL.getTypePtr()->isConstrained()) {
6497     NewCD = cast_or_null<ConceptDecl>(
6498         getDerived().TransformDecl(
6499             TL.getConceptNameLoc(),
6500             TL.getTypePtr()->getTypeConstraintConcept()));
6501 
6502     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6503     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6504     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6505     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6506                                                 ArgIterator(TL,
6507                                                             TL.getNumArgs()),
6508                                                 NewTemplateArgs))
6509       return QualType();
6510 
6511     if (TL.getNestedNameSpecifierLoc()) {
6512       NewNestedNameSpec
6513         = getDerived().TransformNestedNameSpecifierLoc(
6514             TL.getNestedNameSpecifierLoc());
6515       if (!NewNestedNameSpec)
6516         return QualType();
6517     }
6518   }
6519 
6520   QualType Result = TL.getType();
6521   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6522       T->isDependentType()) {
6523     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6524     NewArgList.reserve(NewArgList.size());
6525     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6526       NewArgList.push_back(ArgLoc.getArgument());
6527     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6528                                           NewArgList);
6529     if (Result.isNull())
6530       return QualType();
6531   }
6532 
6533   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6534   NewTL.setNameLoc(TL.getNameLoc());
6535   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6536   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6537   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6538   NewTL.setFoundDecl(TL.getFoundDecl());
6539   NewTL.setLAngleLoc(TL.getLAngleLoc());
6540   NewTL.setRAngleLoc(TL.getRAngleLoc());
6541   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6542     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6543 
6544   return Result;
6545 }
6546 
6547 template <typename Derived>
6548 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6549                                                         TypeLocBuilder &TLB,
6550                                            TemplateSpecializationTypeLoc TL,
6551                                                       TemplateName Template) {
6552   TemplateArgumentListInfo NewTemplateArgs;
6553   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6554   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6555   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6556     ArgIterator;
6557   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6558                                               ArgIterator(TL, TL.getNumArgs()),
6559                                               NewTemplateArgs))
6560     return QualType();
6561 
6562   // FIXME: maybe don't rebuild if all the template arguments are the same.
6563 
6564   QualType Result =
6565     getDerived().RebuildTemplateSpecializationType(Template,
6566                                                    TL.getTemplateNameLoc(),
6567                                                    NewTemplateArgs);
6568 
6569   if (!Result.isNull()) {
6570     // Specializations of template template parameters are represented as
6571     // TemplateSpecializationTypes, and substitution of type alias templates
6572     // within a dependent context can transform them into
6573     // DependentTemplateSpecializationTypes.
6574     if (isa<DependentTemplateSpecializationType>(Result)) {
6575       DependentTemplateSpecializationTypeLoc NewTL
6576         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6577       NewTL.setElaboratedKeywordLoc(SourceLocation());
6578       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
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       return Result;
6586     }
6587 
6588     TemplateSpecializationTypeLoc NewTL
6589       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6590     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6591     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6592     NewTL.setLAngleLoc(TL.getLAngleLoc());
6593     NewTL.setRAngleLoc(TL.getRAngleLoc());
6594     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6595       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6596   }
6597 
6598   return Result;
6599 }
6600 
6601 template <typename Derived>
6602 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6603                                      TypeLocBuilder &TLB,
6604                                      DependentTemplateSpecializationTypeLoc TL,
6605                                      TemplateName Template,
6606                                      CXXScopeSpec &SS) {
6607   TemplateArgumentListInfo NewTemplateArgs;
6608   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6609   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6610   typedef TemplateArgumentLocContainerIterator<
6611             DependentTemplateSpecializationTypeLoc> ArgIterator;
6612   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6613                                               ArgIterator(TL, TL.getNumArgs()),
6614                                               NewTemplateArgs))
6615     return QualType();
6616 
6617   // FIXME: maybe don't rebuild if all the template arguments are the same.
6618 
6619   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6620     QualType Result
6621       = getSema().Context.getDependentTemplateSpecializationType(
6622                                                 TL.getTypePtr()->getKeyword(),
6623                                                          DTN->getQualifier(),
6624                                                          DTN->getIdentifier(),
6625                                                                NewTemplateArgs);
6626 
6627     DependentTemplateSpecializationTypeLoc NewTL
6628       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6629     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6630     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6631     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6632     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6633     NewTL.setLAngleLoc(TL.getLAngleLoc());
6634     NewTL.setRAngleLoc(TL.getRAngleLoc());
6635     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6636       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6637     return Result;
6638   }
6639 
6640   QualType Result
6641     = getDerived().RebuildTemplateSpecializationType(Template,
6642                                                      TL.getTemplateNameLoc(),
6643                                                      NewTemplateArgs);
6644 
6645   if (!Result.isNull()) {
6646     /// FIXME: Wrap this in an elaborated-type-specifier?
6647     TemplateSpecializationTypeLoc NewTL
6648       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6649     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6650     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6651     NewTL.setLAngleLoc(TL.getLAngleLoc());
6652     NewTL.setRAngleLoc(TL.getRAngleLoc());
6653     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6654       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6655   }
6656 
6657   return Result;
6658 }
6659 
6660 template<typename Derived>
6661 QualType
6662 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6663                                                 ElaboratedTypeLoc TL) {
6664   const ElaboratedType *T = TL.getTypePtr();
6665 
6666   NestedNameSpecifierLoc QualifierLoc;
6667   // NOTE: the qualifier in an ElaboratedType is optional.
6668   if (TL.getQualifierLoc()) {
6669     QualifierLoc
6670       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6671     if (!QualifierLoc)
6672       return QualType();
6673   }
6674 
6675   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6676   if (NamedT.isNull())
6677     return QualType();
6678 
6679   // C++0x [dcl.type.elab]p2:
6680   //   If the identifier resolves to a typedef-name or the simple-template-id
6681   //   resolves to an alias template specialization, the
6682   //   elaborated-type-specifier is ill-formed.
6683   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6684     if (const TemplateSpecializationType *TST =
6685           NamedT->getAs<TemplateSpecializationType>()) {
6686       TemplateName Template = TST->getTemplateName();
6687       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6688               Template.getAsTemplateDecl())) {
6689         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6690                      diag::err_tag_reference_non_tag)
6691             << TAT << Sema::NTK_TypeAliasTemplate
6692             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6693         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6694       }
6695     }
6696   }
6697 
6698   QualType Result = TL.getType();
6699   if (getDerived().AlwaysRebuild() ||
6700       QualifierLoc != TL.getQualifierLoc() ||
6701       NamedT != T->getNamedType()) {
6702     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6703                                                 T->getKeyword(),
6704                                                 QualifierLoc, NamedT);
6705     if (Result.isNull())
6706       return QualType();
6707   }
6708 
6709   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6710   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6711   NewTL.setQualifierLoc(QualifierLoc);
6712   return Result;
6713 }
6714 
6715 template<typename Derived>
6716 QualType TreeTransform<Derived>::TransformAttributedType(
6717                                                 TypeLocBuilder &TLB,
6718                                                 AttributedTypeLoc TL) {
6719   const AttributedType *oldType = TL.getTypePtr();
6720   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6721   if (modifiedType.isNull())
6722     return QualType();
6723 
6724   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6725   const Attr *oldAttr = TL.getAttr();
6726   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6727   if (oldAttr && !newAttr)
6728     return QualType();
6729 
6730   QualType result = TL.getType();
6731 
6732   // FIXME: dependent operand expressions?
6733   if (getDerived().AlwaysRebuild() ||
6734       modifiedType != oldType->getModifiedType()) {
6735     // TODO: this is really lame; we should really be rebuilding the
6736     // equivalent type from first principles.
6737     QualType equivalentType
6738       = getDerived().TransformType(oldType->getEquivalentType());
6739     if (equivalentType.isNull())
6740       return QualType();
6741 
6742     // Check whether we can add nullability; it is only represented as
6743     // type sugar, and therefore cannot be diagnosed in any other way.
6744     if (auto nullability = oldType->getImmediateNullability()) {
6745       if (!modifiedType->canHaveNullability()) {
6746         SemaRef.Diag(TL.getAttr()->getLocation(),
6747                      diag::err_nullability_nonpointer)
6748             << DiagNullabilityKind(*nullability, false) << modifiedType;
6749         return QualType();
6750       }
6751     }
6752 
6753     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6754                                                modifiedType,
6755                                                equivalentType);
6756   }
6757 
6758   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6759   newTL.setAttr(newAttr);
6760   return result;
6761 }
6762 
6763 template<typename Derived>
6764 QualType
6765 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6766                                            ParenTypeLoc TL) {
6767   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6768   if (Inner.isNull())
6769     return QualType();
6770 
6771   QualType Result = TL.getType();
6772   if (getDerived().AlwaysRebuild() ||
6773       Inner != TL.getInnerLoc().getType()) {
6774     Result = getDerived().RebuildParenType(Inner);
6775     if (Result.isNull())
6776       return QualType();
6777   }
6778 
6779   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6780   NewTL.setLParenLoc(TL.getLParenLoc());
6781   NewTL.setRParenLoc(TL.getRParenLoc());
6782   return Result;
6783 }
6784 
6785 template <typename Derived>
6786 QualType
6787 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6788                                                     MacroQualifiedTypeLoc TL) {
6789   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6790   if (Inner.isNull())
6791     return QualType();
6792 
6793   QualType Result = TL.getType();
6794   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6795     Result =
6796         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6797     if (Result.isNull())
6798       return QualType();
6799   }
6800 
6801   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6802   NewTL.setExpansionLoc(TL.getExpansionLoc());
6803   return Result;
6804 }
6805 
6806 template<typename Derived>
6807 QualType TreeTransform<Derived>::TransformDependentNameType(
6808     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6809   return TransformDependentNameType(TLB, TL, false);
6810 }
6811 
6812 template<typename Derived>
6813 QualType TreeTransform<Derived>::TransformDependentNameType(
6814     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6815   const DependentNameType *T = TL.getTypePtr();
6816 
6817   NestedNameSpecifierLoc QualifierLoc
6818     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6819   if (!QualifierLoc)
6820     return QualType();
6821 
6822   QualType Result
6823     = getDerived().RebuildDependentNameType(T->getKeyword(),
6824                                             TL.getElaboratedKeywordLoc(),
6825                                             QualifierLoc,
6826                                             T->getIdentifier(),
6827                                             TL.getNameLoc(),
6828                                             DeducedTSTContext);
6829   if (Result.isNull())
6830     return QualType();
6831 
6832   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6833     QualType NamedT = ElabT->getNamedType();
6834     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6835 
6836     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6837     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6838     NewTL.setQualifierLoc(QualifierLoc);
6839   } else {
6840     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6841     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6842     NewTL.setQualifierLoc(QualifierLoc);
6843     NewTL.setNameLoc(TL.getNameLoc());
6844   }
6845   return Result;
6846 }
6847 
6848 template<typename Derived>
6849 QualType TreeTransform<Derived>::
6850           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6851                                  DependentTemplateSpecializationTypeLoc TL) {
6852   NestedNameSpecifierLoc QualifierLoc;
6853   if (TL.getQualifierLoc()) {
6854     QualifierLoc
6855       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6856     if (!QualifierLoc)
6857       return QualType();
6858   }
6859 
6860   return getDerived()
6861            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6862 }
6863 
6864 template<typename Derived>
6865 QualType TreeTransform<Derived>::
6866 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6867                                    DependentTemplateSpecializationTypeLoc TL,
6868                                        NestedNameSpecifierLoc QualifierLoc) {
6869   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6870 
6871   TemplateArgumentListInfo NewTemplateArgs;
6872   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6873   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6874 
6875   typedef TemplateArgumentLocContainerIterator<
6876   DependentTemplateSpecializationTypeLoc> ArgIterator;
6877   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6878                                               ArgIterator(TL, TL.getNumArgs()),
6879                                               NewTemplateArgs))
6880     return QualType();
6881 
6882   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6883       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6884       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6885       /*AllowInjectedClassName*/ false);
6886   if (Result.isNull())
6887     return QualType();
6888 
6889   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6890     QualType NamedT = ElabT->getNamedType();
6891 
6892     // Copy information relevant to the template specialization.
6893     TemplateSpecializationTypeLoc NamedTL
6894       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6895     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6896     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6897     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6898     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6899     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6900       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6901 
6902     // Copy information relevant to the elaborated type.
6903     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6904     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6905     NewTL.setQualifierLoc(QualifierLoc);
6906   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6907     DependentTemplateSpecializationTypeLoc SpecTL
6908       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6909     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6910     SpecTL.setQualifierLoc(QualifierLoc);
6911     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6912     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6913     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6914     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6915     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6916       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6917   } else {
6918     TemplateSpecializationTypeLoc SpecTL
6919       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6920     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6921     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6922     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6923     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6924     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6925       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6926   }
6927   return Result;
6928 }
6929 
6930 template<typename Derived>
6931 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6932                                                       PackExpansionTypeLoc TL) {
6933   QualType Pattern
6934     = getDerived().TransformType(TLB, TL.getPatternLoc());
6935   if (Pattern.isNull())
6936     return QualType();
6937 
6938   QualType Result = TL.getType();
6939   if (getDerived().AlwaysRebuild() ||
6940       Pattern != TL.getPatternLoc().getType()) {
6941     Result = getDerived().RebuildPackExpansionType(Pattern,
6942                                            TL.getPatternLoc().getSourceRange(),
6943                                                    TL.getEllipsisLoc(),
6944                                            TL.getTypePtr()->getNumExpansions());
6945     if (Result.isNull())
6946       return QualType();
6947   }
6948 
6949   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6950   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6951   return Result;
6952 }
6953 
6954 template<typename Derived>
6955 QualType
6956 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6957                                                    ObjCInterfaceTypeLoc TL) {
6958   // ObjCInterfaceType is never dependent.
6959   TLB.pushFullCopy(TL);
6960   return TL.getType();
6961 }
6962 
6963 template<typename Derived>
6964 QualType
6965 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6966                                                    ObjCTypeParamTypeLoc TL) {
6967   const ObjCTypeParamType *T = TL.getTypePtr();
6968   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6969       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6970   if (!OTP)
6971     return QualType();
6972 
6973   QualType Result = TL.getType();
6974   if (getDerived().AlwaysRebuild() ||
6975       OTP != T->getDecl()) {
6976     Result = getDerived().RebuildObjCTypeParamType(OTP,
6977                  TL.getProtocolLAngleLoc(),
6978                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6979                                     TL.getNumProtocols()),
6980                  TL.getProtocolLocs(),
6981                  TL.getProtocolRAngleLoc());
6982     if (Result.isNull())
6983       return QualType();
6984   }
6985 
6986   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6987   if (TL.getNumProtocols()) {
6988     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6989     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6990       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6991     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6992   }
6993   return Result;
6994 }
6995 
6996 template<typename Derived>
6997 QualType
6998 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6999                                                 ObjCObjectTypeLoc TL) {
7000   // Transform base type.
7001   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7002   if (BaseType.isNull())
7003     return QualType();
7004 
7005   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7006 
7007   // Transform type arguments.
7008   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7009   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7010     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7011     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7012     QualType TypeArg = TypeArgInfo->getType();
7013     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7014       AnyChanged = true;
7015 
7016       // We have a pack expansion. Instantiate it.
7017       const auto *PackExpansion = PackExpansionLoc.getType()
7018                                     ->castAs<PackExpansionType>();
7019       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7020       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7021                                               Unexpanded);
7022       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7023 
7024       // Determine whether the set of unexpanded parameter packs can
7025       // and should be expanded.
7026       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7027       bool Expand = false;
7028       bool RetainExpansion = false;
7029       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7030       if (getDerived().TryExpandParameterPacks(
7031             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7032             Unexpanded, Expand, RetainExpansion, NumExpansions))
7033         return QualType();
7034 
7035       if (!Expand) {
7036         // We can't expand this pack expansion into separate arguments yet;
7037         // just substitute into the pattern and create a new pack expansion
7038         // type.
7039         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7040 
7041         TypeLocBuilder TypeArgBuilder;
7042         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7043         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7044                                                              PatternLoc);
7045         if (NewPatternType.isNull())
7046           return QualType();
7047 
7048         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7049                                       NewPatternType, NumExpansions);
7050         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7051         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7052         NewTypeArgInfos.push_back(
7053           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7054         continue;
7055       }
7056 
7057       // Substitute into the pack expansion pattern for each slice of the
7058       // pack.
7059       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7060         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7061 
7062         TypeLocBuilder TypeArgBuilder;
7063         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7064 
7065         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7066                                                          PatternLoc);
7067         if (NewTypeArg.isNull())
7068           return QualType();
7069 
7070         NewTypeArgInfos.push_back(
7071           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7072       }
7073 
7074       continue;
7075     }
7076 
7077     TypeLocBuilder TypeArgBuilder;
7078     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7079     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7080     if (NewTypeArg.isNull())
7081       return QualType();
7082 
7083     // If nothing changed, just keep the old TypeSourceInfo.
7084     if (NewTypeArg == TypeArg) {
7085       NewTypeArgInfos.push_back(TypeArgInfo);
7086       continue;
7087     }
7088 
7089     NewTypeArgInfos.push_back(
7090       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7091     AnyChanged = true;
7092   }
7093 
7094   QualType Result = TL.getType();
7095   if (getDerived().AlwaysRebuild() || AnyChanged) {
7096     // Rebuild the type.
7097     Result = getDerived().RebuildObjCObjectType(
7098         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7099         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7100         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7101         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7102 
7103     if (Result.isNull())
7104       return QualType();
7105   }
7106 
7107   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7108   NewT.setHasBaseTypeAsWritten(true);
7109   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7110   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7111     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7112   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7113   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7114   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7115     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7116   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7117   return Result;
7118 }
7119 
7120 template<typename Derived>
7121 QualType
7122 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7123                                                ObjCObjectPointerTypeLoc TL) {
7124   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7125   if (PointeeType.isNull())
7126     return QualType();
7127 
7128   QualType Result = TL.getType();
7129   if (getDerived().AlwaysRebuild() ||
7130       PointeeType != TL.getPointeeLoc().getType()) {
7131     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7132                                                        TL.getStarLoc());
7133     if (Result.isNull())
7134       return QualType();
7135   }
7136 
7137   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7138   NewT.setStarLoc(TL.getStarLoc());
7139   return Result;
7140 }
7141 
7142 //===----------------------------------------------------------------------===//
7143 // Statement transformation
7144 //===----------------------------------------------------------------------===//
7145 template<typename Derived>
7146 StmtResult
7147 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7148   return S;
7149 }
7150 
7151 template<typename Derived>
7152 StmtResult
7153 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7154   return getDerived().TransformCompoundStmt(S, false);
7155 }
7156 
7157 template<typename Derived>
7158 StmtResult
7159 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7160                                               bool IsStmtExpr) {
7161   Sema::CompoundScopeRAII CompoundScope(getSema());
7162 
7163   const Stmt *ExprResult = S->getStmtExprResult();
7164   bool SubStmtInvalid = false;
7165   bool SubStmtChanged = false;
7166   SmallVector<Stmt*, 8> Statements;
7167   for (auto *B : S->body()) {
7168     StmtResult Result = getDerived().TransformStmt(
7169         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7170 
7171     if (Result.isInvalid()) {
7172       // Immediately fail if this was a DeclStmt, since it's very
7173       // likely that this will cause problems for future statements.
7174       if (isa<DeclStmt>(B))
7175         return StmtError();
7176 
7177       // Otherwise, just keep processing substatements and fail later.
7178       SubStmtInvalid = true;
7179       continue;
7180     }
7181 
7182     SubStmtChanged = SubStmtChanged || Result.get() != B;
7183     Statements.push_back(Result.getAs<Stmt>());
7184   }
7185 
7186   if (SubStmtInvalid)
7187     return StmtError();
7188 
7189   if (!getDerived().AlwaysRebuild() &&
7190       !SubStmtChanged)
7191     return S;
7192 
7193   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7194                                           Statements,
7195                                           S->getRBracLoc(),
7196                                           IsStmtExpr);
7197 }
7198 
7199 template<typename Derived>
7200 StmtResult
7201 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7202   ExprResult LHS, RHS;
7203   {
7204     EnterExpressionEvaluationContext Unevaluated(
7205         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7206 
7207     // Transform the left-hand case value.
7208     LHS = getDerived().TransformExpr(S->getLHS());
7209     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7210     if (LHS.isInvalid())
7211       return StmtError();
7212 
7213     // Transform the right-hand case value (for the GNU case-range extension).
7214     RHS = getDerived().TransformExpr(S->getRHS());
7215     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7216     if (RHS.isInvalid())
7217       return StmtError();
7218   }
7219 
7220   // Build the case statement.
7221   // Case statements are always rebuilt so that they will attached to their
7222   // transformed switch statement.
7223   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7224                                                        LHS.get(),
7225                                                        S->getEllipsisLoc(),
7226                                                        RHS.get(),
7227                                                        S->getColonLoc());
7228   if (Case.isInvalid())
7229     return StmtError();
7230 
7231   // Transform the statement following the case
7232   StmtResult SubStmt =
7233       getDerived().TransformStmt(S->getSubStmt());
7234   if (SubStmt.isInvalid())
7235     return StmtError();
7236 
7237   // Attach the body to the case statement
7238   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7239 }
7240 
7241 template <typename Derived>
7242 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7243   // Transform the statement following the default case
7244   StmtResult SubStmt =
7245       getDerived().TransformStmt(S->getSubStmt());
7246   if (SubStmt.isInvalid())
7247     return StmtError();
7248 
7249   // Default statements are always rebuilt
7250   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7251                                          SubStmt.get());
7252 }
7253 
7254 template<typename Derived>
7255 StmtResult
7256 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7257   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7258   if (SubStmt.isInvalid())
7259     return StmtError();
7260 
7261   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7262                                         S->getDecl());
7263   if (!LD)
7264     return StmtError();
7265 
7266   // If we're transforming "in-place" (we're not creating new local
7267   // declarations), assume we're replacing the old label statement
7268   // and clear out the reference to it.
7269   if (LD == S->getDecl())
7270     S->getDecl()->setStmt(nullptr);
7271 
7272   // FIXME: Pass the real colon location in.
7273   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7274                                        cast<LabelDecl>(LD), SourceLocation(),
7275                                        SubStmt.get());
7276 }
7277 
7278 template <typename Derived>
7279 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7280   if (!R)
7281     return R;
7282 
7283   switch (R->getKind()) {
7284 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7285 #define ATTR(X)
7286 #define PRAGMA_SPELLING_ATTR(X)                                                \
7287   case attr::X:                                                                \
7288     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7289 #include "clang/Basic/AttrList.inc"
7290   default:
7291     return R;
7292   }
7293 }
7294 
7295 template <typename Derived>
7296 StmtResult
7297 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7298                                                 StmtDiscardKind SDK) {
7299   bool AttrsChanged = false;
7300   SmallVector<const Attr *, 1> Attrs;
7301 
7302   // Visit attributes and keep track if any are transformed.
7303   for (const auto *I : S->getAttrs()) {
7304     const Attr *R = getDerived().TransformAttr(I);
7305     AttrsChanged |= (I != R);
7306     Attrs.push_back(R);
7307   }
7308 
7309   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7310   if (SubStmt.isInvalid())
7311     return StmtError();
7312 
7313   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7314     return S;
7315 
7316   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7317                                             SubStmt.get());
7318 }
7319 
7320 template<typename Derived>
7321 StmtResult
7322 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7323   // Transform the initialization statement
7324   StmtResult Init = getDerived().TransformStmt(S->getInit());
7325   if (Init.isInvalid())
7326     return StmtError();
7327 
7328   // Transform the condition
7329   Sema::ConditionResult Cond = getDerived().TransformCondition(
7330       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7331       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7332                        : Sema::ConditionKind::Boolean);
7333   if (Cond.isInvalid())
7334     return StmtError();
7335 
7336   // If this is a constexpr if, determine which arm we should instantiate.
7337   llvm::Optional<bool> ConstexprConditionValue;
7338   if (S->isConstexpr())
7339     ConstexprConditionValue = Cond.getKnownValue();
7340 
7341   // Transform the "then" branch.
7342   StmtResult Then;
7343   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7344     Then = getDerived().TransformStmt(S->getThen());
7345     if (Then.isInvalid())
7346       return StmtError();
7347   } else {
7348     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7349   }
7350 
7351   // Transform the "else" branch.
7352   StmtResult Else;
7353   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7354     Else = getDerived().TransformStmt(S->getElse());
7355     if (Else.isInvalid())
7356       return StmtError();
7357   }
7358 
7359   if (!getDerived().AlwaysRebuild() &&
7360       Init.get() == S->getInit() &&
7361       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7362       Then.get() == S->getThen() &&
7363       Else.get() == S->getElse())
7364     return S;
7365 
7366   return getDerived().RebuildIfStmt(
7367       S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond,
7368       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7369 }
7370 
7371 template<typename Derived>
7372 StmtResult
7373 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7374   // Transform the initialization statement
7375   StmtResult Init = getDerived().TransformStmt(S->getInit());
7376   if (Init.isInvalid())
7377     return StmtError();
7378 
7379   // Transform the condition.
7380   Sema::ConditionResult Cond = getDerived().TransformCondition(
7381       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7382       Sema::ConditionKind::Switch);
7383   if (Cond.isInvalid())
7384     return StmtError();
7385 
7386   // Rebuild the switch statement.
7387   StmtResult Switch =
7388       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7389                                           Init.get(), Cond, S->getRParenLoc());
7390   if (Switch.isInvalid())
7391     return StmtError();
7392 
7393   // Transform the body of the switch statement.
7394   StmtResult Body = getDerived().TransformStmt(S->getBody());
7395   if (Body.isInvalid())
7396     return StmtError();
7397 
7398   // Complete the switch statement.
7399   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7400                                             Body.get());
7401 }
7402 
7403 template<typename Derived>
7404 StmtResult
7405 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7406   // Transform the condition
7407   Sema::ConditionResult Cond = getDerived().TransformCondition(
7408       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7409       Sema::ConditionKind::Boolean);
7410   if (Cond.isInvalid())
7411     return StmtError();
7412 
7413   // Transform the body
7414   StmtResult Body = getDerived().TransformStmt(S->getBody());
7415   if (Body.isInvalid())
7416     return StmtError();
7417 
7418   if (!getDerived().AlwaysRebuild() &&
7419       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7420       Body.get() == S->getBody())
7421     return Owned(S);
7422 
7423   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7424                                        Cond, S->getRParenLoc(), Body.get());
7425 }
7426 
7427 template<typename Derived>
7428 StmtResult
7429 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7430   // Transform the body
7431   StmtResult Body = getDerived().TransformStmt(S->getBody());
7432   if (Body.isInvalid())
7433     return StmtError();
7434 
7435   // Transform the condition
7436   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7437   if (Cond.isInvalid())
7438     return StmtError();
7439 
7440   if (!getDerived().AlwaysRebuild() &&
7441       Cond.get() == S->getCond() &&
7442       Body.get() == S->getBody())
7443     return S;
7444 
7445   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7446                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7447                                     S->getRParenLoc());
7448 }
7449 
7450 template<typename Derived>
7451 StmtResult
7452 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7453   if (getSema().getLangOpts().OpenMP)
7454     getSema().startOpenMPLoop();
7455 
7456   // Transform the initialization statement
7457   StmtResult Init = getDerived().TransformStmt(S->getInit());
7458   if (Init.isInvalid())
7459     return StmtError();
7460 
7461   // In OpenMP loop region loop control variable must be captured and be
7462   // private. Perform analysis of first part (if any).
7463   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7464     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7465 
7466   // Transform the condition
7467   Sema::ConditionResult Cond = getDerived().TransformCondition(
7468       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7469       Sema::ConditionKind::Boolean);
7470   if (Cond.isInvalid())
7471     return StmtError();
7472 
7473   // Transform the increment
7474   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7475   if (Inc.isInvalid())
7476     return StmtError();
7477 
7478   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7479   if (S->getInc() && !FullInc.get())
7480     return StmtError();
7481 
7482   // Transform the body
7483   StmtResult Body = getDerived().TransformStmt(S->getBody());
7484   if (Body.isInvalid())
7485     return StmtError();
7486 
7487   if (!getDerived().AlwaysRebuild() &&
7488       Init.get() == S->getInit() &&
7489       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7490       Inc.get() == S->getInc() &&
7491       Body.get() == S->getBody())
7492     return S;
7493 
7494   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7495                                      Init.get(), Cond, FullInc,
7496                                      S->getRParenLoc(), Body.get());
7497 }
7498 
7499 template<typename Derived>
7500 StmtResult
7501 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7502   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7503                                         S->getLabel());
7504   if (!LD)
7505     return StmtError();
7506 
7507   // Goto statements must always be rebuilt, to resolve the label.
7508   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7509                                       cast<LabelDecl>(LD));
7510 }
7511 
7512 template<typename Derived>
7513 StmtResult
7514 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7515   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7516   if (Target.isInvalid())
7517     return StmtError();
7518   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7519 
7520   if (!getDerived().AlwaysRebuild() &&
7521       Target.get() == S->getTarget())
7522     return S;
7523 
7524   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7525                                               Target.get());
7526 }
7527 
7528 template<typename Derived>
7529 StmtResult
7530 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7531   return S;
7532 }
7533 
7534 template<typename Derived>
7535 StmtResult
7536 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7537   return S;
7538 }
7539 
7540 template<typename Derived>
7541 StmtResult
7542 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7543   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7544                                                         /*NotCopyInit*/false);
7545   if (Result.isInvalid())
7546     return StmtError();
7547 
7548   // FIXME: We always rebuild the return statement because there is no way
7549   // to tell whether the return type of the function has changed.
7550   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7551 }
7552 
7553 template<typename Derived>
7554 StmtResult
7555 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7556   bool DeclChanged = false;
7557   SmallVector<Decl *, 4> Decls;
7558   for (auto *D : S->decls()) {
7559     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7560     if (!Transformed)
7561       return StmtError();
7562 
7563     if (Transformed != D)
7564       DeclChanged = true;
7565 
7566     Decls.push_back(Transformed);
7567   }
7568 
7569   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7570     return S;
7571 
7572   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7573 }
7574 
7575 template<typename Derived>
7576 StmtResult
7577 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7578 
7579   SmallVector<Expr*, 8> Constraints;
7580   SmallVector<Expr*, 8> Exprs;
7581   SmallVector<IdentifierInfo *, 4> Names;
7582 
7583   ExprResult AsmString;
7584   SmallVector<Expr*, 8> Clobbers;
7585 
7586   bool ExprsChanged = false;
7587 
7588   // Go through the outputs.
7589   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7590     Names.push_back(S->getOutputIdentifier(I));
7591 
7592     // No need to transform the constraint literal.
7593     Constraints.push_back(S->getOutputConstraintLiteral(I));
7594 
7595     // Transform the output expr.
7596     Expr *OutputExpr = S->getOutputExpr(I);
7597     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7598     if (Result.isInvalid())
7599       return StmtError();
7600 
7601     ExprsChanged |= Result.get() != OutputExpr;
7602 
7603     Exprs.push_back(Result.get());
7604   }
7605 
7606   // Go through the inputs.
7607   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7608     Names.push_back(S->getInputIdentifier(I));
7609 
7610     // No need to transform the constraint literal.
7611     Constraints.push_back(S->getInputConstraintLiteral(I));
7612 
7613     // Transform the input expr.
7614     Expr *InputExpr = S->getInputExpr(I);
7615     ExprResult Result = getDerived().TransformExpr(InputExpr);
7616     if (Result.isInvalid())
7617       return StmtError();
7618 
7619     ExprsChanged |= Result.get() != InputExpr;
7620 
7621     Exprs.push_back(Result.get());
7622   }
7623 
7624   // Go through the Labels.
7625   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7626     Names.push_back(S->getLabelIdentifier(I));
7627 
7628     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7629     if (Result.isInvalid())
7630       return StmtError();
7631     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7632     Exprs.push_back(Result.get());
7633   }
7634   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7635     return S;
7636 
7637   // Go through the clobbers.
7638   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7639     Clobbers.push_back(S->getClobberStringLiteral(I));
7640 
7641   // No need to transform the asm string literal.
7642   AsmString = S->getAsmString();
7643   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7644                                         S->isVolatile(), S->getNumOutputs(),
7645                                         S->getNumInputs(), Names.data(),
7646                                         Constraints, Exprs, AsmString.get(),
7647                                         Clobbers, S->getNumLabels(),
7648                                         S->getRParenLoc());
7649 }
7650 
7651 template<typename Derived>
7652 StmtResult
7653 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7654   ArrayRef<Token> AsmToks =
7655     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7656 
7657   bool HadError = false, HadChange = false;
7658 
7659   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7660   SmallVector<Expr*, 8> TransformedExprs;
7661   TransformedExprs.reserve(SrcExprs.size());
7662   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7663     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7664     if (!Result.isUsable()) {
7665       HadError = true;
7666     } else {
7667       HadChange |= (Result.get() != SrcExprs[i]);
7668       TransformedExprs.push_back(Result.get());
7669     }
7670   }
7671 
7672   if (HadError) return StmtError();
7673   if (!HadChange && !getDerived().AlwaysRebuild())
7674     return Owned(S);
7675 
7676   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7677                                        AsmToks, S->getAsmString(),
7678                                        S->getNumOutputs(), S->getNumInputs(),
7679                                        S->getAllConstraints(), S->getClobbers(),
7680                                        TransformedExprs, S->getEndLoc());
7681 }
7682 
7683 // C++ Coroutines TS
7684 
7685 template<typename Derived>
7686 StmtResult
7687 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7688   auto *ScopeInfo = SemaRef.getCurFunction();
7689   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7690   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7691          ScopeInfo->NeedsCoroutineSuspends &&
7692          ScopeInfo->CoroutineSuspends.first == nullptr &&
7693          ScopeInfo->CoroutineSuspends.second == nullptr &&
7694          "expected clean scope info");
7695 
7696   // Set that we have (possibly-invalid) suspend points before we do anything
7697   // that may fail.
7698   ScopeInfo->setNeedsCoroutineSuspends(false);
7699 
7700   // We re-build the coroutine promise object (and the coroutine parameters its
7701   // type and constructor depend on) based on the types used in our current
7702   // function. We must do so, and set it on the current FunctionScopeInfo,
7703   // before attempting to transform the other parts of the coroutine body
7704   // statement, such as the implicit suspend statements (because those
7705   // statements reference the FunctionScopeInfo::CoroutinePromise).
7706   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7707     return StmtError();
7708   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7709   if (!Promise)
7710     return StmtError();
7711   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7712   ScopeInfo->CoroutinePromise = Promise;
7713 
7714   // Transform the implicit coroutine statements constructed using dependent
7715   // types during the previous parse: initial and final suspensions, the return
7716   // object, and others. We also transform the coroutine function's body.
7717   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7718   if (InitSuspend.isInvalid())
7719     return StmtError();
7720   StmtResult FinalSuspend =
7721       getDerived().TransformStmt(S->getFinalSuspendStmt());
7722   if (FinalSuspend.isInvalid() ||
7723       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7724     return StmtError();
7725   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7726   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7727 
7728   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7729   if (BodyRes.isInvalid())
7730     return StmtError();
7731 
7732   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7733   if (Builder.isInvalid())
7734     return StmtError();
7735 
7736   Expr *ReturnObject = S->getReturnValueInit();
7737   assert(ReturnObject && "the return object is expected to be valid");
7738   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7739                                                      /*NoCopyInit*/ false);
7740   if (Res.isInvalid())
7741     return StmtError();
7742   Builder.ReturnValue = Res.get();
7743 
7744   // If during the previous parse the coroutine still had a dependent promise
7745   // statement, we may need to build some implicit coroutine statements
7746   // (such as exception and fallthrough handlers) for the first time.
7747   if (S->hasDependentPromiseType()) {
7748     // We can only build these statements, however, if the current promise type
7749     // is not dependent.
7750     if (!Promise->getType()->isDependentType()) {
7751       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7752              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7753              "these nodes should not have been built yet");
7754       if (!Builder.buildDependentStatements())
7755         return StmtError();
7756     }
7757   } else {
7758     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7759       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7760       if (Res.isInvalid())
7761         return StmtError();
7762       Builder.OnFallthrough = Res.get();
7763     }
7764 
7765     if (auto *OnException = S->getExceptionHandler()) {
7766       StmtResult Res = getDerived().TransformStmt(OnException);
7767       if (Res.isInvalid())
7768         return StmtError();
7769       Builder.OnException = Res.get();
7770     }
7771 
7772     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7773       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7774       if (Res.isInvalid())
7775         return StmtError();
7776       Builder.ReturnStmtOnAllocFailure = Res.get();
7777     }
7778 
7779     // Transform any additional statements we may have already built
7780     assert(S->getAllocate() && S->getDeallocate() &&
7781            "allocation and deallocation calls must already be built");
7782     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7783     if (AllocRes.isInvalid())
7784       return StmtError();
7785     Builder.Allocate = AllocRes.get();
7786 
7787     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7788     if (DeallocRes.isInvalid())
7789       return StmtError();
7790     Builder.Deallocate = DeallocRes.get();
7791 
7792     assert(S->getResultDecl() && "ResultDecl must already be built");
7793     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7794     if (ResultDecl.isInvalid())
7795       return StmtError();
7796     Builder.ResultDecl = ResultDecl.get();
7797 
7798     if (auto *ReturnStmt = S->getReturnStmt()) {
7799       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7800       if (Res.isInvalid())
7801         return StmtError();
7802       Builder.ReturnStmt = Res.get();
7803     }
7804   }
7805 
7806   return getDerived().RebuildCoroutineBodyStmt(Builder);
7807 }
7808 
7809 template<typename Derived>
7810 StmtResult
7811 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7812   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7813                                                         /*NotCopyInit*/false);
7814   if (Result.isInvalid())
7815     return StmtError();
7816 
7817   // Always rebuild; we don't know if this needs to be injected into a new
7818   // context or if the promise type has changed.
7819   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7820                                           S->isImplicit());
7821 }
7822 
7823 template<typename Derived>
7824 ExprResult
7825 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7826   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7827                                                         /*NotCopyInit*/false);
7828   if (Result.isInvalid())
7829     return ExprError();
7830 
7831   // Always rebuild; we don't know if this needs to be injected into a new
7832   // context or if the promise type has changed.
7833   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7834                                          E->isImplicit());
7835 }
7836 
7837 template <typename Derived>
7838 ExprResult
7839 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7840   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7841                                                         /*NotCopyInit*/ false);
7842   if (OperandResult.isInvalid())
7843     return ExprError();
7844 
7845   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7846           E->getOperatorCoawaitLookup());
7847 
7848   if (LookupResult.isInvalid())
7849     return ExprError();
7850 
7851   // Always rebuild; we don't know if this needs to be injected into a new
7852   // context or if the promise type has changed.
7853   return getDerived().RebuildDependentCoawaitExpr(
7854       E->getKeywordLoc(), OperandResult.get(),
7855       cast<UnresolvedLookupExpr>(LookupResult.get()));
7856 }
7857 
7858 template<typename Derived>
7859 ExprResult
7860 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7861   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7862                                                         /*NotCopyInit*/false);
7863   if (Result.isInvalid())
7864     return ExprError();
7865 
7866   // Always rebuild; we don't know if this needs to be injected into a new
7867   // context or if the promise type has changed.
7868   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7869 }
7870 
7871 // Objective-C Statements.
7872 
7873 template<typename Derived>
7874 StmtResult
7875 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7876   // Transform the body of the @try.
7877   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7878   if (TryBody.isInvalid())
7879     return StmtError();
7880 
7881   // Transform the @catch statements (if present).
7882   bool AnyCatchChanged = false;
7883   SmallVector<Stmt*, 8> CatchStmts;
7884   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7885     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7886     if (Catch.isInvalid())
7887       return StmtError();
7888     if (Catch.get() != S->getCatchStmt(I))
7889       AnyCatchChanged = true;
7890     CatchStmts.push_back(Catch.get());
7891   }
7892 
7893   // Transform the @finally statement (if present).
7894   StmtResult Finally;
7895   if (S->getFinallyStmt()) {
7896     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7897     if (Finally.isInvalid())
7898       return StmtError();
7899   }
7900 
7901   // If nothing changed, just retain this statement.
7902   if (!getDerived().AlwaysRebuild() &&
7903       TryBody.get() == S->getTryBody() &&
7904       !AnyCatchChanged &&
7905       Finally.get() == S->getFinallyStmt())
7906     return S;
7907 
7908   // Build a new statement.
7909   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7910                                            CatchStmts, Finally.get());
7911 }
7912 
7913 template<typename Derived>
7914 StmtResult
7915 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7916   // Transform the @catch parameter, if there is one.
7917   VarDecl *Var = nullptr;
7918   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7919     TypeSourceInfo *TSInfo = nullptr;
7920     if (FromVar->getTypeSourceInfo()) {
7921       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7922       if (!TSInfo)
7923         return StmtError();
7924     }
7925 
7926     QualType T;
7927     if (TSInfo)
7928       T = TSInfo->getType();
7929     else {
7930       T = getDerived().TransformType(FromVar->getType());
7931       if (T.isNull())
7932         return StmtError();
7933     }
7934 
7935     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7936     if (!Var)
7937       return StmtError();
7938   }
7939 
7940   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7941   if (Body.isInvalid())
7942     return StmtError();
7943 
7944   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7945                                              S->getRParenLoc(),
7946                                              Var, Body.get());
7947 }
7948 
7949 template<typename Derived>
7950 StmtResult
7951 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7952   // Transform the body.
7953   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7954   if (Body.isInvalid())
7955     return StmtError();
7956 
7957   // If nothing changed, just retain this statement.
7958   if (!getDerived().AlwaysRebuild() &&
7959       Body.get() == S->getFinallyBody())
7960     return S;
7961 
7962   // Build a new statement.
7963   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7964                                                Body.get());
7965 }
7966 
7967 template<typename Derived>
7968 StmtResult
7969 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7970   ExprResult Operand;
7971   if (S->getThrowExpr()) {
7972     Operand = getDerived().TransformExpr(S->getThrowExpr());
7973     if (Operand.isInvalid())
7974       return StmtError();
7975   }
7976 
7977   if (!getDerived().AlwaysRebuild() &&
7978       Operand.get() == S->getThrowExpr())
7979     return S;
7980 
7981   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7982 }
7983 
7984 template<typename Derived>
7985 StmtResult
7986 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7987                                                   ObjCAtSynchronizedStmt *S) {
7988   // Transform the object we are locking.
7989   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7990   if (Object.isInvalid())
7991     return StmtError();
7992   Object =
7993     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7994                                                   Object.get());
7995   if (Object.isInvalid())
7996     return StmtError();
7997 
7998   // Transform the body.
7999   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8000   if (Body.isInvalid())
8001     return StmtError();
8002 
8003   // If nothing change, just retain the current statement.
8004   if (!getDerived().AlwaysRebuild() &&
8005       Object.get() == S->getSynchExpr() &&
8006       Body.get() == S->getSynchBody())
8007     return S;
8008 
8009   // Build a new statement.
8010   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8011                                                     Object.get(), Body.get());
8012 }
8013 
8014 template<typename Derived>
8015 StmtResult
8016 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8017                                               ObjCAutoreleasePoolStmt *S) {
8018   // Transform the body.
8019   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8020   if (Body.isInvalid())
8021     return StmtError();
8022 
8023   // If nothing changed, just retain this statement.
8024   if (!getDerived().AlwaysRebuild() &&
8025       Body.get() == S->getSubStmt())
8026     return S;
8027 
8028   // Build a new statement.
8029   return getDerived().RebuildObjCAutoreleasePoolStmt(
8030                         S->getAtLoc(), Body.get());
8031 }
8032 
8033 template<typename Derived>
8034 StmtResult
8035 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8036                                                   ObjCForCollectionStmt *S) {
8037   // Transform the element statement.
8038   StmtResult Element =
8039       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8040   if (Element.isInvalid())
8041     return StmtError();
8042 
8043   // Transform the collection expression.
8044   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8045   if (Collection.isInvalid())
8046     return StmtError();
8047 
8048   // Transform the body.
8049   StmtResult Body = getDerived().TransformStmt(S->getBody());
8050   if (Body.isInvalid())
8051     return StmtError();
8052 
8053   // If nothing changed, just retain this statement.
8054   if (!getDerived().AlwaysRebuild() &&
8055       Element.get() == S->getElement() &&
8056       Collection.get() == S->getCollection() &&
8057       Body.get() == S->getBody())
8058     return S;
8059 
8060   // Build a new statement.
8061   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8062                                                    Element.get(),
8063                                                    Collection.get(),
8064                                                    S->getRParenLoc(),
8065                                                    Body.get());
8066 }
8067 
8068 template <typename Derived>
8069 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8070   // Transform the exception declaration, if any.
8071   VarDecl *Var = nullptr;
8072   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8073     TypeSourceInfo *T =
8074         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8075     if (!T)
8076       return StmtError();
8077 
8078     Var = getDerived().RebuildExceptionDecl(
8079         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8080         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8081     if (!Var || Var->isInvalidDecl())
8082       return StmtError();
8083   }
8084 
8085   // Transform the actual exception handler.
8086   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8087   if (Handler.isInvalid())
8088     return StmtError();
8089 
8090   if (!getDerived().AlwaysRebuild() && !Var &&
8091       Handler.get() == S->getHandlerBlock())
8092     return S;
8093 
8094   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8095 }
8096 
8097 template <typename Derived>
8098 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8099   // Transform the try block itself.
8100   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8101   if (TryBlock.isInvalid())
8102     return StmtError();
8103 
8104   // Transform the handlers.
8105   bool HandlerChanged = false;
8106   SmallVector<Stmt *, 8> Handlers;
8107   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8108     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8109     if (Handler.isInvalid())
8110       return StmtError();
8111 
8112     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8113     Handlers.push_back(Handler.getAs<Stmt>());
8114   }
8115 
8116   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8117       !HandlerChanged)
8118     return S;
8119 
8120   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8121                                         Handlers);
8122 }
8123 
8124 template<typename Derived>
8125 StmtResult
8126 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8127   StmtResult Init =
8128       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8129   if (Init.isInvalid())
8130     return StmtError();
8131 
8132   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8133   if (Range.isInvalid())
8134     return StmtError();
8135 
8136   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8137   if (Begin.isInvalid())
8138     return StmtError();
8139   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8140   if (End.isInvalid())
8141     return StmtError();
8142 
8143   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8144   if (Cond.isInvalid())
8145     return StmtError();
8146   if (Cond.get())
8147     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8148   if (Cond.isInvalid())
8149     return StmtError();
8150   if (Cond.get())
8151     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8152 
8153   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8154   if (Inc.isInvalid())
8155     return StmtError();
8156   if (Inc.get())
8157     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8158 
8159   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8160   if (LoopVar.isInvalid())
8161     return StmtError();
8162 
8163   StmtResult NewStmt = S;
8164   if (getDerived().AlwaysRebuild() ||
8165       Init.get() != S->getInit() ||
8166       Range.get() != S->getRangeStmt() ||
8167       Begin.get() != S->getBeginStmt() ||
8168       End.get() != S->getEndStmt() ||
8169       Cond.get() != S->getCond() ||
8170       Inc.get() != S->getInc() ||
8171       LoopVar.get() != S->getLoopVarStmt()) {
8172     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8173                                                   S->getCoawaitLoc(), Init.get(),
8174                                                   S->getColonLoc(), Range.get(),
8175                                                   Begin.get(), End.get(),
8176                                                   Cond.get(),
8177                                                   Inc.get(), LoopVar.get(),
8178                                                   S->getRParenLoc());
8179     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8180       // Might not have attached any initializer to the loop variable.
8181       getSema().ActOnInitializerError(
8182           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8183       return StmtError();
8184     }
8185   }
8186 
8187   StmtResult Body = getDerived().TransformStmt(S->getBody());
8188   if (Body.isInvalid())
8189     return StmtError();
8190 
8191   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8192   // it now so we have a new statement to attach the body to.
8193   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8194     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8195                                                   S->getCoawaitLoc(), Init.get(),
8196                                                   S->getColonLoc(), Range.get(),
8197                                                   Begin.get(), End.get(),
8198                                                   Cond.get(),
8199                                                   Inc.get(), LoopVar.get(),
8200                                                   S->getRParenLoc());
8201     if (NewStmt.isInvalid())
8202       return StmtError();
8203   }
8204 
8205   if (NewStmt.get() == S)
8206     return S;
8207 
8208   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8209 }
8210 
8211 template<typename Derived>
8212 StmtResult
8213 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8214                                                     MSDependentExistsStmt *S) {
8215   // Transform the nested-name-specifier, if any.
8216   NestedNameSpecifierLoc QualifierLoc;
8217   if (S->getQualifierLoc()) {
8218     QualifierLoc
8219       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8220     if (!QualifierLoc)
8221       return StmtError();
8222   }
8223 
8224   // Transform the declaration name.
8225   DeclarationNameInfo NameInfo = S->getNameInfo();
8226   if (NameInfo.getName()) {
8227     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8228     if (!NameInfo.getName())
8229       return StmtError();
8230   }
8231 
8232   // Check whether anything changed.
8233   if (!getDerived().AlwaysRebuild() &&
8234       QualifierLoc == S->getQualifierLoc() &&
8235       NameInfo.getName() == S->getNameInfo().getName())
8236     return S;
8237 
8238   // Determine whether this name exists, if we can.
8239   CXXScopeSpec SS;
8240   SS.Adopt(QualifierLoc);
8241   bool Dependent = false;
8242   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8243   case Sema::IER_Exists:
8244     if (S->isIfExists())
8245       break;
8246 
8247     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8248 
8249   case Sema::IER_DoesNotExist:
8250     if (S->isIfNotExists())
8251       break;
8252 
8253     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8254 
8255   case Sema::IER_Dependent:
8256     Dependent = true;
8257     break;
8258 
8259   case Sema::IER_Error:
8260     return StmtError();
8261   }
8262 
8263   // We need to continue with the instantiation, so do so now.
8264   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8265   if (SubStmt.isInvalid())
8266     return StmtError();
8267 
8268   // If we have resolved the name, just transform to the substatement.
8269   if (!Dependent)
8270     return SubStmt;
8271 
8272   // The name is still dependent, so build a dependent expression again.
8273   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8274                                                    S->isIfExists(),
8275                                                    QualifierLoc,
8276                                                    NameInfo,
8277                                                    SubStmt.get());
8278 }
8279 
8280 template<typename Derived>
8281 ExprResult
8282 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8283   NestedNameSpecifierLoc QualifierLoc;
8284   if (E->getQualifierLoc()) {
8285     QualifierLoc
8286     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8287     if (!QualifierLoc)
8288       return ExprError();
8289   }
8290 
8291   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8292     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8293   if (!PD)
8294     return ExprError();
8295 
8296   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8297   if (Base.isInvalid())
8298     return ExprError();
8299 
8300   return new (SemaRef.getASTContext())
8301       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8302                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8303                         QualifierLoc, E->getMemberLoc());
8304 }
8305 
8306 template <typename Derived>
8307 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8308     MSPropertySubscriptExpr *E) {
8309   auto BaseRes = getDerived().TransformExpr(E->getBase());
8310   if (BaseRes.isInvalid())
8311     return ExprError();
8312   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8313   if (IdxRes.isInvalid())
8314     return ExprError();
8315 
8316   if (!getDerived().AlwaysRebuild() &&
8317       BaseRes.get() == E->getBase() &&
8318       IdxRes.get() == E->getIdx())
8319     return E;
8320 
8321   return getDerived().RebuildArraySubscriptExpr(
8322       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8323 }
8324 
8325 template <typename Derived>
8326 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8327   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8328   if (TryBlock.isInvalid())
8329     return StmtError();
8330 
8331   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8332   if (Handler.isInvalid())
8333     return StmtError();
8334 
8335   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8336       Handler.get() == S->getHandler())
8337     return S;
8338 
8339   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8340                                         TryBlock.get(), Handler.get());
8341 }
8342 
8343 template <typename Derived>
8344 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8345   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8346   if (Block.isInvalid())
8347     return StmtError();
8348 
8349   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8350 }
8351 
8352 template <typename Derived>
8353 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8354   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8355   if (FilterExpr.isInvalid())
8356     return StmtError();
8357 
8358   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8359   if (Block.isInvalid())
8360     return StmtError();
8361 
8362   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8363                                            Block.get());
8364 }
8365 
8366 template <typename Derived>
8367 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8368   if (isa<SEHFinallyStmt>(Handler))
8369     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8370   else
8371     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8372 }
8373 
8374 template<typename Derived>
8375 StmtResult
8376 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8377   return S;
8378 }
8379 
8380 //===----------------------------------------------------------------------===//
8381 // OpenMP directive transformation
8382 //===----------------------------------------------------------------------===//
8383 
8384 template <typename Derived>
8385 StmtResult
8386 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8387   // OMPCanonicalLoops are eliminated during transformation, since they will be
8388   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8389   // after transformation.
8390   return getDerived().TransformStmt(L->getLoopStmt());
8391 }
8392 
8393 template <typename Derived>
8394 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8395     OMPExecutableDirective *D) {
8396 
8397   // Transform the clauses
8398   llvm::SmallVector<OMPClause *, 16> TClauses;
8399   ArrayRef<OMPClause *> Clauses = D->clauses();
8400   TClauses.reserve(Clauses.size());
8401   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8402        I != E; ++I) {
8403     if (*I) {
8404       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8405       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8406       getDerived().getSema().EndOpenMPClause();
8407       if (Clause)
8408         TClauses.push_back(Clause);
8409     } else {
8410       TClauses.push_back(nullptr);
8411     }
8412   }
8413   StmtResult AssociatedStmt;
8414   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8415     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8416                                                   /*CurScope=*/nullptr);
8417     StmtResult Body;
8418     {
8419       Sema::CompoundScopeRAII CompoundScope(getSema());
8420       Stmt *CS;
8421       if (D->getDirectiveKind() == OMPD_atomic ||
8422           D->getDirectiveKind() == OMPD_critical ||
8423           D->getDirectiveKind() == OMPD_section ||
8424           D->getDirectiveKind() == OMPD_master)
8425         CS = D->getAssociatedStmt();
8426       else
8427         CS = D->getRawStmt();
8428       Body = getDerived().TransformStmt(CS);
8429       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8430           getSema().getLangOpts().OpenMPIRBuilder)
8431         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8432     }
8433     AssociatedStmt =
8434         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8435     if (AssociatedStmt.isInvalid()) {
8436       return StmtError();
8437     }
8438   }
8439   if (TClauses.size() != Clauses.size()) {
8440     return StmtError();
8441   }
8442 
8443   // Transform directive name for 'omp critical' directive.
8444   DeclarationNameInfo DirName;
8445   if (D->getDirectiveKind() == OMPD_critical) {
8446     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8447     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8448   }
8449   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8450   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8451     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8452   } else if (D->getDirectiveKind() == OMPD_cancel) {
8453     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8454   }
8455 
8456   return getDerived().RebuildOMPExecutableDirective(
8457       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8458       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8459 }
8460 
8461 template <typename Derived>
8462 StmtResult
8463 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8464   DeclarationNameInfo DirName;
8465   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8466                                              D->getBeginLoc());
8467   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8468   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8469   return Res;
8470 }
8471 
8472 template <typename Derived>
8473 StmtResult
8474 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8475   DeclarationNameInfo DirName;
8476   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8477                                              D->getBeginLoc());
8478   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8479   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8480   return Res;
8481 }
8482 
8483 template <typename Derived>
8484 StmtResult
8485 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8486   DeclarationNameInfo DirName;
8487   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8488                                              nullptr, D->getBeginLoc());
8489   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8490   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8491   return Res;
8492 }
8493 
8494 template <typename Derived>
8495 StmtResult
8496 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8497   DeclarationNameInfo DirName;
8498   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8499                                              D->getBeginLoc());
8500   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8501   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8502   return Res;
8503 }
8504 
8505 template <typename Derived>
8506 StmtResult
8507 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8508   DeclarationNameInfo DirName;
8509   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8510                                              D->getBeginLoc());
8511   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8512   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8513   return Res;
8514 }
8515 
8516 template <typename Derived>
8517 StmtResult
8518 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8519   DeclarationNameInfo DirName;
8520   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8521                                              D->getBeginLoc());
8522   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8523   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8524   return Res;
8525 }
8526 
8527 template <typename Derived>
8528 StmtResult
8529 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8530   DeclarationNameInfo DirName;
8531   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8532                                              D->getBeginLoc());
8533   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8534   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8535   return Res;
8536 }
8537 
8538 template <typename Derived>
8539 StmtResult
8540 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8541   DeclarationNameInfo DirName;
8542   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8543                                              D->getBeginLoc());
8544   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8545   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8546   return Res;
8547 }
8548 
8549 template <typename Derived>
8550 StmtResult
8551 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8552   DeclarationNameInfo DirName;
8553   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8554                                              D->getBeginLoc());
8555   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8556   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8557   return Res;
8558 }
8559 
8560 template <typename Derived>
8561 StmtResult
8562 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8563   getDerived().getSema().StartOpenMPDSABlock(
8564       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8565   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8566   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8567   return Res;
8568 }
8569 
8570 template <typename Derived>
8571 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8572     OMPParallelForDirective *D) {
8573   DeclarationNameInfo DirName;
8574   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8575                                              nullptr, D->getBeginLoc());
8576   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8577   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8578   return Res;
8579 }
8580 
8581 template <typename Derived>
8582 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8583     OMPParallelForSimdDirective *D) {
8584   DeclarationNameInfo DirName;
8585   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8586                                              nullptr, D->getBeginLoc());
8587   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8588   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8589   return Res;
8590 }
8591 
8592 template <typename Derived>
8593 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8594     OMPParallelMasterDirective *D) {
8595   DeclarationNameInfo DirName;
8596   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8597                                              nullptr, D->getBeginLoc());
8598   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8599   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8600   return Res;
8601 }
8602 
8603 template <typename Derived>
8604 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8605     OMPParallelSectionsDirective *D) {
8606   DeclarationNameInfo DirName;
8607   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8608                                              nullptr, D->getBeginLoc());
8609   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8610   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8611   return Res;
8612 }
8613 
8614 template <typename Derived>
8615 StmtResult
8616 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8617   DeclarationNameInfo DirName;
8618   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8619                                              D->getBeginLoc());
8620   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8621   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8622   return Res;
8623 }
8624 
8625 template <typename Derived>
8626 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8627     OMPTaskyieldDirective *D) {
8628   DeclarationNameInfo DirName;
8629   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8630                                              D->getBeginLoc());
8631   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8632   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8633   return Res;
8634 }
8635 
8636 template <typename Derived>
8637 StmtResult
8638 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8639   DeclarationNameInfo DirName;
8640   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8641                                              D->getBeginLoc());
8642   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8643   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8644   return Res;
8645 }
8646 
8647 template <typename Derived>
8648 StmtResult
8649 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8650   DeclarationNameInfo DirName;
8651   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8652                                              D->getBeginLoc());
8653   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8654   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8655   return Res;
8656 }
8657 
8658 template <typename Derived>
8659 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8660     OMPTaskgroupDirective *D) {
8661   DeclarationNameInfo DirName;
8662   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8663                                              D->getBeginLoc());
8664   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8665   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8666   return Res;
8667 }
8668 
8669 template <typename Derived>
8670 StmtResult
8671 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8672   DeclarationNameInfo DirName;
8673   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8674                                              D->getBeginLoc());
8675   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8676   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8677   return Res;
8678 }
8679 
8680 template <typename Derived>
8681 StmtResult
8682 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8683   DeclarationNameInfo DirName;
8684   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8685                                              D->getBeginLoc());
8686   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8687   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8688   return Res;
8689 }
8690 
8691 template <typename Derived>
8692 StmtResult
8693 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8694   DeclarationNameInfo DirName;
8695   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8696                                              D->getBeginLoc());
8697   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8698   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8699   return Res;
8700 }
8701 
8702 template <typename Derived>
8703 StmtResult
8704 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8705   DeclarationNameInfo DirName;
8706   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8707                                              D->getBeginLoc());
8708   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8709   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8710   return Res;
8711 }
8712 
8713 template <typename Derived>
8714 StmtResult
8715 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8716   DeclarationNameInfo DirName;
8717   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8718                                              D->getBeginLoc());
8719   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8720   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8721   return Res;
8722 }
8723 
8724 template <typename Derived>
8725 StmtResult
8726 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8727   DeclarationNameInfo DirName;
8728   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8729                                              D->getBeginLoc());
8730   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8731   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8732   return Res;
8733 }
8734 
8735 template <typename Derived>
8736 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8737     OMPTargetDataDirective *D) {
8738   DeclarationNameInfo DirName;
8739   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8740                                              D->getBeginLoc());
8741   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8742   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8743   return Res;
8744 }
8745 
8746 template <typename Derived>
8747 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8748     OMPTargetEnterDataDirective *D) {
8749   DeclarationNameInfo DirName;
8750   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8751                                              nullptr, D->getBeginLoc());
8752   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8753   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8754   return Res;
8755 }
8756 
8757 template <typename Derived>
8758 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8759     OMPTargetExitDataDirective *D) {
8760   DeclarationNameInfo DirName;
8761   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8762                                              nullptr, D->getBeginLoc());
8763   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8764   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8765   return Res;
8766 }
8767 
8768 template <typename Derived>
8769 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8770     OMPTargetParallelDirective *D) {
8771   DeclarationNameInfo DirName;
8772   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8773                                              nullptr, D->getBeginLoc());
8774   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8775   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8776   return Res;
8777 }
8778 
8779 template <typename Derived>
8780 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8781     OMPTargetParallelForDirective *D) {
8782   DeclarationNameInfo DirName;
8783   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8784                                              nullptr, D->getBeginLoc());
8785   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8786   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8787   return Res;
8788 }
8789 
8790 template <typename Derived>
8791 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8792     OMPTargetUpdateDirective *D) {
8793   DeclarationNameInfo DirName;
8794   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8795                                              nullptr, D->getBeginLoc());
8796   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8797   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8798   return Res;
8799 }
8800 
8801 template <typename Derived>
8802 StmtResult
8803 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8804   DeclarationNameInfo DirName;
8805   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8806                                              D->getBeginLoc());
8807   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8808   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8809   return Res;
8810 }
8811 
8812 template <typename Derived>
8813 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8814     OMPCancellationPointDirective *D) {
8815   DeclarationNameInfo DirName;
8816   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8817                                              nullptr, D->getBeginLoc());
8818   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8819   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8820   return Res;
8821 }
8822 
8823 template <typename Derived>
8824 StmtResult
8825 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8826   DeclarationNameInfo DirName;
8827   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8828                                              D->getBeginLoc());
8829   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8830   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8831   return Res;
8832 }
8833 
8834 template <typename Derived>
8835 StmtResult
8836 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8837   DeclarationNameInfo DirName;
8838   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8839                                              D->getBeginLoc());
8840   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8841   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8842   return Res;
8843 }
8844 
8845 template <typename Derived>
8846 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8847     OMPTaskLoopSimdDirective *D) {
8848   DeclarationNameInfo DirName;
8849   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8850                                              nullptr, D->getBeginLoc());
8851   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8852   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8853   return Res;
8854 }
8855 
8856 template <typename Derived>
8857 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8858     OMPMasterTaskLoopDirective *D) {
8859   DeclarationNameInfo DirName;
8860   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8861                                              nullptr, D->getBeginLoc());
8862   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8863   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8864   return Res;
8865 }
8866 
8867 template <typename Derived>
8868 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8869     OMPMasterTaskLoopSimdDirective *D) {
8870   DeclarationNameInfo DirName;
8871   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8872                                              nullptr, D->getBeginLoc());
8873   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8874   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8875   return Res;
8876 }
8877 
8878 template <typename Derived>
8879 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8880     OMPParallelMasterTaskLoopDirective *D) {
8881   DeclarationNameInfo DirName;
8882   getDerived().getSema().StartOpenMPDSABlock(
8883       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8884   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8885   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8886   return Res;
8887 }
8888 
8889 template <typename Derived>
8890 StmtResult
8891 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8892     OMPParallelMasterTaskLoopSimdDirective *D) {
8893   DeclarationNameInfo DirName;
8894   getDerived().getSema().StartOpenMPDSABlock(
8895       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8896   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8897   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8898   return Res;
8899 }
8900 
8901 template <typename Derived>
8902 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8903     OMPDistributeDirective *D) {
8904   DeclarationNameInfo DirName;
8905   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8906                                              D->getBeginLoc());
8907   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8908   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8909   return Res;
8910 }
8911 
8912 template <typename Derived>
8913 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8914     OMPDistributeParallelForDirective *D) {
8915   DeclarationNameInfo DirName;
8916   getDerived().getSema().StartOpenMPDSABlock(
8917       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8918   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8919   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8920   return Res;
8921 }
8922 
8923 template <typename Derived>
8924 StmtResult
8925 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8926     OMPDistributeParallelForSimdDirective *D) {
8927   DeclarationNameInfo DirName;
8928   getDerived().getSema().StartOpenMPDSABlock(
8929       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8930   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8931   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8932   return Res;
8933 }
8934 
8935 template <typename Derived>
8936 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8937     OMPDistributeSimdDirective *D) {
8938   DeclarationNameInfo DirName;
8939   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8940                                              nullptr, D->getBeginLoc());
8941   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8942   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8943   return Res;
8944 }
8945 
8946 template <typename Derived>
8947 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8948     OMPTargetParallelForSimdDirective *D) {
8949   DeclarationNameInfo DirName;
8950   getDerived().getSema().StartOpenMPDSABlock(
8951       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8952   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8953   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8954   return Res;
8955 }
8956 
8957 template <typename Derived>
8958 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8959     OMPTargetSimdDirective *D) {
8960   DeclarationNameInfo DirName;
8961   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8962                                              D->getBeginLoc());
8963   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8964   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8965   return Res;
8966 }
8967 
8968 template <typename Derived>
8969 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8970     OMPTeamsDistributeDirective *D) {
8971   DeclarationNameInfo DirName;
8972   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8973                                              nullptr, D->getBeginLoc());
8974   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8975   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8976   return Res;
8977 }
8978 
8979 template <typename Derived>
8980 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8981     OMPTeamsDistributeSimdDirective *D) {
8982   DeclarationNameInfo DirName;
8983   getDerived().getSema().StartOpenMPDSABlock(
8984       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8985   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8986   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8987   return Res;
8988 }
8989 
8990 template <typename Derived>
8991 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8992     OMPTeamsDistributeParallelForSimdDirective *D) {
8993   DeclarationNameInfo DirName;
8994   getDerived().getSema().StartOpenMPDSABlock(
8995       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8996       D->getBeginLoc());
8997   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8998   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8999   return Res;
9000 }
9001 
9002 template <typename Derived>
9003 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9004     OMPTeamsDistributeParallelForDirective *D) {
9005   DeclarationNameInfo DirName;
9006   getDerived().getSema().StartOpenMPDSABlock(
9007       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9008   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9009   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9010   return Res;
9011 }
9012 
9013 template <typename Derived>
9014 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9015     OMPTargetTeamsDirective *D) {
9016   DeclarationNameInfo DirName;
9017   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9018                                              nullptr, D->getBeginLoc());
9019   auto Res = getDerived().TransformOMPExecutableDirective(D);
9020   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9021   return Res;
9022 }
9023 
9024 template <typename Derived>
9025 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9026     OMPTargetTeamsDistributeDirective *D) {
9027   DeclarationNameInfo DirName;
9028   getDerived().getSema().StartOpenMPDSABlock(
9029       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9030   auto Res = getDerived().TransformOMPExecutableDirective(D);
9031   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9032   return Res;
9033 }
9034 
9035 template <typename Derived>
9036 StmtResult
9037 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9038     OMPTargetTeamsDistributeParallelForDirective *D) {
9039   DeclarationNameInfo DirName;
9040   getDerived().getSema().StartOpenMPDSABlock(
9041       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9042       D->getBeginLoc());
9043   auto Res = getDerived().TransformOMPExecutableDirective(D);
9044   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9045   return Res;
9046 }
9047 
9048 template <typename Derived>
9049 StmtResult TreeTransform<Derived>::
9050     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9051         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9052   DeclarationNameInfo DirName;
9053   getDerived().getSema().StartOpenMPDSABlock(
9054       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9055       D->getBeginLoc());
9056   auto Res = getDerived().TransformOMPExecutableDirective(D);
9057   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9058   return Res;
9059 }
9060 
9061 template <typename Derived>
9062 StmtResult
9063 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9064     OMPTargetTeamsDistributeSimdDirective *D) {
9065   DeclarationNameInfo DirName;
9066   getDerived().getSema().StartOpenMPDSABlock(
9067       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9068   auto Res = getDerived().TransformOMPExecutableDirective(D);
9069   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9070   return Res;
9071 }
9072 
9073 template <typename Derived>
9074 StmtResult
9075 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9076   DeclarationNameInfo DirName;
9077   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9078                                              D->getBeginLoc());
9079   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9080   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9081   return Res;
9082 }
9083 
9084 template <typename Derived>
9085 StmtResult
9086 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9087   DeclarationNameInfo DirName;
9088   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9089                                              D->getBeginLoc());
9090   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9091   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9092   return Res;
9093 }
9094 
9095 //===----------------------------------------------------------------------===//
9096 // OpenMP clause transformation
9097 //===----------------------------------------------------------------------===//
9098 template <typename Derived>
9099 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9100   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9101   if (Cond.isInvalid())
9102     return nullptr;
9103   return getDerived().RebuildOMPIfClause(
9104       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9105       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9106 }
9107 
9108 template <typename Derived>
9109 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9110   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9111   if (Cond.isInvalid())
9112     return nullptr;
9113   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9114                                             C->getLParenLoc(), C->getEndLoc());
9115 }
9116 
9117 template <typename Derived>
9118 OMPClause *
9119 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9120   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9121   if (NumThreads.isInvalid())
9122     return nullptr;
9123   return getDerived().RebuildOMPNumThreadsClause(
9124       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9125 }
9126 
9127 template <typename Derived>
9128 OMPClause *
9129 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9130   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9131   if (E.isInvalid())
9132     return nullptr;
9133   return getDerived().RebuildOMPSafelenClause(
9134       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9135 }
9136 
9137 template <typename Derived>
9138 OMPClause *
9139 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9140   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9141   if (E.isInvalid())
9142     return nullptr;
9143   return getDerived().RebuildOMPAllocatorClause(
9144       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9145 }
9146 
9147 template <typename Derived>
9148 OMPClause *
9149 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9150   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9151   if (E.isInvalid())
9152     return nullptr;
9153   return getDerived().RebuildOMPSimdlenClause(
9154       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9155 }
9156 
9157 template <typename Derived>
9158 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9159   SmallVector<Expr *, 4> TransformedSizes;
9160   TransformedSizes.reserve(C->getNumSizes());
9161   bool Changed = false;
9162   for (Expr *E : C->getSizesRefs()) {
9163     if (!E) {
9164       TransformedSizes.push_back(nullptr);
9165       continue;
9166     }
9167 
9168     ExprResult T = getDerived().TransformExpr(E);
9169     if (T.isInvalid())
9170       return nullptr;
9171     if (E != T.get())
9172       Changed = true;
9173     TransformedSizes.push_back(T.get());
9174   }
9175 
9176   if (!Changed && !getDerived().AlwaysRebuild())
9177     return C;
9178   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9179                                C->getLParenLoc(), C->getEndLoc());
9180 }
9181 
9182 template <typename Derived>
9183 OMPClause *
9184 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9185   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9186   if (E.isInvalid())
9187     return nullptr;
9188   return getDerived().RebuildOMPCollapseClause(
9189       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9190 }
9191 
9192 template <typename Derived>
9193 OMPClause *
9194 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9195   return getDerived().RebuildOMPDefaultClause(
9196       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9197       C->getLParenLoc(), C->getEndLoc());
9198 }
9199 
9200 template <typename Derived>
9201 OMPClause *
9202 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9203   return getDerived().RebuildOMPProcBindClause(
9204       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9205       C->getLParenLoc(), C->getEndLoc());
9206 }
9207 
9208 template <typename Derived>
9209 OMPClause *
9210 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9211   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9212   if (E.isInvalid())
9213     return nullptr;
9214   return getDerived().RebuildOMPScheduleClause(
9215       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9216       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9217       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9218       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9219 }
9220 
9221 template <typename Derived>
9222 OMPClause *
9223 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9224   ExprResult E;
9225   if (auto *Num = C->getNumForLoops()) {
9226     E = getDerived().TransformExpr(Num);
9227     if (E.isInvalid())
9228       return nullptr;
9229   }
9230   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9231                                               C->getLParenLoc(), E.get());
9232 }
9233 
9234 template <typename Derived>
9235 OMPClause *
9236 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9237   ExprResult E;
9238   if (Expr *Evt = C->getEventHandler()) {
9239     E = getDerived().TransformExpr(Evt);
9240     if (E.isInvalid())
9241       return nullptr;
9242   }
9243   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9244                                              C->getLParenLoc(), C->getEndLoc());
9245 }
9246 
9247 template <typename Derived>
9248 OMPClause *
9249 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9250   // No need to rebuild this clause, no template-dependent parameters.
9251   return C;
9252 }
9253 
9254 template <typename Derived>
9255 OMPClause *
9256 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9257   // No need to rebuild this clause, no template-dependent parameters.
9258   return C;
9259 }
9260 
9261 template <typename Derived>
9262 OMPClause *
9263 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9264   // No need to rebuild this clause, no template-dependent parameters.
9265   return C;
9266 }
9267 
9268 template <typename Derived>
9269 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9270   // No need to rebuild this clause, no template-dependent parameters.
9271   return C;
9272 }
9273 
9274 template <typename Derived>
9275 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9276   // No need to rebuild this clause, no template-dependent parameters.
9277   return C;
9278 }
9279 
9280 template <typename Derived>
9281 OMPClause *
9282 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9283   // No need to rebuild this clause, no template-dependent parameters.
9284   return C;
9285 }
9286 
9287 template <typename Derived>
9288 OMPClause *
9289 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9290   // No need to rebuild this clause, no template-dependent parameters.
9291   return C;
9292 }
9293 
9294 template <typename Derived>
9295 OMPClause *
9296 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9297   // No need to rebuild this clause, no template-dependent parameters.
9298   return C;
9299 }
9300 
9301 template <typename Derived>
9302 OMPClause *
9303 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9304   // No need to rebuild this clause, no template-dependent parameters.
9305   return C;
9306 }
9307 
9308 template <typename Derived>
9309 OMPClause *
9310 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9311   // No need to rebuild this clause, no template-dependent parameters.
9312   return C;
9313 }
9314 
9315 template <typename Derived>
9316 OMPClause *
9317 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9318   // No need to rebuild this clause, no template-dependent parameters.
9319   return C;
9320 }
9321 
9322 template <typename Derived>
9323 OMPClause *
9324 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9325   // No need to rebuild this clause, no template-dependent parameters.
9326   return C;
9327 }
9328 
9329 template <typename Derived>
9330 OMPClause *
9331 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9332   // No need to rebuild this clause, no template-dependent parameters.
9333   return C;
9334 }
9335 
9336 template <typename Derived>
9337 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9338   // No need to rebuild this clause, no template-dependent parameters.
9339   return C;
9340 }
9341 
9342 template <typename Derived>
9343 OMPClause *
9344 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9345   // No need to rebuild this clause, no template-dependent parameters.
9346   return C;
9347 }
9348 
9349 template <typename Derived>
9350 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9351   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9352   if (IVR.isInvalid())
9353     return nullptr;
9354 
9355   llvm::SmallVector<Expr *, 8> PrefExprs;
9356   PrefExprs.reserve(C->varlist_size() - 1);
9357   for (Expr *E : llvm::drop_begin(C->varlists())) {
9358     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9359     if (ER.isInvalid())
9360       return nullptr;
9361     PrefExprs.push_back(ER.get());
9362   }
9363   return getDerived().RebuildOMPInitClause(
9364       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9365       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9366 }
9367 
9368 template <typename Derived>
9369 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9370   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9371   if (ER.isInvalid())
9372     return nullptr;
9373   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9374                                           C->getLParenLoc(), C->getVarLoc(),
9375                                           C->getEndLoc());
9376 }
9377 
9378 template <typename Derived>
9379 OMPClause *
9380 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9381   ExprResult ER;
9382   if (Expr *IV = C->getInteropVar()) {
9383     ER = getDerived().TransformExpr(IV);
9384     if (ER.isInvalid())
9385       return nullptr;
9386   }
9387   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9388                                               C->getLParenLoc(), C->getVarLoc(),
9389                                               C->getEndLoc());
9390 }
9391 
9392 template <typename Derived>
9393 OMPClause *
9394 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9395   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9396   if (Cond.isInvalid())
9397     return nullptr;
9398   return getDerived().RebuildOMPNovariantsClause(
9399       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9400 }
9401 
9402 template <typename Derived>
9403 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9404     OMPUnifiedAddressClause *C) {
9405   llvm_unreachable("unified_address clause cannot appear in dependent context");
9406 }
9407 
9408 template <typename Derived>
9409 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9410     OMPUnifiedSharedMemoryClause *C) {
9411   llvm_unreachable(
9412       "unified_shared_memory clause cannot appear in dependent context");
9413 }
9414 
9415 template <typename Derived>
9416 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9417     OMPReverseOffloadClause *C) {
9418   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9419 }
9420 
9421 template <typename Derived>
9422 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9423     OMPDynamicAllocatorsClause *C) {
9424   llvm_unreachable(
9425       "dynamic_allocators clause cannot appear in dependent context");
9426 }
9427 
9428 template <typename Derived>
9429 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9430     OMPAtomicDefaultMemOrderClause *C) {
9431   llvm_unreachable(
9432       "atomic_default_mem_order clause cannot appear in dependent context");
9433 }
9434 
9435 template <typename Derived>
9436 OMPClause *
9437 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9438   llvm::SmallVector<Expr *, 16> Vars;
9439   Vars.reserve(C->varlist_size());
9440   for (auto *VE : C->varlists()) {
9441     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9442     if (EVar.isInvalid())
9443       return nullptr;
9444     Vars.push_back(EVar.get());
9445   }
9446   return getDerived().RebuildOMPPrivateClause(
9447       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9448 }
9449 
9450 template <typename Derived>
9451 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9452     OMPFirstprivateClause *C) {
9453   llvm::SmallVector<Expr *, 16> Vars;
9454   Vars.reserve(C->varlist_size());
9455   for (auto *VE : C->varlists()) {
9456     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9457     if (EVar.isInvalid())
9458       return nullptr;
9459     Vars.push_back(EVar.get());
9460   }
9461   return getDerived().RebuildOMPFirstprivateClause(
9462       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9463 }
9464 
9465 template <typename Derived>
9466 OMPClause *
9467 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9468   llvm::SmallVector<Expr *, 16> Vars;
9469   Vars.reserve(C->varlist_size());
9470   for (auto *VE : C->varlists()) {
9471     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9472     if (EVar.isInvalid())
9473       return nullptr;
9474     Vars.push_back(EVar.get());
9475   }
9476   return getDerived().RebuildOMPLastprivateClause(
9477       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9478       C->getLParenLoc(), C->getEndLoc());
9479 }
9480 
9481 template <typename Derived>
9482 OMPClause *
9483 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9484   llvm::SmallVector<Expr *, 16> Vars;
9485   Vars.reserve(C->varlist_size());
9486   for (auto *VE : C->varlists()) {
9487     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9488     if (EVar.isInvalid())
9489       return nullptr;
9490     Vars.push_back(EVar.get());
9491   }
9492   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9493                                              C->getLParenLoc(), C->getEndLoc());
9494 }
9495 
9496 template <typename Derived>
9497 OMPClause *
9498 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9499   llvm::SmallVector<Expr *, 16> Vars;
9500   Vars.reserve(C->varlist_size());
9501   for (auto *VE : C->varlists()) {
9502     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9503     if (EVar.isInvalid())
9504       return nullptr;
9505     Vars.push_back(EVar.get());
9506   }
9507   CXXScopeSpec ReductionIdScopeSpec;
9508   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9509 
9510   DeclarationNameInfo NameInfo = C->getNameInfo();
9511   if (NameInfo.getName()) {
9512     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9513     if (!NameInfo.getName())
9514       return nullptr;
9515   }
9516   // Build a list of all UDR decls with the same names ranged by the Scopes.
9517   // The Scope boundary is a duplication of the previous decl.
9518   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9519   for (auto *E : C->reduction_ops()) {
9520     // Transform all the decls.
9521     if (E) {
9522       auto *ULE = cast<UnresolvedLookupExpr>(E);
9523       UnresolvedSet<8> Decls;
9524       for (auto *D : ULE->decls()) {
9525         NamedDecl *InstD =
9526             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9527         Decls.addDecl(InstD, InstD->getAccess());
9528       }
9529       UnresolvedReductions.push_back(
9530        UnresolvedLookupExpr::Create(
9531           SemaRef.Context, /*NamingClass=*/nullptr,
9532           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9533           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9534           Decls.begin(), Decls.end()));
9535     } else
9536       UnresolvedReductions.push_back(nullptr);
9537   }
9538   return getDerived().RebuildOMPReductionClause(
9539       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9540       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9541       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9542 }
9543 
9544 template <typename Derived>
9545 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9546     OMPTaskReductionClause *C) {
9547   llvm::SmallVector<Expr *, 16> Vars;
9548   Vars.reserve(C->varlist_size());
9549   for (auto *VE : C->varlists()) {
9550     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9551     if (EVar.isInvalid())
9552       return nullptr;
9553     Vars.push_back(EVar.get());
9554   }
9555   CXXScopeSpec ReductionIdScopeSpec;
9556   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9557 
9558   DeclarationNameInfo NameInfo = C->getNameInfo();
9559   if (NameInfo.getName()) {
9560     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9561     if (!NameInfo.getName())
9562       return nullptr;
9563   }
9564   // Build a list of all UDR decls with the same names ranged by the Scopes.
9565   // The Scope boundary is a duplication of the previous decl.
9566   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9567   for (auto *E : C->reduction_ops()) {
9568     // Transform all the decls.
9569     if (E) {
9570       auto *ULE = cast<UnresolvedLookupExpr>(E);
9571       UnresolvedSet<8> Decls;
9572       for (auto *D : ULE->decls()) {
9573         NamedDecl *InstD =
9574             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9575         Decls.addDecl(InstD, InstD->getAccess());
9576       }
9577       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9578           SemaRef.Context, /*NamingClass=*/nullptr,
9579           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9580           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9581     } else
9582       UnresolvedReductions.push_back(nullptr);
9583   }
9584   return getDerived().RebuildOMPTaskReductionClause(
9585       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9586       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9587 }
9588 
9589 template <typename Derived>
9590 OMPClause *
9591 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9592   llvm::SmallVector<Expr *, 16> Vars;
9593   Vars.reserve(C->varlist_size());
9594   for (auto *VE : C->varlists()) {
9595     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9596     if (EVar.isInvalid())
9597       return nullptr;
9598     Vars.push_back(EVar.get());
9599   }
9600   CXXScopeSpec ReductionIdScopeSpec;
9601   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9602 
9603   DeclarationNameInfo NameInfo = C->getNameInfo();
9604   if (NameInfo.getName()) {
9605     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9606     if (!NameInfo.getName())
9607       return nullptr;
9608   }
9609   // Build a list of all UDR decls with the same names ranged by the Scopes.
9610   // The Scope boundary is a duplication of the previous decl.
9611   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9612   for (auto *E : C->reduction_ops()) {
9613     // Transform all the decls.
9614     if (E) {
9615       auto *ULE = cast<UnresolvedLookupExpr>(E);
9616       UnresolvedSet<8> Decls;
9617       for (auto *D : ULE->decls()) {
9618         NamedDecl *InstD =
9619             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9620         Decls.addDecl(InstD, InstD->getAccess());
9621       }
9622       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9623           SemaRef.Context, /*NamingClass=*/nullptr,
9624           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9625           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9626     } else
9627       UnresolvedReductions.push_back(nullptr);
9628   }
9629   return getDerived().RebuildOMPInReductionClause(
9630       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9631       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9632 }
9633 
9634 template <typename Derived>
9635 OMPClause *
9636 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9637   llvm::SmallVector<Expr *, 16> Vars;
9638   Vars.reserve(C->varlist_size());
9639   for (auto *VE : C->varlists()) {
9640     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9641     if (EVar.isInvalid())
9642       return nullptr;
9643     Vars.push_back(EVar.get());
9644   }
9645   ExprResult Step = getDerived().TransformExpr(C->getStep());
9646   if (Step.isInvalid())
9647     return nullptr;
9648   return getDerived().RebuildOMPLinearClause(
9649       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9650       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9651 }
9652 
9653 template <typename Derived>
9654 OMPClause *
9655 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9656   llvm::SmallVector<Expr *, 16> Vars;
9657   Vars.reserve(C->varlist_size());
9658   for (auto *VE : C->varlists()) {
9659     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9660     if (EVar.isInvalid())
9661       return nullptr;
9662     Vars.push_back(EVar.get());
9663   }
9664   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9665   if (Alignment.isInvalid())
9666     return nullptr;
9667   return getDerived().RebuildOMPAlignedClause(
9668       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9669       C->getColonLoc(), C->getEndLoc());
9670 }
9671 
9672 template <typename Derived>
9673 OMPClause *
9674 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9675   llvm::SmallVector<Expr *, 16> Vars;
9676   Vars.reserve(C->varlist_size());
9677   for (auto *VE : C->varlists()) {
9678     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9679     if (EVar.isInvalid())
9680       return nullptr;
9681     Vars.push_back(EVar.get());
9682   }
9683   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9684                                              C->getLParenLoc(), C->getEndLoc());
9685 }
9686 
9687 template <typename Derived>
9688 OMPClause *
9689 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9690   llvm::SmallVector<Expr *, 16> Vars;
9691   Vars.reserve(C->varlist_size());
9692   for (auto *VE : C->varlists()) {
9693     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9694     if (EVar.isInvalid())
9695       return nullptr;
9696     Vars.push_back(EVar.get());
9697   }
9698   return getDerived().RebuildOMPCopyprivateClause(
9699       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9700 }
9701 
9702 template <typename Derived>
9703 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9704   llvm::SmallVector<Expr *, 16> Vars;
9705   Vars.reserve(C->varlist_size());
9706   for (auto *VE : C->varlists()) {
9707     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9708     if (EVar.isInvalid())
9709       return nullptr;
9710     Vars.push_back(EVar.get());
9711   }
9712   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9713                                             C->getLParenLoc(), C->getEndLoc());
9714 }
9715 
9716 template <typename Derived>
9717 OMPClause *
9718 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9719   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9720   if (E.isInvalid())
9721     return nullptr;
9722   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9723                                              C->getLParenLoc(), C->getEndLoc());
9724 }
9725 
9726 template <typename Derived>
9727 OMPClause *
9728 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9729   llvm::SmallVector<Expr *, 16> Vars;
9730   Expr *DepModifier = C->getModifier();
9731   if (DepModifier) {
9732     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9733     if (DepModRes.isInvalid())
9734       return nullptr;
9735     DepModifier = DepModRes.get();
9736   }
9737   Vars.reserve(C->varlist_size());
9738   for (auto *VE : C->varlists()) {
9739     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9740     if (EVar.isInvalid())
9741       return nullptr;
9742     Vars.push_back(EVar.get());
9743   }
9744   return getDerived().RebuildOMPDependClause(
9745       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9746       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9747       C->getEndLoc());
9748 }
9749 
9750 template <typename Derived>
9751 OMPClause *
9752 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9753   ExprResult E = getDerived().TransformExpr(C->getDevice());
9754   if (E.isInvalid())
9755     return nullptr;
9756   return getDerived().RebuildOMPDeviceClause(
9757       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9758       C->getModifierLoc(), C->getEndLoc());
9759 }
9760 
9761 template <typename Derived, class T>
9762 bool transformOMPMappableExprListClause(
9763     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9764     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9765     DeclarationNameInfo &MapperIdInfo,
9766     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9767   // Transform expressions in the list.
9768   Vars.reserve(C->varlist_size());
9769   for (auto *VE : C->varlists()) {
9770     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9771     if (EVar.isInvalid())
9772       return true;
9773     Vars.push_back(EVar.get());
9774   }
9775   // Transform mapper scope specifier and identifier.
9776   NestedNameSpecifierLoc QualifierLoc;
9777   if (C->getMapperQualifierLoc()) {
9778     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9779         C->getMapperQualifierLoc());
9780     if (!QualifierLoc)
9781       return true;
9782   }
9783   MapperIdScopeSpec.Adopt(QualifierLoc);
9784   MapperIdInfo = C->getMapperIdInfo();
9785   if (MapperIdInfo.getName()) {
9786     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9787     if (!MapperIdInfo.getName())
9788       return true;
9789   }
9790   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9791   // the previous user-defined mapper lookup in dependent environment.
9792   for (auto *E : C->mapperlists()) {
9793     // Transform all the decls.
9794     if (E) {
9795       auto *ULE = cast<UnresolvedLookupExpr>(E);
9796       UnresolvedSet<8> Decls;
9797       for (auto *D : ULE->decls()) {
9798         NamedDecl *InstD =
9799             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9800         Decls.addDecl(InstD, InstD->getAccess());
9801       }
9802       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9803           TT.getSema().Context, /*NamingClass=*/nullptr,
9804           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9805           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9806           Decls.end()));
9807     } else {
9808       UnresolvedMappers.push_back(nullptr);
9809     }
9810   }
9811   return false;
9812 }
9813 
9814 template <typename Derived>
9815 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9816   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9817   llvm::SmallVector<Expr *, 16> Vars;
9818   CXXScopeSpec MapperIdScopeSpec;
9819   DeclarationNameInfo MapperIdInfo;
9820   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9821   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9822           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9823     return nullptr;
9824   return getDerived().RebuildOMPMapClause(
9825       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9826       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9827       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9828 }
9829 
9830 template <typename Derived>
9831 OMPClause *
9832 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9833   Expr *Allocator = C->getAllocator();
9834   if (Allocator) {
9835     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9836     if (AllocatorRes.isInvalid())
9837       return nullptr;
9838     Allocator = AllocatorRes.get();
9839   }
9840   llvm::SmallVector<Expr *, 16> Vars;
9841   Vars.reserve(C->varlist_size());
9842   for (auto *VE : C->varlists()) {
9843     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9844     if (EVar.isInvalid())
9845       return nullptr;
9846     Vars.push_back(EVar.get());
9847   }
9848   return getDerived().RebuildOMPAllocateClause(
9849       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9850       C->getEndLoc());
9851 }
9852 
9853 template <typename Derived>
9854 OMPClause *
9855 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9856   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9857   if (E.isInvalid())
9858     return nullptr;
9859   return getDerived().RebuildOMPNumTeamsClause(
9860       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9861 }
9862 
9863 template <typename Derived>
9864 OMPClause *
9865 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9866   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9867   if (E.isInvalid())
9868     return nullptr;
9869   return getDerived().RebuildOMPThreadLimitClause(
9870       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9871 }
9872 
9873 template <typename Derived>
9874 OMPClause *
9875 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9876   ExprResult E = getDerived().TransformExpr(C->getPriority());
9877   if (E.isInvalid())
9878     return nullptr;
9879   return getDerived().RebuildOMPPriorityClause(
9880       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9881 }
9882 
9883 template <typename Derived>
9884 OMPClause *
9885 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9886   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9887   if (E.isInvalid())
9888     return nullptr;
9889   return getDerived().RebuildOMPGrainsizeClause(
9890       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9891 }
9892 
9893 template <typename Derived>
9894 OMPClause *
9895 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9896   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9897   if (E.isInvalid())
9898     return nullptr;
9899   return getDerived().RebuildOMPNumTasksClause(
9900       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9901 }
9902 
9903 template <typename Derived>
9904 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9905   ExprResult E = getDerived().TransformExpr(C->getHint());
9906   if (E.isInvalid())
9907     return nullptr;
9908   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9909                                            C->getLParenLoc(), C->getEndLoc());
9910 }
9911 
9912 template <typename Derived>
9913 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9914     OMPDistScheduleClause *C) {
9915   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9916   if (E.isInvalid())
9917     return nullptr;
9918   return getDerived().RebuildOMPDistScheduleClause(
9919       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9920       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9921 }
9922 
9923 template <typename Derived>
9924 OMPClause *
9925 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9926   // Rebuild Defaultmap Clause since we need to invoke the checking of
9927   // defaultmap(none:variable-category) after template initialization.
9928   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9929                                                  C->getDefaultmapKind(),
9930                                                  C->getBeginLoc(),
9931                                                  C->getLParenLoc(),
9932                                                  C->getDefaultmapModifierLoc(),
9933                                                  C->getDefaultmapKindLoc(),
9934                                                  C->getEndLoc());
9935 }
9936 
9937 template <typename Derived>
9938 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9939   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9940   llvm::SmallVector<Expr *, 16> Vars;
9941   CXXScopeSpec MapperIdScopeSpec;
9942   DeclarationNameInfo MapperIdInfo;
9943   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9944   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9945           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9946     return nullptr;
9947   return getDerived().RebuildOMPToClause(
9948       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9949       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9950 }
9951 
9952 template <typename Derived>
9953 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9954   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9955   llvm::SmallVector<Expr *, 16> Vars;
9956   CXXScopeSpec MapperIdScopeSpec;
9957   DeclarationNameInfo MapperIdInfo;
9958   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9959   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9960           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9961     return nullptr;
9962   return getDerived().RebuildOMPFromClause(
9963       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9964       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9965 }
9966 
9967 template <typename Derived>
9968 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9969     OMPUseDevicePtrClause *C) {
9970   llvm::SmallVector<Expr *, 16> Vars;
9971   Vars.reserve(C->varlist_size());
9972   for (auto *VE : C->varlists()) {
9973     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9974     if (EVar.isInvalid())
9975       return nullptr;
9976     Vars.push_back(EVar.get());
9977   }
9978   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9979   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9980 }
9981 
9982 template <typename Derived>
9983 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
9984     OMPUseDeviceAddrClause *C) {
9985   llvm::SmallVector<Expr *, 16> Vars;
9986   Vars.reserve(C->varlist_size());
9987   for (auto *VE : C->varlists()) {
9988     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9989     if (EVar.isInvalid())
9990       return nullptr;
9991     Vars.push_back(EVar.get());
9992   }
9993   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9994   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
9995 }
9996 
9997 template <typename Derived>
9998 OMPClause *
9999 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10000   llvm::SmallVector<Expr *, 16> Vars;
10001   Vars.reserve(C->varlist_size());
10002   for (auto *VE : C->varlists()) {
10003     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10004     if (EVar.isInvalid())
10005       return nullptr;
10006     Vars.push_back(EVar.get());
10007   }
10008   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10009   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10010 }
10011 
10012 template <typename Derived>
10013 OMPClause *
10014 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10015   llvm::SmallVector<Expr *, 16> Vars;
10016   Vars.reserve(C->varlist_size());
10017   for (auto *VE : C->varlists()) {
10018     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10019     if (EVar.isInvalid())
10020       return nullptr;
10021     Vars.push_back(EVar.get());
10022   }
10023   return getDerived().RebuildOMPNontemporalClause(
10024       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10025 }
10026 
10027 template <typename Derived>
10028 OMPClause *
10029 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10030   llvm::SmallVector<Expr *, 16> Vars;
10031   Vars.reserve(C->varlist_size());
10032   for (auto *VE : C->varlists()) {
10033     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10034     if (EVar.isInvalid())
10035       return nullptr;
10036     Vars.push_back(EVar.get());
10037   }
10038   return getDerived().RebuildOMPInclusiveClause(
10039       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10040 }
10041 
10042 template <typename Derived>
10043 OMPClause *
10044 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10045   llvm::SmallVector<Expr *, 16> Vars;
10046   Vars.reserve(C->varlist_size());
10047   for (auto *VE : C->varlists()) {
10048     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10049     if (EVar.isInvalid())
10050       return nullptr;
10051     Vars.push_back(EVar.get());
10052   }
10053   return getDerived().RebuildOMPExclusiveClause(
10054       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10055 }
10056 
10057 template <typename Derived>
10058 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10059     OMPUsesAllocatorsClause *C) {
10060   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10061   Data.reserve(C->getNumberOfAllocators());
10062   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10063     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10064     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10065     if (Allocator.isInvalid())
10066       continue;
10067     ExprResult AllocatorTraits;
10068     if (Expr *AT = D.AllocatorTraits) {
10069       AllocatorTraits = getDerived().TransformExpr(AT);
10070       if (AllocatorTraits.isInvalid())
10071         continue;
10072     }
10073     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10074     NewD.Allocator = Allocator.get();
10075     NewD.AllocatorTraits = AllocatorTraits.get();
10076     NewD.LParenLoc = D.LParenLoc;
10077     NewD.RParenLoc = D.RParenLoc;
10078   }
10079   return getDerived().RebuildOMPUsesAllocatorsClause(
10080       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10081 }
10082 
10083 template <typename Derived>
10084 OMPClause *
10085 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10086   SmallVector<Expr *, 4> Locators;
10087   Locators.reserve(C->varlist_size());
10088   ExprResult ModifierRes;
10089   if (Expr *Modifier = C->getModifier()) {
10090     ModifierRes = getDerived().TransformExpr(Modifier);
10091     if (ModifierRes.isInvalid())
10092       return nullptr;
10093   }
10094   for (Expr *E : C->varlists()) {
10095     ExprResult Locator = getDerived().TransformExpr(E);
10096     if (Locator.isInvalid())
10097       continue;
10098     Locators.push_back(Locator.get());
10099   }
10100   return getDerived().RebuildOMPAffinityClause(
10101       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10102       ModifierRes.get(), Locators);
10103 }
10104 
10105 template <typename Derived>
10106 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10107   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10108                                             C->getBeginLoc(), C->getLParenLoc(),
10109                                             C->getEndLoc());
10110 }
10111 
10112 //===----------------------------------------------------------------------===//
10113 // Expression transformation
10114 //===----------------------------------------------------------------------===//
10115 template<typename Derived>
10116 ExprResult
10117 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10118   return TransformExpr(E->getSubExpr());
10119 }
10120 
10121 template<typename Derived>
10122 ExprResult
10123 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10124   if (!E->isTypeDependent())
10125     return E;
10126 
10127   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10128                                             E->getIdentKind());
10129 }
10130 
10131 template<typename Derived>
10132 ExprResult
10133 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10134   NestedNameSpecifierLoc QualifierLoc;
10135   if (E->getQualifierLoc()) {
10136     QualifierLoc
10137       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10138     if (!QualifierLoc)
10139       return ExprError();
10140   }
10141 
10142   ValueDecl *ND
10143     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10144                                                          E->getDecl()));
10145   if (!ND)
10146     return ExprError();
10147 
10148   NamedDecl *Found = ND;
10149   if (E->getFoundDecl() != E->getDecl()) {
10150     Found = cast_or_null<NamedDecl>(
10151         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10152     if (!Found)
10153       return ExprError();
10154   }
10155 
10156   DeclarationNameInfo NameInfo = E->getNameInfo();
10157   if (NameInfo.getName()) {
10158     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10159     if (!NameInfo.getName())
10160       return ExprError();
10161   }
10162 
10163   if (!getDerived().AlwaysRebuild() &&
10164       QualifierLoc == E->getQualifierLoc() &&
10165       ND == E->getDecl() &&
10166       Found == E->getFoundDecl() &&
10167       NameInfo.getName() == E->getDecl()->getDeclName() &&
10168       !E->hasExplicitTemplateArgs()) {
10169 
10170     // Mark it referenced in the new context regardless.
10171     // FIXME: this is a bit instantiation-specific.
10172     SemaRef.MarkDeclRefReferenced(E);
10173 
10174     return E;
10175   }
10176 
10177   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10178   if (E->hasExplicitTemplateArgs()) {
10179     TemplateArgs = &TransArgs;
10180     TransArgs.setLAngleLoc(E->getLAngleLoc());
10181     TransArgs.setRAngleLoc(E->getRAngleLoc());
10182     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10183                                                 E->getNumTemplateArgs(),
10184                                                 TransArgs))
10185       return ExprError();
10186   }
10187 
10188   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10189                                          Found, TemplateArgs);
10190 }
10191 
10192 template<typename Derived>
10193 ExprResult
10194 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10195   return E;
10196 }
10197 
10198 template <typename Derived>
10199 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10200     FixedPointLiteral *E) {
10201   return E;
10202 }
10203 
10204 template<typename Derived>
10205 ExprResult
10206 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10207   return E;
10208 }
10209 
10210 template<typename Derived>
10211 ExprResult
10212 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10213   return E;
10214 }
10215 
10216 template<typename Derived>
10217 ExprResult
10218 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10219   return E;
10220 }
10221 
10222 template<typename Derived>
10223 ExprResult
10224 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10225   return E;
10226 }
10227 
10228 template<typename Derived>
10229 ExprResult
10230 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10231   if (FunctionDecl *FD = E->getDirectCallee())
10232     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10233   return SemaRef.MaybeBindToTemporary(E);
10234 }
10235 
10236 template<typename Derived>
10237 ExprResult
10238 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10239   ExprResult ControllingExpr =
10240     getDerived().TransformExpr(E->getControllingExpr());
10241   if (ControllingExpr.isInvalid())
10242     return ExprError();
10243 
10244   SmallVector<Expr *, 4> AssocExprs;
10245   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10246   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10247     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10248     if (TSI) {
10249       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10250       if (!AssocType)
10251         return ExprError();
10252       AssocTypes.push_back(AssocType);
10253     } else {
10254       AssocTypes.push_back(nullptr);
10255     }
10256 
10257     ExprResult AssocExpr =
10258         getDerived().TransformExpr(Assoc.getAssociationExpr());
10259     if (AssocExpr.isInvalid())
10260       return ExprError();
10261     AssocExprs.push_back(AssocExpr.get());
10262   }
10263 
10264   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10265                                                   E->getDefaultLoc(),
10266                                                   E->getRParenLoc(),
10267                                                   ControllingExpr.get(),
10268                                                   AssocTypes,
10269                                                   AssocExprs);
10270 }
10271 
10272 template<typename Derived>
10273 ExprResult
10274 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10275   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10276   if (SubExpr.isInvalid())
10277     return ExprError();
10278 
10279   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10280     return E;
10281 
10282   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10283                                        E->getRParen());
10284 }
10285 
10286 /// The operand of a unary address-of operator has special rules: it's
10287 /// allowed to refer to a non-static member of a class even if there's no 'this'
10288 /// object available.
10289 template<typename Derived>
10290 ExprResult
10291 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10292   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10293     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10294   else
10295     return getDerived().TransformExpr(E);
10296 }
10297 
10298 template<typename Derived>
10299 ExprResult
10300 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10301   ExprResult SubExpr;
10302   if (E->getOpcode() == UO_AddrOf)
10303     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10304   else
10305     SubExpr = TransformExpr(E->getSubExpr());
10306   if (SubExpr.isInvalid())
10307     return ExprError();
10308 
10309   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10310     return E;
10311 
10312   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10313                                            E->getOpcode(),
10314                                            SubExpr.get());
10315 }
10316 
10317 template<typename Derived>
10318 ExprResult
10319 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10320   // Transform the type.
10321   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10322   if (!Type)
10323     return ExprError();
10324 
10325   // Transform all of the components into components similar to what the
10326   // parser uses.
10327   // FIXME: It would be slightly more efficient in the non-dependent case to
10328   // just map FieldDecls, rather than requiring the rebuilder to look for
10329   // the fields again. However, __builtin_offsetof is rare enough in
10330   // template code that we don't care.
10331   bool ExprChanged = false;
10332   typedef Sema::OffsetOfComponent Component;
10333   SmallVector<Component, 4> Components;
10334   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10335     const OffsetOfNode &ON = E->getComponent(I);
10336     Component Comp;
10337     Comp.isBrackets = true;
10338     Comp.LocStart = ON.getSourceRange().getBegin();
10339     Comp.LocEnd = ON.getSourceRange().getEnd();
10340     switch (ON.getKind()) {
10341     case OffsetOfNode::Array: {
10342       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10343       ExprResult Index = getDerived().TransformExpr(FromIndex);
10344       if (Index.isInvalid())
10345         return ExprError();
10346 
10347       ExprChanged = ExprChanged || Index.get() != FromIndex;
10348       Comp.isBrackets = true;
10349       Comp.U.E = Index.get();
10350       break;
10351     }
10352 
10353     case OffsetOfNode::Field:
10354     case OffsetOfNode::Identifier:
10355       Comp.isBrackets = false;
10356       Comp.U.IdentInfo = ON.getFieldName();
10357       if (!Comp.U.IdentInfo)
10358         continue;
10359 
10360       break;
10361 
10362     case OffsetOfNode::Base:
10363       // Will be recomputed during the rebuild.
10364       continue;
10365     }
10366 
10367     Components.push_back(Comp);
10368   }
10369 
10370   // If nothing changed, retain the existing expression.
10371   if (!getDerived().AlwaysRebuild() &&
10372       Type == E->getTypeSourceInfo() &&
10373       !ExprChanged)
10374     return E;
10375 
10376   // Build a new offsetof expression.
10377   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10378                                           Components, E->getRParenLoc());
10379 }
10380 
10381 template<typename Derived>
10382 ExprResult
10383 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10384   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10385          "opaque value expression requires transformation");
10386   return E;
10387 }
10388 
10389 template<typename Derived>
10390 ExprResult
10391 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10392   return E;
10393 }
10394 
10395 template <typename Derived>
10396 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10397   llvm::SmallVector<Expr *, 8> Children;
10398   bool Changed = false;
10399   for (Expr *C : E->subExpressions()) {
10400     ExprResult NewC = getDerived().TransformExpr(C);
10401     if (NewC.isInvalid())
10402       return ExprError();
10403     Children.push_back(NewC.get());
10404 
10405     Changed |= NewC.get() != C;
10406   }
10407   if (!getDerived().AlwaysRebuild() && !Changed)
10408     return E;
10409   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10410                                           Children, E->getType());
10411 }
10412 
10413 template<typename Derived>
10414 ExprResult
10415 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10416   // Rebuild the syntactic form.  The original syntactic form has
10417   // opaque-value expressions in it, so strip those away and rebuild
10418   // the result.  This is a really awful way of doing this, but the
10419   // better solution (rebuilding the semantic expressions and
10420   // rebinding OVEs as necessary) doesn't work; we'd need
10421   // TreeTransform to not strip away implicit conversions.
10422   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10423   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10424   if (result.isInvalid()) return ExprError();
10425 
10426   // If that gives us a pseudo-object result back, the pseudo-object
10427   // expression must have been an lvalue-to-rvalue conversion which we
10428   // should reapply.
10429   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10430     result = SemaRef.checkPseudoObjectRValue(result.get());
10431 
10432   return result;
10433 }
10434 
10435 template<typename Derived>
10436 ExprResult
10437 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10438                                                 UnaryExprOrTypeTraitExpr *E) {
10439   if (E->isArgumentType()) {
10440     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10441 
10442     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10443     if (!NewT)
10444       return ExprError();
10445 
10446     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10447       return E;
10448 
10449     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10450                                                     E->getKind(),
10451                                                     E->getSourceRange());
10452   }
10453 
10454   // C++0x [expr.sizeof]p1:
10455   //   The operand is either an expression, which is an unevaluated operand
10456   //   [...]
10457   EnterExpressionEvaluationContext Unevaluated(
10458       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10459       Sema::ReuseLambdaContextDecl);
10460 
10461   // Try to recover if we have something like sizeof(T::X) where X is a type.
10462   // Notably, there must be *exactly* one set of parens if X is a type.
10463   TypeSourceInfo *RecoveryTSI = nullptr;
10464   ExprResult SubExpr;
10465   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10466   if (auto *DRE =
10467           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10468     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10469         PE, DRE, false, &RecoveryTSI);
10470   else
10471     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10472 
10473   if (RecoveryTSI) {
10474     return getDerived().RebuildUnaryExprOrTypeTrait(
10475         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10476   } else if (SubExpr.isInvalid())
10477     return ExprError();
10478 
10479   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10480     return E;
10481 
10482   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10483                                                   E->getOperatorLoc(),
10484                                                   E->getKind(),
10485                                                   E->getSourceRange());
10486 }
10487 
10488 template<typename Derived>
10489 ExprResult
10490 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10491   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10492   if (LHS.isInvalid())
10493     return ExprError();
10494 
10495   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10496   if (RHS.isInvalid())
10497     return ExprError();
10498 
10499 
10500   if (!getDerived().AlwaysRebuild() &&
10501       LHS.get() == E->getLHS() &&
10502       RHS.get() == E->getRHS())
10503     return E;
10504 
10505   return getDerived().RebuildArraySubscriptExpr(
10506       LHS.get(),
10507       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10508 }
10509 
10510 template <typename Derived>
10511 ExprResult
10512 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10513   ExprResult Base = getDerived().TransformExpr(E->getBase());
10514   if (Base.isInvalid())
10515     return ExprError();
10516 
10517   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10518   if (RowIdx.isInvalid())
10519     return ExprError();
10520 
10521   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10522   if (ColumnIdx.isInvalid())
10523     return ExprError();
10524 
10525   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10526       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10527     return E;
10528 
10529   return getDerived().RebuildMatrixSubscriptExpr(
10530       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10531 }
10532 
10533 template <typename Derived>
10534 ExprResult
10535 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10536   ExprResult Base = getDerived().TransformExpr(E->getBase());
10537   if (Base.isInvalid())
10538     return ExprError();
10539 
10540   ExprResult LowerBound;
10541   if (E->getLowerBound()) {
10542     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10543     if (LowerBound.isInvalid())
10544       return ExprError();
10545   }
10546 
10547   ExprResult Length;
10548   if (E->getLength()) {
10549     Length = getDerived().TransformExpr(E->getLength());
10550     if (Length.isInvalid())
10551       return ExprError();
10552   }
10553 
10554   ExprResult Stride;
10555   if (Expr *Str = E->getStride()) {
10556     Stride = getDerived().TransformExpr(Str);
10557     if (Stride.isInvalid())
10558       return ExprError();
10559   }
10560 
10561   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10562       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10563     return E;
10564 
10565   return getDerived().RebuildOMPArraySectionExpr(
10566       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10567       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10568       E->getRBracketLoc());
10569 }
10570 
10571 template <typename Derived>
10572 ExprResult
10573 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10574   ExprResult Base = getDerived().TransformExpr(E->getBase());
10575   if (Base.isInvalid())
10576     return ExprError();
10577 
10578   SmallVector<Expr *, 4> Dims;
10579   bool ErrorFound = false;
10580   for (Expr *Dim : E->getDimensions()) {
10581     ExprResult DimRes = getDerived().TransformExpr(Dim);
10582     if (DimRes.isInvalid()) {
10583       ErrorFound = true;
10584       continue;
10585     }
10586     Dims.push_back(DimRes.get());
10587   }
10588 
10589   if (ErrorFound)
10590     return ExprError();
10591   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10592                                                  E->getRParenLoc(), Dims,
10593                                                  E->getBracketsRanges());
10594 }
10595 
10596 template <typename Derived>
10597 ExprResult
10598 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10599   unsigned NumIterators = E->numOfIterators();
10600   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10601 
10602   bool ErrorFound = false;
10603   bool NeedToRebuild = getDerived().AlwaysRebuild();
10604   for (unsigned I = 0; I < NumIterators; ++I) {
10605     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10606     Data[I].DeclIdent = D->getIdentifier();
10607     Data[I].DeclIdentLoc = D->getLocation();
10608     if (D->getLocation() == D->getBeginLoc()) {
10609       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10610              "Implicit type must be int.");
10611     } else {
10612       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10613       QualType DeclTy = getDerived().TransformType(D->getType());
10614       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10615     }
10616     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10617     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10618     ExprResult End = getDerived().TransformExpr(Range.End);
10619     ExprResult Step = getDerived().TransformExpr(Range.Step);
10620     ErrorFound = ErrorFound ||
10621                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10622                                                !Data[I].Type.get().isNull())) ||
10623                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10624     if (ErrorFound)
10625       continue;
10626     Data[I].Range.Begin = Begin.get();
10627     Data[I].Range.End = End.get();
10628     Data[I].Range.Step = Step.get();
10629     Data[I].AssignLoc = E->getAssignLoc(I);
10630     Data[I].ColonLoc = E->getColonLoc(I);
10631     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10632     NeedToRebuild =
10633         NeedToRebuild ||
10634         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10635                                        D->getType().getTypePtrOrNull()) ||
10636         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10637         Range.Step != Data[I].Range.Step;
10638   }
10639   if (ErrorFound)
10640     return ExprError();
10641   if (!NeedToRebuild)
10642     return E;
10643 
10644   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10645       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10646   if (!Res.isUsable())
10647     return Res;
10648   auto *IE = cast<OMPIteratorExpr>(Res.get());
10649   for (unsigned I = 0; I < NumIterators; ++I)
10650     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10651                                       IE->getIteratorDecl(I));
10652   return Res;
10653 }
10654 
10655 template<typename Derived>
10656 ExprResult
10657 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10658   // Transform the callee.
10659   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10660   if (Callee.isInvalid())
10661     return ExprError();
10662 
10663   // Transform arguments.
10664   bool ArgChanged = false;
10665   SmallVector<Expr*, 8> Args;
10666   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10667                                   &ArgChanged))
10668     return ExprError();
10669 
10670   if (!getDerived().AlwaysRebuild() &&
10671       Callee.get() == E->getCallee() &&
10672       !ArgChanged)
10673     return SemaRef.MaybeBindToTemporary(E);
10674 
10675   // FIXME: Wrong source location information for the '('.
10676   SourceLocation FakeLParenLoc
10677     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10678 
10679   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10680   if (E->hasStoredFPFeatures()) {
10681     FPOptionsOverride NewOverrides = E->getFPFeatures();
10682     getSema().CurFPFeatures =
10683         NewOverrides.applyOverrides(getSema().getLangOpts());
10684     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10685   }
10686 
10687   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10688                                       Args,
10689                                       E->getRParenLoc());
10690 }
10691 
10692 template<typename Derived>
10693 ExprResult
10694 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10695   ExprResult Base = getDerived().TransformExpr(E->getBase());
10696   if (Base.isInvalid())
10697     return ExprError();
10698 
10699   NestedNameSpecifierLoc QualifierLoc;
10700   if (E->hasQualifier()) {
10701     QualifierLoc
10702       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10703 
10704     if (!QualifierLoc)
10705       return ExprError();
10706   }
10707   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10708 
10709   ValueDecl *Member
10710     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10711                                                          E->getMemberDecl()));
10712   if (!Member)
10713     return ExprError();
10714 
10715   NamedDecl *FoundDecl = E->getFoundDecl();
10716   if (FoundDecl == E->getMemberDecl()) {
10717     FoundDecl = Member;
10718   } else {
10719     FoundDecl = cast_or_null<NamedDecl>(
10720                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10721     if (!FoundDecl)
10722       return ExprError();
10723   }
10724 
10725   if (!getDerived().AlwaysRebuild() &&
10726       Base.get() == E->getBase() &&
10727       QualifierLoc == E->getQualifierLoc() &&
10728       Member == E->getMemberDecl() &&
10729       FoundDecl == E->getFoundDecl() &&
10730       !E->hasExplicitTemplateArgs()) {
10731 
10732     // Mark it referenced in the new context regardless.
10733     // FIXME: this is a bit instantiation-specific.
10734     SemaRef.MarkMemberReferenced(E);
10735 
10736     return E;
10737   }
10738 
10739   TemplateArgumentListInfo TransArgs;
10740   if (E->hasExplicitTemplateArgs()) {
10741     TransArgs.setLAngleLoc(E->getLAngleLoc());
10742     TransArgs.setRAngleLoc(E->getRAngleLoc());
10743     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10744                                                 E->getNumTemplateArgs(),
10745                                                 TransArgs))
10746       return ExprError();
10747   }
10748 
10749   // FIXME: Bogus source location for the operator
10750   SourceLocation FakeOperatorLoc =
10751       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10752 
10753   // FIXME: to do this check properly, we will need to preserve the
10754   // first-qualifier-in-scope here, just in case we had a dependent
10755   // base (and therefore couldn't do the check) and a
10756   // nested-name-qualifier (and therefore could do the lookup).
10757   NamedDecl *FirstQualifierInScope = nullptr;
10758   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10759   if (MemberNameInfo.getName()) {
10760     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10761     if (!MemberNameInfo.getName())
10762       return ExprError();
10763   }
10764 
10765   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10766                                         E->isArrow(),
10767                                         QualifierLoc,
10768                                         TemplateKWLoc,
10769                                         MemberNameInfo,
10770                                         Member,
10771                                         FoundDecl,
10772                                         (E->hasExplicitTemplateArgs()
10773                                            ? &TransArgs : nullptr),
10774                                         FirstQualifierInScope);
10775 }
10776 
10777 template<typename Derived>
10778 ExprResult
10779 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10780   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10781   if (LHS.isInvalid())
10782     return ExprError();
10783 
10784   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10785   if (RHS.isInvalid())
10786     return ExprError();
10787 
10788   if (!getDerived().AlwaysRebuild() &&
10789       LHS.get() == E->getLHS() &&
10790       RHS.get() == E->getRHS())
10791     return E;
10792 
10793   if (E->isCompoundAssignmentOp())
10794     // FPFeatures has already been established from trailing storage
10795     return getDerived().RebuildBinaryOperator(
10796         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10797   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10798   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10799   getSema().CurFPFeatures =
10800       NewOverrides.applyOverrides(getSema().getLangOpts());
10801   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10802   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10803                                             LHS.get(), RHS.get());
10804 }
10805 
10806 template <typename Derived>
10807 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10808     CXXRewrittenBinaryOperator *E) {
10809   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10810 
10811   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10812   if (LHS.isInvalid())
10813     return ExprError();
10814 
10815   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10816   if (RHS.isInvalid())
10817     return ExprError();
10818 
10819   if (!getDerived().AlwaysRebuild() &&
10820       LHS.get() == Decomp.LHS &&
10821       RHS.get() == Decomp.RHS)
10822     return E;
10823 
10824   // Extract the already-resolved callee declarations so that we can restrict
10825   // ourselves to using them as the unqualified lookup results when rebuilding.
10826   UnresolvedSet<2> UnqualLookups;
10827   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10828                             const_cast<Expr *>(Decomp.InnerBinOp)};
10829   for (Expr *PossibleBinOp : PossibleBinOps) {
10830     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10831     if (!Op)
10832       continue;
10833     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10834     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10835       continue;
10836 
10837     // Transform the callee in case we built a call to a local extern
10838     // declaration.
10839     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10840         E->getOperatorLoc(), Callee->getFoundDecl()));
10841     if (!Found)
10842       return ExprError();
10843     UnqualLookups.addDecl(Found);
10844   }
10845 
10846   return getDerived().RebuildCXXRewrittenBinaryOperator(
10847       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10848 }
10849 
10850 template<typename Derived>
10851 ExprResult
10852 TreeTransform<Derived>::TransformCompoundAssignOperator(
10853                                                       CompoundAssignOperator *E) {
10854   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10855   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10856   getSema().CurFPFeatures =
10857       NewOverrides.applyOverrides(getSema().getLangOpts());
10858   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10859   return getDerived().TransformBinaryOperator(E);
10860 }
10861 
10862 template<typename Derived>
10863 ExprResult TreeTransform<Derived>::
10864 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10865   // Just rebuild the common and RHS expressions and see whether we
10866   // get any changes.
10867 
10868   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10869   if (commonExpr.isInvalid())
10870     return ExprError();
10871 
10872   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10873   if (rhs.isInvalid())
10874     return ExprError();
10875 
10876   if (!getDerived().AlwaysRebuild() &&
10877       commonExpr.get() == e->getCommon() &&
10878       rhs.get() == e->getFalseExpr())
10879     return e;
10880 
10881   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10882                                                  e->getQuestionLoc(),
10883                                                  nullptr,
10884                                                  e->getColonLoc(),
10885                                                  rhs.get());
10886 }
10887 
10888 template<typename Derived>
10889 ExprResult
10890 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10891   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10892   if (Cond.isInvalid())
10893     return ExprError();
10894 
10895   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10896   if (LHS.isInvalid())
10897     return ExprError();
10898 
10899   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10900   if (RHS.isInvalid())
10901     return ExprError();
10902 
10903   if (!getDerived().AlwaysRebuild() &&
10904       Cond.get() == E->getCond() &&
10905       LHS.get() == E->getLHS() &&
10906       RHS.get() == E->getRHS())
10907     return E;
10908 
10909   return getDerived().RebuildConditionalOperator(Cond.get(),
10910                                                  E->getQuestionLoc(),
10911                                                  LHS.get(),
10912                                                  E->getColonLoc(),
10913                                                  RHS.get());
10914 }
10915 
10916 template<typename Derived>
10917 ExprResult
10918 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10919   // Implicit casts are eliminated during transformation, since they
10920   // will be recomputed by semantic analysis after transformation.
10921   return getDerived().TransformExpr(E->getSubExprAsWritten());
10922 }
10923 
10924 template<typename Derived>
10925 ExprResult
10926 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10927   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10928   if (!Type)
10929     return ExprError();
10930 
10931   ExprResult SubExpr
10932     = getDerived().TransformExpr(E->getSubExprAsWritten());
10933   if (SubExpr.isInvalid())
10934     return ExprError();
10935 
10936   if (!getDerived().AlwaysRebuild() &&
10937       Type == E->getTypeInfoAsWritten() &&
10938       SubExpr.get() == E->getSubExpr())
10939     return E;
10940 
10941   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10942                                             Type,
10943                                             E->getRParenLoc(),
10944                                             SubExpr.get());
10945 }
10946 
10947 template<typename Derived>
10948 ExprResult
10949 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10950   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10951   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10952   if (!NewT)
10953     return ExprError();
10954 
10955   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10956   if (Init.isInvalid())
10957     return ExprError();
10958 
10959   if (!getDerived().AlwaysRebuild() &&
10960       OldT == NewT &&
10961       Init.get() == E->getInitializer())
10962     return SemaRef.MaybeBindToTemporary(E);
10963 
10964   // Note: the expression type doesn't necessarily match the
10965   // type-as-written, but that's okay, because it should always be
10966   // derivable from the initializer.
10967 
10968   return getDerived().RebuildCompoundLiteralExpr(
10969       E->getLParenLoc(), NewT,
10970       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10971 }
10972 
10973 template<typename Derived>
10974 ExprResult
10975 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10976   ExprResult Base = getDerived().TransformExpr(E->getBase());
10977   if (Base.isInvalid())
10978     return ExprError();
10979 
10980   if (!getDerived().AlwaysRebuild() &&
10981       Base.get() == E->getBase())
10982     return E;
10983 
10984   // FIXME: Bad source location
10985   SourceLocation FakeOperatorLoc =
10986       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10987   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10988                                                   E->getAccessorLoc(),
10989                                                   E->getAccessor());
10990 }
10991 
10992 template<typename Derived>
10993 ExprResult
10994 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10995   if (InitListExpr *Syntactic = E->getSyntacticForm())
10996     E = Syntactic;
10997 
10998   bool InitChanged = false;
10999 
11000   EnterExpressionEvaluationContext Context(
11001       getSema(), EnterExpressionEvaluationContext::InitList);
11002 
11003   SmallVector<Expr*, 4> Inits;
11004   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11005                                   Inits, &InitChanged))
11006     return ExprError();
11007 
11008   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11009     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11010     // in some cases. We can't reuse it in general, because the syntactic and
11011     // semantic forms are linked, and we can't know that semantic form will
11012     // match even if the syntactic form does.
11013   }
11014 
11015   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11016                                       E->getRBraceLoc());
11017 }
11018 
11019 template<typename Derived>
11020 ExprResult
11021 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11022   Designation Desig;
11023 
11024   // transform the initializer value
11025   ExprResult Init = getDerived().TransformExpr(E->getInit());
11026   if (Init.isInvalid())
11027     return ExprError();
11028 
11029   // transform the designators.
11030   SmallVector<Expr*, 4> ArrayExprs;
11031   bool ExprChanged = false;
11032   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11033     if (D.isFieldDesignator()) {
11034       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11035                                                D.getDotLoc(),
11036                                                D.getFieldLoc()));
11037       if (D.getField()) {
11038         FieldDecl *Field = cast_or_null<FieldDecl>(
11039             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11040         if (Field != D.getField())
11041           // Rebuild the expression when the transformed FieldDecl is
11042           // different to the already assigned FieldDecl.
11043           ExprChanged = true;
11044       } else {
11045         // Ensure that the designator expression is rebuilt when there isn't
11046         // a resolved FieldDecl in the designator as we don't want to assign
11047         // a FieldDecl to a pattern designator that will be instantiated again.
11048         ExprChanged = true;
11049       }
11050       continue;
11051     }
11052 
11053     if (D.isArrayDesignator()) {
11054       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11055       if (Index.isInvalid())
11056         return ExprError();
11057 
11058       Desig.AddDesignator(
11059           Designator::getArray(Index.get(), D.getLBracketLoc()));
11060 
11061       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11062       ArrayExprs.push_back(Index.get());
11063       continue;
11064     }
11065 
11066     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11067     ExprResult Start
11068       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11069     if (Start.isInvalid())
11070       return ExprError();
11071 
11072     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11073     if (End.isInvalid())
11074       return ExprError();
11075 
11076     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11077                                                   End.get(),
11078                                                   D.getLBracketLoc(),
11079                                                   D.getEllipsisLoc()));
11080 
11081     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11082                   End.get() != E->getArrayRangeEnd(D);
11083 
11084     ArrayExprs.push_back(Start.get());
11085     ArrayExprs.push_back(End.get());
11086   }
11087 
11088   if (!getDerived().AlwaysRebuild() &&
11089       Init.get() == E->getInit() &&
11090       !ExprChanged)
11091     return E;
11092 
11093   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11094                                                 E->getEqualOrColonLoc(),
11095                                                 E->usesGNUSyntax(), Init.get());
11096 }
11097 
11098 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11099 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11100 template<typename Derived>
11101 ExprResult
11102 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11103     DesignatedInitUpdateExpr *E) {
11104   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11105                    "initializer");
11106   return ExprError();
11107 }
11108 
11109 template<typename Derived>
11110 ExprResult
11111 TreeTransform<Derived>::TransformNoInitExpr(
11112     NoInitExpr *E) {
11113   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11114   return ExprError();
11115 }
11116 
11117 template<typename Derived>
11118 ExprResult
11119 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11120   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11121   return ExprError();
11122 }
11123 
11124 template<typename Derived>
11125 ExprResult
11126 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11127   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11128   return ExprError();
11129 }
11130 
11131 template<typename Derived>
11132 ExprResult
11133 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11134                                                      ImplicitValueInitExpr *E) {
11135   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11136 
11137   // FIXME: Will we ever have proper type location here? Will we actually
11138   // need to transform the type?
11139   QualType T = getDerived().TransformType(E->getType());
11140   if (T.isNull())
11141     return ExprError();
11142 
11143   if (!getDerived().AlwaysRebuild() &&
11144       T == E->getType())
11145     return E;
11146 
11147   return getDerived().RebuildImplicitValueInitExpr(T);
11148 }
11149 
11150 template<typename Derived>
11151 ExprResult
11152 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11153   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11154   if (!TInfo)
11155     return ExprError();
11156 
11157   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11158   if (SubExpr.isInvalid())
11159     return ExprError();
11160 
11161   if (!getDerived().AlwaysRebuild() &&
11162       TInfo == E->getWrittenTypeInfo() &&
11163       SubExpr.get() == E->getSubExpr())
11164     return E;
11165 
11166   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11167                                        TInfo, E->getRParenLoc());
11168 }
11169 
11170 template<typename Derived>
11171 ExprResult
11172 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11173   bool ArgumentChanged = false;
11174   SmallVector<Expr*, 4> Inits;
11175   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11176                      &ArgumentChanged))
11177     return ExprError();
11178 
11179   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11180                                            Inits,
11181                                            E->getRParenLoc());
11182 }
11183 
11184 /// Transform an address-of-label expression.
11185 ///
11186 /// By default, the transformation of an address-of-label expression always
11187 /// rebuilds the expression, so that the label identifier can be resolved to
11188 /// the corresponding label statement by semantic analysis.
11189 template<typename Derived>
11190 ExprResult
11191 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11192   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11193                                         E->getLabel());
11194   if (!LD)
11195     return ExprError();
11196 
11197   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11198                                            cast<LabelDecl>(LD));
11199 }
11200 
11201 template<typename Derived>
11202 ExprResult
11203 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11204   SemaRef.ActOnStartStmtExpr();
11205   StmtResult SubStmt
11206     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11207   if (SubStmt.isInvalid()) {
11208     SemaRef.ActOnStmtExprError();
11209     return ExprError();
11210   }
11211 
11212   unsigned OldDepth = E->getTemplateDepth();
11213   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11214 
11215   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11216       SubStmt.get() == E->getSubStmt()) {
11217     // Calling this an 'error' is unintuitive, but it does the right thing.
11218     SemaRef.ActOnStmtExprError();
11219     return SemaRef.MaybeBindToTemporary(E);
11220   }
11221 
11222   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11223                                       E->getRParenLoc(), NewDepth);
11224 }
11225 
11226 template<typename Derived>
11227 ExprResult
11228 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11229   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11230   if (Cond.isInvalid())
11231     return ExprError();
11232 
11233   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11234   if (LHS.isInvalid())
11235     return ExprError();
11236 
11237   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11238   if (RHS.isInvalid())
11239     return ExprError();
11240 
11241   if (!getDerived().AlwaysRebuild() &&
11242       Cond.get() == E->getCond() &&
11243       LHS.get() == E->getLHS() &&
11244       RHS.get() == E->getRHS())
11245     return E;
11246 
11247   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11248                                         Cond.get(), LHS.get(), RHS.get(),
11249                                         E->getRParenLoc());
11250 }
11251 
11252 template<typename Derived>
11253 ExprResult
11254 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11255   return E;
11256 }
11257 
11258 template<typename Derived>
11259 ExprResult
11260 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11261   switch (E->getOperator()) {
11262   case OO_New:
11263   case OO_Delete:
11264   case OO_Array_New:
11265   case OO_Array_Delete:
11266     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11267 
11268   case OO_Call: {
11269     // This is a call to an object's operator().
11270     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11271 
11272     // Transform the object itself.
11273     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11274     if (Object.isInvalid())
11275       return ExprError();
11276 
11277     // FIXME: Poor location information
11278     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11279         static_cast<Expr *>(Object.get())->getEndLoc());
11280 
11281     // Transform the call arguments.
11282     SmallVector<Expr*, 8> Args;
11283     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11284                                     Args))
11285       return ExprError();
11286 
11287     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11288                                         E->getEndLoc());
11289   }
11290 
11291 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11292   case OO_##Name:
11293 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11294 #include "clang/Basic/OperatorKinds.def"
11295   case OO_Subscript:
11296     // Handled below.
11297     break;
11298 
11299   case OO_Conditional:
11300     llvm_unreachable("conditional operator is not actually overloadable");
11301 
11302   case OO_None:
11303   case NUM_OVERLOADED_OPERATORS:
11304     llvm_unreachable("not an overloaded operator?");
11305   }
11306 
11307   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11308   if (Callee.isInvalid())
11309     return ExprError();
11310 
11311   ExprResult First;
11312   if (E->getOperator() == OO_Amp)
11313     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11314   else
11315     First = getDerived().TransformExpr(E->getArg(0));
11316   if (First.isInvalid())
11317     return ExprError();
11318 
11319   ExprResult Second;
11320   if (E->getNumArgs() == 2) {
11321     Second = getDerived().TransformExpr(E->getArg(1));
11322     if (Second.isInvalid())
11323       return ExprError();
11324   }
11325 
11326   if (!getDerived().AlwaysRebuild() &&
11327       Callee.get() == E->getCallee() &&
11328       First.get() == E->getArg(0) &&
11329       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11330     return SemaRef.MaybeBindToTemporary(E);
11331 
11332   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11333   FPOptionsOverride NewOverrides(E->getFPFeatures());
11334   getSema().CurFPFeatures =
11335       NewOverrides.applyOverrides(getSema().getLangOpts());
11336   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11337 
11338   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11339                                                  E->getOperatorLoc(),
11340                                                  Callee.get(),
11341                                                  First.get(),
11342                                                  Second.get());
11343 }
11344 
11345 template<typename Derived>
11346 ExprResult
11347 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11348   return getDerived().TransformCallExpr(E);
11349 }
11350 
11351 template <typename Derived>
11352 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11353   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11354                          getSema().CurContext != E->getParentContext();
11355 
11356   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11357     return E;
11358 
11359   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11360                                            E->getEndLoc(),
11361                                            getSema().CurContext);
11362 }
11363 
11364 template<typename Derived>
11365 ExprResult
11366 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11367   // Transform the callee.
11368   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11369   if (Callee.isInvalid())
11370     return ExprError();
11371 
11372   // Transform exec config.
11373   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11374   if (EC.isInvalid())
11375     return ExprError();
11376 
11377   // Transform arguments.
11378   bool ArgChanged = false;
11379   SmallVector<Expr*, 8> Args;
11380   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11381                                   &ArgChanged))
11382     return ExprError();
11383 
11384   if (!getDerived().AlwaysRebuild() &&
11385       Callee.get() == E->getCallee() &&
11386       !ArgChanged)
11387     return SemaRef.MaybeBindToTemporary(E);
11388 
11389   // FIXME: Wrong source location information for the '('.
11390   SourceLocation FakeLParenLoc
11391     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11392   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11393                                       Args,
11394                                       E->getRParenLoc(), EC.get());
11395 }
11396 
11397 template<typename Derived>
11398 ExprResult
11399 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11400   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11401   if (!Type)
11402     return ExprError();
11403 
11404   ExprResult SubExpr
11405     = getDerived().TransformExpr(E->getSubExprAsWritten());
11406   if (SubExpr.isInvalid())
11407     return ExprError();
11408 
11409   if (!getDerived().AlwaysRebuild() &&
11410       Type == E->getTypeInfoAsWritten() &&
11411       SubExpr.get() == E->getSubExpr())
11412     return E;
11413   return getDerived().RebuildCXXNamedCastExpr(
11414       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11415       Type, E->getAngleBrackets().getEnd(),
11416       // FIXME. this should be '(' location
11417       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11418 }
11419 
11420 template<typename Derived>
11421 ExprResult
11422 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11423   TypeSourceInfo *TSI =
11424       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11425   if (!TSI)
11426     return ExprError();
11427 
11428   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11429   if (Sub.isInvalid())
11430     return ExprError();
11431 
11432   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11433                                                 Sub.get(), BCE->getEndLoc());
11434 }
11435 
11436 template<typename Derived>
11437 ExprResult
11438 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11439   return getDerived().TransformCXXNamedCastExpr(E);
11440 }
11441 
11442 template<typename Derived>
11443 ExprResult
11444 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11445   return getDerived().TransformCXXNamedCastExpr(E);
11446 }
11447 
11448 template<typename Derived>
11449 ExprResult
11450 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11451                                                       CXXReinterpretCastExpr *E) {
11452   return getDerived().TransformCXXNamedCastExpr(E);
11453 }
11454 
11455 template<typename Derived>
11456 ExprResult
11457 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11458   return getDerived().TransformCXXNamedCastExpr(E);
11459 }
11460 
11461 template<typename Derived>
11462 ExprResult
11463 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11464   return getDerived().TransformCXXNamedCastExpr(E);
11465 }
11466 
11467 template<typename Derived>
11468 ExprResult
11469 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11470                                                      CXXFunctionalCastExpr *E) {
11471   TypeSourceInfo *Type =
11472       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11473   if (!Type)
11474     return ExprError();
11475 
11476   ExprResult SubExpr
11477     = getDerived().TransformExpr(E->getSubExprAsWritten());
11478   if (SubExpr.isInvalid())
11479     return ExprError();
11480 
11481   if (!getDerived().AlwaysRebuild() &&
11482       Type == E->getTypeInfoAsWritten() &&
11483       SubExpr.get() == E->getSubExpr())
11484     return E;
11485 
11486   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11487                                                    E->getLParenLoc(),
11488                                                    SubExpr.get(),
11489                                                    E->getRParenLoc(),
11490                                                    E->isListInitialization());
11491 }
11492 
11493 template<typename Derived>
11494 ExprResult
11495 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11496   if (E->isTypeOperand()) {
11497     TypeSourceInfo *TInfo
11498       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11499     if (!TInfo)
11500       return ExprError();
11501 
11502     if (!getDerived().AlwaysRebuild() &&
11503         TInfo == E->getTypeOperandSourceInfo())
11504       return E;
11505 
11506     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11507                                              TInfo, E->getEndLoc());
11508   }
11509 
11510   // We don't know whether the subexpression is potentially evaluated until
11511   // after we perform semantic analysis.  We speculatively assume it is
11512   // unevaluated; it will get fixed later if the subexpression is in fact
11513   // potentially evaluated.
11514   EnterExpressionEvaluationContext Unevaluated(
11515       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11516       Sema::ReuseLambdaContextDecl);
11517 
11518   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11519   if (SubExpr.isInvalid())
11520     return ExprError();
11521 
11522   if (!getDerived().AlwaysRebuild() &&
11523       SubExpr.get() == E->getExprOperand())
11524     return E;
11525 
11526   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11527                                            SubExpr.get(), E->getEndLoc());
11528 }
11529 
11530 template<typename Derived>
11531 ExprResult
11532 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11533   if (E->isTypeOperand()) {
11534     TypeSourceInfo *TInfo
11535       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11536     if (!TInfo)
11537       return ExprError();
11538 
11539     if (!getDerived().AlwaysRebuild() &&
11540         TInfo == E->getTypeOperandSourceInfo())
11541       return E;
11542 
11543     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11544                                              TInfo, E->getEndLoc());
11545   }
11546 
11547   EnterExpressionEvaluationContext Unevaluated(
11548       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11549 
11550   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11551   if (SubExpr.isInvalid())
11552     return ExprError();
11553 
11554   if (!getDerived().AlwaysRebuild() &&
11555       SubExpr.get() == E->getExprOperand())
11556     return E;
11557 
11558   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11559                                            SubExpr.get(), E->getEndLoc());
11560 }
11561 
11562 template<typename Derived>
11563 ExprResult
11564 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11565   return E;
11566 }
11567 
11568 template<typename Derived>
11569 ExprResult
11570 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11571                                                      CXXNullPtrLiteralExpr *E) {
11572   return E;
11573 }
11574 
11575 template<typename Derived>
11576 ExprResult
11577 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11578   QualType T = getSema().getCurrentThisType();
11579 
11580   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11581     // Mark it referenced in the new context regardless.
11582     // FIXME: this is a bit instantiation-specific.
11583     getSema().MarkThisReferenced(E);
11584     return E;
11585   }
11586 
11587   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11588 }
11589 
11590 template<typename Derived>
11591 ExprResult
11592 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11593   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11594   if (SubExpr.isInvalid())
11595     return ExprError();
11596 
11597   if (!getDerived().AlwaysRebuild() &&
11598       SubExpr.get() == E->getSubExpr())
11599     return E;
11600 
11601   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11602                                           E->isThrownVariableInScope());
11603 }
11604 
11605 template<typename Derived>
11606 ExprResult
11607 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11608   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11609       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11610   if (!Param)
11611     return ExprError();
11612 
11613   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11614       E->getUsedContext() == SemaRef.CurContext)
11615     return E;
11616 
11617   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11618 }
11619 
11620 template<typename Derived>
11621 ExprResult
11622 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11623   FieldDecl *Field = cast_or_null<FieldDecl>(
11624       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11625   if (!Field)
11626     return ExprError();
11627 
11628   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11629       E->getUsedContext() == SemaRef.CurContext)
11630     return E;
11631 
11632   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11633 }
11634 
11635 template<typename Derived>
11636 ExprResult
11637 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11638                                                     CXXScalarValueInitExpr *E) {
11639   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11640   if (!T)
11641     return ExprError();
11642 
11643   if (!getDerived().AlwaysRebuild() &&
11644       T == E->getTypeSourceInfo())
11645     return E;
11646 
11647   return getDerived().RebuildCXXScalarValueInitExpr(T,
11648                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11649                                                     E->getRParenLoc());
11650 }
11651 
11652 template<typename Derived>
11653 ExprResult
11654 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11655   // Transform the type that we're allocating
11656   TypeSourceInfo *AllocTypeInfo =
11657       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11658   if (!AllocTypeInfo)
11659     return ExprError();
11660 
11661   // Transform the size of the array we're allocating (if any).
11662   Optional<Expr *> ArraySize;
11663   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11664     ExprResult NewArraySize;
11665     if (*OldArraySize) {
11666       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11667       if (NewArraySize.isInvalid())
11668         return ExprError();
11669     }
11670     ArraySize = NewArraySize.get();
11671   }
11672 
11673   // Transform the placement arguments (if any).
11674   bool ArgumentChanged = false;
11675   SmallVector<Expr*, 8> PlacementArgs;
11676   if (getDerived().TransformExprs(E->getPlacementArgs(),
11677                                   E->getNumPlacementArgs(), true,
11678                                   PlacementArgs, &ArgumentChanged))
11679     return ExprError();
11680 
11681   // Transform the initializer (if any).
11682   Expr *OldInit = E->getInitializer();
11683   ExprResult NewInit;
11684   if (OldInit)
11685     NewInit = getDerived().TransformInitializer(OldInit, true);
11686   if (NewInit.isInvalid())
11687     return ExprError();
11688 
11689   // Transform new operator and delete operator.
11690   FunctionDecl *OperatorNew = nullptr;
11691   if (E->getOperatorNew()) {
11692     OperatorNew = cast_or_null<FunctionDecl>(
11693         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11694     if (!OperatorNew)
11695       return ExprError();
11696   }
11697 
11698   FunctionDecl *OperatorDelete = nullptr;
11699   if (E->getOperatorDelete()) {
11700     OperatorDelete = cast_or_null<FunctionDecl>(
11701         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11702     if (!OperatorDelete)
11703       return ExprError();
11704   }
11705 
11706   if (!getDerived().AlwaysRebuild() &&
11707       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11708       ArraySize == E->getArraySize() &&
11709       NewInit.get() == OldInit &&
11710       OperatorNew == E->getOperatorNew() &&
11711       OperatorDelete == E->getOperatorDelete() &&
11712       !ArgumentChanged) {
11713     // Mark any declarations we need as referenced.
11714     // FIXME: instantiation-specific.
11715     if (OperatorNew)
11716       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11717     if (OperatorDelete)
11718       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11719 
11720     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11721       QualType ElementType
11722         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11723       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11724         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11725         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11726           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11727         }
11728       }
11729     }
11730 
11731     return E;
11732   }
11733 
11734   QualType AllocType = AllocTypeInfo->getType();
11735   if (!ArraySize) {
11736     // If no array size was specified, but the new expression was
11737     // instantiated with an array type (e.g., "new T" where T is
11738     // instantiated with "int[4]"), extract the outer bound from the
11739     // array type as our array size. We do this with constant and
11740     // dependently-sized array types.
11741     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11742     if (!ArrayT) {
11743       // Do nothing
11744     } else if (const ConstantArrayType *ConsArrayT
11745                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11746       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11747                                          SemaRef.Context.getSizeType(),
11748                                          /*FIXME:*/ E->getBeginLoc());
11749       AllocType = ConsArrayT->getElementType();
11750     } else if (const DependentSizedArrayType *DepArrayT
11751                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11752       if (DepArrayT->getSizeExpr()) {
11753         ArraySize = DepArrayT->getSizeExpr();
11754         AllocType = DepArrayT->getElementType();
11755       }
11756     }
11757   }
11758 
11759   return getDerived().RebuildCXXNewExpr(
11760       E->getBeginLoc(), E->isGlobalNew(),
11761       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11762       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11763       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11764 }
11765 
11766 template<typename Derived>
11767 ExprResult
11768 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11769   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11770   if (Operand.isInvalid())
11771     return ExprError();
11772 
11773   // Transform the delete operator, if known.
11774   FunctionDecl *OperatorDelete = nullptr;
11775   if (E->getOperatorDelete()) {
11776     OperatorDelete = cast_or_null<FunctionDecl>(
11777         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11778     if (!OperatorDelete)
11779       return ExprError();
11780   }
11781 
11782   if (!getDerived().AlwaysRebuild() &&
11783       Operand.get() == E->getArgument() &&
11784       OperatorDelete == E->getOperatorDelete()) {
11785     // Mark any declarations we need as referenced.
11786     // FIXME: instantiation-specific.
11787     if (OperatorDelete)
11788       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11789 
11790     if (!E->getArgument()->isTypeDependent()) {
11791       QualType Destroyed = SemaRef.Context.getBaseElementType(
11792                                                          E->getDestroyedType());
11793       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11794         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11795         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11796                                        SemaRef.LookupDestructor(Record));
11797       }
11798     }
11799 
11800     return E;
11801   }
11802 
11803   return getDerived().RebuildCXXDeleteExpr(
11804       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11805 }
11806 
11807 template<typename Derived>
11808 ExprResult
11809 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11810                                                      CXXPseudoDestructorExpr *E) {
11811   ExprResult Base = getDerived().TransformExpr(E->getBase());
11812   if (Base.isInvalid())
11813     return ExprError();
11814 
11815   ParsedType ObjectTypePtr;
11816   bool MayBePseudoDestructor = false;
11817   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11818                                               E->getOperatorLoc(),
11819                                         E->isArrow()? tok::arrow : tok::period,
11820                                               ObjectTypePtr,
11821                                               MayBePseudoDestructor);
11822   if (Base.isInvalid())
11823     return ExprError();
11824 
11825   QualType ObjectType = ObjectTypePtr.get();
11826   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11827   if (QualifierLoc) {
11828     QualifierLoc
11829       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11830     if (!QualifierLoc)
11831       return ExprError();
11832   }
11833   CXXScopeSpec SS;
11834   SS.Adopt(QualifierLoc);
11835 
11836   PseudoDestructorTypeStorage Destroyed;
11837   if (E->getDestroyedTypeInfo()) {
11838     TypeSourceInfo *DestroyedTypeInfo
11839       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11840                                                 ObjectType, nullptr, SS);
11841     if (!DestroyedTypeInfo)
11842       return ExprError();
11843     Destroyed = DestroyedTypeInfo;
11844   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11845     // We aren't likely to be able to resolve the identifier down to a type
11846     // now anyway, so just retain the identifier.
11847     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11848                                             E->getDestroyedTypeLoc());
11849   } else {
11850     // Look for a destructor known with the given name.
11851     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11852                                               *E->getDestroyedTypeIdentifier(),
11853                                                 E->getDestroyedTypeLoc(),
11854                                                 /*Scope=*/nullptr,
11855                                                 SS, ObjectTypePtr,
11856                                                 false);
11857     if (!T)
11858       return ExprError();
11859 
11860     Destroyed
11861       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11862                                                  E->getDestroyedTypeLoc());
11863   }
11864 
11865   TypeSourceInfo *ScopeTypeInfo = nullptr;
11866   if (E->getScopeTypeInfo()) {
11867     CXXScopeSpec EmptySS;
11868     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11869                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11870     if (!ScopeTypeInfo)
11871       return ExprError();
11872   }
11873 
11874   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11875                                                      E->getOperatorLoc(),
11876                                                      E->isArrow(),
11877                                                      SS,
11878                                                      ScopeTypeInfo,
11879                                                      E->getColonColonLoc(),
11880                                                      E->getTildeLoc(),
11881                                                      Destroyed);
11882 }
11883 
11884 template <typename Derived>
11885 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11886                                                         bool RequiresADL,
11887                                                         LookupResult &R) {
11888   // Transform all the decls.
11889   bool AllEmptyPacks = true;
11890   for (auto *OldD : Old->decls()) {
11891     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11892     if (!InstD) {
11893       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11894       // This can happen because of dependent hiding.
11895       if (isa<UsingShadowDecl>(OldD))
11896         continue;
11897       else {
11898         R.clear();
11899         return true;
11900       }
11901     }
11902 
11903     // Expand using pack declarations.
11904     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11905     ArrayRef<NamedDecl*> Decls = SingleDecl;
11906     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11907       Decls = UPD->expansions();
11908 
11909     // Expand using declarations.
11910     for (auto *D : Decls) {
11911       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11912         for (auto *SD : UD->shadows())
11913           R.addDecl(SD);
11914       } else {
11915         R.addDecl(D);
11916       }
11917     }
11918 
11919     AllEmptyPacks &= Decls.empty();
11920   };
11921 
11922   // C++ [temp.res]/8.4.2:
11923   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11924   //   a name in the template definition found a using-declaration, but the
11925   //   lookup in the corresponding scope in the instantiation odoes not find
11926   //   any declarations because the using-declaration was a pack expansion and
11927   //   the corresponding pack is empty
11928   if (AllEmptyPacks && !RequiresADL) {
11929     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11930         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11931     return true;
11932   }
11933 
11934   // Resolve a kind, but don't do any further analysis.  If it's
11935   // ambiguous, the callee needs to deal with it.
11936   R.resolveKind();
11937   return false;
11938 }
11939 
11940 template<typename Derived>
11941 ExprResult
11942 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11943                                                   UnresolvedLookupExpr *Old) {
11944   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11945                  Sema::LookupOrdinaryName);
11946 
11947   // Transform the declaration set.
11948   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11949     return ExprError();
11950 
11951   // Rebuild the nested-name qualifier, if present.
11952   CXXScopeSpec SS;
11953   if (Old->getQualifierLoc()) {
11954     NestedNameSpecifierLoc QualifierLoc
11955       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11956     if (!QualifierLoc)
11957       return ExprError();
11958 
11959     SS.Adopt(QualifierLoc);
11960   }
11961 
11962   if (Old->getNamingClass()) {
11963     CXXRecordDecl *NamingClass
11964       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11965                                                             Old->getNameLoc(),
11966                                                         Old->getNamingClass()));
11967     if (!NamingClass) {
11968       R.clear();
11969       return ExprError();
11970     }
11971 
11972     R.setNamingClass(NamingClass);
11973   }
11974 
11975   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11976 
11977   // If we have neither explicit template arguments, nor the template keyword,
11978   // it's a normal declaration name or member reference.
11979   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11980     NamedDecl *D = R.getAsSingle<NamedDecl>();
11981     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11982     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11983     // give a good diagnostic.
11984     if (D && D->isCXXInstanceMember()) {
11985       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11986                                                      /*TemplateArgs=*/nullptr,
11987                                                      /*Scope=*/nullptr);
11988     }
11989 
11990     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11991   }
11992 
11993   // If we have template arguments, rebuild them, then rebuild the
11994   // templateid expression.
11995   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11996   if (Old->hasExplicitTemplateArgs() &&
11997       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11998                                               Old->getNumTemplateArgs(),
11999                                               TransArgs)) {
12000     R.clear();
12001     return ExprError();
12002   }
12003 
12004   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12005                                             Old->requiresADL(), &TransArgs);
12006 }
12007 
12008 template<typename Derived>
12009 ExprResult
12010 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12011   bool ArgChanged = false;
12012   SmallVector<TypeSourceInfo *, 4> Args;
12013   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12014     TypeSourceInfo *From = E->getArg(I);
12015     TypeLoc FromTL = From->getTypeLoc();
12016     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12017       TypeLocBuilder TLB;
12018       TLB.reserve(FromTL.getFullDataSize());
12019       QualType To = getDerived().TransformType(TLB, FromTL);
12020       if (To.isNull())
12021         return ExprError();
12022 
12023       if (To == From->getType())
12024         Args.push_back(From);
12025       else {
12026         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12027         ArgChanged = true;
12028       }
12029       continue;
12030     }
12031 
12032     ArgChanged = true;
12033 
12034     // We have a pack expansion. Instantiate it.
12035     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12036     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12037     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12038     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12039 
12040     // Determine whether the set of unexpanded parameter packs can and should
12041     // be expanded.
12042     bool Expand = true;
12043     bool RetainExpansion = false;
12044     Optional<unsigned> OrigNumExpansions =
12045         ExpansionTL.getTypePtr()->getNumExpansions();
12046     Optional<unsigned> NumExpansions = OrigNumExpansions;
12047     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12048                                              PatternTL.getSourceRange(),
12049                                              Unexpanded,
12050                                              Expand, RetainExpansion,
12051                                              NumExpansions))
12052       return ExprError();
12053 
12054     if (!Expand) {
12055       // The transform has determined that we should perform a simple
12056       // transformation on the pack expansion, producing another pack
12057       // expansion.
12058       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12059 
12060       TypeLocBuilder TLB;
12061       TLB.reserve(From->getTypeLoc().getFullDataSize());
12062 
12063       QualType To = getDerived().TransformType(TLB, PatternTL);
12064       if (To.isNull())
12065         return ExprError();
12066 
12067       To = getDerived().RebuildPackExpansionType(To,
12068                                                  PatternTL.getSourceRange(),
12069                                                  ExpansionTL.getEllipsisLoc(),
12070                                                  NumExpansions);
12071       if (To.isNull())
12072         return ExprError();
12073 
12074       PackExpansionTypeLoc ToExpansionTL
12075         = TLB.push<PackExpansionTypeLoc>(To);
12076       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12077       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12078       continue;
12079     }
12080 
12081     // Expand the pack expansion by substituting for each argument in the
12082     // pack(s).
12083     for (unsigned I = 0; I != *NumExpansions; ++I) {
12084       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12085       TypeLocBuilder TLB;
12086       TLB.reserve(PatternTL.getFullDataSize());
12087       QualType To = getDerived().TransformType(TLB, PatternTL);
12088       if (To.isNull())
12089         return ExprError();
12090 
12091       if (To->containsUnexpandedParameterPack()) {
12092         To = getDerived().RebuildPackExpansionType(To,
12093                                                    PatternTL.getSourceRange(),
12094                                                    ExpansionTL.getEllipsisLoc(),
12095                                                    NumExpansions);
12096         if (To.isNull())
12097           return ExprError();
12098 
12099         PackExpansionTypeLoc ToExpansionTL
12100           = TLB.push<PackExpansionTypeLoc>(To);
12101         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12102       }
12103 
12104       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12105     }
12106 
12107     if (!RetainExpansion)
12108       continue;
12109 
12110     // If we're supposed to retain a pack expansion, do so by temporarily
12111     // forgetting the partially-substituted parameter pack.
12112     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12113 
12114     TypeLocBuilder TLB;
12115     TLB.reserve(From->getTypeLoc().getFullDataSize());
12116 
12117     QualType To = getDerived().TransformType(TLB, PatternTL);
12118     if (To.isNull())
12119       return ExprError();
12120 
12121     To = getDerived().RebuildPackExpansionType(To,
12122                                                PatternTL.getSourceRange(),
12123                                                ExpansionTL.getEllipsisLoc(),
12124                                                NumExpansions);
12125     if (To.isNull())
12126       return ExprError();
12127 
12128     PackExpansionTypeLoc ToExpansionTL
12129       = TLB.push<PackExpansionTypeLoc>(To);
12130     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12131     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12132   }
12133 
12134   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12135     return E;
12136 
12137   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12138                                        E->getEndLoc());
12139 }
12140 
12141 template<typename Derived>
12142 ExprResult
12143 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12144                                                  ConceptSpecializationExpr *E) {
12145   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12146   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12147   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12148                                               Old->NumTemplateArgs, TransArgs))
12149     return ExprError();
12150 
12151   return getDerived().RebuildConceptSpecializationExpr(
12152       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12153       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12154       &TransArgs);
12155 }
12156 
12157 template<typename Derived>
12158 ExprResult
12159 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12160   SmallVector<ParmVarDecl*, 4> TransParams;
12161   SmallVector<QualType, 4> TransParamTypes;
12162   Sema::ExtParameterInfoBuilder ExtParamInfos;
12163 
12164   // C++2a [expr.prim.req]p2
12165   // Expressions appearing within a requirement-body are unevaluated operands.
12166   EnterExpressionEvaluationContext Ctx(
12167       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12168 
12169   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12170       getSema().Context, getSema().CurContext,
12171       E->getBody()->getBeginLoc());
12172 
12173   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12174 
12175   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12176                                                E->getLocalParameters(),
12177                                                /*ParamTypes=*/nullptr,
12178                                                /*ParamInfos=*/nullptr,
12179                                                TransParamTypes, &TransParams,
12180                                                ExtParamInfos))
12181     return ExprError();
12182 
12183   for (ParmVarDecl *Param : TransParams)
12184     Param->setDeclContext(Body);
12185 
12186   SmallVector<concepts::Requirement *, 4> TransReqs;
12187   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12188                                                      TransReqs))
12189     return ExprError();
12190 
12191   for (concepts::Requirement *Req : TransReqs) {
12192     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12193       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12194         ER->getReturnTypeRequirement()
12195                 .getTypeConstraintTemplateParameterList()->getParam(0)
12196                 ->setDeclContext(Body);
12197       }
12198     }
12199   }
12200 
12201   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12202                                           TransParams, TransReqs,
12203                                           E->getRBraceLoc());
12204 }
12205 
12206 template<typename Derived>
12207 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12208     ArrayRef<concepts::Requirement *> Reqs,
12209     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12210   for (concepts::Requirement *Req : Reqs) {
12211     concepts::Requirement *TransReq = nullptr;
12212     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12213       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12214     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12215       TransReq = getDerived().TransformExprRequirement(ExprReq);
12216     else
12217       TransReq = getDerived().TransformNestedRequirement(
12218                      cast<concepts::NestedRequirement>(Req));
12219     if (!TransReq)
12220       return true;
12221     Transformed.push_back(TransReq);
12222   }
12223   return false;
12224 }
12225 
12226 template<typename Derived>
12227 concepts::TypeRequirement *
12228 TreeTransform<Derived>::TransformTypeRequirement(
12229     concepts::TypeRequirement *Req) {
12230   if (Req->isSubstitutionFailure()) {
12231     if (getDerived().AlwaysRebuild())
12232       return getDerived().RebuildTypeRequirement(
12233               Req->getSubstitutionDiagnostic());
12234     return Req;
12235   }
12236   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12237   if (!TransType)
12238     return nullptr;
12239   return getDerived().RebuildTypeRequirement(TransType);
12240 }
12241 
12242 template<typename Derived>
12243 concepts::ExprRequirement *
12244 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12245   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12246   if (Req->isExprSubstitutionFailure())
12247     TransExpr = Req->getExprSubstitutionDiagnostic();
12248   else {
12249     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12250     if (TransExprRes.isInvalid())
12251       return nullptr;
12252     TransExpr = TransExprRes.get();
12253   }
12254 
12255   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12256   const auto &RetReq = Req->getReturnTypeRequirement();
12257   if (RetReq.isEmpty())
12258     TransRetReq.emplace();
12259   else if (RetReq.isSubstitutionFailure())
12260     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12261   else if (RetReq.isTypeConstraint()) {
12262     TemplateParameterList *OrigTPL =
12263         RetReq.getTypeConstraintTemplateParameterList();
12264     TemplateParameterList *TPL =
12265         getDerived().TransformTemplateParameterList(OrigTPL);
12266     if (!TPL)
12267       return nullptr;
12268     TransRetReq.emplace(TPL);
12269   }
12270   assert(TransRetReq.hasValue() &&
12271          "All code paths leading here must set TransRetReq");
12272   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12273     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12274                                                Req->getNoexceptLoc(),
12275                                                std::move(*TransRetReq));
12276   return getDerived().RebuildExprRequirement(
12277       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12278       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12279 }
12280 
12281 template<typename Derived>
12282 concepts::NestedRequirement *
12283 TreeTransform<Derived>::TransformNestedRequirement(
12284     concepts::NestedRequirement *Req) {
12285   if (Req->isSubstitutionFailure()) {
12286     if (getDerived().AlwaysRebuild())
12287       return getDerived().RebuildNestedRequirement(
12288           Req->getSubstitutionDiagnostic());
12289     return Req;
12290   }
12291   ExprResult TransConstraint =
12292       getDerived().TransformExpr(Req->getConstraintExpr());
12293   if (TransConstraint.isInvalid())
12294     return nullptr;
12295   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12296 }
12297 
12298 template<typename Derived>
12299 ExprResult
12300 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12301   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12302   if (!T)
12303     return ExprError();
12304 
12305   if (!getDerived().AlwaysRebuild() &&
12306       T == E->getQueriedTypeSourceInfo())
12307     return E;
12308 
12309   ExprResult SubExpr;
12310   {
12311     EnterExpressionEvaluationContext Unevaluated(
12312         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12313     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12314     if (SubExpr.isInvalid())
12315       return ExprError();
12316 
12317     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12318       return E;
12319   }
12320 
12321   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12322                                             SubExpr.get(), E->getEndLoc());
12323 }
12324 
12325 template<typename Derived>
12326 ExprResult
12327 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12328   ExprResult SubExpr;
12329   {
12330     EnterExpressionEvaluationContext Unevaluated(
12331         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12332     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12333     if (SubExpr.isInvalid())
12334       return ExprError();
12335 
12336     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12337       return E;
12338   }
12339 
12340   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12341                                              SubExpr.get(), E->getEndLoc());
12342 }
12343 
12344 template <typename Derived>
12345 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12346     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12347     TypeSourceInfo **RecoveryTSI) {
12348   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12349       DRE, AddrTaken, RecoveryTSI);
12350 
12351   // Propagate both errors and recovered types, which return ExprEmpty.
12352   if (!NewDRE.isUsable())
12353     return NewDRE;
12354 
12355   // We got an expr, wrap it up in parens.
12356   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12357     return PE;
12358   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12359                                        PE->getRParen());
12360 }
12361 
12362 template <typename Derived>
12363 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12364     DependentScopeDeclRefExpr *E) {
12365   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12366                                             nullptr);
12367 }
12368 
12369 template<typename Derived>
12370 ExprResult
12371 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12372                                                DependentScopeDeclRefExpr *E,
12373                                                bool IsAddressOfOperand,
12374                                                TypeSourceInfo **RecoveryTSI) {
12375   assert(E->getQualifierLoc());
12376   NestedNameSpecifierLoc QualifierLoc
12377   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12378   if (!QualifierLoc)
12379     return ExprError();
12380   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12381 
12382   // TODO: If this is a conversion-function-id, verify that the
12383   // destination type name (if present) resolves the same way after
12384   // instantiation as it did in the local scope.
12385 
12386   DeclarationNameInfo NameInfo
12387     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12388   if (!NameInfo.getName())
12389     return ExprError();
12390 
12391   if (!E->hasExplicitTemplateArgs()) {
12392     if (!getDerived().AlwaysRebuild() &&
12393         QualifierLoc == E->getQualifierLoc() &&
12394         // Note: it is sufficient to compare the Name component of NameInfo:
12395         // if name has not changed, DNLoc has not changed either.
12396         NameInfo.getName() == E->getDeclName())
12397       return E;
12398 
12399     return getDerived().RebuildDependentScopeDeclRefExpr(
12400         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12401         IsAddressOfOperand, RecoveryTSI);
12402   }
12403 
12404   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12405   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12406                                               E->getNumTemplateArgs(),
12407                                               TransArgs))
12408     return ExprError();
12409 
12410   return getDerived().RebuildDependentScopeDeclRefExpr(
12411       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12412       RecoveryTSI);
12413 }
12414 
12415 template<typename Derived>
12416 ExprResult
12417 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12418   // CXXConstructExprs other than for list-initialization and
12419   // CXXTemporaryObjectExpr are always implicit, so when we have
12420   // a 1-argument construction we just transform that argument.
12421   if (getDerived().AllowSkippingCXXConstructExpr() &&
12422       ((E->getNumArgs() == 1 ||
12423         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12424        (!getDerived().DropCallArgument(E->getArg(0))) &&
12425        !E->isListInitialization()))
12426     return getDerived().TransformInitializer(E->getArg(0),
12427                                              /*DirectInit*/ false);
12428 
12429   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12430 
12431   QualType T = getDerived().TransformType(E->getType());
12432   if (T.isNull())
12433     return ExprError();
12434 
12435   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12436       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12437   if (!Constructor)
12438     return ExprError();
12439 
12440   bool ArgumentChanged = false;
12441   SmallVector<Expr*, 8> Args;
12442   {
12443     EnterExpressionEvaluationContext Context(
12444         getSema(), EnterExpressionEvaluationContext::InitList,
12445         E->isListInitialization());
12446     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12447                                     &ArgumentChanged))
12448       return ExprError();
12449   }
12450 
12451   if (!getDerived().AlwaysRebuild() &&
12452       T == E->getType() &&
12453       Constructor == E->getConstructor() &&
12454       !ArgumentChanged) {
12455     // Mark the constructor as referenced.
12456     // FIXME: Instantiation-specific
12457     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12458     return E;
12459   }
12460 
12461   return getDerived().RebuildCXXConstructExpr(
12462       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12463       E->hadMultipleCandidates(), E->isListInitialization(),
12464       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12465       E->getConstructionKind(), E->getParenOrBraceRange());
12466 }
12467 
12468 template<typename Derived>
12469 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12470     CXXInheritedCtorInitExpr *E) {
12471   QualType T = getDerived().TransformType(E->getType());
12472   if (T.isNull())
12473     return ExprError();
12474 
12475   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12476       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12477   if (!Constructor)
12478     return ExprError();
12479 
12480   if (!getDerived().AlwaysRebuild() &&
12481       T == E->getType() &&
12482       Constructor == E->getConstructor()) {
12483     // Mark the constructor as referenced.
12484     // FIXME: Instantiation-specific
12485     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12486     return E;
12487   }
12488 
12489   return getDerived().RebuildCXXInheritedCtorInitExpr(
12490       T, E->getLocation(), Constructor,
12491       E->constructsVBase(), E->inheritedFromVBase());
12492 }
12493 
12494 /// Transform a C++ temporary-binding expression.
12495 ///
12496 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12497 /// transform the subexpression and return that.
12498 template<typename Derived>
12499 ExprResult
12500 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12501   return getDerived().TransformExpr(E->getSubExpr());
12502 }
12503 
12504 /// Transform a C++ expression that contains cleanups that should
12505 /// be run after the expression is evaluated.
12506 ///
12507 /// Since ExprWithCleanups nodes are implicitly generated, we
12508 /// just transform the subexpression and return that.
12509 template<typename Derived>
12510 ExprResult
12511 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12512   return getDerived().TransformExpr(E->getSubExpr());
12513 }
12514 
12515 template<typename Derived>
12516 ExprResult
12517 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12518                                                     CXXTemporaryObjectExpr *E) {
12519   TypeSourceInfo *T =
12520       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12521   if (!T)
12522     return ExprError();
12523 
12524   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12525       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12526   if (!Constructor)
12527     return ExprError();
12528 
12529   bool ArgumentChanged = false;
12530   SmallVector<Expr*, 8> Args;
12531   Args.reserve(E->getNumArgs());
12532   {
12533     EnterExpressionEvaluationContext Context(
12534         getSema(), EnterExpressionEvaluationContext::InitList,
12535         E->isListInitialization());
12536     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12537                        &ArgumentChanged))
12538       return ExprError();
12539   }
12540 
12541   if (!getDerived().AlwaysRebuild() &&
12542       T == E->getTypeSourceInfo() &&
12543       Constructor == E->getConstructor() &&
12544       !ArgumentChanged) {
12545     // FIXME: Instantiation-specific
12546     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12547     return SemaRef.MaybeBindToTemporary(E);
12548   }
12549 
12550   // FIXME: We should just pass E->isListInitialization(), but we're not
12551   // prepared to handle list-initialization without a child InitListExpr.
12552   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12553   return getDerived().RebuildCXXTemporaryObjectExpr(
12554       T, LParenLoc, Args, E->getEndLoc(),
12555       /*ListInitialization=*/LParenLoc.isInvalid());
12556 }
12557 
12558 template<typename Derived>
12559 ExprResult
12560 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12561   // Transform any init-capture expressions before entering the scope of the
12562   // lambda body, because they are not semantically within that scope.
12563   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12564   struct TransformedInitCapture {
12565     // The location of the ... if the result is retaining a pack expansion.
12566     SourceLocation EllipsisLoc;
12567     // Zero or more expansions of the init-capture.
12568     SmallVector<InitCaptureInfoTy, 4> Expansions;
12569   };
12570   SmallVector<TransformedInitCapture, 4> InitCaptures;
12571   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12572   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12573                                     CEnd = E->capture_end();
12574        C != CEnd; ++C) {
12575     if (!E->isInitCapture(C))
12576       continue;
12577 
12578     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12579     VarDecl *OldVD = C->getCapturedVar();
12580 
12581     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12582                                 Optional<unsigned> NumExpansions) {
12583       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12584           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12585 
12586       if (NewExprInitResult.isInvalid()) {
12587         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12588         return;
12589       }
12590       Expr *NewExprInit = NewExprInitResult.get();
12591 
12592       QualType NewInitCaptureType =
12593           getSema().buildLambdaInitCaptureInitialization(
12594               C->getLocation(), OldVD->getType()->isReferenceType(),
12595               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12596               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12597               NewExprInit);
12598       Result.Expansions.push_back(
12599           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12600     };
12601 
12602     // If this is an init-capture pack, consider expanding the pack now.
12603     if (OldVD->isParameterPack()) {
12604       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12605                                              ->getTypeLoc()
12606                                              .castAs<PackExpansionTypeLoc>();
12607       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12608       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12609 
12610       // Determine whether the set of unexpanded parameter packs can and should
12611       // be expanded.
12612       bool Expand = true;
12613       bool RetainExpansion = false;
12614       Optional<unsigned> OrigNumExpansions =
12615           ExpansionTL.getTypePtr()->getNumExpansions();
12616       Optional<unsigned> NumExpansions = OrigNumExpansions;
12617       if (getDerived().TryExpandParameterPacks(
12618               ExpansionTL.getEllipsisLoc(),
12619               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12620               RetainExpansion, NumExpansions))
12621         return ExprError();
12622       if (Expand) {
12623         for (unsigned I = 0; I != *NumExpansions; ++I) {
12624           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12625           SubstInitCapture(SourceLocation(), None);
12626         }
12627       }
12628       if (!Expand || RetainExpansion) {
12629         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12630         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12631         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12632       }
12633     } else {
12634       SubstInitCapture(SourceLocation(), None);
12635     }
12636   }
12637 
12638   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12639   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12640 
12641   // Transform the template parameters, and add them to the current
12642   // instantiation scope. The null case is handled correctly.
12643   auto TPL = getDerived().TransformTemplateParameterList(
12644       E->getTemplateParameterList());
12645   LSI->GLTemplateParameterList = TPL;
12646 
12647   // Transform the type of the original lambda's call operator.
12648   // The transformation MUST be done in the CurrentInstantiationScope since
12649   // it introduces a mapping of the original to the newly created
12650   // transformed parameters.
12651   TypeSourceInfo *NewCallOpTSI = nullptr;
12652   {
12653     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12654     FunctionProtoTypeLoc OldCallOpFPTL =
12655         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12656 
12657     TypeLocBuilder NewCallOpTLBuilder;
12658     SmallVector<QualType, 4> ExceptionStorage;
12659     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12660     QualType NewCallOpType = TransformFunctionProtoType(
12661         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12662         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12663           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12664                                               ExceptionStorage, Changed);
12665         });
12666     if (NewCallOpType.isNull())
12667       return ExprError();
12668     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12669                                                         NewCallOpType);
12670   }
12671 
12672   // Transform the trailing requires clause
12673   ExprResult NewTrailingRequiresClause;
12674   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12675     // FIXME: Concepts: Substitution into requires clause should only happen
12676     //                  when checking satisfaction.
12677     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12678 
12679   // Create the local class that will describe the lambda.
12680   // FIXME: KnownDependent below is wrong when substituting inside a templated
12681   // context that isn't a DeclContext (such as a variable template).
12682   CXXRecordDecl *OldClass = E->getLambdaClass();
12683   CXXRecordDecl *Class
12684     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12685                                         NewCallOpTSI,
12686                                         /*KnownDependent=*/false,
12687                                         E->getCaptureDefault());
12688   getDerived().transformedLocalDecl(OldClass, {Class});
12689 
12690   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12691   if (getDerived().ReplacingOriginal())
12692     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12693                                OldClass->getLambdaManglingNumber(),
12694                                OldClass->getDeviceLambdaManglingNumber(),
12695                                OldClass->getLambdaContextDecl());
12696 
12697   // Build the call operator.
12698   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12699       Class, E->getIntroducerRange(), NewCallOpTSI,
12700       E->getCallOperator()->getEndLoc(),
12701       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12702       E->getCallOperator()->getConstexprKind(),
12703       NewTrailingRequiresClause.get());
12704 
12705   LSI->CallOperator = NewCallOperator;
12706 
12707   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12708   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12709 
12710   // Number the lambda for linkage purposes if necessary.
12711   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12712 
12713   // Introduce the context of the call operator.
12714   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12715                                  /*NewThisContext*/false);
12716 
12717   // Enter the scope of the lambda.
12718   getSema().buildLambdaScope(LSI, NewCallOperator,
12719                              E->getIntroducerRange(),
12720                              E->getCaptureDefault(),
12721                              E->getCaptureDefaultLoc(),
12722                              E->hasExplicitParameters(),
12723                              E->hasExplicitResultType(),
12724                              E->isMutable());
12725 
12726   bool Invalid = false;
12727 
12728   // Transform captures.
12729   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12730                                  CEnd = E->capture_end();
12731        C != CEnd; ++C) {
12732     // When we hit the first implicit capture, tell Sema that we've finished
12733     // the list of explicit captures.
12734     if (C->isImplicit())
12735       break;
12736 
12737     // Capturing 'this' is trivial.
12738     if (C->capturesThis()) {
12739       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12740                                     /*BuildAndDiagnose*/ true, nullptr,
12741                                     C->getCaptureKind() == LCK_StarThis);
12742       continue;
12743     }
12744     // Captured expression will be recaptured during captured variables
12745     // rebuilding.
12746     if (C->capturesVLAType())
12747       continue;
12748 
12749     // Rebuild init-captures, including the implied field declaration.
12750     if (E->isInitCapture(C)) {
12751       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12752 
12753       VarDecl *OldVD = C->getCapturedVar();
12754       llvm::SmallVector<Decl*, 4> NewVDs;
12755 
12756       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12757         ExprResult Init = Info.first;
12758         QualType InitQualType = Info.second;
12759         if (Init.isInvalid() || InitQualType.isNull()) {
12760           Invalid = true;
12761           break;
12762         }
12763         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12764             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12765             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12766         if (!NewVD) {
12767           Invalid = true;
12768           break;
12769         }
12770         NewVDs.push_back(NewVD);
12771         getSema().addInitCapture(LSI, NewVD);
12772       }
12773 
12774       if (Invalid)
12775         break;
12776 
12777       getDerived().transformedLocalDecl(OldVD, NewVDs);
12778       continue;
12779     }
12780 
12781     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12782 
12783     // Determine the capture kind for Sema.
12784     Sema::TryCaptureKind Kind
12785       = C->isImplicit()? Sema::TryCapture_Implicit
12786                        : C->getCaptureKind() == LCK_ByCopy
12787                            ? Sema::TryCapture_ExplicitByVal
12788                            : Sema::TryCapture_ExplicitByRef;
12789     SourceLocation EllipsisLoc;
12790     if (C->isPackExpansion()) {
12791       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12792       bool ShouldExpand = false;
12793       bool RetainExpansion = false;
12794       Optional<unsigned> NumExpansions;
12795       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12796                                                C->getLocation(),
12797                                                Unexpanded,
12798                                                ShouldExpand, RetainExpansion,
12799                                                NumExpansions)) {
12800         Invalid = true;
12801         continue;
12802       }
12803 
12804       if (ShouldExpand) {
12805         // The transform has determined that we should perform an expansion;
12806         // transform and capture each of the arguments.
12807         // expansion of the pattern. Do so.
12808         VarDecl *Pack = C->getCapturedVar();
12809         for (unsigned I = 0; I != *NumExpansions; ++I) {
12810           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12811           VarDecl *CapturedVar
12812             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12813                                                                Pack));
12814           if (!CapturedVar) {
12815             Invalid = true;
12816             continue;
12817           }
12818 
12819           // Capture the transformed variable.
12820           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12821         }
12822 
12823         // FIXME: Retain a pack expansion if RetainExpansion is true.
12824 
12825         continue;
12826       }
12827 
12828       EllipsisLoc = C->getEllipsisLoc();
12829     }
12830 
12831     // Transform the captured variable.
12832     VarDecl *CapturedVar
12833       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12834                                                          C->getCapturedVar()));
12835     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12836       Invalid = true;
12837       continue;
12838     }
12839 
12840     // Capture the transformed variable.
12841     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12842                                  EllipsisLoc);
12843   }
12844   getSema().finishLambdaExplicitCaptures(LSI);
12845 
12846   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12847   // evaluation context even if we're not transforming the function body.
12848   getSema().PushExpressionEvaluationContext(
12849       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12850 
12851   // Instantiate the body of the lambda expression.
12852   StmtResult Body =
12853       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12854 
12855   // ActOnLambda* will pop the function scope for us.
12856   FuncScopeCleanup.disable();
12857 
12858   if (Body.isInvalid()) {
12859     SavedContext.pop();
12860     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12861                                /*IsInstantiation=*/true);
12862     return ExprError();
12863   }
12864 
12865   // Copy the LSI before ActOnFinishFunctionBody removes it.
12866   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12867   // the call operator.
12868   auto LSICopy = *LSI;
12869   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12870                                     /*IsInstantiation*/ true);
12871   SavedContext.pop();
12872 
12873   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12874                                    &LSICopy);
12875 }
12876 
12877 template<typename Derived>
12878 StmtResult
12879 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12880   return TransformStmt(S);
12881 }
12882 
12883 template<typename Derived>
12884 StmtResult
12885 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12886   // Transform captures.
12887   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12888                                  CEnd = E->capture_end();
12889        C != CEnd; ++C) {
12890     // When we hit the first implicit capture, tell Sema that we've finished
12891     // the list of explicit captures.
12892     if (!C->isImplicit())
12893       continue;
12894 
12895     // Capturing 'this' is trivial.
12896     if (C->capturesThis()) {
12897       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12898                                     /*BuildAndDiagnose*/ true, nullptr,
12899                                     C->getCaptureKind() == LCK_StarThis);
12900       continue;
12901     }
12902     // Captured expression will be recaptured during captured variables
12903     // rebuilding.
12904     if (C->capturesVLAType())
12905       continue;
12906 
12907     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12908     assert(!E->isInitCapture(C) && "implicit init-capture?");
12909 
12910     // Transform the captured variable.
12911     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12912         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12913     if (!CapturedVar || CapturedVar->isInvalidDecl())
12914       return StmtError();
12915 
12916     // Capture the transformed variable.
12917     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12918   }
12919 
12920   return S;
12921 }
12922 
12923 template<typename Derived>
12924 ExprResult
12925 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12926                                                   CXXUnresolvedConstructExpr *E) {
12927   TypeSourceInfo *T =
12928       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12929   if (!T)
12930     return ExprError();
12931 
12932   bool ArgumentChanged = false;
12933   SmallVector<Expr*, 8> Args;
12934   Args.reserve(E->getNumArgs());
12935   {
12936     EnterExpressionEvaluationContext Context(
12937         getSema(), EnterExpressionEvaluationContext::InitList,
12938         E->isListInitialization());
12939     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
12940                                     &ArgumentChanged))
12941       return ExprError();
12942   }
12943 
12944   if (!getDerived().AlwaysRebuild() &&
12945       T == E->getTypeSourceInfo() &&
12946       !ArgumentChanged)
12947     return E;
12948 
12949   // FIXME: we're faking the locations of the commas
12950   return getDerived().RebuildCXXUnresolvedConstructExpr(
12951       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12952 }
12953 
12954 template<typename Derived>
12955 ExprResult
12956 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12957                                              CXXDependentScopeMemberExpr *E) {
12958   // Transform the base of the expression.
12959   ExprResult Base((Expr*) nullptr);
12960   Expr *OldBase;
12961   QualType BaseType;
12962   QualType ObjectType;
12963   if (!E->isImplicitAccess()) {
12964     OldBase = E->getBase();
12965     Base = getDerived().TransformExpr(OldBase);
12966     if (Base.isInvalid())
12967       return ExprError();
12968 
12969     // Start the member reference and compute the object's type.
12970     ParsedType ObjectTy;
12971     bool MayBePseudoDestructor = false;
12972     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12973                                                 E->getOperatorLoc(),
12974                                       E->isArrow()? tok::arrow : tok::period,
12975                                                 ObjectTy,
12976                                                 MayBePseudoDestructor);
12977     if (Base.isInvalid())
12978       return ExprError();
12979 
12980     ObjectType = ObjectTy.get();
12981     BaseType = ((Expr*) Base.get())->getType();
12982   } else {
12983     OldBase = nullptr;
12984     BaseType = getDerived().TransformType(E->getBaseType());
12985     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12986   }
12987 
12988   // Transform the first part of the nested-name-specifier that qualifies
12989   // the member name.
12990   NamedDecl *FirstQualifierInScope
12991     = getDerived().TransformFirstQualifierInScope(
12992                                             E->getFirstQualifierFoundInScope(),
12993                                             E->getQualifierLoc().getBeginLoc());
12994 
12995   NestedNameSpecifierLoc QualifierLoc;
12996   if (E->getQualifier()) {
12997     QualifierLoc
12998       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12999                                                      ObjectType,
13000                                                      FirstQualifierInScope);
13001     if (!QualifierLoc)
13002       return ExprError();
13003   }
13004 
13005   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13006 
13007   // TODO: If this is a conversion-function-id, verify that the
13008   // destination type name (if present) resolves the same way after
13009   // instantiation as it did in the local scope.
13010 
13011   DeclarationNameInfo NameInfo
13012     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13013   if (!NameInfo.getName())
13014     return ExprError();
13015 
13016   if (!E->hasExplicitTemplateArgs()) {
13017     // This is a reference to a member without an explicitly-specified
13018     // template argument list. Optimize for this common case.
13019     if (!getDerived().AlwaysRebuild() &&
13020         Base.get() == OldBase &&
13021         BaseType == E->getBaseType() &&
13022         QualifierLoc == E->getQualifierLoc() &&
13023         NameInfo.getName() == E->getMember() &&
13024         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13025       return E;
13026 
13027     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13028                                                        BaseType,
13029                                                        E->isArrow(),
13030                                                        E->getOperatorLoc(),
13031                                                        QualifierLoc,
13032                                                        TemplateKWLoc,
13033                                                        FirstQualifierInScope,
13034                                                        NameInfo,
13035                                                        /*TemplateArgs*/nullptr);
13036   }
13037 
13038   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13039   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13040                                               E->getNumTemplateArgs(),
13041                                               TransArgs))
13042     return ExprError();
13043 
13044   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13045                                                      BaseType,
13046                                                      E->isArrow(),
13047                                                      E->getOperatorLoc(),
13048                                                      QualifierLoc,
13049                                                      TemplateKWLoc,
13050                                                      FirstQualifierInScope,
13051                                                      NameInfo,
13052                                                      &TransArgs);
13053 }
13054 
13055 template<typename Derived>
13056 ExprResult
13057 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
13058   // Transform the base of the expression.
13059   ExprResult Base((Expr*) nullptr);
13060   QualType BaseType;
13061   if (!Old->isImplicitAccess()) {
13062     Base = getDerived().TransformExpr(Old->getBase());
13063     if (Base.isInvalid())
13064       return ExprError();
13065     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
13066                                                      Old->isArrow());
13067     if (Base.isInvalid())
13068       return ExprError();
13069     BaseType = Base.get()->getType();
13070   } else {
13071     BaseType = getDerived().TransformType(Old->getBaseType());
13072   }
13073 
13074   NestedNameSpecifierLoc QualifierLoc;
13075   if (Old->getQualifierLoc()) {
13076     QualifierLoc
13077     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13078     if (!QualifierLoc)
13079       return ExprError();
13080   }
13081 
13082   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13083 
13084   LookupResult R(SemaRef, Old->getMemberNameInfo(),
13085                  Sema::LookupOrdinaryName);
13086 
13087   // Transform the declaration set.
13088   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
13089     return ExprError();
13090 
13091   // Determine the naming class.
13092   if (Old->getNamingClass()) {
13093     CXXRecordDecl *NamingClass
13094       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
13095                                                           Old->getMemberLoc(),
13096                                                         Old->getNamingClass()));
13097     if (!NamingClass)
13098       return ExprError();
13099 
13100     R.setNamingClass(NamingClass);
13101   }
13102 
13103   TemplateArgumentListInfo TransArgs;
13104   if (Old->hasExplicitTemplateArgs()) {
13105     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13106     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13107     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
13108                                                 Old->getNumTemplateArgs(),
13109                                                 TransArgs))
13110       return ExprError();
13111   }
13112 
13113   // FIXME: to do this check properly, we will need to preserve the
13114   // first-qualifier-in-scope here, just in case we had a dependent
13115   // base (and therefore couldn't do the check) and a
13116   // nested-name-qualifier (and therefore could do the lookup).
13117   NamedDecl *FirstQualifierInScope = nullptr;
13118 
13119   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
13120                                                   BaseType,
13121                                                   Old->getOperatorLoc(),
13122                                                   Old->isArrow(),
13123                                                   QualifierLoc,
13124                                                   TemplateKWLoc,
13125                                                   FirstQualifierInScope,
13126                                                   R,
13127                                               (Old->hasExplicitTemplateArgs()
13128                                                   ? &TransArgs : nullptr));
13129 }
13130 
13131 template<typename Derived>
13132 ExprResult
13133 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13134   EnterExpressionEvaluationContext Unevaluated(
13135       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13136   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13137   if (SubExpr.isInvalid())
13138     return ExprError();
13139 
13140   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13141     return E;
13142 
13143   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13144 }
13145 
13146 template<typename Derived>
13147 ExprResult
13148 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13149   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13150   if (Pattern.isInvalid())
13151     return ExprError();
13152 
13153   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13154     return E;
13155 
13156   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13157                                            E->getNumExpansions());
13158 }
13159 
13160 template<typename Derived>
13161 ExprResult
13162 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13163   // If E is not value-dependent, then nothing will change when we transform it.
13164   // Note: This is an instantiation-centric view.
13165   if (!E->isValueDependent())
13166     return E;
13167 
13168   EnterExpressionEvaluationContext Unevaluated(
13169       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13170 
13171   ArrayRef<TemplateArgument> PackArgs;
13172   TemplateArgument ArgStorage;
13173 
13174   // Find the argument list to transform.
13175   if (E->isPartiallySubstituted()) {
13176     PackArgs = E->getPartialArguments();
13177   } else if (E->isValueDependent()) {
13178     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13179     bool ShouldExpand = false;
13180     bool RetainExpansion = false;
13181     Optional<unsigned> NumExpansions;
13182     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13183                                              Unexpanded,
13184                                              ShouldExpand, RetainExpansion,
13185                                              NumExpansions))
13186       return ExprError();
13187 
13188     // If we need to expand the pack, build a template argument from it and
13189     // expand that.
13190     if (ShouldExpand) {
13191       auto *Pack = E->getPack();
13192       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13193         ArgStorage = getSema().Context.getPackExpansionType(
13194             getSema().Context.getTypeDeclType(TTPD), None);
13195       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13196         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13197       } else {
13198         auto *VD = cast<ValueDecl>(Pack);
13199         ExprResult DRE = getSema().BuildDeclRefExpr(
13200             VD, VD->getType().getNonLValueExprType(getSema().Context),
13201             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
13202             E->getPackLoc());
13203         if (DRE.isInvalid())
13204           return ExprError();
13205         ArgStorage = new (getSema().Context) PackExpansionExpr(
13206             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13207       }
13208       PackArgs = ArgStorage;
13209     }
13210   }
13211 
13212   // If we're not expanding the pack, just transform the decl.
13213   if (!PackArgs.size()) {
13214     auto *Pack = cast_or_null<NamedDecl>(
13215         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13216     if (!Pack)
13217       return ExprError();
13218     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13219                                               E->getPackLoc(),
13220                                               E->getRParenLoc(), None, None);
13221   }
13222 
13223   // Try to compute the result without performing a partial substitution.
13224   Optional<unsigned> Result = 0;
13225   for (const TemplateArgument &Arg : PackArgs) {
13226     if (!Arg.isPackExpansion()) {
13227       Result = *Result + 1;
13228       continue;
13229     }
13230 
13231     TemplateArgumentLoc ArgLoc;
13232     InventTemplateArgumentLoc(Arg, ArgLoc);
13233 
13234     // Find the pattern of the pack expansion.
13235     SourceLocation Ellipsis;
13236     Optional<unsigned> OrigNumExpansions;
13237     TemplateArgumentLoc Pattern =
13238         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13239                                                           OrigNumExpansions);
13240 
13241     // Substitute under the pack expansion. Do not expand the pack (yet).
13242     TemplateArgumentLoc OutPattern;
13243     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13244     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13245                                                /*Uneval*/ true))
13246       return true;
13247 
13248     // See if we can determine the number of arguments from the result.
13249     Optional<unsigned> NumExpansions =
13250         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13251     if (!NumExpansions) {
13252       // No: we must be in an alias template expansion, and we're going to need
13253       // to actually expand the packs.
13254       Result = None;
13255       break;
13256     }
13257 
13258     Result = *Result + *NumExpansions;
13259   }
13260 
13261   // Common case: we could determine the number of expansions without
13262   // substituting.
13263   if (Result)
13264     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13265                                               E->getPackLoc(),
13266                                               E->getRParenLoc(), *Result, None);
13267 
13268   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13269                                                E->getPackLoc());
13270   {
13271     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13272     typedef TemplateArgumentLocInventIterator<
13273         Derived, const TemplateArgument*> PackLocIterator;
13274     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13275                                    PackLocIterator(*this, PackArgs.end()),
13276                                    TransformedPackArgs, /*Uneval*/true))
13277       return ExprError();
13278   }
13279 
13280   // Check whether we managed to fully-expand the pack.
13281   // FIXME: Is it possible for us to do so and not hit the early exit path?
13282   SmallVector<TemplateArgument, 8> Args;
13283   bool PartialSubstitution = false;
13284   for (auto &Loc : TransformedPackArgs.arguments()) {
13285     Args.push_back(Loc.getArgument());
13286     if (Loc.getArgument().isPackExpansion())
13287       PartialSubstitution = true;
13288   }
13289 
13290   if (PartialSubstitution)
13291     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13292                                               E->getPackLoc(),
13293                                               E->getRParenLoc(), None, Args);
13294 
13295   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13296                                             E->getPackLoc(), E->getRParenLoc(),
13297                                             Args.size(), None);
13298 }
13299 
13300 template<typename Derived>
13301 ExprResult
13302 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13303                                           SubstNonTypeTemplateParmPackExpr *E) {
13304   // Default behavior is to do nothing with this transformation.
13305   return E;
13306 }
13307 
13308 template<typename Derived>
13309 ExprResult
13310 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13311                                           SubstNonTypeTemplateParmExpr *E) {
13312   // Default behavior is to do nothing with this transformation.
13313   return E;
13314 }
13315 
13316 template<typename Derived>
13317 ExprResult
13318 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13319   // Default behavior is to do nothing with this transformation.
13320   return E;
13321 }
13322 
13323 template<typename Derived>
13324 ExprResult
13325 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13326                                                   MaterializeTemporaryExpr *E) {
13327   return getDerived().TransformExpr(E->getSubExpr());
13328 }
13329 
13330 template<typename Derived>
13331 ExprResult
13332 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13333   UnresolvedLookupExpr *Callee = nullptr;
13334   if (Expr *OldCallee = E->getCallee()) {
13335     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13336     if (CalleeResult.isInvalid())
13337       return ExprError();
13338     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13339   }
13340 
13341   Expr *Pattern = E->getPattern();
13342 
13343   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13344   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13345   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13346 
13347   // Determine whether the set of unexpanded parameter packs can and should
13348   // be expanded.
13349   bool Expand = true;
13350   bool RetainExpansion = false;
13351   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13352                      NumExpansions = OrigNumExpansions;
13353   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13354                                            Pattern->getSourceRange(),
13355                                            Unexpanded,
13356                                            Expand, RetainExpansion,
13357                                            NumExpansions))
13358     return true;
13359 
13360   if (!Expand) {
13361     // Do not expand any packs here, just transform and rebuild a fold
13362     // expression.
13363     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13364 
13365     ExprResult LHS =
13366         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13367     if (LHS.isInvalid())
13368       return true;
13369 
13370     ExprResult RHS =
13371         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13372     if (RHS.isInvalid())
13373       return true;
13374 
13375     if (!getDerived().AlwaysRebuild() &&
13376         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13377       return E;
13378 
13379     return getDerived().RebuildCXXFoldExpr(
13380         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13381         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13382   }
13383 
13384   // Formally a fold expression expands to nested parenthesized expressions.
13385   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13386   // them.
13387   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13388     SemaRef.Diag(E->getEllipsisLoc(),
13389                  clang::diag::err_fold_expression_limit_exceeded)
13390         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13391         << E->getSourceRange();
13392     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13393     return ExprError();
13394   }
13395 
13396   // The transform has determined that we should perform an elementwise
13397   // expansion of the pattern. Do so.
13398   ExprResult Result = getDerived().TransformExpr(E->getInit());
13399   if (Result.isInvalid())
13400     return true;
13401   bool LeftFold = E->isLeftFold();
13402 
13403   // If we're retaining an expansion for a right fold, it is the innermost
13404   // component and takes the init (if any).
13405   if (!LeftFold && RetainExpansion) {
13406     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13407 
13408     ExprResult Out = getDerived().TransformExpr(Pattern);
13409     if (Out.isInvalid())
13410       return true;
13411 
13412     Result = getDerived().RebuildCXXFoldExpr(
13413         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13414         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13415     if (Result.isInvalid())
13416       return true;
13417   }
13418 
13419   for (unsigned I = 0; I != *NumExpansions; ++I) {
13420     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13421         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13422     ExprResult Out = getDerived().TransformExpr(Pattern);
13423     if (Out.isInvalid())
13424       return true;
13425 
13426     if (Out.get()->containsUnexpandedParameterPack()) {
13427       // We still have a pack; retain a pack expansion for this slice.
13428       Result = getDerived().RebuildCXXFoldExpr(
13429           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13430           E->getOperator(), E->getEllipsisLoc(),
13431           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13432           OrigNumExpansions);
13433     } else if (Result.isUsable()) {
13434       // We've got down to a single element; build a binary operator.
13435       Expr *LHS = LeftFold ? Result.get() : Out.get();
13436       Expr *RHS = LeftFold ? Out.get() : Result.get();
13437       if (Callee)
13438         Result = getDerived().RebuildCXXOperatorCallExpr(
13439             BinaryOperator::getOverloadedOperator(E->getOperator()),
13440             E->getEllipsisLoc(), Callee, LHS, RHS);
13441       else
13442         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13443                                                     E->getOperator(), LHS, RHS);
13444     } else
13445       Result = Out;
13446 
13447     if (Result.isInvalid())
13448       return true;
13449   }
13450 
13451   // If we're retaining an expansion for a left fold, it is the outermost
13452   // component and takes the complete expansion so far as its init (if any).
13453   if (LeftFold && RetainExpansion) {
13454     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13455 
13456     ExprResult Out = getDerived().TransformExpr(Pattern);
13457     if (Out.isInvalid())
13458       return true;
13459 
13460     Result = getDerived().RebuildCXXFoldExpr(
13461         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13462         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13463     if (Result.isInvalid())
13464       return true;
13465   }
13466 
13467   // If we had no init and an empty pack, and we're not retaining an expansion,
13468   // then produce a fallback value or error.
13469   if (Result.isUnset())
13470     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13471                                                 E->getOperator());
13472 
13473   return Result;
13474 }
13475 
13476 template<typename Derived>
13477 ExprResult
13478 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13479     CXXStdInitializerListExpr *E) {
13480   return getDerived().TransformExpr(E->getSubExpr());
13481 }
13482 
13483 template<typename Derived>
13484 ExprResult
13485 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13486   return SemaRef.MaybeBindToTemporary(E);
13487 }
13488 
13489 template<typename Derived>
13490 ExprResult
13491 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13492   return E;
13493 }
13494 
13495 template<typename Derived>
13496 ExprResult
13497 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13498   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13499   if (SubExpr.isInvalid())
13500     return ExprError();
13501 
13502   if (!getDerived().AlwaysRebuild() &&
13503       SubExpr.get() == E->getSubExpr())
13504     return E;
13505 
13506   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13507 }
13508 
13509 template<typename Derived>
13510 ExprResult
13511 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13512   // Transform each of the elements.
13513   SmallVector<Expr *, 8> Elements;
13514   bool ArgChanged = false;
13515   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13516                                   /*IsCall=*/false, Elements, &ArgChanged))
13517     return ExprError();
13518 
13519   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13520     return SemaRef.MaybeBindToTemporary(E);
13521 
13522   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13523                                               Elements.data(),
13524                                               Elements.size());
13525 }
13526 
13527 template<typename Derived>
13528 ExprResult
13529 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13530                                                     ObjCDictionaryLiteral *E) {
13531   // Transform each of the elements.
13532   SmallVector<ObjCDictionaryElement, 8> Elements;
13533   bool ArgChanged = false;
13534   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13535     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13536 
13537     if (OrigElement.isPackExpansion()) {
13538       // This key/value element is a pack expansion.
13539       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13540       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13541       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13542       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13543 
13544       // Determine whether the set of unexpanded parameter packs can
13545       // and should be expanded.
13546       bool Expand = true;
13547       bool RetainExpansion = false;
13548       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13549       Optional<unsigned> NumExpansions = OrigNumExpansions;
13550       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13551                                OrigElement.Value->getEndLoc());
13552       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13553                                                PatternRange, Unexpanded, Expand,
13554                                                RetainExpansion, NumExpansions))
13555         return ExprError();
13556 
13557       if (!Expand) {
13558         // The transform has determined that we should perform a simple
13559         // transformation on the pack expansion, producing another pack
13560         // expansion.
13561         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13562         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13563         if (Key.isInvalid())
13564           return ExprError();
13565 
13566         if (Key.get() != OrigElement.Key)
13567           ArgChanged = true;
13568 
13569         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13570         if (Value.isInvalid())
13571           return ExprError();
13572 
13573         if (Value.get() != OrigElement.Value)
13574           ArgChanged = true;
13575 
13576         ObjCDictionaryElement Expansion = {
13577           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13578         };
13579         Elements.push_back(Expansion);
13580         continue;
13581       }
13582 
13583       // Record right away that the argument was changed.  This needs
13584       // to happen even if the array expands to nothing.
13585       ArgChanged = true;
13586 
13587       // The transform has determined that we should perform an elementwise
13588       // expansion of the pattern. Do so.
13589       for (unsigned I = 0; I != *NumExpansions; ++I) {
13590         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13591         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13592         if (Key.isInvalid())
13593           return ExprError();
13594 
13595         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13596         if (Value.isInvalid())
13597           return ExprError();
13598 
13599         ObjCDictionaryElement Element = {
13600           Key.get(), Value.get(), SourceLocation(), NumExpansions
13601         };
13602 
13603         // If any unexpanded parameter packs remain, we still have a
13604         // pack expansion.
13605         // FIXME: Can this really happen?
13606         if (Key.get()->containsUnexpandedParameterPack() ||
13607             Value.get()->containsUnexpandedParameterPack())
13608           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13609 
13610         Elements.push_back(Element);
13611       }
13612 
13613       // FIXME: Retain a pack expansion if RetainExpansion is true.
13614 
13615       // We've finished with this pack expansion.
13616       continue;
13617     }
13618 
13619     // Transform and check key.
13620     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13621     if (Key.isInvalid())
13622       return ExprError();
13623 
13624     if (Key.get() != OrigElement.Key)
13625       ArgChanged = true;
13626 
13627     // Transform and check value.
13628     ExprResult Value
13629       = getDerived().TransformExpr(OrigElement.Value);
13630     if (Value.isInvalid())
13631       return ExprError();
13632 
13633     if (Value.get() != OrigElement.Value)
13634       ArgChanged = true;
13635 
13636     ObjCDictionaryElement Element = {
13637       Key.get(), Value.get(), SourceLocation(), None
13638     };
13639     Elements.push_back(Element);
13640   }
13641 
13642   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13643     return SemaRef.MaybeBindToTemporary(E);
13644 
13645   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13646                                                    Elements);
13647 }
13648 
13649 template<typename Derived>
13650 ExprResult
13651 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13652   TypeSourceInfo *EncodedTypeInfo
13653     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13654   if (!EncodedTypeInfo)
13655     return ExprError();
13656 
13657   if (!getDerived().AlwaysRebuild() &&
13658       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13659     return E;
13660 
13661   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13662                                             EncodedTypeInfo,
13663                                             E->getRParenLoc());
13664 }
13665 
13666 template<typename Derived>
13667 ExprResult TreeTransform<Derived>::
13668 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13669   // This is a kind of implicit conversion, and it needs to get dropped
13670   // and recomputed for the same general reasons that ImplicitCastExprs
13671   // do, as well a more specific one: this expression is only valid when
13672   // it appears *immediately* as an argument expression.
13673   return getDerived().TransformExpr(E->getSubExpr());
13674 }
13675 
13676 template<typename Derived>
13677 ExprResult TreeTransform<Derived>::
13678 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13679   TypeSourceInfo *TSInfo
13680     = getDerived().TransformType(E->getTypeInfoAsWritten());
13681   if (!TSInfo)
13682     return ExprError();
13683 
13684   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13685   if (Result.isInvalid())
13686     return ExprError();
13687 
13688   if (!getDerived().AlwaysRebuild() &&
13689       TSInfo == E->getTypeInfoAsWritten() &&
13690       Result.get() == E->getSubExpr())
13691     return E;
13692 
13693   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13694                                       E->getBridgeKeywordLoc(), TSInfo,
13695                                       Result.get());
13696 }
13697 
13698 template <typename Derived>
13699 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13700     ObjCAvailabilityCheckExpr *E) {
13701   return E;
13702 }
13703 
13704 template<typename Derived>
13705 ExprResult
13706 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13707   // Transform arguments.
13708   bool ArgChanged = false;
13709   SmallVector<Expr*, 8> Args;
13710   Args.reserve(E->getNumArgs());
13711   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13712                                   &ArgChanged))
13713     return ExprError();
13714 
13715   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13716     // Class message: transform the receiver type.
13717     TypeSourceInfo *ReceiverTypeInfo
13718       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13719     if (!ReceiverTypeInfo)
13720       return ExprError();
13721 
13722     // If nothing changed, just retain the existing message send.
13723     if (!getDerived().AlwaysRebuild() &&
13724         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13725       return SemaRef.MaybeBindToTemporary(E);
13726 
13727     // Build a new class message send.
13728     SmallVector<SourceLocation, 16> SelLocs;
13729     E->getSelectorLocs(SelLocs);
13730     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13731                                                E->getSelector(),
13732                                                SelLocs,
13733                                                E->getMethodDecl(),
13734                                                E->getLeftLoc(),
13735                                                Args,
13736                                                E->getRightLoc());
13737   }
13738   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13739            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13740     if (!E->getMethodDecl())
13741       return ExprError();
13742 
13743     // Build a new class message send to 'super'.
13744     SmallVector<SourceLocation, 16> SelLocs;
13745     E->getSelectorLocs(SelLocs);
13746     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13747                                                E->getSelector(),
13748                                                SelLocs,
13749                                                E->getReceiverType(),
13750                                                E->getMethodDecl(),
13751                                                E->getLeftLoc(),
13752                                                Args,
13753                                                E->getRightLoc());
13754   }
13755 
13756   // Instance message: transform the receiver
13757   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13758          "Only class and instance messages may be instantiated");
13759   ExprResult Receiver
13760     = getDerived().TransformExpr(E->getInstanceReceiver());
13761   if (Receiver.isInvalid())
13762     return ExprError();
13763 
13764   // If nothing changed, just retain the existing message send.
13765   if (!getDerived().AlwaysRebuild() &&
13766       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13767     return SemaRef.MaybeBindToTemporary(E);
13768 
13769   // Build a new instance message send.
13770   SmallVector<SourceLocation, 16> SelLocs;
13771   E->getSelectorLocs(SelLocs);
13772   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13773                                              E->getSelector(),
13774                                              SelLocs,
13775                                              E->getMethodDecl(),
13776                                              E->getLeftLoc(),
13777                                              Args,
13778                                              E->getRightLoc());
13779 }
13780 
13781 template<typename Derived>
13782 ExprResult
13783 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13784   return E;
13785 }
13786 
13787 template<typename Derived>
13788 ExprResult
13789 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13790   return E;
13791 }
13792 
13793 template<typename Derived>
13794 ExprResult
13795 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13796   // Transform the base expression.
13797   ExprResult Base = getDerived().TransformExpr(E->getBase());
13798   if (Base.isInvalid())
13799     return ExprError();
13800 
13801   // We don't need to transform the ivar; it will never change.
13802 
13803   // If nothing changed, just retain the existing expression.
13804   if (!getDerived().AlwaysRebuild() &&
13805       Base.get() == E->getBase())
13806     return E;
13807 
13808   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13809                                              E->getLocation(),
13810                                              E->isArrow(), E->isFreeIvar());
13811 }
13812 
13813 template<typename Derived>
13814 ExprResult
13815 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13816   // 'super' and types never change. Property never changes. Just
13817   // retain the existing expression.
13818   if (!E->isObjectReceiver())
13819     return E;
13820 
13821   // Transform the base expression.
13822   ExprResult Base = getDerived().TransformExpr(E->getBase());
13823   if (Base.isInvalid())
13824     return ExprError();
13825 
13826   // We don't need to transform the property; it will never change.
13827 
13828   // If nothing changed, just retain the existing expression.
13829   if (!getDerived().AlwaysRebuild() &&
13830       Base.get() == E->getBase())
13831     return E;
13832 
13833   if (E->isExplicitProperty())
13834     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13835                                                    E->getExplicitProperty(),
13836                                                    E->getLocation());
13837 
13838   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13839                                                  SemaRef.Context.PseudoObjectTy,
13840                                                  E->getImplicitPropertyGetter(),
13841                                                  E->getImplicitPropertySetter(),
13842                                                  E->getLocation());
13843 }
13844 
13845 template<typename Derived>
13846 ExprResult
13847 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13848   // Transform the base expression.
13849   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13850   if (Base.isInvalid())
13851     return ExprError();
13852 
13853   // Transform the key expression.
13854   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13855   if (Key.isInvalid())
13856     return ExprError();
13857 
13858   // If nothing changed, just retain the existing expression.
13859   if (!getDerived().AlwaysRebuild() &&
13860       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13861     return E;
13862 
13863   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13864                                                   Base.get(), Key.get(),
13865                                                   E->getAtIndexMethodDecl(),
13866                                                   E->setAtIndexMethodDecl());
13867 }
13868 
13869 template<typename Derived>
13870 ExprResult
13871 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13872   // Transform the base expression.
13873   ExprResult Base = getDerived().TransformExpr(E->getBase());
13874   if (Base.isInvalid())
13875     return ExprError();
13876 
13877   // If nothing changed, just retain the existing expression.
13878   if (!getDerived().AlwaysRebuild() &&
13879       Base.get() == E->getBase())
13880     return E;
13881 
13882   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13883                                          E->getOpLoc(),
13884                                          E->isArrow());
13885 }
13886 
13887 template<typename Derived>
13888 ExprResult
13889 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13890   bool ArgumentChanged = false;
13891   SmallVector<Expr*, 8> SubExprs;
13892   SubExprs.reserve(E->getNumSubExprs());
13893   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13894                                   SubExprs, &ArgumentChanged))
13895     return ExprError();
13896 
13897   if (!getDerived().AlwaysRebuild() &&
13898       !ArgumentChanged)
13899     return E;
13900 
13901   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13902                                                SubExprs,
13903                                                E->getRParenLoc());
13904 }
13905 
13906 template<typename Derived>
13907 ExprResult
13908 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13909   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13910   if (SrcExpr.isInvalid())
13911     return ExprError();
13912 
13913   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13914   if (!Type)
13915     return ExprError();
13916 
13917   if (!getDerived().AlwaysRebuild() &&
13918       Type == E->getTypeSourceInfo() &&
13919       SrcExpr.get() == E->getSrcExpr())
13920     return E;
13921 
13922   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13923                                                SrcExpr.get(), Type,
13924                                                E->getRParenLoc());
13925 }
13926 
13927 template<typename Derived>
13928 ExprResult
13929 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13930   BlockDecl *oldBlock = E->getBlockDecl();
13931 
13932   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13933   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13934 
13935   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13936   blockScope->TheDecl->setBlockMissingReturnType(
13937                          oldBlock->blockMissingReturnType());
13938 
13939   SmallVector<ParmVarDecl*, 4> params;
13940   SmallVector<QualType, 4> paramTypes;
13941 
13942   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13943 
13944   // Parameter substitution.
13945   Sema::ExtParameterInfoBuilder extParamInfos;
13946   if (getDerived().TransformFunctionTypeParams(
13947           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13948           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13949           extParamInfos)) {
13950     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13951     return ExprError();
13952   }
13953 
13954   QualType exprResultType =
13955       getDerived().TransformType(exprFunctionType->getReturnType());
13956 
13957   auto epi = exprFunctionType->getExtProtoInfo();
13958   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13959 
13960   QualType functionType =
13961     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13962   blockScope->FunctionType = functionType;
13963 
13964   // Set the parameters on the block decl.
13965   if (!params.empty())
13966     blockScope->TheDecl->setParams(params);
13967 
13968   if (!oldBlock->blockMissingReturnType()) {
13969     blockScope->HasImplicitReturnType = false;
13970     blockScope->ReturnType = exprResultType;
13971   }
13972 
13973   // Transform the body
13974   StmtResult body = getDerived().TransformStmt(E->getBody());
13975   if (body.isInvalid()) {
13976     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13977     return ExprError();
13978   }
13979 
13980 #ifndef NDEBUG
13981   // In builds with assertions, make sure that we captured everything we
13982   // captured before.
13983   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13984     for (const auto &I : oldBlock->captures()) {
13985       VarDecl *oldCapture = I.getVariable();
13986 
13987       // Ignore parameter packs.
13988       if (oldCapture->isParameterPack())
13989         continue;
13990 
13991       VarDecl *newCapture =
13992         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13993                                                  oldCapture));
13994       assert(blockScope->CaptureMap.count(newCapture));
13995     }
13996     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13997   }
13998 #endif
13999 
14000   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14001                                     /*Scope=*/nullptr);
14002 }
14003 
14004 template<typename Derived>
14005 ExprResult
14006 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14007   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14008   if (SrcExpr.isInvalid())
14009     return ExprError();
14010 
14011   QualType Type = getDerived().TransformType(E->getType());
14012 
14013   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14014                                  E->getRParenLoc());
14015 }
14016 
14017 template<typename Derived>
14018 ExprResult
14019 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14020   bool ArgumentChanged = false;
14021   SmallVector<Expr*, 8> SubExprs;
14022   SubExprs.reserve(E->getNumSubExprs());
14023   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14024                                   SubExprs, &ArgumentChanged))
14025     return ExprError();
14026 
14027   if (!getDerived().AlwaysRebuild() &&
14028       !ArgumentChanged)
14029     return E;
14030 
14031   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14032                                         E->getOp(), E->getRParenLoc());
14033 }
14034 
14035 //===----------------------------------------------------------------------===//
14036 // Type reconstruction
14037 //===----------------------------------------------------------------------===//
14038 
14039 template<typename Derived>
14040 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14041                                                     SourceLocation Star) {
14042   return SemaRef.BuildPointerType(PointeeType, Star,
14043                                   getDerived().getBaseEntity());
14044 }
14045 
14046 template<typename Derived>
14047 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14048                                                          SourceLocation Star) {
14049   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14050                                        getDerived().getBaseEntity());
14051 }
14052 
14053 template<typename Derived>
14054 QualType
14055 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14056                                              bool WrittenAsLValue,
14057                                              SourceLocation Sigil) {
14058   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14059                                     Sigil, getDerived().getBaseEntity());
14060 }
14061 
14062 template<typename Derived>
14063 QualType
14064 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14065                                                  QualType ClassType,
14066                                                  SourceLocation Sigil) {
14067   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14068                                         getDerived().getBaseEntity());
14069 }
14070 
14071 template<typename Derived>
14072 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14073            const ObjCTypeParamDecl *Decl,
14074            SourceLocation ProtocolLAngleLoc,
14075            ArrayRef<ObjCProtocolDecl *> Protocols,
14076            ArrayRef<SourceLocation> ProtocolLocs,
14077            SourceLocation ProtocolRAngleLoc) {
14078   return SemaRef.BuildObjCTypeParamType(Decl,
14079                                         ProtocolLAngleLoc, Protocols,
14080                                         ProtocolLocs, ProtocolRAngleLoc,
14081                                         /*FailOnError=*/true);
14082 }
14083 
14084 template<typename Derived>
14085 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14086            QualType BaseType,
14087            SourceLocation Loc,
14088            SourceLocation TypeArgsLAngleLoc,
14089            ArrayRef<TypeSourceInfo *> TypeArgs,
14090            SourceLocation TypeArgsRAngleLoc,
14091            SourceLocation ProtocolLAngleLoc,
14092            ArrayRef<ObjCProtocolDecl *> Protocols,
14093            ArrayRef<SourceLocation> ProtocolLocs,
14094            SourceLocation ProtocolRAngleLoc) {
14095   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14096                                      TypeArgs, TypeArgsRAngleLoc,
14097                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14098                                      ProtocolRAngleLoc,
14099                                      /*FailOnError=*/true);
14100 }
14101 
14102 template<typename Derived>
14103 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14104            QualType PointeeType,
14105            SourceLocation Star) {
14106   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14107 }
14108 
14109 template<typename Derived>
14110 QualType
14111 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14112                                          ArrayType::ArraySizeModifier SizeMod,
14113                                          const llvm::APInt *Size,
14114                                          Expr *SizeExpr,
14115                                          unsigned IndexTypeQuals,
14116                                          SourceRange BracketsRange) {
14117   if (SizeExpr || !Size)
14118     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14119                                   IndexTypeQuals, BracketsRange,
14120                                   getDerived().getBaseEntity());
14121 
14122   QualType Types[] = {
14123     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14124     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14125     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14126   };
14127   const unsigned NumTypes = llvm::array_lengthof(Types);
14128   QualType SizeType;
14129   for (unsigned I = 0; I != NumTypes; ++I)
14130     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14131       SizeType = Types[I];
14132       break;
14133     }
14134 
14135   // Note that we can return a VariableArrayType here in the case where
14136   // the element type was a dependent VariableArrayType.
14137   IntegerLiteral *ArraySize
14138       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14139                                /*FIXME*/BracketsRange.getBegin());
14140   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14141                                 IndexTypeQuals, BracketsRange,
14142                                 getDerived().getBaseEntity());
14143 }
14144 
14145 template<typename Derived>
14146 QualType
14147 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14148                                                  ArrayType::ArraySizeModifier SizeMod,
14149                                                  const llvm::APInt &Size,
14150                                                  Expr *SizeExpr,
14151                                                  unsigned IndexTypeQuals,
14152                                                  SourceRange BracketsRange) {
14153   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14154                                         IndexTypeQuals, BracketsRange);
14155 }
14156 
14157 template<typename Derived>
14158 QualType
14159 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14160                                           ArrayType::ArraySizeModifier SizeMod,
14161                                                  unsigned IndexTypeQuals,
14162                                                    SourceRange BracketsRange) {
14163   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14164                                        IndexTypeQuals, BracketsRange);
14165 }
14166 
14167 template<typename Derived>
14168 QualType
14169 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14170                                           ArrayType::ArraySizeModifier SizeMod,
14171                                                  Expr *SizeExpr,
14172                                                  unsigned IndexTypeQuals,
14173                                                  SourceRange BracketsRange) {
14174   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14175                                        SizeExpr,
14176                                        IndexTypeQuals, BracketsRange);
14177 }
14178 
14179 template<typename Derived>
14180 QualType
14181 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14182                                           ArrayType::ArraySizeModifier SizeMod,
14183                                                        Expr *SizeExpr,
14184                                                        unsigned IndexTypeQuals,
14185                                                    SourceRange BracketsRange) {
14186   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14187                                        SizeExpr,
14188                                        IndexTypeQuals, BracketsRange);
14189 }
14190 
14191 template <typename Derived>
14192 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14193     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14194   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14195                                           AttributeLoc);
14196 }
14197 
14198 template <typename Derived>
14199 QualType
14200 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14201                                           unsigned NumElements,
14202                                           VectorType::VectorKind VecKind) {
14203   // FIXME: semantic checking!
14204   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14205 }
14206 
14207 template <typename Derived>
14208 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14209     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14210     VectorType::VectorKind VecKind) {
14211   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14212 }
14213 
14214 template<typename Derived>
14215 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14216                                                       unsigned NumElements,
14217                                                  SourceLocation AttributeLoc) {
14218   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14219                           NumElements, true);
14220   IntegerLiteral *VectorSize
14221     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14222                              AttributeLoc);
14223   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14224 }
14225 
14226 template<typename Derived>
14227 QualType
14228 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14229                                                            Expr *SizeExpr,
14230                                                   SourceLocation AttributeLoc) {
14231   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14232 }
14233 
14234 template <typename Derived>
14235 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14236     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14237   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14238                                                NumColumns);
14239 }
14240 
14241 template <typename Derived>
14242 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14243     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14244     SourceLocation AttributeLoc) {
14245   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14246                                  AttributeLoc);
14247 }
14248 
14249 template<typename Derived>
14250 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14251     QualType T,
14252     MutableArrayRef<QualType> ParamTypes,
14253     const FunctionProtoType::ExtProtoInfo &EPI) {
14254   return SemaRef.BuildFunctionType(T, ParamTypes,
14255                                    getDerived().getBaseLocation(),
14256                                    getDerived().getBaseEntity(),
14257                                    EPI);
14258 }
14259 
14260 template<typename Derived>
14261 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14262   return SemaRef.Context.getFunctionNoProtoType(T);
14263 }
14264 
14265 template<typename Derived>
14266 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14267                                                             Decl *D) {
14268   assert(D && "no decl found");
14269   if (D->isInvalidDecl()) return QualType();
14270 
14271   // FIXME: Doesn't account for ObjCInterfaceDecl!
14272   TypeDecl *Ty;
14273   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14274     // A valid resolved using typename pack expansion decl can have multiple
14275     // UsingDecls, but they must each have exactly one type, and it must be
14276     // the same type in every case. But we must have at least one expansion!
14277     if (UPD->expansions().empty()) {
14278       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14279           << UPD->isCXXClassMember() << UPD;
14280       return QualType();
14281     }
14282 
14283     // We might still have some unresolved types. Try to pick a resolved type
14284     // if we can. The final instantiation will check that the remaining
14285     // unresolved types instantiate to the type we pick.
14286     QualType FallbackT;
14287     QualType T;
14288     for (auto *E : UPD->expansions()) {
14289       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14290       if (ThisT.isNull())
14291         continue;
14292       else if (ThisT->getAs<UnresolvedUsingType>())
14293         FallbackT = ThisT;
14294       else if (T.isNull())
14295         T = ThisT;
14296       else
14297         assert(getSema().Context.hasSameType(ThisT, T) &&
14298                "mismatched resolved types in using pack expansion");
14299     }
14300     return T.isNull() ? FallbackT : T;
14301   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14302     assert(Using->hasTypename() &&
14303            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14304 
14305     // A valid resolved using typename decl points to exactly one type decl.
14306     assert(++Using->shadow_begin() == Using->shadow_end());
14307     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
14308   } else {
14309     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14310            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14311     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14312   }
14313 
14314   return SemaRef.Context.getTypeDeclType(Ty);
14315 }
14316 
14317 template<typename Derived>
14318 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14319                                                        SourceLocation Loc) {
14320   return SemaRef.BuildTypeofExprType(E, Loc);
14321 }
14322 
14323 template<typename Derived>
14324 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14325   return SemaRef.Context.getTypeOfType(Underlying);
14326 }
14327 
14328 template<typename Derived>
14329 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14330                                                      SourceLocation Loc) {
14331   return SemaRef.BuildDecltypeType(E, Loc);
14332 }
14333 
14334 template<typename Derived>
14335 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14336                                             UnaryTransformType::UTTKind UKind,
14337                                             SourceLocation Loc) {
14338   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14339 }
14340 
14341 template<typename Derived>
14342 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14343                                                       TemplateName Template,
14344                                              SourceLocation TemplateNameLoc,
14345                                      TemplateArgumentListInfo &TemplateArgs) {
14346   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14347 }
14348 
14349 template<typename Derived>
14350 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14351                                                    SourceLocation KWLoc) {
14352   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14353 }
14354 
14355 template<typename Derived>
14356 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14357                                                  SourceLocation KWLoc,
14358                                                  bool isReadPipe) {
14359   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14360                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14361 }
14362 
14363 template <typename Derived>
14364 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14365                                                    unsigned NumBits,
14366                                                    SourceLocation Loc) {
14367   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14368                         NumBits, true);
14369   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14370                                                 SemaRef.Context.IntTy, Loc);
14371   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14372 }
14373 
14374 template <typename Derived>
14375 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14376     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14377   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14378 }
14379 
14380 template<typename Derived>
14381 TemplateName
14382 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14383                                             bool TemplateKW,
14384                                             TemplateDecl *Template) {
14385   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14386                                                   Template);
14387 }
14388 
14389 template<typename Derived>
14390 TemplateName
14391 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14392                                             SourceLocation TemplateKWLoc,
14393                                             const IdentifierInfo &Name,
14394                                             SourceLocation NameLoc,
14395                                             QualType ObjectType,
14396                                             NamedDecl *FirstQualifierInScope,
14397                                             bool AllowInjectedClassName) {
14398   UnqualifiedId TemplateName;
14399   TemplateName.setIdentifier(&Name, NameLoc);
14400   Sema::TemplateTy Template;
14401   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14402                               TemplateName, ParsedType::make(ObjectType),
14403                               /*EnteringContext=*/false, Template,
14404                               AllowInjectedClassName);
14405   return Template.get();
14406 }
14407 
14408 template<typename Derived>
14409 TemplateName
14410 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14411                                             SourceLocation TemplateKWLoc,
14412                                             OverloadedOperatorKind Operator,
14413                                             SourceLocation NameLoc,
14414                                             QualType ObjectType,
14415                                             bool AllowInjectedClassName) {
14416   UnqualifiedId Name;
14417   // FIXME: Bogus location information.
14418   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14419   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14420   Sema::TemplateTy Template;
14421   getSema().ActOnTemplateName(
14422       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14423       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14424   return Template.get();
14425 }
14426 
14427 template<typename Derived>
14428 ExprResult
14429 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14430                                                    SourceLocation OpLoc,
14431                                                    Expr *OrigCallee,
14432                                                    Expr *First,
14433                                                    Expr *Second) {
14434   Expr *Callee = OrigCallee->IgnoreParenCasts();
14435   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14436 
14437   if (First->getObjectKind() == OK_ObjCProperty) {
14438     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14439     if (BinaryOperator::isAssignmentOp(Opc))
14440       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14441                                                  First, Second);
14442     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14443     if (Result.isInvalid())
14444       return ExprError();
14445     First = Result.get();
14446   }
14447 
14448   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14449     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14450     if (Result.isInvalid())
14451       return ExprError();
14452     Second = Result.get();
14453   }
14454 
14455   // Determine whether this should be a builtin operation.
14456   if (Op == OO_Subscript) {
14457     if (!First->getType()->isOverloadableType() &&
14458         !Second->getType()->isOverloadableType())
14459       return getSema().CreateBuiltinArraySubscriptExpr(
14460           First, Callee->getBeginLoc(), Second, OpLoc);
14461   } else if (Op == OO_Arrow) {
14462     // -> is never a builtin operation.
14463     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14464   } else if (Second == nullptr || isPostIncDec) {
14465     if (!First->getType()->isOverloadableType() ||
14466         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14467       // The argument is not of overloadable type, or this is an expression
14468       // of the form &Class::member, so try to create a built-in unary
14469       // operation.
14470       UnaryOperatorKind Opc
14471         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14472 
14473       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14474     }
14475   } else {
14476     if (!First->getType()->isOverloadableType() &&
14477         !Second->getType()->isOverloadableType()) {
14478       // Neither of the arguments is an overloadable type, so try to
14479       // create a built-in binary operation.
14480       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14481       ExprResult Result
14482         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14483       if (Result.isInvalid())
14484         return ExprError();
14485 
14486       return Result;
14487     }
14488   }
14489 
14490   // Compute the transformed set of functions (and function templates) to be
14491   // used during overload resolution.
14492   UnresolvedSet<16> Functions;
14493   bool RequiresADL;
14494 
14495   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14496     Functions.append(ULE->decls_begin(), ULE->decls_end());
14497     // If the overload could not be resolved in the template definition
14498     // (because we had a dependent argument), ADL is performed as part of
14499     // template instantiation.
14500     RequiresADL = ULE->requiresADL();
14501   } else {
14502     // If we've resolved this to a particular non-member function, just call
14503     // that function. If we resolved it to a member function,
14504     // CreateOverloaded* will find that function for us.
14505     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14506     if (!isa<CXXMethodDecl>(ND))
14507       Functions.addDecl(ND);
14508     RequiresADL = false;
14509   }
14510 
14511   // Add any functions found via argument-dependent lookup.
14512   Expr *Args[2] = { First, Second };
14513   unsigned NumArgs = 1 + (Second != nullptr);
14514 
14515   // Create the overloaded operator invocation for unary operators.
14516   if (NumArgs == 1 || isPostIncDec) {
14517     UnaryOperatorKind Opc
14518       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14519     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14520                                            RequiresADL);
14521   }
14522 
14523   if (Op == OO_Subscript) {
14524     SourceLocation LBrace;
14525     SourceLocation RBrace;
14526 
14527     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14528       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14529       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14530       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14531     } else {
14532       LBrace = Callee->getBeginLoc();
14533       RBrace = OpLoc;
14534     }
14535 
14536     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14537                                                       First, Second);
14538   }
14539 
14540   // Create the overloaded operator invocation for binary operators.
14541   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14542   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14543       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14544   if (Result.isInvalid())
14545     return ExprError();
14546 
14547   return Result;
14548 }
14549 
14550 template<typename Derived>
14551 ExprResult
14552 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14553                                                      SourceLocation OperatorLoc,
14554                                                        bool isArrow,
14555                                                        CXXScopeSpec &SS,
14556                                                      TypeSourceInfo *ScopeType,
14557                                                        SourceLocation CCLoc,
14558                                                        SourceLocation TildeLoc,
14559                                         PseudoDestructorTypeStorage Destroyed) {
14560   QualType BaseType = Base->getType();
14561   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14562       (!isArrow && !BaseType->getAs<RecordType>()) ||
14563       (isArrow && BaseType->getAs<PointerType>() &&
14564        !BaseType->castAs<PointerType>()->getPointeeType()
14565                                               ->template getAs<RecordType>())){
14566     // This pseudo-destructor expression is still a pseudo-destructor.
14567     return SemaRef.BuildPseudoDestructorExpr(
14568         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14569         CCLoc, TildeLoc, Destroyed);
14570   }
14571 
14572   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14573   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14574                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14575   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14576   NameInfo.setNamedTypeInfo(DestroyedType);
14577 
14578   // The scope type is now known to be a valid nested name specifier
14579   // component. Tack it on to the end of the nested name specifier.
14580   if (ScopeType) {
14581     if (!ScopeType->getType()->getAs<TagType>()) {
14582       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14583                      diag::err_expected_class_or_namespace)
14584           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14585       return ExprError();
14586     }
14587     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14588               CCLoc);
14589   }
14590 
14591   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14592   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14593                                             OperatorLoc, isArrow,
14594                                             SS, TemplateKWLoc,
14595                                             /*FIXME: FirstQualifier*/ nullptr,
14596                                             NameInfo,
14597                                             /*TemplateArgs*/ nullptr,
14598                                             /*S*/nullptr);
14599 }
14600 
14601 template<typename Derived>
14602 StmtResult
14603 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14604   SourceLocation Loc = S->getBeginLoc();
14605   CapturedDecl *CD = S->getCapturedDecl();
14606   unsigned NumParams = CD->getNumParams();
14607   unsigned ContextParamPos = CD->getContextParamPosition();
14608   SmallVector<Sema::CapturedParamNameType, 4> Params;
14609   for (unsigned I = 0; I < NumParams; ++I) {
14610     if (I != ContextParamPos) {
14611       Params.push_back(
14612              std::make_pair(
14613                   CD->getParam(I)->getName(),
14614                   getDerived().TransformType(CD->getParam(I)->getType())));
14615     } else {
14616       Params.push_back(std::make_pair(StringRef(), QualType()));
14617     }
14618   }
14619   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14620                                      S->getCapturedRegionKind(), Params);
14621   StmtResult Body;
14622   {
14623     Sema::CompoundScopeRAII CompoundScope(getSema());
14624     Body = getDerived().TransformStmt(S->getCapturedStmt());
14625   }
14626 
14627   if (Body.isInvalid()) {
14628     getSema().ActOnCapturedRegionError();
14629     return StmtError();
14630   }
14631 
14632   return getSema().ActOnCapturedRegionEnd(Body.get());
14633 }
14634 
14635 } // end namespace clang
14636 
14637 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14638