1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Basic/DiagnosticParse.h"
32 #include "clang/Basic/OpenMPKinds.h"
33 #include "clang/Sema/Designator.h"
34 #include "clang/Sema/Lookup.h"
35 #include "clang/Sema/Ownership.h"
36 #include "clang/Sema/ParsedTemplate.h"
37 #include "clang/Sema/ScopeInfo.h"
38 #include "clang/Sema/SemaDiagnostic.h"
39 #include "clang/Sema/SemaInternal.h"
40 #include "llvm/ADT/ArrayRef.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include <algorithm>
43 
44 using namespace llvm::omp;
45 
46 namespace clang {
47 using namespace sema;
48 
49 /// A semantic tree transformation that allows one to transform one
50 /// abstract syntax tree into another.
51 ///
52 /// A new tree transformation is defined by creating a new subclass \c X of
53 /// \c TreeTransform<X> and then overriding certain operations to provide
54 /// behavior specific to that transformation. For example, template
55 /// instantiation is implemented as a tree transformation where the
56 /// transformation of TemplateTypeParmType nodes involves substituting the
57 /// template arguments for their corresponding template parameters; a similar
58 /// transformation is performed for non-type template parameters and
59 /// template template parameters.
60 ///
61 /// This tree-transformation template uses static polymorphism to allow
62 /// subclasses to customize any of its operations. Thus, a subclass can
63 /// override any of the transformation or rebuild operators by providing an
64 /// operation with the same signature as the default implementation. The
65 /// overriding function should not be virtual.
66 ///
67 /// Semantic tree transformations are split into two stages, either of which
68 /// can be replaced by a subclass. The "transform" step transforms an AST node
69 /// or the parts of an AST node using the various transformation functions,
70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
71 /// node of the appropriate kind from the pieces. The default transformation
72 /// routines recursively transform the operands to composite AST nodes (e.g.,
73 /// the pointee type of a PointerType node) and, if any of those operand nodes
74 /// were changed by the transformation, invokes the rebuild operation to create
75 /// a new AST node.
76 ///
77 /// Subclasses can customize the transformation at various levels. The
78 /// most coarse-grained transformations involve replacing TransformType(),
79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
81 /// new implementations.
82 ///
83 /// For more fine-grained transformations, subclasses can replace any of the
84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
86 /// replacing TransformTemplateTypeParmType() allows template instantiation
87 /// to substitute template arguments for their corresponding template
88 /// parameters. Additionally, subclasses can override the \c RebuildXXX
89 /// functions to control how AST nodes are rebuilt when their operands change.
90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
92 /// be able to use more efficient rebuild steps.
93 ///
94 /// There are a handful of other functions that can be overridden, allowing one
95 /// to avoid traversing nodes that don't need any transformation
96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
97 /// operands have not changed (\c AlwaysRebuild()), and customize the
98 /// default locations and entity names used for type-checking
99 /// (\c getBaseLocation(), \c getBaseEntity()).
100 template<typename Derived>
101 class TreeTransform {
102   /// Private RAII object that helps us forget and then re-remember
103   /// the template argument corresponding to a partially-substituted parameter
104   /// pack.
105   class ForgetPartiallySubstitutedPackRAII {
106     Derived &Self;
107     TemplateArgument Old;
108 
109   public:
110     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
111       Old = Self.ForgetPartiallySubstitutedPack();
112     }
113 
114     ~ForgetPartiallySubstitutedPackRAII() {
115       Self.RememberPartiallySubstitutedPack(Old);
116     }
117   };
118 
119 protected:
120   Sema &SemaRef;
121 
122   /// The set of local declarations that have been transformed, for
123   /// cases where we are forced to build new declarations within the transformer
124   /// rather than in the subclass (e.g., lambda closure types).
125   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
126 
127 public:
128   /// Initializes a new tree transformer.
129   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
130 
131   /// Retrieves a reference to the derived class.
132   Derived &getDerived() { return static_cast<Derived&>(*this); }
133 
134   /// Retrieves a reference to the derived class.
135   const Derived &getDerived() const {
136     return static_cast<const Derived&>(*this);
137   }
138 
139   static inline ExprResult Owned(Expr *E) { return E; }
140   static inline StmtResult Owned(Stmt *S) { return S; }
141 
142   /// Retrieves a reference to the semantic analysis object used for
143   /// this tree transform.
144   Sema &getSema() const { return SemaRef; }
145 
146   /// Whether the transformation should always rebuild AST nodes, even
147   /// if none of the children have changed.
148   ///
149   /// Subclasses may override this function to specify when the transformation
150   /// should rebuild all AST nodes.
151   ///
152   /// We must always rebuild all AST nodes when performing variadic template
153   /// pack expansion, in order to avoid violating the AST invariant that each
154   /// statement node appears at most once in its containing declaration.
155   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
156 
157   /// Whether the transformation is forming an expression or statement that
158   /// replaces the original. In this case, we'll reuse mangling numbers from
159   /// existing lambdas.
160   bool ReplacingOriginal() { return false; }
161 
162   /// Wether CXXConstructExpr can be skipped when they are implicit.
163   /// They will be reconstructed when used if needed.
164   /// This is usefull when the user that cause rebuilding of the
165   /// CXXConstructExpr is outside of the expression at which the TreeTransform
166   /// started.
167   bool AllowSkippingCXXConstructExpr() { return true; }
168 
169   /// Returns the location of the entity being transformed, if that
170   /// information was not available elsewhere in the AST.
171   ///
172   /// By default, returns no source-location information. Subclasses can
173   /// provide an alternative implementation that provides better location
174   /// information.
175   SourceLocation getBaseLocation() { return SourceLocation(); }
176 
177   /// Returns the name of the entity being transformed, if that
178   /// information was not available elsewhere in the AST.
179   ///
180   /// By default, returns an empty name. Subclasses can provide an alternative
181   /// implementation with a more precise name.
182   DeclarationName getBaseEntity() { return DeclarationName(); }
183 
184   /// Sets the "base" location and entity when that
185   /// information is known based on another transformation.
186   ///
187   /// By default, the source location and entity are ignored. Subclasses can
188   /// override this function to provide a customized implementation.
189   void setBase(SourceLocation Loc, DeclarationName Entity) { }
190 
191   /// RAII object that temporarily sets the base location and entity
192   /// used for reporting diagnostics in types.
193   class TemporaryBase {
194     TreeTransform &Self;
195     SourceLocation OldLocation;
196     DeclarationName OldEntity;
197 
198   public:
199     TemporaryBase(TreeTransform &Self, SourceLocation Location,
200                   DeclarationName Entity) : Self(Self) {
201       OldLocation = Self.getDerived().getBaseLocation();
202       OldEntity = Self.getDerived().getBaseEntity();
203 
204       if (Location.isValid())
205         Self.getDerived().setBase(Location, Entity);
206     }
207 
208     ~TemporaryBase() {
209       Self.getDerived().setBase(OldLocation, OldEntity);
210     }
211   };
212 
213   /// Determine whether the given type \p T has already been
214   /// transformed.
215   ///
216   /// Subclasses can provide an alternative implementation of this routine
217   /// to short-circuit evaluation when it is known that a given type will
218   /// not change. For example, template instantiation need not traverse
219   /// non-dependent types.
220   bool AlreadyTransformed(QualType T) {
221     return T.isNull();
222   }
223 
224   /// Transform a template parameter depth level.
225   ///
226   /// During a transformation that transforms template parameters, this maps
227   /// an old template parameter depth to a new depth.
228   unsigned TransformTemplateDepth(unsigned Depth) {
229     return Depth;
230   }
231 
232   /// Determine whether the given call argument should be dropped, e.g.,
233   /// because it is a default argument.
234   ///
235   /// Subclasses can provide an alternative implementation of this routine to
236   /// determine which kinds of call arguments get dropped. By default,
237   /// CXXDefaultArgument nodes are dropped (prior to transformation).
238   bool DropCallArgument(Expr *E) {
239     return E->isDefaultArgument();
240   }
241 
242   /// Determine whether we should expand a pack expansion with the
243   /// given set of parameter packs into separate arguments by repeatedly
244   /// transforming the pattern.
245   ///
246   /// By default, the transformer never tries to expand pack expansions.
247   /// Subclasses can override this routine to provide different behavior.
248   ///
249   /// \param EllipsisLoc The location of the ellipsis that identifies the
250   /// pack expansion.
251   ///
252   /// \param PatternRange The source range that covers the entire pattern of
253   /// the pack expansion.
254   ///
255   /// \param Unexpanded The set of unexpanded parameter packs within the
256   /// pattern.
257   ///
258   /// \param ShouldExpand Will be set to \c true if the transformer should
259   /// expand the corresponding pack expansions into separate arguments. When
260   /// set, \c NumExpansions must also be set.
261   ///
262   /// \param RetainExpansion Whether the caller should add an unexpanded
263   /// pack expansion after all of the expanded arguments. This is used
264   /// when extending explicitly-specified template argument packs per
265   /// C++0x [temp.arg.explicit]p9.
266   ///
267   /// \param NumExpansions The number of separate arguments that will be in
268   /// the expanded form of the corresponding pack expansion. This is both an
269   /// input and an output parameter, which can be set by the caller if the
270   /// number of expansions is known a priori (e.g., due to a prior substitution)
271   /// and will be set by the callee when the number of expansions is known.
272   /// The callee must set this value when \c ShouldExpand is \c true; it may
273   /// set this value in other cases.
274   ///
275   /// \returns true if an error occurred (e.g., because the parameter packs
276   /// are to be instantiated with arguments of different lengths), false
277   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
278   /// must be set.
279   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
280                                SourceRange PatternRange,
281                                ArrayRef<UnexpandedParameterPack> Unexpanded,
282                                bool &ShouldExpand,
283                                bool &RetainExpansion,
284                                Optional<unsigned> &NumExpansions) {
285     ShouldExpand = false;
286     return false;
287   }
288 
289   /// "Forget" about the partially-substituted pack template argument,
290   /// when performing an instantiation that must preserve the parameter pack
291   /// use.
292   ///
293   /// This routine is meant to be overridden by the template instantiator.
294   TemplateArgument ForgetPartiallySubstitutedPack() {
295     return TemplateArgument();
296   }
297 
298   /// "Remember" the partially-substituted pack template argument
299   /// after performing an instantiation that must preserve the parameter pack
300   /// use.
301   ///
302   /// This routine is meant to be overridden by the template instantiator.
303   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
304 
305   /// Note to the derived class when a function parameter pack is
306   /// being expanded.
307   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
308 
309   /// Transforms the given type into another type.
310   ///
311   /// By default, this routine transforms a type by creating a
312   /// TypeSourceInfo for it and delegating to the appropriate
313   /// function.  This is expensive, but we don't mind, because
314   /// this method is deprecated anyway;  all users should be
315   /// switched to storing TypeSourceInfos.
316   ///
317   /// \returns the transformed type.
318   QualType TransformType(QualType T);
319 
320   /// Transforms the given type-with-location into a new
321   /// type-with-location.
322   ///
323   /// By default, this routine transforms a type by delegating to the
324   /// appropriate TransformXXXType to build a new type.  Subclasses
325   /// may override this function (to take over all type
326   /// transformations) or some set of the TransformXXXType functions
327   /// to alter the transformation.
328   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
329 
330   /// Transform the given type-with-location into a new
331   /// type, collecting location information in the given builder
332   /// as necessary.
333   ///
334   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
335 
336   /// Transform a type that is permitted to produce a
337   /// DeducedTemplateSpecializationType.
338   ///
339   /// This is used in the (relatively rare) contexts where it is acceptable
340   /// for transformation to produce a class template type with deduced
341   /// template arguments.
342   /// @{
343   QualType TransformTypeWithDeducedTST(QualType T);
344   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
345   /// @}
346 
347   /// The reason why the value of a statement is not discarded, if any.
348   enum StmtDiscardKind {
349     SDK_Discarded,
350     SDK_NotDiscarded,
351     SDK_StmtExprResult,
352   };
353 
354   /// Transform the given statement.
355   ///
356   /// By default, this routine transforms a statement by delegating to the
357   /// appropriate TransformXXXStmt function to transform a specific kind of
358   /// statement or the TransformExpr() function to transform an expression.
359   /// Subclasses may override this function to transform statements using some
360   /// other mechanism.
361   ///
362   /// \returns the transformed statement.
363   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
364 
365   /// Transform the given statement.
366   ///
367   /// By default, this routine transforms a statement by delegating to the
368   /// appropriate TransformOMPXXXClause function to transform a specific kind
369   /// of clause. Subclasses may override this function to transform statements
370   /// using some other mechanism.
371   ///
372   /// \returns the transformed OpenMP clause.
373   OMPClause *TransformOMPClause(OMPClause *S);
374 
375   /// Transform the given attribute.
376   ///
377   /// By default, this routine transforms a statement by delegating to the
378   /// appropriate TransformXXXAttr function to transform a specific kind
379   /// of attribute. Subclasses may override this function to transform
380   /// attributed statements using some other mechanism.
381   ///
382   /// \returns the transformed attribute
383   const Attr *TransformAttr(const Attr *S);
384 
385 /// Transform the specified attribute.
386 ///
387 /// Subclasses should override the transformation of attributes with a pragma
388 /// spelling to transform expressions stored within the attribute.
389 ///
390 /// \returns the transformed attribute.
391 #define ATTR(X)
392 #define PRAGMA_SPELLING_ATTR(X)                                                \
393   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
394 #include "clang/Basic/AttrList.inc"
395 
396   /// Transform the given expression.
397   ///
398   /// By default, this routine transforms an expression by delegating to the
399   /// appropriate TransformXXXExpr function to build a new expression.
400   /// Subclasses may override this function to transform expressions using some
401   /// other mechanism.
402   ///
403   /// \returns the transformed expression.
404   ExprResult TransformExpr(Expr *E);
405 
406   /// Transform the given initializer.
407   ///
408   /// By default, this routine transforms an initializer by stripping off the
409   /// semantic nodes added by initialization, then passing the result to
410   /// TransformExpr or TransformExprs.
411   ///
412   /// \returns the transformed initializer.
413   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
414 
415   /// Transform the given list of expressions.
416   ///
417   /// This routine transforms a list of expressions by invoking
418   /// \c TransformExpr() for each subexpression. However, it also provides
419   /// support for variadic templates by expanding any pack expansions (if the
420   /// derived class permits such expansion) along the way. When pack expansions
421   /// are present, the number of outputs may not equal the number of inputs.
422   ///
423   /// \param Inputs The set of expressions to be transformed.
424   ///
425   /// \param NumInputs The number of expressions in \c Inputs.
426   ///
427   /// \param IsCall If \c true, then this transform is being performed on
428   /// function-call arguments, and any arguments that should be dropped, will
429   /// be.
430   ///
431   /// \param Outputs The transformed input expressions will be added to this
432   /// vector.
433   ///
434   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
435   /// due to transformation.
436   ///
437   /// \returns true if an error occurred, false otherwise.
438   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
439                       SmallVectorImpl<Expr *> &Outputs,
440                       bool *ArgChanged = nullptr);
441 
442   /// Transform the given declaration, which is referenced from a type
443   /// or expression.
444   ///
445   /// By default, acts as the identity function on declarations, unless the
446   /// transformer has had to transform the declaration itself. Subclasses
447   /// may override this function to provide alternate behavior.
448   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
449     llvm::DenseMap<Decl *, Decl *>::iterator Known
450       = TransformedLocalDecls.find(D);
451     if (Known != TransformedLocalDecls.end())
452       return Known->second;
453 
454     return D;
455   }
456 
457   /// Transform the specified condition.
458   ///
459   /// By default, this transforms the variable and expression and rebuilds
460   /// the condition.
461   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
462                                            Expr *Expr,
463                                            Sema::ConditionKind Kind);
464 
465   /// Transform the attributes associated with the given declaration and
466   /// place them on the new declaration.
467   ///
468   /// By default, this operation does nothing. Subclasses may override this
469   /// behavior to transform attributes.
470   void transformAttrs(Decl *Old, Decl *New) { }
471 
472   /// Note that a local declaration has been transformed by this
473   /// transformer.
474   ///
475   /// Local declarations are typically transformed via a call to
476   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
477   /// the transformer itself has to transform the declarations. This routine
478   /// can be overridden by a subclass that keeps track of such mappings.
479   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
480     assert(New.size() == 1 &&
481            "must override transformedLocalDecl if performing pack expansion");
482     TransformedLocalDecls[Old] = New.front();
483   }
484 
485   /// Transform the definition of the given declaration.
486   ///
487   /// By default, invokes TransformDecl() to transform the declaration.
488   /// Subclasses may override this function to provide alternate behavior.
489   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
490     return getDerived().TransformDecl(Loc, D);
491   }
492 
493   /// Transform the given declaration, which was the first part of a
494   /// nested-name-specifier in a member access expression.
495   ///
496   /// This specific declaration transformation only applies to the first
497   /// identifier in a nested-name-specifier of a member access expression, e.g.,
498   /// the \c T in \c x->T::member
499   ///
500   /// By default, invokes TransformDecl() to transform the declaration.
501   /// Subclasses may override this function to provide alternate behavior.
502   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
503     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
504   }
505 
506   /// Transform the set of declarations in an OverloadExpr.
507   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
508                                   LookupResult &R);
509 
510   /// Transform the given nested-name-specifier with source-location
511   /// information.
512   ///
513   /// By default, transforms all of the types and declarations within the
514   /// nested-name-specifier. Subclasses may override this function to provide
515   /// alternate behavior.
516   NestedNameSpecifierLoc
517   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
518                                   QualType ObjectType = QualType(),
519                                   NamedDecl *FirstQualifierInScope = nullptr);
520 
521   /// Transform the given declaration name.
522   ///
523   /// By default, transforms the types of conversion function, constructor,
524   /// and destructor names and then (if needed) rebuilds the declaration name.
525   /// Identifiers and selectors are returned unmodified. Sublcasses may
526   /// override this function to provide alternate behavior.
527   DeclarationNameInfo
528   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
529 
530   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
531       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
532   concepts::TypeRequirement *
533   TransformTypeRequirement(concepts::TypeRequirement *Req);
534   concepts::ExprRequirement *
535   TransformExprRequirement(concepts::ExprRequirement *Req);
536   concepts::NestedRequirement *
537   TransformNestedRequirement(concepts::NestedRequirement *Req);
538 
539   /// Transform the given template name.
540   ///
541   /// \param SS The nested-name-specifier that qualifies the template
542   /// name. This nested-name-specifier must already have been transformed.
543   ///
544   /// \param Name The template name to transform.
545   ///
546   /// \param NameLoc The source location of the template name.
547   ///
548   /// \param ObjectType If we're translating a template name within a member
549   /// access expression, this is the type of the object whose member template
550   /// is being referenced.
551   ///
552   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
553   /// also refers to a name within the current (lexical) scope, this is the
554   /// declaration it refers to.
555   ///
556   /// By default, transforms the template name by transforming the declarations
557   /// and nested-name-specifiers that occur within the template name.
558   /// Subclasses may override this function to provide alternate behavior.
559   TemplateName
560   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
561                         SourceLocation NameLoc,
562                         QualType ObjectType = QualType(),
563                         NamedDecl *FirstQualifierInScope = nullptr,
564                         bool AllowInjectedClassName = false);
565 
566   /// Transform the given template argument.
567   ///
568   /// By default, this operation transforms the type, expression, or
569   /// declaration stored within the template argument and constructs a
570   /// new template argument from the transformed result. Subclasses may
571   /// override this function to provide alternate behavior.
572   ///
573   /// Returns true if there was an error.
574   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
575                                  TemplateArgumentLoc &Output,
576                                  bool Uneval = false);
577 
578   /// Transform the given set of template arguments.
579   ///
580   /// By default, this operation transforms all of the template arguments
581   /// in the input set using \c TransformTemplateArgument(), and appends
582   /// the transformed arguments to the output list.
583   ///
584   /// Note that this overload of \c TransformTemplateArguments() is merely
585   /// a convenience function. Subclasses that wish to override this behavior
586   /// should override the iterator-based member template version.
587   ///
588   /// \param Inputs The set of template arguments to be transformed.
589   ///
590   /// \param NumInputs The number of template arguments in \p Inputs.
591   ///
592   /// \param Outputs The set of transformed template arguments output by this
593   /// routine.
594   ///
595   /// Returns true if an error occurred.
596   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
597                                   unsigned NumInputs,
598                                   TemplateArgumentListInfo &Outputs,
599                                   bool Uneval = false) {
600     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
601                                       Uneval);
602   }
603 
604   /// Transform the given set of template arguments.
605   ///
606   /// By default, this operation transforms all of the template arguments
607   /// in the input set using \c TransformTemplateArgument(), and appends
608   /// the transformed arguments to the output list.
609   ///
610   /// \param First An iterator to the first template argument.
611   ///
612   /// \param Last An iterator one step past the last template argument.
613   ///
614   /// \param Outputs The set of transformed template arguments output by this
615   /// routine.
616   ///
617   /// Returns true if an error occurred.
618   template<typename InputIterator>
619   bool TransformTemplateArguments(InputIterator First,
620                                   InputIterator Last,
621                                   TemplateArgumentListInfo &Outputs,
622                                   bool Uneval = false);
623 
624   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
625   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
626                                  TemplateArgumentLoc &ArgLoc);
627 
628   /// Fakes up a TypeSourceInfo for a type.
629   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
630     return SemaRef.Context.getTrivialTypeSourceInfo(T,
631                        getDerived().getBaseLocation());
632   }
633 
634 #define ABSTRACT_TYPELOC(CLASS, PARENT)
635 #define TYPELOC(CLASS, PARENT)                                   \
636   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
637 #include "clang/AST/TypeLocNodes.def"
638 
639   template<typename Fn>
640   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
641                                       FunctionProtoTypeLoc TL,
642                                       CXXRecordDecl *ThisContext,
643                                       Qualifiers ThisTypeQuals,
644                                       Fn TransformExceptionSpec);
645 
646   bool TransformExceptionSpec(SourceLocation Loc,
647                               FunctionProtoType::ExceptionSpecInfo &ESI,
648                               SmallVectorImpl<QualType> &Exceptions,
649                               bool &Changed);
650 
651   StmtResult TransformSEHHandler(Stmt *Handler);
652 
653   QualType
654   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
655                                       TemplateSpecializationTypeLoc TL,
656                                       TemplateName Template);
657 
658   QualType
659   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
660                                       DependentTemplateSpecializationTypeLoc TL,
661                                                TemplateName Template,
662                                                CXXScopeSpec &SS);
663 
664   QualType TransformDependentTemplateSpecializationType(
665       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
666       NestedNameSpecifierLoc QualifierLoc);
667 
668   /// Transforms the parameters of a function type into the
669   /// given vectors.
670   ///
671   /// The result vectors should be kept in sync; null entries in the
672   /// variables vector are acceptable.
673   ///
674   /// Return true on error.
675   bool TransformFunctionTypeParams(
676       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
677       const QualType *ParamTypes,
678       const FunctionProtoType::ExtParameterInfo *ParamInfos,
679       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
680       Sema::ExtParameterInfoBuilder &PInfos);
681 
682   /// Transforms a single function-type parameter.  Return null
683   /// on error.
684   ///
685   /// \param indexAdjustment - A number to add to the parameter's
686   ///   scope index;  can be negative
687   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
688                                           int indexAdjustment,
689                                           Optional<unsigned> NumExpansions,
690                                           bool ExpectParameterPack);
691 
692   /// Transform the body of a lambda-expression.
693   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
694   /// Alternative implementation of TransformLambdaBody that skips transforming
695   /// the body.
696   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
697 
698   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
699 
700   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
701   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
702 
703   TemplateParameterList *TransformTemplateParameterList(
704         TemplateParameterList *TPL) {
705     return TPL;
706   }
707 
708   ExprResult TransformAddressOfOperand(Expr *E);
709 
710   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
711                                                 bool IsAddressOfOperand,
712                                                 TypeSourceInfo **RecoveryTSI);
713 
714   ExprResult TransformParenDependentScopeDeclRefExpr(
715       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
716       TypeSourceInfo **RecoveryTSI);
717 
718   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
719 
720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
721 // amount of stack usage with clang.
722 #define STMT(Node, Parent)                        \
723   LLVM_ATTRIBUTE_NOINLINE \
724   StmtResult Transform##Node(Node *S);
725 #define VALUESTMT(Node, Parent)                   \
726   LLVM_ATTRIBUTE_NOINLINE \
727   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
728 #define EXPR(Node, Parent)                        \
729   LLVM_ATTRIBUTE_NOINLINE \
730   ExprResult Transform##Node(Node *E);
731 #define ABSTRACT_STMT(Stmt)
732 #include "clang/AST/StmtNodes.inc"
733 
734 #define GEN_CLANG_CLAUSE_CLASS
735 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
736   LLVM_ATTRIBUTE_NOINLINE                                                      \
737   OMPClause *Transform##Class(Class *S);
738 #include "llvm/Frontend/OpenMP/OMP.inc"
739 
740   /// Build a new qualified type given its unqualified type and type location.
741   ///
742   /// By default, this routine adds type qualifiers only to types that can
743   /// have qualifiers, and silently suppresses those qualifiers that are not
744   /// permitted. Subclasses may override this routine to provide different
745   /// behavior.
746   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
747 
748   /// Build a new pointer type given its pointee type.
749   ///
750   /// By default, performs semantic analysis when building the pointer type.
751   /// Subclasses may override this routine to provide different behavior.
752   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
753 
754   /// Build a new block pointer type given its pointee type.
755   ///
756   /// By default, performs semantic analysis when building the block pointer
757   /// type. Subclasses may override this routine to provide different behavior.
758   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
759 
760   /// Build a new reference type given the type it references.
761   ///
762   /// By default, performs semantic analysis when building the
763   /// reference type. Subclasses may override this routine to provide
764   /// different behavior.
765   ///
766   /// \param LValue whether the type was written with an lvalue sigil
767   /// or an rvalue sigil.
768   QualType RebuildReferenceType(QualType ReferentType,
769                                 bool LValue,
770                                 SourceLocation Sigil);
771 
772   /// Build a new member pointer type given the pointee type and the
773   /// class type it refers into.
774   ///
775   /// By default, performs semantic analysis when building the member pointer
776   /// type. Subclasses may override this routine to provide different behavior.
777   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
778                                     SourceLocation Sigil);
779 
780   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
781                                     SourceLocation ProtocolLAngleLoc,
782                                     ArrayRef<ObjCProtocolDecl *> Protocols,
783                                     ArrayRef<SourceLocation> ProtocolLocs,
784                                     SourceLocation ProtocolRAngleLoc);
785 
786   /// Build an Objective-C object type.
787   ///
788   /// By default, performs semantic analysis when building the object type.
789   /// Subclasses may override this routine to provide different behavior.
790   QualType RebuildObjCObjectType(QualType BaseType,
791                                  SourceLocation Loc,
792                                  SourceLocation TypeArgsLAngleLoc,
793                                  ArrayRef<TypeSourceInfo *> TypeArgs,
794                                  SourceLocation TypeArgsRAngleLoc,
795                                  SourceLocation ProtocolLAngleLoc,
796                                  ArrayRef<ObjCProtocolDecl *> Protocols,
797                                  ArrayRef<SourceLocation> ProtocolLocs,
798                                  SourceLocation ProtocolRAngleLoc);
799 
800   /// Build a new Objective-C object pointer type given the pointee type.
801   ///
802   /// By default, directly builds the pointer type, with no additional semantic
803   /// analysis.
804   QualType RebuildObjCObjectPointerType(QualType PointeeType,
805                                         SourceLocation Star);
806 
807   /// Build a new array type given the element type, size
808   /// modifier, size of the array (if known), size expression, and index type
809   /// qualifiers.
810   ///
811   /// By default, performs semantic analysis when building the array type.
812   /// Subclasses may override this routine to provide different behavior.
813   /// Also by default, all of the other Rebuild*Array
814   QualType RebuildArrayType(QualType ElementType,
815                             ArrayType::ArraySizeModifier SizeMod,
816                             const llvm::APInt *Size,
817                             Expr *SizeExpr,
818                             unsigned IndexTypeQuals,
819                             SourceRange BracketsRange);
820 
821   /// Build a new constant array type given the element type, size
822   /// modifier, (known) size of the array, and index type qualifiers.
823   ///
824   /// By default, performs semantic analysis when building the array type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildConstantArrayType(QualType ElementType,
827                                     ArrayType::ArraySizeModifier SizeMod,
828                                     const llvm::APInt &Size,
829                                     Expr *SizeExpr,
830                                     unsigned IndexTypeQuals,
831                                     SourceRange BracketsRange);
832 
833   /// Build a new incomplete array type given the element type, size
834   /// modifier, and index type qualifiers.
835   ///
836   /// By default, performs semantic analysis when building the array type.
837   /// Subclasses may override this routine to provide different behavior.
838   QualType RebuildIncompleteArrayType(QualType ElementType,
839                                       ArrayType::ArraySizeModifier SizeMod,
840                                       unsigned IndexTypeQuals,
841                                       SourceRange BracketsRange);
842 
843   /// Build a new variable-length array type given the element type,
844   /// size modifier, size expression, and index type qualifiers.
845   ///
846   /// By default, performs semantic analysis when building the array type.
847   /// Subclasses may override this routine to provide different behavior.
848   QualType RebuildVariableArrayType(QualType ElementType,
849                                     ArrayType::ArraySizeModifier SizeMod,
850                                     Expr *SizeExpr,
851                                     unsigned IndexTypeQuals,
852                                     SourceRange BracketsRange);
853 
854   /// Build a new dependent-sized array type given the element type,
855   /// size modifier, size expression, and index type qualifiers.
856   ///
857   /// By default, performs semantic analysis when building the array type.
858   /// Subclasses may override this routine to provide different behavior.
859   QualType RebuildDependentSizedArrayType(QualType ElementType,
860                                           ArrayType::ArraySizeModifier SizeMod,
861                                           Expr *SizeExpr,
862                                           unsigned IndexTypeQuals,
863                                           SourceRange BracketsRange);
864 
865   /// Build a new vector type given the element type and
866   /// number of elements.
867   ///
868   /// By default, performs semantic analysis when building the vector type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
871                              VectorType::VectorKind VecKind);
872 
873   /// Build a new potentially dependently-sized extended vector type
874   /// given the element type and number of elements.
875   ///
876   /// By default, performs semantic analysis when building the vector type.
877   /// Subclasses may override this routine to provide different behavior.
878   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
879                                            SourceLocation AttributeLoc,
880                                            VectorType::VectorKind);
881 
882   /// Build a new extended vector type given the element type and
883   /// number of elements.
884   ///
885   /// By default, performs semantic analysis when building the vector type.
886   /// Subclasses may override this routine to provide different behavior.
887   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
888                                 SourceLocation AttributeLoc);
889 
890   /// Build a new potentially dependently-sized extended vector type
891   /// given the element type and number of elements.
892   ///
893   /// By default, performs semantic analysis when building the vector type.
894   /// Subclasses may override this routine to provide different behavior.
895   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
896                                               Expr *SizeExpr,
897                                               SourceLocation AttributeLoc);
898 
899   /// Build a new matrix type given the element type and dimensions.
900   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
901                                      unsigned NumColumns);
902 
903   /// Build a new matrix type given the type and dependently-defined
904   /// dimensions.
905   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
906                                            Expr *ColumnExpr,
907                                            SourceLocation AttributeLoc);
908 
909   /// Build a new DependentAddressSpaceType or return the pointee
910   /// type variable with the correct address space (retrieved from
911   /// AddrSpaceExpr) applied to it. The former will be returned in cases
912   /// where the address space remains dependent.
913   ///
914   /// By default, performs semantic analysis when building the type with address
915   /// space applied. Subclasses may override this routine to provide different
916   /// behavior.
917   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
918                                             Expr *AddrSpaceExpr,
919                                             SourceLocation AttributeLoc);
920 
921   /// Build a new function type.
922   ///
923   /// By default, performs semantic analysis when building the function type.
924   /// Subclasses may override this routine to provide different behavior.
925   QualType RebuildFunctionProtoType(QualType T,
926                                     MutableArrayRef<QualType> ParamTypes,
927                                     const FunctionProtoType::ExtProtoInfo &EPI);
928 
929   /// Build a new unprototyped function type.
930   QualType RebuildFunctionNoProtoType(QualType ResultType);
931 
932   /// Rebuild an unresolved typename type, given the decl that
933   /// the UnresolvedUsingTypenameDecl was transformed to.
934   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
935 
936   /// Build a new typedef type.
937   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
938     return SemaRef.Context.getTypeDeclType(Typedef);
939   }
940 
941   /// Build a new MacroDefined type.
942   QualType RebuildMacroQualifiedType(QualType T,
943                                      const IdentifierInfo *MacroII) {
944     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
945   }
946 
947   /// Build a new class/struct/union type.
948   QualType RebuildRecordType(RecordDecl *Record) {
949     return SemaRef.Context.getTypeDeclType(Record);
950   }
951 
952   /// Build a new Enum type.
953   QualType RebuildEnumType(EnumDecl *Enum) {
954     return SemaRef.Context.getTypeDeclType(Enum);
955   }
956 
957   /// Build a new typeof(expr) type.
958   ///
959   /// By default, performs semantic analysis when building the typeof type.
960   /// Subclasses may override this routine to provide different behavior.
961   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
962 
963   /// Build a new typeof(type) type.
964   ///
965   /// By default, builds a new TypeOfType with the given underlying type.
966   QualType RebuildTypeOfType(QualType Underlying);
967 
968   /// Build a new unary transform type.
969   QualType RebuildUnaryTransformType(QualType BaseType,
970                                      UnaryTransformType::UTTKind UKind,
971                                      SourceLocation Loc);
972 
973   /// Build a new C++11 decltype type.
974   ///
975   /// By default, performs semantic analysis when building the decltype type.
976   /// Subclasses may override this routine to provide different behavior.
977   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
978 
979   /// Build a new C++11 auto type.
980   ///
981   /// By default, builds a new AutoType with the given deduced type.
982   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
983                            ConceptDecl *TypeConstraintConcept,
984                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
985     // Note, IsDependent is always false here: we implicitly convert an 'auto'
986     // which has been deduced to a dependent type into an undeduced 'auto', so
987     // that we'll retry deduction after the transformation.
988     return SemaRef.Context.getAutoType(Deduced, Keyword,
989                                        /*IsDependent*/ false, /*IsPack=*/false,
990                                        TypeConstraintConcept,
991                                        TypeConstraintArgs);
992   }
993 
994   /// By default, builds a new DeducedTemplateSpecializationType with the given
995   /// deduced type.
996   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
997       QualType Deduced) {
998     return SemaRef.Context.getDeducedTemplateSpecializationType(
999         Template, Deduced, /*IsDependent*/ false);
1000   }
1001 
1002   /// Build a new template specialization type.
1003   ///
1004   /// By default, performs semantic analysis when building the template
1005   /// specialization type. Subclasses may override this routine to provide
1006   /// different behavior.
1007   QualType RebuildTemplateSpecializationType(TemplateName Template,
1008                                              SourceLocation TemplateLoc,
1009                                              TemplateArgumentListInfo &Args);
1010 
1011   /// Build a new parenthesized type.
1012   ///
1013   /// By default, builds a new ParenType type from the inner type.
1014   /// Subclasses may override this routine to provide different behavior.
1015   QualType RebuildParenType(QualType InnerType) {
1016     return SemaRef.BuildParenType(InnerType);
1017   }
1018 
1019   /// Build a new qualified name type.
1020   ///
1021   /// By default, builds a new ElaboratedType type from the keyword,
1022   /// the nested-name-specifier and the named type.
1023   /// Subclasses may override this routine to provide different behavior.
1024   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1025                                  ElaboratedTypeKeyword Keyword,
1026                                  NestedNameSpecifierLoc QualifierLoc,
1027                                  QualType Named) {
1028     return SemaRef.Context.getElaboratedType(Keyword,
1029                                          QualifierLoc.getNestedNameSpecifier(),
1030                                              Named);
1031   }
1032 
1033   /// Build a new typename type that refers to a template-id.
1034   ///
1035   /// By default, builds a new DependentNameType type from the
1036   /// nested-name-specifier and the given type. Subclasses may override
1037   /// this routine to provide different behavior.
1038   QualType RebuildDependentTemplateSpecializationType(
1039                                           ElaboratedTypeKeyword Keyword,
1040                                           NestedNameSpecifierLoc QualifierLoc,
1041                                           SourceLocation TemplateKWLoc,
1042                                           const IdentifierInfo *Name,
1043                                           SourceLocation NameLoc,
1044                                           TemplateArgumentListInfo &Args,
1045                                           bool AllowInjectedClassName) {
1046     // Rebuild the template name.
1047     // TODO: avoid TemplateName abstraction
1048     CXXScopeSpec SS;
1049     SS.Adopt(QualifierLoc);
1050     TemplateName InstName = getDerived().RebuildTemplateName(
1051         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1052         AllowInjectedClassName);
1053 
1054     if (InstName.isNull())
1055       return QualType();
1056 
1057     // If it's still dependent, make a dependent specialization.
1058     if (InstName.getAsDependentTemplateName())
1059       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1060                                           QualifierLoc.getNestedNameSpecifier(),
1061                                                                     Name,
1062                                                                     Args);
1063 
1064     // Otherwise, make an elaborated type wrapping a non-dependent
1065     // specialization.
1066     QualType T =
1067     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1068     if (T.isNull()) return QualType();
1069 
1070     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1071       return T;
1072 
1073     return SemaRef.Context.getElaboratedType(Keyword,
1074                                        QualifierLoc.getNestedNameSpecifier(),
1075                                              T);
1076   }
1077 
1078   /// Build a new typename type that refers to an identifier.
1079   ///
1080   /// By default, performs semantic analysis when building the typename type
1081   /// (or elaborated type). Subclasses may override this routine to provide
1082   /// different behavior.
1083   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1084                                     SourceLocation KeywordLoc,
1085                                     NestedNameSpecifierLoc QualifierLoc,
1086                                     const IdentifierInfo *Id,
1087                                     SourceLocation IdLoc,
1088                                     bool DeducedTSTContext) {
1089     CXXScopeSpec SS;
1090     SS.Adopt(QualifierLoc);
1091 
1092     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1093       // If the name is still dependent, just build a new dependent name type.
1094       if (!SemaRef.computeDeclContext(SS))
1095         return SemaRef.Context.getDependentNameType(Keyword,
1096                                           QualifierLoc.getNestedNameSpecifier(),
1097                                                     Id);
1098     }
1099 
1100     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1101       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1102                                        *Id, IdLoc, DeducedTSTContext);
1103     }
1104 
1105     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1106 
1107     // We had a dependent elaborated-type-specifier that has been transformed
1108     // into a non-dependent elaborated-type-specifier. Find the tag we're
1109     // referring to.
1110     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1111     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1112     if (!DC)
1113       return QualType();
1114 
1115     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1116       return QualType();
1117 
1118     TagDecl *Tag = nullptr;
1119     SemaRef.LookupQualifiedName(Result, DC);
1120     switch (Result.getResultKind()) {
1121       case LookupResult::NotFound:
1122       case LookupResult::NotFoundInCurrentInstantiation:
1123         break;
1124 
1125       case LookupResult::Found:
1126         Tag = Result.getAsSingle<TagDecl>();
1127         break;
1128 
1129       case LookupResult::FoundOverloaded:
1130       case LookupResult::FoundUnresolvedValue:
1131         llvm_unreachable("Tag lookup cannot find non-tags");
1132 
1133       case LookupResult::Ambiguous:
1134         // Let the LookupResult structure handle ambiguities.
1135         return QualType();
1136     }
1137 
1138     if (!Tag) {
1139       // Check where the name exists but isn't a tag type and use that to emit
1140       // better diagnostics.
1141       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1142       SemaRef.LookupQualifiedName(Result, DC);
1143       switch (Result.getResultKind()) {
1144         case LookupResult::Found:
1145         case LookupResult::FoundOverloaded:
1146         case LookupResult::FoundUnresolvedValue: {
1147           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1148           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1149           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1150                                                                << NTK << Kind;
1151           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1152           break;
1153         }
1154         default:
1155           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1156               << Kind << Id << DC << QualifierLoc.getSourceRange();
1157           break;
1158       }
1159       return QualType();
1160     }
1161 
1162     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1163                                               IdLoc, Id)) {
1164       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1165       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1166       return QualType();
1167     }
1168 
1169     // Build the elaborated-type-specifier type.
1170     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1171     return SemaRef.Context.getElaboratedType(Keyword,
1172                                          QualifierLoc.getNestedNameSpecifier(),
1173                                              T);
1174   }
1175 
1176   /// Build a new pack expansion type.
1177   ///
1178   /// By default, builds a new PackExpansionType type from the given pattern.
1179   /// Subclasses may override this routine to provide different behavior.
1180   QualType RebuildPackExpansionType(QualType Pattern,
1181                                     SourceRange PatternRange,
1182                                     SourceLocation EllipsisLoc,
1183                                     Optional<unsigned> NumExpansions) {
1184     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1185                                         NumExpansions);
1186   }
1187 
1188   /// Build a new atomic type given its value type.
1189   ///
1190   /// By default, performs semantic analysis when building the atomic type.
1191   /// Subclasses may override this routine to provide different behavior.
1192   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1193 
1194   /// Build a new pipe type given its value type.
1195   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1196                            bool isReadPipe);
1197 
1198    /// Build an extended int given its value type.
1199   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1200                              SourceLocation Loc);
1201 
1202   /// Build a dependent extended int given its value type.
1203   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1204                                       SourceLocation Loc);
1205 
1206   /// Build a new template name given a nested name specifier, a flag
1207   /// indicating whether the "template" keyword was provided, and the template
1208   /// that the template name refers to.
1209   ///
1210   /// By default, builds the new template name directly. Subclasses may override
1211   /// this routine to provide different behavior.
1212   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1213                                    bool TemplateKW,
1214                                    TemplateDecl *Template);
1215 
1216   /// Build a new template name given a nested name specifier and the
1217   /// name that is referred to as a template.
1218   ///
1219   /// By default, performs semantic analysis to determine whether the name can
1220   /// be resolved to a specific template, then builds the appropriate kind of
1221   /// template name. Subclasses may override this routine to provide different
1222   /// behavior.
1223   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1224                                    SourceLocation TemplateKWLoc,
1225                                    const IdentifierInfo &Name,
1226                                    SourceLocation NameLoc, QualType ObjectType,
1227                                    NamedDecl *FirstQualifierInScope,
1228                                    bool AllowInjectedClassName);
1229 
1230   /// Build a new template name given a nested name specifier and the
1231   /// overloaded operator name that is referred to as a template.
1232   ///
1233   /// By default, performs semantic analysis to determine whether the name can
1234   /// be resolved to a specific template, then builds the appropriate kind of
1235   /// template name. Subclasses may override this routine to provide different
1236   /// behavior.
1237   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1238                                    SourceLocation TemplateKWLoc,
1239                                    OverloadedOperatorKind Operator,
1240                                    SourceLocation NameLoc, QualType ObjectType,
1241                                    bool AllowInjectedClassName);
1242 
1243   /// Build a new template name given a template template parameter pack
1244   /// and the
1245   ///
1246   /// By default, performs semantic analysis to determine whether the name can
1247   /// be resolved to a specific template, then builds the appropriate kind of
1248   /// template name. Subclasses may override this routine to provide different
1249   /// behavior.
1250   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1251                                    const TemplateArgument &ArgPack) {
1252     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1253   }
1254 
1255   /// Build a new compound statement.
1256   ///
1257   /// By default, performs semantic analysis to build the new statement.
1258   /// Subclasses may override this routine to provide different behavior.
1259   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1260                                        MultiStmtArg Statements,
1261                                        SourceLocation RBraceLoc,
1262                                        bool IsStmtExpr) {
1263     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1264                                        IsStmtExpr);
1265   }
1266 
1267   /// Build a new case statement.
1268   ///
1269   /// By default, performs semantic analysis to build the new statement.
1270   /// Subclasses may override this routine to provide different behavior.
1271   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1272                                    Expr *LHS,
1273                                    SourceLocation EllipsisLoc,
1274                                    Expr *RHS,
1275                                    SourceLocation ColonLoc) {
1276     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1277                                    ColonLoc);
1278   }
1279 
1280   /// Attach the body to a new case statement.
1281   ///
1282   /// By default, performs semantic analysis to build the new statement.
1283   /// Subclasses may override this routine to provide different behavior.
1284   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1285     getSema().ActOnCaseStmtBody(S, Body);
1286     return S;
1287   }
1288 
1289   /// Build a new default statement.
1290   ///
1291   /// By default, performs semantic analysis to build the new statement.
1292   /// Subclasses may override this routine to provide different behavior.
1293   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1294                                       SourceLocation ColonLoc,
1295                                       Stmt *SubStmt) {
1296     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1297                                       /*CurScope=*/nullptr);
1298   }
1299 
1300   /// Build a new label statement.
1301   ///
1302   /// By default, performs semantic analysis to build the new statement.
1303   /// Subclasses may override this routine to provide different behavior.
1304   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1305                               SourceLocation ColonLoc, Stmt *SubStmt) {
1306     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1307   }
1308 
1309   /// Build a new attributed statement.
1310   ///
1311   /// By default, performs semantic analysis to build the new statement.
1312   /// Subclasses may override this routine to provide different behavior.
1313   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1314                                    ArrayRef<const Attr *> Attrs,
1315                                    Stmt *SubStmt) {
1316     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1317   }
1318 
1319   /// Build a new "if" statement.
1320   ///
1321   /// By default, performs semantic analysis to build the new statement.
1322   /// Subclasses may override this routine to provide different behavior.
1323   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1324                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1325                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1326                            SourceLocation ElseLoc, Stmt *Else) {
1327     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond,
1328                                  RParenLoc, Then, ElseLoc, Else);
1329   }
1330 
1331   /// Start building a new switch statement.
1332   ///
1333   /// By default, performs semantic analysis to build the new statement.
1334   /// Subclasses may override this routine to provide different behavior.
1335   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1336                                     SourceLocation LParenLoc, Stmt *Init,
1337                                     Sema::ConditionResult Cond,
1338                                     SourceLocation RParenLoc) {
1339     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1340                                             RParenLoc);
1341   }
1342 
1343   /// Attach the body to the switch statement.
1344   ///
1345   /// By default, performs semantic analysis to build the new statement.
1346   /// Subclasses may override this routine to provide different behavior.
1347   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1348                                    Stmt *Switch, Stmt *Body) {
1349     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1350   }
1351 
1352   /// Build a new while statement.
1353   ///
1354   /// By default, performs semantic analysis to build the new statement.
1355   /// Subclasses may override this routine to provide different behavior.
1356   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1357                               Sema::ConditionResult Cond,
1358                               SourceLocation RParenLoc, Stmt *Body) {
1359     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1360   }
1361 
1362   /// Build a new do-while statement.
1363   ///
1364   /// By default, performs semantic analysis to build the new statement.
1365   /// Subclasses may override this routine to provide different behavior.
1366   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1367                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1368                            Expr *Cond, SourceLocation RParenLoc) {
1369     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1370                                  Cond, RParenLoc);
1371   }
1372 
1373   /// Build a new for statement.
1374   ///
1375   /// By default, performs semantic analysis to build the new statement.
1376   /// Subclasses may override this routine to provide different behavior.
1377   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1378                             Stmt *Init, Sema::ConditionResult Cond,
1379                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1380                             Stmt *Body) {
1381     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1382                                   Inc, RParenLoc, Body);
1383   }
1384 
1385   /// Build a new goto statement.
1386   ///
1387   /// By default, performs semantic analysis to build the new statement.
1388   /// Subclasses may override this routine to provide different behavior.
1389   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1390                              LabelDecl *Label) {
1391     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1392   }
1393 
1394   /// Build a new indirect goto statement.
1395   ///
1396   /// By default, performs semantic analysis to build the new statement.
1397   /// Subclasses may override this routine to provide different behavior.
1398   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1399                                      SourceLocation StarLoc,
1400                                      Expr *Target) {
1401     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1402   }
1403 
1404   /// Build a new return statement.
1405   ///
1406   /// By default, performs semantic analysis to build the new statement.
1407   /// Subclasses may override this routine to provide different behavior.
1408   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1409     return getSema().BuildReturnStmt(ReturnLoc, Result);
1410   }
1411 
1412   /// Build a new declaration statement.
1413   ///
1414   /// By default, performs semantic analysis to build the new statement.
1415   /// Subclasses may override this routine to provide different behavior.
1416   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1417                              SourceLocation StartLoc, SourceLocation EndLoc) {
1418     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1419     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1420   }
1421 
1422   /// Build a new inline asm statement.
1423   ///
1424   /// By default, performs semantic analysis to build the new statement.
1425   /// Subclasses may override this routine to provide different behavior.
1426   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1427                                bool IsVolatile, unsigned NumOutputs,
1428                                unsigned NumInputs, IdentifierInfo **Names,
1429                                MultiExprArg Constraints, MultiExprArg Exprs,
1430                                Expr *AsmString, MultiExprArg Clobbers,
1431                                unsigned NumLabels,
1432                                SourceLocation RParenLoc) {
1433     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1434                                      NumInputs, Names, Constraints, Exprs,
1435                                      AsmString, Clobbers, NumLabels, RParenLoc);
1436   }
1437 
1438   /// Build a new MS style inline asm statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
1442   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1443                               ArrayRef<Token> AsmToks,
1444                               StringRef AsmString,
1445                               unsigned NumOutputs, unsigned NumInputs,
1446                               ArrayRef<StringRef> Constraints,
1447                               ArrayRef<StringRef> Clobbers,
1448                               ArrayRef<Expr*> Exprs,
1449                               SourceLocation EndLoc) {
1450     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1451                                     NumOutputs, NumInputs,
1452                                     Constraints, Clobbers, Exprs, EndLoc);
1453   }
1454 
1455   /// Build a new co_return statement.
1456   ///
1457   /// By default, performs semantic analysis to build the new statement.
1458   /// Subclasses may override this routine to provide different behavior.
1459   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1460                                  bool IsImplicit) {
1461     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1462   }
1463 
1464   /// Build a new co_await expression.
1465   ///
1466   /// By default, performs semantic analysis to build the new expression.
1467   /// Subclasses may override this routine to provide different behavior.
1468   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1469                                 bool IsImplicit) {
1470     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1471   }
1472 
1473   /// Build a new co_await expression.
1474   ///
1475   /// By default, performs semantic analysis to build the new expression.
1476   /// Subclasses may override this routine to provide different behavior.
1477   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1478                                          Expr *Result,
1479                                          UnresolvedLookupExpr *Lookup) {
1480     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1481   }
1482 
1483   /// Build a new co_yield expression.
1484   ///
1485   /// By default, performs semantic analysis to build the new expression.
1486   /// Subclasses may override this routine to provide different behavior.
1487   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1488     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1489   }
1490 
1491   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1492     return getSema().BuildCoroutineBodyStmt(Args);
1493   }
1494 
1495   /// Build a new Objective-C \@try statement.
1496   ///
1497   /// By default, performs semantic analysis to build the new statement.
1498   /// Subclasses may override this routine to provide different behavior.
1499   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1500                                         Stmt *TryBody,
1501                                         MultiStmtArg CatchStmts,
1502                                         Stmt *Finally) {
1503     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1504                                         Finally);
1505   }
1506 
1507   /// Rebuild an Objective-C exception declaration.
1508   ///
1509   /// By default, performs semantic analysis to build the new declaration.
1510   /// Subclasses may override this routine to provide different behavior.
1511   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1512                                     TypeSourceInfo *TInfo, QualType T) {
1513     return getSema().BuildObjCExceptionDecl(TInfo, T,
1514                                             ExceptionDecl->getInnerLocStart(),
1515                                             ExceptionDecl->getLocation(),
1516                                             ExceptionDecl->getIdentifier());
1517   }
1518 
1519   /// Build a new Objective-C \@catch statement.
1520   ///
1521   /// By default, performs semantic analysis to build the new statement.
1522   /// Subclasses may override this routine to provide different behavior.
1523   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1524                                           SourceLocation RParenLoc,
1525                                           VarDecl *Var,
1526                                           Stmt *Body) {
1527     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1528                                           Var, Body);
1529   }
1530 
1531   /// Build a new Objective-C \@finally statement.
1532   ///
1533   /// By default, performs semantic analysis to build the new statement.
1534   /// Subclasses may override this routine to provide different behavior.
1535   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1536                                             Stmt *Body) {
1537     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1538   }
1539 
1540   /// Build a new Objective-C \@throw statement.
1541   ///
1542   /// By default, performs semantic analysis to build the new statement.
1543   /// Subclasses may override this routine to provide different behavior.
1544   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1545                                           Expr *Operand) {
1546     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1547   }
1548 
1549   /// Build a new OpenMP Canonical loop.
1550   ///
1551   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1552   /// OMPCanonicalLoop.
1553   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1554     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1555   }
1556 
1557   /// Build a new OpenMP executable directive.
1558   ///
1559   /// By default, performs semantic analysis to build the new statement.
1560   /// Subclasses may override this routine to provide different behavior.
1561   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1562                                            DeclarationNameInfo DirName,
1563                                            OpenMPDirectiveKind CancelRegion,
1564                                            ArrayRef<OMPClause *> Clauses,
1565                                            Stmt *AStmt, SourceLocation StartLoc,
1566                                            SourceLocation EndLoc) {
1567     return getSema().ActOnOpenMPExecutableDirective(
1568         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1569   }
1570 
1571   /// Build a new OpenMP 'if' clause.
1572   ///
1573   /// By default, performs semantic analysis to build the new OpenMP clause.
1574   /// Subclasses may override this routine to provide different behavior.
1575   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1576                                 Expr *Condition, SourceLocation StartLoc,
1577                                 SourceLocation LParenLoc,
1578                                 SourceLocation NameModifierLoc,
1579                                 SourceLocation ColonLoc,
1580                                 SourceLocation EndLoc) {
1581     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1582                                          LParenLoc, NameModifierLoc, ColonLoc,
1583                                          EndLoc);
1584   }
1585 
1586   /// Build a new OpenMP 'final' clause.
1587   ///
1588   /// By default, performs semantic analysis to build the new OpenMP clause.
1589   /// Subclasses may override this routine to provide different behavior.
1590   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1591                                    SourceLocation LParenLoc,
1592                                    SourceLocation EndLoc) {
1593     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1594                                             EndLoc);
1595   }
1596 
1597   /// Build a new OpenMP 'num_threads' clause.
1598   ///
1599   /// By default, performs semantic analysis to build the new OpenMP clause.
1600   /// Subclasses may override this routine to provide different behavior.
1601   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1602                                         SourceLocation StartLoc,
1603                                         SourceLocation LParenLoc,
1604                                         SourceLocation EndLoc) {
1605     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1606                                                  LParenLoc, EndLoc);
1607   }
1608 
1609   /// Build a new OpenMP 'safelen' clause.
1610   ///
1611   /// By default, performs semantic analysis to build the new OpenMP clause.
1612   /// Subclasses may override this routine to provide different behavior.
1613   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1614                                      SourceLocation LParenLoc,
1615                                      SourceLocation EndLoc) {
1616     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1617   }
1618 
1619   /// Build a new OpenMP 'simdlen' clause.
1620   ///
1621   /// By default, performs semantic analysis to build the new OpenMP clause.
1622   /// Subclasses may override this routine to provide different behavior.
1623   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1624                                      SourceLocation LParenLoc,
1625                                      SourceLocation EndLoc) {
1626     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1627   }
1628 
1629   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1630                                    SourceLocation StartLoc,
1631                                    SourceLocation LParenLoc,
1632                                    SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1634   }
1635 
1636   /// Build a new OpenMP 'allocator' clause.
1637   ///
1638   /// By default, performs semantic analysis to build the new OpenMP clause.
1639   /// Subclasses may override this routine to provide different behavior.
1640   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1641                                        SourceLocation LParenLoc,
1642                                        SourceLocation EndLoc) {
1643     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1644   }
1645 
1646   /// Build a new OpenMP 'collapse' clause.
1647   ///
1648   /// By default, performs semantic analysis to build the new OpenMP clause.
1649   /// Subclasses may override this routine to provide different behavior.
1650   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1651                                       SourceLocation LParenLoc,
1652                                       SourceLocation EndLoc) {
1653     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1654                                                EndLoc);
1655   }
1656 
1657   /// Build a new OpenMP 'default' clause.
1658   ///
1659   /// By default, performs semantic analysis to build the new OpenMP clause.
1660   /// Subclasses may override this routine to provide different behavior.
1661   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1662                                      SourceLocation StartLoc,
1663                                      SourceLocation LParenLoc,
1664                                      SourceLocation EndLoc) {
1665     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1666                                               StartLoc, LParenLoc, EndLoc);
1667   }
1668 
1669   /// Build a new OpenMP 'proc_bind' clause.
1670   ///
1671   /// By default, performs semantic analysis to build the new OpenMP clause.
1672   /// Subclasses may override this routine to provide different behavior.
1673   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1674                                       SourceLocation KindKwLoc,
1675                                       SourceLocation StartLoc,
1676                                       SourceLocation LParenLoc,
1677                                       SourceLocation EndLoc) {
1678     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1679                                                StartLoc, LParenLoc, EndLoc);
1680   }
1681 
1682   /// Build a new OpenMP 'schedule' clause.
1683   ///
1684   /// By default, performs semantic analysis to build the new OpenMP clause.
1685   /// Subclasses may override this routine to provide different behavior.
1686   OMPClause *RebuildOMPScheduleClause(
1687       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1688       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1689       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1690       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1691     return getSema().ActOnOpenMPScheduleClause(
1692         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1693         CommaLoc, EndLoc);
1694   }
1695 
1696   /// Build a new OpenMP 'ordered' clause.
1697   ///
1698   /// By default, performs semantic analysis to build the new OpenMP clause.
1699   /// Subclasses may override this routine to provide different behavior.
1700   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1701                                      SourceLocation EndLoc,
1702                                      SourceLocation LParenLoc, Expr *Num) {
1703     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1704   }
1705 
1706   /// Build a new OpenMP 'private' clause.
1707   ///
1708   /// By default, performs semantic analysis to build the new OpenMP clause.
1709   /// Subclasses may override this routine to provide different behavior.
1710   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1711                                      SourceLocation StartLoc,
1712                                      SourceLocation LParenLoc,
1713                                      SourceLocation EndLoc) {
1714     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1715                                               EndLoc);
1716   }
1717 
1718   /// Build a new OpenMP 'firstprivate' clause.
1719   ///
1720   /// By default, performs semantic analysis to build the new OpenMP clause.
1721   /// Subclasses may override this routine to provide different behavior.
1722   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1723                                           SourceLocation StartLoc,
1724                                           SourceLocation LParenLoc,
1725                                           SourceLocation EndLoc) {
1726     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1727                                                    EndLoc);
1728   }
1729 
1730   /// Build a new OpenMP 'lastprivate' clause.
1731   ///
1732   /// By default, performs semantic analysis to build the new OpenMP clause.
1733   /// Subclasses may override this routine to provide different behavior.
1734   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1735                                          OpenMPLastprivateModifier LPKind,
1736                                          SourceLocation LPKindLoc,
1737                                          SourceLocation ColonLoc,
1738                                          SourceLocation StartLoc,
1739                                          SourceLocation LParenLoc,
1740                                          SourceLocation EndLoc) {
1741     return getSema().ActOnOpenMPLastprivateClause(
1742         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1743   }
1744 
1745   /// Build a new OpenMP 'shared' clause.
1746   ///
1747   /// By default, performs semantic analysis to build the new OpenMP clause.
1748   /// Subclasses may override this routine to provide different behavior.
1749   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1750                                     SourceLocation StartLoc,
1751                                     SourceLocation LParenLoc,
1752                                     SourceLocation EndLoc) {
1753     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1754                                              EndLoc);
1755   }
1756 
1757   /// Build a new OpenMP 'reduction' clause.
1758   ///
1759   /// By default, performs semantic analysis to build the new statement.
1760   /// Subclasses may override this routine to provide different behavior.
1761   OMPClause *RebuildOMPReductionClause(
1762       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1763       SourceLocation StartLoc, SourceLocation LParenLoc,
1764       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1765       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1766       const DeclarationNameInfo &ReductionId,
1767       ArrayRef<Expr *> UnresolvedReductions) {
1768     return getSema().ActOnOpenMPReductionClause(
1769         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1770         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1771   }
1772 
1773   /// Build a new OpenMP 'task_reduction' clause.
1774   ///
1775   /// By default, performs semantic analysis to build the new statement.
1776   /// Subclasses may override this routine to provide different behavior.
1777   OMPClause *RebuildOMPTaskReductionClause(
1778       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1779       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1780       CXXScopeSpec &ReductionIdScopeSpec,
1781       const DeclarationNameInfo &ReductionId,
1782       ArrayRef<Expr *> UnresolvedReductions) {
1783     return getSema().ActOnOpenMPTaskReductionClause(
1784         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1785         ReductionId, UnresolvedReductions);
1786   }
1787 
1788   /// Build a new OpenMP 'in_reduction' clause.
1789   ///
1790   /// By default, performs semantic analysis to build the new statement.
1791   /// Subclasses may override this routine to provide different behavior.
1792   OMPClause *
1793   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1794                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1795                               SourceLocation EndLoc,
1796                               CXXScopeSpec &ReductionIdScopeSpec,
1797                               const DeclarationNameInfo &ReductionId,
1798                               ArrayRef<Expr *> UnresolvedReductions) {
1799     return getSema().ActOnOpenMPInReductionClause(
1800         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1801         ReductionId, UnresolvedReductions);
1802   }
1803 
1804   /// Build a new OpenMP 'linear' clause.
1805   ///
1806   /// By default, performs semantic analysis to build the new OpenMP clause.
1807   /// Subclasses may override this routine to provide different behavior.
1808   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1809                                     SourceLocation StartLoc,
1810                                     SourceLocation LParenLoc,
1811                                     OpenMPLinearClauseKind Modifier,
1812                                     SourceLocation ModifierLoc,
1813                                     SourceLocation ColonLoc,
1814                                     SourceLocation EndLoc) {
1815     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1816                                              Modifier, ModifierLoc, ColonLoc,
1817                                              EndLoc);
1818   }
1819 
1820   /// Build a new OpenMP 'aligned' clause.
1821   ///
1822   /// By default, performs semantic analysis to build the new OpenMP clause.
1823   /// Subclasses may override this routine to provide different behavior.
1824   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1825                                      SourceLocation StartLoc,
1826                                      SourceLocation LParenLoc,
1827                                      SourceLocation ColonLoc,
1828                                      SourceLocation EndLoc) {
1829     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1830                                               LParenLoc, ColonLoc, EndLoc);
1831   }
1832 
1833   /// Build a new OpenMP 'copyin' clause.
1834   ///
1835   /// By default, performs semantic analysis to build the new OpenMP clause.
1836   /// Subclasses may override this routine to provide different behavior.
1837   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1838                                     SourceLocation StartLoc,
1839                                     SourceLocation LParenLoc,
1840                                     SourceLocation EndLoc) {
1841     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1842                                              EndLoc);
1843   }
1844 
1845   /// Build a new OpenMP 'copyprivate' clause.
1846   ///
1847   /// By default, performs semantic analysis to build the new OpenMP clause.
1848   /// Subclasses may override this routine to provide different behavior.
1849   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1850                                          SourceLocation StartLoc,
1851                                          SourceLocation LParenLoc,
1852                                          SourceLocation EndLoc) {
1853     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1854                                                   EndLoc);
1855   }
1856 
1857   /// Build a new OpenMP 'flush' pseudo clause.
1858   ///
1859   /// By default, performs semantic analysis to build the new OpenMP clause.
1860   /// Subclasses may override this routine to provide different behavior.
1861   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1862                                    SourceLocation StartLoc,
1863                                    SourceLocation LParenLoc,
1864                                    SourceLocation EndLoc) {
1865     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1866                                             EndLoc);
1867   }
1868 
1869   /// Build a new OpenMP 'depobj' pseudo clause.
1870   ///
1871   /// By default, performs semantic analysis to build the new OpenMP clause.
1872   /// Subclasses may override this routine to provide different behavior.
1873   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1874                                     SourceLocation LParenLoc,
1875                                     SourceLocation EndLoc) {
1876     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1877                                              EndLoc);
1878   }
1879 
1880   /// Build a new OpenMP 'depend' pseudo clause.
1881   ///
1882   /// By default, performs semantic analysis to build the new OpenMP clause.
1883   /// Subclasses may override this routine to provide different behavior.
1884   OMPClause *
1885   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1886                          SourceLocation DepLoc, SourceLocation ColonLoc,
1887                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1888                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1889     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1890                                              ColonLoc, VarList, StartLoc,
1891                                              LParenLoc, EndLoc);
1892   }
1893 
1894   /// Build a new OpenMP 'device' clause.
1895   ///
1896   /// By default, performs semantic analysis to build the new statement.
1897   /// Subclasses may override this routine to provide different behavior.
1898   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1899                                     Expr *Device, SourceLocation StartLoc,
1900                                     SourceLocation LParenLoc,
1901                                     SourceLocation ModifierLoc,
1902                                     SourceLocation EndLoc) {
1903     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1904                                              LParenLoc, ModifierLoc, EndLoc);
1905   }
1906 
1907   /// Build a new OpenMP 'map' clause.
1908   ///
1909   /// By default, performs semantic analysis to build the new OpenMP clause.
1910   /// Subclasses may override this routine to provide different behavior.
1911   OMPClause *RebuildOMPMapClause(
1912       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1913       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1914       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1915       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1916       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1917       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1918     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1919                                           MapperIdScopeSpec, MapperId, MapType,
1920                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1921                                           VarList, Locs, UnresolvedMappers);
1922   }
1923 
1924   /// Build a new OpenMP 'allocate' clause.
1925   ///
1926   /// By default, performs semantic analysis to build the new OpenMP clause.
1927   /// Subclasses may override this routine to provide different behavior.
1928   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1929                                       SourceLocation StartLoc,
1930                                       SourceLocation LParenLoc,
1931                                       SourceLocation ColonLoc,
1932                                       SourceLocation EndLoc) {
1933     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1934                                                LParenLoc, ColonLoc, EndLoc);
1935   }
1936 
1937   /// Build a new OpenMP 'num_teams' clause.
1938   ///
1939   /// By default, performs semantic analysis to build the new statement.
1940   /// Subclasses may override this routine to provide different behavior.
1941   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1942                                       SourceLocation LParenLoc,
1943                                       SourceLocation EndLoc) {
1944     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1945                                                EndLoc);
1946   }
1947 
1948   /// Build a new OpenMP 'thread_limit' clause.
1949   ///
1950   /// By default, performs semantic analysis to build the new statement.
1951   /// Subclasses may override this routine to provide different behavior.
1952   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1953                                          SourceLocation StartLoc,
1954                                          SourceLocation LParenLoc,
1955                                          SourceLocation EndLoc) {
1956     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1957                                                   LParenLoc, EndLoc);
1958   }
1959 
1960   /// Build a new OpenMP 'priority' clause.
1961   ///
1962   /// By default, performs semantic analysis to build the new statement.
1963   /// Subclasses may override this routine to provide different behavior.
1964   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1965                                       SourceLocation LParenLoc,
1966                                       SourceLocation EndLoc) {
1967     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1968                                                EndLoc);
1969   }
1970 
1971   /// Build a new OpenMP 'grainsize' clause.
1972   ///
1973   /// By default, performs semantic analysis to build the new statement.
1974   /// Subclasses may override this routine to provide different behavior.
1975   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1976                                        SourceLocation LParenLoc,
1977                                        SourceLocation EndLoc) {
1978     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1979                                                 EndLoc);
1980   }
1981 
1982   /// Build a new OpenMP 'num_tasks' clause.
1983   ///
1984   /// By default, performs semantic analysis to build the new statement.
1985   /// Subclasses may override this routine to provide different behavior.
1986   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1987                                       SourceLocation LParenLoc,
1988                                       SourceLocation EndLoc) {
1989     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1990                                                EndLoc);
1991   }
1992 
1993   /// Build a new OpenMP 'hint' clause.
1994   ///
1995   /// By default, performs semantic analysis to build the new statement.
1996   /// Subclasses may override this routine to provide different behavior.
1997   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1998                                   SourceLocation LParenLoc,
1999                                   SourceLocation EndLoc) {
2000     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2001   }
2002 
2003   /// Build a new OpenMP 'detach' clause.
2004   ///
2005   /// By default, performs semantic analysis to build the new statement.
2006   /// Subclasses may override this routine to provide different behavior.
2007   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2008                                     SourceLocation LParenLoc,
2009                                     SourceLocation EndLoc) {
2010     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2011   }
2012 
2013   /// Build a new OpenMP 'dist_schedule' clause.
2014   ///
2015   /// By default, performs semantic analysis to build the new OpenMP clause.
2016   /// Subclasses may override this routine to provide different behavior.
2017   OMPClause *
2018   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2019                                Expr *ChunkSize, SourceLocation StartLoc,
2020                                SourceLocation LParenLoc, SourceLocation KindLoc,
2021                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2022     return getSema().ActOnOpenMPDistScheduleClause(
2023         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2024   }
2025 
2026   /// Build a new OpenMP 'to' clause.
2027   ///
2028   /// By default, performs semantic analysis to build the new statement.
2029   /// Subclasses may override this routine to provide different behavior.
2030   OMPClause *
2031   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2032                      ArrayRef<SourceLocation> MotionModifiersLoc,
2033                      CXXScopeSpec &MapperIdScopeSpec,
2034                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2035                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2036                      ArrayRef<Expr *> UnresolvedMappers) {
2037     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2038                                          MapperIdScopeSpec, MapperId, ColonLoc,
2039                                          VarList, Locs, UnresolvedMappers);
2040   }
2041 
2042   /// Build a new OpenMP 'from' clause.
2043   ///
2044   /// By default, performs semantic analysis to build the new statement.
2045   /// Subclasses may override this routine to provide different behavior.
2046   OMPClause *
2047   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2048                        ArrayRef<SourceLocation> MotionModifiersLoc,
2049                        CXXScopeSpec &MapperIdScopeSpec,
2050                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2051                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2052                        ArrayRef<Expr *> UnresolvedMappers) {
2053     return getSema().ActOnOpenMPFromClause(
2054         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2055         ColonLoc, VarList, Locs, UnresolvedMappers);
2056   }
2057 
2058   /// Build a new OpenMP 'use_device_ptr' clause.
2059   ///
2060   /// By default, performs semantic analysis to build the new OpenMP clause.
2061   /// Subclasses may override this routine to provide different behavior.
2062   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2063                                           const OMPVarListLocTy &Locs) {
2064     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2065   }
2066 
2067   /// Build a new OpenMP 'use_device_addr' clause.
2068   ///
2069   /// By default, performs semantic analysis to build the new OpenMP clause.
2070   /// Subclasses may override this routine to provide different behavior.
2071   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2072                                            const OMPVarListLocTy &Locs) {
2073     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2074   }
2075 
2076   /// Build a new OpenMP 'is_device_ptr' clause.
2077   ///
2078   /// By default, performs semantic analysis to build the new OpenMP clause.
2079   /// Subclasses may override this routine to provide different behavior.
2080   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2081                                          const OMPVarListLocTy &Locs) {
2082     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2083   }
2084 
2085   /// Build a new OpenMP 'defaultmap' clause.
2086   ///
2087   /// By default, performs semantic analysis to build the new OpenMP clause.
2088   /// Subclasses may override this routine to provide different behavior.
2089   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2090                                         OpenMPDefaultmapClauseKind Kind,
2091                                         SourceLocation StartLoc,
2092                                         SourceLocation LParenLoc,
2093                                         SourceLocation MLoc,
2094                                         SourceLocation KindLoc,
2095                                         SourceLocation EndLoc) {
2096     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2097                                                  MLoc, KindLoc, EndLoc);
2098   }
2099 
2100   /// Build a new OpenMP 'nontemporal' clause.
2101   ///
2102   /// By default, performs semantic analysis to build the new OpenMP clause.
2103   /// Subclasses may override this routine to provide different behavior.
2104   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2105                                          SourceLocation StartLoc,
2106                                          SourceLocation LParenLoc,
2107                                          SourceLocation EndLoc) {
2108     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2109                                                   EndLoc);
2110   }
2111 
2112   /// Build a new OpenMP 'inclusive' clause.
2113   ///
2114   /// By default, performs semantic analysis to build the new OpenMP clause.
2115   /// Subclasses may override this routine to provide different behavior.
2116   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2117                                        SourceLocation StartLoc,
2118                                        SourceLocation LParenLoc,
2119                                        SourceLocation EndLoc) {
2120     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2121                                                 EndLoc);
2122   }
2123 
2124   /// Build a new OpenMP 'exclusive' clause.
2125   ///
2126   /// By default, performs semantic analysis to build the new OpenMP clause.
2127   /// Subclasses may override this routine to provide different behavior.
2128   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2129                                        SourceLocation StartLoc,
2130                                        SourceLocation LParenLoc,
2131                                        SourceLocation EndLoc) {
2132     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2133                                                 EndLoc);
2134   }
2135 
2136   /// Build a new OpenMP 'uses_allocators' clause.
2137   ///
2138   /// By default, performs semantic analysis to build the new OpenMP clause.
2139   /// Subclasses may override this routine to provide different behavior.
2140   OMPClause *RebuildOMPUsesAllocatorsClause(
2141       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2142       SourceLocation LParenLoc, SourceLocation EndLoc) {
2143     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2144                                                     Data);
2145   }
2146 
2147   /// Build a new OpenMP 'affinity' clause.
2148   ///
2149   /// By default, performs semantic analysis to build the new OpenMP clause.
2150   /// Subclasses may override this routine to provide different behavior.
2151   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2152                                       SourceLocation LParenLoc,
2153                                       SourceLocation ColonLoc,
2154                                       SourceLocation EndLoc, Expr *Modifier,
2155                                       ArrayRef<Expr *> Locators) {
2156     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2157                                                EndLoc, Modifier, Locators);
2158   }
2159 
2160   /// Build a new OpenMP 'order' clause.
2161   ///
2162   /// By default, performs semantic analysis to build the new OpenMP clause.
2163   /// Subclasses may override this routine to provide different behavior.
2164   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2165                                    SourceLocation KindKwLoc,
2166                                    SourceLocation StartLoc,
2167                                    SourceLocation LParenLoc,
2168                                    SourceLocation EndLoc) {
2169     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2170                                             LParenLoc, EndLoc);
2171   }
2172 
2173   /// Build a new OpenMP 'init' clause.
2174   ///
2175   /// By default, performs semantic analysis to build the new OpenMP clause.
2176   /// Subclasses may override this routine to provide different behavior.
2177   OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs,
2178                                   bool IsTarget, bool IsTargetSync,
2179                                   SourceLocation StartLoc,
2180                                   SourceLocation LParenLoc,
2181                                   SourceLocation VarLoc,
2182                                   SourceLocation EndLoc) {
2183     return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget,
2184                                            IsTargetSync, StartLoc, LParenLoc,
2185                                            VarLoc, EndLoc);
2186   }
2187 
2188   /// Build a new OpenMP 'use' clause.
2189   ///
2190   /// By default, performs semantic analysis to build the new OpenMP clause.
2191   /// Subclasses may override this routine to provide different behavior.
2192   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2193                                  SourceLocation LParenLoc,
2194                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2195     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2196                                           VarLoc, EndLoc);
2197   }
2198 
2199   /// Build a new OpenMP 'destroy' clause.
2200   ///
2201   /// By default, performs semantic analysis to build the new OpenMP clause.
2202   /// Subclasses may override this routine to provide different behavior.
2203   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2204                                      SourceLocation LParenLoc,
2205                                      SourceLocation VarLoc,
2206                                      SourceLocation EndLoc) {
2207     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2208                                               VarLoc, EndLoc);
2209   }
2210 
2211   /// Build a new OpenMP 'novariants' clause.
2212   ///
2213   /// By default, performs semantic analysis to build the new OpenMP clause.
2214   /// Subclasses may override this routine to provide different behavior.
2215   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2216                                         SourceLocation StartLoc,
2217                                         SourceLocation LParenLoc,
2218                                         SourceLocation EndLoc) {
2219     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2220                                                  EndLoc);
2221   }
2222 
2223   /// Build a new OpenMP 'nocontext' clause.
2224   ///
2225   /// By default, performs semantic analysis to build the new OpenMP clause.
2226   /// Subclasses may override this routine to provide different behavior.
2227   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2228                                        SourceLocation LParenLoc,
2229                                        SourceLocation EndLoc) {
2230     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2231                                                 EndLoc);
2232   }
2233 
2234   /// Build a new OpenMP 'filter' clause.
2235   ///
2236   /// By default, performs semantic analysis to build the new OpenMP clause.
2237   /// Subclasses may override this routine to provide different behavior.
2238   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2239                                     SourceLocation LParenLoc,
2240                                     SourceLocation EndLoc) {
2241     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2242                                              EndLoc);
2243   }
2244 
2245   /// Rebuild the operand to an Objective-C \@synchronized statement.
2246   ///
2247   /// By default, performs semantic analysis to build the new statement.
2248   /// Subclasses may override this routine to provide different behavior.
2249   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2250                                               Expr *object) {
2251     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2252   }
2253 
2254   /// Build a new Objective-C \@synchronized statement.
2255   ///
2256   /// By default, performs semantic analysis to build the new statement.
2257   /// Subclasses may override this routine to provide different behavior.
2258   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2259                                            Expr *Object, Stmt *Body) {
2260     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2261   }
2262 
2263   /// Build a new Objective-C \@autoreleasepool statement.
2264   ///
2265   /// By default, performs semantic analysis to build the new statement.
2266   /// Subclasses may override this routine to provide different behavior.
2267   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2268                                             Stmt *Body) {
2269     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2270   }
2271 
2272   /// Build a new Objective-C fast enumeration statement.
2273   ///
2274   /// By default, performs semantic analysis to build the new statement.
2275   /// Subclasses may override this routine to provide different behavior.
2276   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2277                                           Stmt *Element,
2278                                           Expr *Collection,
2279                                           SourceLocation RParenLoc,
2280                                           Stmt *Body) {
2281     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2282                                                 Element,
2283                                                 Collection,
2284                                                 RParenLoc);
2285     if (ForEachStmt.isInvalid())
2286       return StmtError();
2287 
2288     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2289   }
2290 
2291   /// Build a new C++ exception declaration.
2292   ///
2293   /// By default, performs semantic analysis to build the new decaration.
2294   /// Subclasses may override this routine to provide different behavior.
2295   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2296                                 TypeSourceInfo *Declarator,
2297                                 SourceLocation StartLoc,
2298                                 SourceLocation IdLoc,
2299                                 IdentifierInfo *Id) {
2300     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2301                                                        StartLoc, IdLoc, Id);
2302     if (Var)
2303       getSema().CurContext->addDecl(Var);
2304     return Var;
2305   }
2306 
2307   /// Build a new C++ catch statement.
2308   ///
2309   /// By default, performs semantic analysis to build the new statement.
2310   /// Subclasses may override this routine to provide different behavior.
2311   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2312                                  VarDecl *ExceptionDecl,
2313                                  Stmt *Handler) {
2314     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2315                                                       Handler));
2316   }
2317 
2318   /// Build a new C++ try statement.
2319   ///
2320   /// By default, performs semantic analysis to build the new statement.
2321   /// Subclasses may override this routine to provide different behavior.
2322   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2323                                ArrayRef<Stmt *> Handlers) {
2324     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2325   }
2326 
2327   /// Build a new C++0x range-based for statement.
2328   ///
2329   /// By default, performs semantic analysis to build the new statement.
2330   /// Subclasses may override this routine to provide different behavior.
2331   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2332                                     SourceLocation CoawaitLoc, Stmt *Init,
2333                                     SourceLocation ColonLoc, Stmt *Range,
2334                                     Stmt *Begin, Stmt *End, Expr *Cond,
2335                                     Expr *Inc, Stmt *LoopVar,
2336                                     SourceLocation RParenLoc) {
2337     // If we've just learned that the range is actually an Objective-C
2338     // collection, treat this as an Objective-C fast enumeration loop.
2339     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2340       if (RangeStmt->isSingleDecl()) {
2341         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2342           if (RangeVar->isInvalidDecl())
2343             return StmtError();
2344 
2345           Expr *RangeExpr = RangeVar->getInit();
2346           if (!RangeExpr->isTypeDependent() &&
2347               RangeExpr->getType()->isObjCObjectPointerType()) {
2348             // FIXME: Support init-statements in Objective-C++20 ranged for
2349             // statement.
2350             if (Init) {
2351               return SemaRef.Diag(Init->getBeginLoc(),
2352                                   diag::err_objc_for_range_init_stmt)
2353                          << Init->getSourceRange();
2354             }
2355             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2356                                                         RangeExpr, RParenLoc);
2357           }
2358         }
2359       }
2360     }
2361 
2362     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2363                                           Range, Begin, End, Cond, Inc, LoopVar,
2364                                           RParenLoc, Sema::BFRK_Rebuild);
2365   }
2366 
2367   /// Build a new C++0x range-based for statement.
2368   ///
2369   /// By default, performs semantic analysis to build the new statement.
2370   /// Subclasses may override this routine to provide different behavior.
2371   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2372                                           bool IsIfExists,
2373                                           NestedNameSpecifierLoc QualifierLoc,
2374                                           DeclarationNameInfo NameInfo,
2375                                           Stmt *Nested) {
2376     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2377                                                 QualifierLoc, NameInfo, Nested);
2378   }
2379 
2380   /// Attach body to a C++0x range-based for statement.
2381   ///
2382   /// By default, performs semantic analysis to finish the new statement.
2383   /// Subclasses may override this routine to provide different behavior.
2384   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2385     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2386   }
2387 
2388   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2389                                Stmt *TryBlock, Stmt *Handler) {
2390     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2391   }
2392 
2393   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2394                                   Stmt *Block) {
2395     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2396   }
2397 
2398   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2399     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2400   }
2401 
2402   /// Build a new predefined expression.
2403   ///
2404   /// By default, performs semantic analysis to build the new expression.
2405   /// Subclasses may override this routine to provide different behavior.
2406   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2407                                    PredefinedExpr::IdentKind IK) {
2408     return getSema().BuildPredefinedExpr(Loc, IK);
2409   }
2410 
2411   /// Build a new expression that references a declaration.
2412   ///
2413   /// By default, performs semantic analysis to build the new expression.
2414   /// Subclasses may override this routine to provide different behavior.
2415   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2416                                         LookupResult &R,
2417                                         bool RequiresADL) {
2418     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2419   }
2420 
2421 
2422   /// Build a new expression that references a declaration.
2423   ///
2424   /// By default, performs semantic analysis to build the new expression.
2425   /// Subclasses may override this routine to provide different behavior.
2426   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2427                                 ValueDecl *VD,
2428                                 const DeclarationNameInfo &NameInfo,
2429                                 NamedDecl *Found,
2430                                 TemplateArgumentListInfo *TemplateArgs) {
2431     CXXScopeSpec SS;
2432     SS.Adopt(QualifierLoc);
2433     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2434                                               TemplateArgs);
2435   }
2436 
2437   /// Build a new expression in parentheses.
2438   ///
2439   /// By default, performs semantic analysis to build the new expression.
2440   /// Subclasses may override this routine to provide different behavior.
2441   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2442                                     SourceLocation RParen) {
2443     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2444   }
2445 
2446   /// Build a new pseudo-destructor expression.
2447   ///
2448   /// By default, performs semantic analysis to build the new expression.
2449   /// Subclasses may override this routine to provide different behavior.
2450   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2451                                             SourceLocation OperatorLoc,
2452                                             bool isArrow,
2453                                             CXXScopeSpec &SS,
2454                                             TypeSourceInfo *ScopeType,
2455                                             SourceLocation CCLoc,
2456                                             SourceLocation TildeLoc,
2457                                         PseudoDestructorTypeStorage Destroyed);
2458 
2459   /// Build a new unary operator expression.
2460   ///
2461   /// By default, performs semantic analysis to build the new expression.
2462   /// Subclasses may override this routine to provide different behavior.
2463   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2464                                         UnaryOperatorKind Opc,
2465                                         Expr *SubExpr) {
2466     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2467   }
2468 
2469   /// Build a new builtin offsetof expression.
2470   ///
2471   /// By default, performs semantic analysis to build the new expression.
2472   /// Subclasses may override this routine to provide different behavior.
2473   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2474                                  TypeSourceInfo *Type,
2475                                  ArrayRef<Sema::OffsetOfComponent> Components,
2476                                  SourceLocation RParenLoc) {
2477     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2478                                           RParenLoc);
2479   }
2480 
2481   /// Build a new sizeof, alignof or vec_step expression with a
2482   /// type argument.
2483   ///
2484   /// By default, performs semantic analysis to build the new expression.
2485   /// Subclasses may override this routine to provide different behavior.
2486   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2487                                          SourceLocation OpLoc,
2488                                          UnaryExprOrTypeTrait ExprKind,
2489                                          SourceRange R) {
2490     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2491   }
2492 
2493   /// Build a new sizeof, alignof or vec step expression with an
2494   /// expression argument.
2495   ///
2496   /// By default, performs semantic analysis to build the new expression.
2497   /// Subclasses may override this routine to provide different behavior.
2498   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2499                                          UnaryExprOrTypeTrait ExprKind,
2500                                          SourceRange R) {
2501     ExprResult Result
2502       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2503     if (Result.isInvalid())
2504       return ExprError();
2505 
2506     return Result;
2507   }
2508 
2509   /// Build a new array subscript expression.
2510   ///
2511   /// By default, performs semantic analysis to build the new expression.
2512   /// Subclasses may override this routine to provide different behavior.
2513   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2514                                              SourceLocation LBracketLoc,
2515                                              Expr *RHS,
2516                                              SourceLocation RBracketLoc) {
2517     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2518                                              LBracketLoc, RHS,
2519                                              RBracketLoc);
2520   }
2521 
2522   /// Build a new matrix subscript expression.
2523   ///
2524   /// By default, performs semantic analysis to build the new expression.
2525   /// Subclasses may override this routine to provide different behavior.
2526   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2527                                         Expr *ColumnIdx,
2528                                         SourceLocation RBracketLoc) {
2529     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2530                                                       RBracketLoc);
2531   }
2532 
2533   /// Build a new array section expression.
2534   ///
2535   /// By default, performs semantic analysis to build the new expression.
2536   /// Subclasses may override this routine to provide different behavior.
2537   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2538                                         Expr *LowerBound,
2539                                         SourceLocation ColonLocFirst,
2540                                         SourceLocation ColonLocSecond,
2541                                         Expr *Length, Expr *Stride,
2542                                         SourceLocation RBracketLoc) {
2543     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2544                                               ColonLocFirst, ColonLocSecond,
2545                                               Length, Stride, RBracketLoc);
2546   }
2547 
2548   /// Build a new array shaping expression.
2549   ///
2550   /// By default, performs semantic analysis to build the new expression.
2551   /// Subclasses may override this routine to provide different behavior.
2552   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2553                                         SourceLocation RParenLoc,
2554                                         ArrayRef<Expr *> Dims,
2555                                         ArrayRef<SourceRange> BracketsRanges) {
2556     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2557                                               BracketsRanges);
2558   }
2559 
2560   /// Build a new iterator expression.
2561   ///
2562   /// By default, performs semantic analysis to build the new expression.
2563   /// Subclasses may override this routine to provide different behavior.
2564   ExprResult RebuildOMPIteratorExpr(
2565       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2566       ArrayRef<Sema::OMPIteratorData> Data) {
2567     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2568                                           LLoc, RLoc, Data);
2569   }
2570 
2571   /// Build a new call expression.
2572   ///
2573   /// By default, performs semantic analysis to build the new expression.
2574   /// Subclasses may override this routine to provide different behavior.
2575   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2576                                    MultiExprArg Args,
2577                                    SourceLocation RParenLoc,
2578                                    Expr *ExecConfig = nullptr) {
2579     return getSema().ActOnCallExpr(
2580         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2581   }
2582 
2583   /// Build a new member access expression.
2584   ///
2585   /// By default, performs semantic analysis to build the new expression.
2586   /// Subclasses may override this routine to provide different behavior.
2587   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2588                                bool isArrow,
2589                                NestedNameSpecifierLoc QualifierLoc,
2590                                SourceLocation TemplateKWLoc,
2591                                const DeclarationNameInfo &MemberNameInfo,
2592                                ValueDecl *Member,
2593                                NamedDecl *FoundDecl,
2594                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2595                                NamedDecl *FirstQualifierInScope) {
2596     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2597                                                                       isArrow);
2598     if (!Member->getDeclName()) {
2599       // We have a reference to an unnamed field.  This is always the
2600       // base of an anonymous struct/union member access, i.e. the
2601       // field is always of record type.
2602       assert(Member->getType()->isRecordType() &&
2603              "unnamed member not of record type?");
2604 
2605       BaseResult =
2606         getSema().PerformObjectMemberConversion(BaseResult.get(),
2607                                                 QualifierLoc.getNestedNameSpecifier(),
2608                                                 FoundDecl, Member);
2609       if (BaseResult.isInvalid())
2610         return ExprError();
2611       Base = BaseResult.get();
2612 
2613       CXXScopeSpec EmptySS;
2614       return getSema().BuildFieldReferenceExpr(
2615           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2616           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2617     }
2618 
2619     CXXScopeSpec SS;
2620     SS.Adopt(QualifierLoc);
2621 
2622     Base = BaseResult.get();
2623     QualType BaseType = Base->getType();
2624 
2625     if (isArrow && !BaseType->isPointerType())
2626       return ExprError();
2627 
2628     // FIXME: this involves duplicating earlier analysis in a lot of
2629     // cases; we should avoid this when possible.
2630     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2631     R.addDecl(FoundDecl);
2632     R.resolveKind();
2633 
2634     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2635                                               SS, TemplateKWLoc,
2636                                               FirstQualifierInScope,
2637                                               R, ExplicitTemplateArgs,
2638                                               /*S*/nullptr);
2639   }
2640 
2641   /// Build a new binary operator expression.
2642   ///
2643   /// By default, performs semantic analysis to build the new expression.
2644   /// Subclasses may override this routine to provide different behavior.
2645   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2646                                          BinaryOperatorKind Opc,
2647                                          Expr *LHS, Expr *RHS) {
2648     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2649   }
2650 
2651   /// Build a new rewritten operator expression.
2652   ///
2653   /// By default, performs semantic analysis to build the new expression.
2654   /// Subclasses may override this routine to provide different behavior.
2655   ExprResult RebuildCXXRewrittenBinaryOperator(
2656       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2657       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2658     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2659                                            RHS, /*RequiresADL*/false);
2660   }
2661 
2662   /// Build a new conditional operator expression.
2663   ///
2664   /// By default, performs semantic analysis to build the new expression.
2665   /// Subclasses may override this routine to provide different behavior.
2666   ExprResult RebuildConditionalOperator(Expr *Cond,
2667                                         SourceLocation QuestionLoc,
2668                                         Expr *LHS,
2669                                         SourceLocation ColonLoc,
2670                                         Expr *RHS) {
2671     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2672                                         LHS, RHS);
2673   }
2674 
2675   /// Build a new C-style cast expression.
2676   ///
2677   /// By default, performs semantic analysis to build the new expression.
2678   /// Subclasses may override this routine to provide different behavior.
2679   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2680                                          TypeSourceInfo *TInfo,
2681                                          SourceLocation RParenLoc,
2682                                          Expr *SubExpr) {
2683     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2684                                          SubExpr);
2685   }
2686 
2687   /// Build a new compound literal expression.
2688   ///
2689   /// By default, performs semantic analysis to build the new expression.
2690   /// Subclasses may override this routine to provide different behavior.
2691   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2692                                               TypeSourceInfo *TInfo,
2693                                               SourceLocation RParenLoc,
2694                                               Expr *Init) {
2695     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2696                                               Init);
2697   }
2698 
2699   /// Build a new extended vector element access expression.
2700   ///
2701   /// By default, performs semantic analysis to build the new expression.
2702   /// Subclasses may override this routine to provide different behavior.
2703   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2704                                                SourceLocation OpLoc,
2705                                                SourceLocation AccessorLoc,
2706                                                IdentifierInfo &Accessor) {
2707 
2708     CXXScopeSpec SS;
2709     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2710     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2711                                               OpLoc, /*IsArrow*/ false,
2712                                               SS, SourceLocation(),
2713                                               /*FirstQualifierInScope*/ nullptr,
2714                                               NameInfo,
2715                                               /* TemplateArgs */ nullptr,
2716                                               /*S*/ nullptr);
2717   }
2718 
2719   /// Build a new initializer list expression.
2720   ///
2721   /// By default, performs semantic analysis to build the new expression.
2722   /// Subclasses may override this routine to provide different behavior.
2723   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2724                              MultiExprArg Inits,
2725                              SourceLocation RBraceLoc) {
2726     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2727   }
2728 
2729   /// Build a new designated initializer expression.
2730   ///
2731   /// By default, performs semantic analysis to build the new expression.
2732   /// Subclasses may override this routine to provide different behavior.
2733   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2734                                              MultiExprArg ArrayExprs,
2735                                              SourceLocation EqualOrColonLoc,
2736                                              bool GNUSyntax,
2737                                              Expr *Init) {
2738     ExprResult Result
2739       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2740                                            Init);
2741     if (Result.isInvalid())
2742       return ExprError();
2743 
2744     return Result;
2745   }
2746 
2747   /// Build a new value-initialized expression.
2748   ///
2749   /// By default, builds the implicit value initialization without performing
2750   /// any semantic analysis. Subclasses may override this routine to provide
2751   /// different behavior.
2752   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2753     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2754   }
2755 
2756   /// Build a new \c va_arg expression.
2757   ///
2758   /// By default, performs semantic analysis to build the new expression.
2759   /// Subclasses may override this routine to provide different behavior.
2760   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2761                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2762                                     SourceLocation RParenLoc) {
2763     return getSema().BuildVAArgExpr(BuiltinLoc,
2764                                     SubExpr, TInfo,
2765                                     RParenLoc);
2766   }
2767 
2768   /// Build a new expression list in parentheses.
2769   ///
2770   /// By default, performs semantic analysis to build the new expression.
2771   /// Subclasses may override this routine to provide different behavior.
2772   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2773                                   MultiExprArg SubExprs,
2774                                   SourceLocation RParenLoc) {
2775     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2776   }
2777 
2778   /// Build a new address-of-label expression.
2779   ///
2780   /// By default, performs semantic analysis, using the name of the label
2781   /// rather than attempting to map the label statement itself.
2782   /// Subclasses may override this routine to provide different behavior.
2783   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2784                                   SourceLocation LabelLoc, LabelDecl *Label) {
2785     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2786   }
2787 
2788   /// Build a new GNU statement 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 RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2793                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2794     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2795                                    TemplateDepth);
2796   }
2797 
2798   /// Build a new __builtin_choose_expr expression.
2799   ///
2800   /// By default, performs semantic analysis to build the new expression.
2801   /// Subclasses may override this routine to provide different behavior.
2802   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2803                                      Expr *Cond, Expr *LHS, Expr *RHS,
2804                                      SourceLocation RParenLoc) {
2805     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2806                                    Cond, LHS, RHS,
2807                                    RParenLoc);
2808   }
2809 
2810   /// Build a new generic selection expression.
2811   ///
2812   /// By default, performs semantic analysis to build the new expression.
2813   /// Subclasses may override this routine to provide different behavior.
2814   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2815                                          SourceLocation DefaultLoc,
2816                                          SourceLocation RParenLoc,
2817                                          Expr *ControllingExpr,
2818                                          ArrayRef<TypeSourceInfo *> Types,
2819                                          ArrayRef<Expr *> Exprs) {
2820     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2821                                                 ControllingExpr, Types, Exprs);
2822   }
2823 
2824   /// Build a new overloaded operator call expression.
2825   ///
2826   /// By default, performs semantic analysis to build the new expression.
2827   /// The semantic analysis provides the behavior of template instantiation,
2828   /// copying with transformations that turn what looks like an overloaded
2829   /// operator call into a use of a builtin operator, performing
2830   /// argument-dependent lookup, etc. Subclasses may override this routine to
2831   /// provide different behavior.
2832   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2833                                               SourceLocation OpLoc,
2834                                               Expr *Callee,
2835                                               Expr *First,
2836                                               Expr *Second);
2837 
2838   /// Build a new C++ "named" cast expression, such as static_cast or
2839   /// reinterpret_cast.
2840   ///
2841   /// By default, this routine dispatches to one of the more-specific routines
2842   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2843   /// Subclasses may override this routine to provide different behavior.
2844   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2845                                            Stmt::StmtClass Class,
2846                                            SourceLocation LAngleLoc,
2847                                            TypeSourceInfo *TInfo,
2848                                            SourceLocation RAngleLoc,
2849                                            SourceLocation LParenLoc,
2850                                            Expr *SubExpr,
2851                                            SourceLocation RParenLoc) {
2852     switch (Class) {
2853     case Stmt::CXXStaticCastExprClass:
2854       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2855                                                    RAngleLoc, LParenLoc,
2856                                                    SubExpr, RParenLoc);
2857 
2858     case Stmt::CXXDynamicCastExprClass:
2859       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2860                                                     RAngleLoc, LParenLoc,
2861                                                     SubExpr, RParenLoc);
2862 
2863     case Stmt::CXXReinterpretCastExprClass:
2864       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2865                                                         RAngleLoc, LParenLoc,
2866                                                         SubExpr,
2867                                                         RParenLoc);
2868 
2869     case Stmt::CXXConstCastExprClass:
2870       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2871                                                    RAngleLoc, LParenLoc,
2872                                                    SubExpr, RParenLoc);
2873 
2874     case Stmt::CXXAddrspaceCastExprClass:
2875       return getDerived().RebuildCXXAddrspaceCastExpr(
2876           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2877 
2878     default:
2879       llvm_unreachable("Invalid C++ named cast");
2880     }
2881   }
2882 
2883   /// Build a new C++ static_cast expression.
2884   ///
2885   /// By default, performs semantic analysis to build the new expression.
2886   /// Subclasses may override this routine to provide different behavior.
2887   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2888                                             SourceLocation LAngleLoc,
2889                                             TypeSourceInfo *TInfo,
2890                                             SourceLocation RAngleLoc,
2891                                             SourceLocation LParenLoc,
2892                                             Expr *SubExpr,
2893                                             SourceLocation RParenLoc) {
2894     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2895                                        TInfo, SubExpr,
2896                                        SourceRange(LAngleLoc, RAngleLoc),
2897                                        SourceRange(LParenLoc, RParenLoc));
2898   }
2899 
2900   /// Build a new C++ dynamic_cast expression.
2901   ///
2902   /// By default, performs semantic analysis to build the new expression.
2903   /// Subclasses may override this routine to provide different behavior.
2904   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2905                                              SourceLocation LAngleLoc,
2906                                              TypeSourceInfo *TInfo,
2907                                              SourceLocation RAngleLoc,
2908                                              SourceLocation LParenLoc,
2909                                              Expr *SubExpr,
2910                                              SourceLocation RParenLoc) {
2911     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2912                                        TInfo, SubExpr,
2913                                        SourceRange(LAngleLoc, RAngleLoc),
2914                                        SourceRange(LParenLoc, RParenLoc));
2915   }
2916 
2917   /// Build a new C++ reinterpret_cast expression.
2918   ///
2919   /// By default, performs semantic analysis to build the new expression.
2920   /// Subclasses may override this routine to provide different behavior.
2921   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2922                                                  SourceLocation LAngleLoc,
2923                                                  TypeSourceInfo *TInfo,
2924                                                  SourceLocation RAngleLoc,
2925                                                  SourceLocation LParenLoc,
2926                                                  Expr *SubExpr,
2927                                                  SourceLocation RParenLoc) {
2928     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2929                                        TInfo, SubExpr,
2930                                        SourceRange(LAngleLoc, RAngleLoc),
2931                                        SourceRange(LParenLoc, RParenLoc));
2932   }
2933 
2934   /// Build a new C++ const_cast expression.
2935   ///
2936   /// By default, performs semantic analysis to build the new expression.
2937   /// Subclasses may override this routine to provide different behavior.
2938   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2939                                            SourceLocation LAngleLoc,
2940                                            TypeSourceInfo *TInfo,
2941                                            SourceLocation RAngleLoc,
2942                                            SourceLocation LParenLoc,
2943                                            Expr *SubExpr,
2944                                            SourceLocation RParenLoc) {
2945     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2946                                        TInfo, SubExpr,
2947                                        SourceRange(LAngleLoc, RAngleLoc),
2948                                        SourceRange(LParenLoc, RParenLoc));
2949   }
2950 
2951   ExprResult
2952   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2953                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2954                               SourceLocation LParenLoc, Expr *SubExpr,
2955                               SourceLocation RParenLoc) {
2956     return getSema().BuildCXXNamedCast(
2957         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2958         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2959   }
2960 
2961   /// Build a new C++ functional-style cast expression.
2962   ///
2963   /// By default, performs semantic analysis to build the new expression.
2964   /// Subclasses may override this routine to provide different behavior.
2965   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2966                                           SourceLocation LParenLoc,
2967                                           Expr *Sub,
2968                                           SourceLocation RParenLoc,
2969                                           bool ListInitialization) {
2970     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2971                                                MultiExprArg(&Sub, 1), RParenLoc,
2972                                                ListInitialization);
2973   }
2974 
2975   /// Build a new C++ __builtin_bit_cast expression.
2976   ///
2977   /// By default, performs semantic analysis to build the new expression.
2978   /// Subclasses may override this routine to provide different behavior.
2979   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2980                                        TypeSourceInfo *TSI, Expr *Sub,
2981                                        SourceLocation RParenLoc) {
2982     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2983   }
2984 
2985   /// Build a new C++ typeid(type) expression.
2986   ///
2987   /// By default, performs semantic analysis to build the new expression.
2988   /// Subclasses may override this routine to provide different behavior.
2989   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2990                                         SourceLocation TypeidLoc,
2991                                         TypeSourceInfo *Operand,
2992                                         SourceLocation RParenLoc) {
2993     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2994                                     RParenLoc);
2995   }
2996 
2997 
2998   /// Build a new C++ typeid(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 RebuildCXXTypeidExpr(QualType TypeInfoType,
3003                                         SourceLocation TypeidLoc,
3004                                         Expr *Operand,
3005                                         SourceLocation RParenLoc) {
3006     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3007                                     RParenLoc);
3008   }
3009 
3010   /// Build a new C++ __uuidof(type) expression.
3011   ///
3012   /// By default, performs semantic analysis to build the new expression.
3013   /// Subclasses may override this routine to provide different behavior.
3014   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3015                                   TypeSourceInfo *Operand,
3016                                   SourceLocation RParenLoc) {
3017     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3018   }
3019 
3020   /// Build a new C++ __uuidof(expr) expression.
3021   ///
3022   /// By default, performs semantic analysis to build the new expression.
3023   /// Subclasses may override this routine to provide different behavior.
3024   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3025                                   Expr *Operand, SourceLocation RParenLoc) {
3026     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3027   }
3028 
3029   /// Build a new C++ "this" expression.
3030   ///
3031   /// By default, builds a new "this" expression without performing any
3032   /// semantic analysis. Subclasses may override this routine to provide
3033   /// different behavior.
3034   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3035                                 QualType ThisType,
3036                                 bool isImplicit) {
3037     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3038   }
3039 
3040   /// Build a new C++ throw expression.
3041   ///
3042   /// By default, performs semantic analysis to build the new expression.
3043   /// Subclasses may override this routine to provide different behavior.
3044   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3045                                  bool IsThrownVariableInScope) {
3046     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3047   }
3048 
3049   /// Build a new C++ default-argument expression.
3050   ///
3051   /// By default, builds a new default-argument expression, which does not
3052   /// require any semantic analysis. Subclasses may override this routine to
3053   /// provide different behavior.
3054   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3055     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3056                                      getSema().CurContext);
3057   }
3058 
3059   /// Build a new C++11 default-initialization expression.
3060   ///
3061   /// By default, builds a new default field initialization expression, which
3062   /// does not require any semantic analysis. Subclasses may override this
3063   /// routine to provide different behavior.
3064   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3065                                        FieldDecl *Field) {
3066     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3067                                       getSema().CurContext);
3068   }
3069 
3070   /// Build a new C++ zero-initialization expression.
3071   ///
3072   /// By default, performs semantic analysis to build the new expression.
3073   /// Subclasses may override this routine to provide different behavior.
3074   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3075                                            SourceLocation LParenLoc,
3076                                            SourceLocation RParenLoc) {
3077     return getSema().BuildCXXTypeConstructExpr(
3078         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3079   }
3080 
3081   /// Build a new C++ "new" expression.
3082   ///
3083   /// By default, performs semantic analysis to build the new expression.
3084   /// Subclasses may override this routine to provide different behavior.
3085   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3086                                bool UseGlobal,
3087                                SourceLocation PlacementLParen,
3088                                MultiExprArg PlacementArgs,
3089                                SourceLocation PlacementRParen,
3090                                SourceRange TypeIdParens,
3091                                QualType AllocatedType,
3092                                TypeSourceInfo *AllocatedTypeInfo,
3093                                Optional<Expr *> ArraySize,
3094                                SourceRange DirectInitRange,
3095                                Expr *Initializer) {
3096     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3097                                  PlacementLParen,
3098                                  PlacementArgs,
3099                                  PlacementRParen,
3100                                  TypeIdParens,
3101                                  AllocatedType,
3102                                  AllocatedTypeInfo,
3103                                  ArraySize,
3104                                  DirectInitRange,
3105                                  Initializer);
3106   }
3107 
3108   /// Build a new C++ "delete" expression.
3109   ///
3110   /// By default, performs semantic analysis to build the new expression.
3111   /// Subclasses may override this routine to provide different behavior.
3112   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3113                                         bool IsGlobalDelete,
3114                                         bool IsArrayForm,
3115                                         Expr *Operand) {
3116     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3117                                     Operand);
3118   }
3119 
3120   /// Build a new type trait expression.
3121   ///
3122   /// By default, performs semantic analysis to build the new expression.
3123   /// Subclasses may override this routine to provide different behavior.
3124   ExprResult RebuildTypeTrait(TypeTrait Trait,
3125                               SourceLocation StartLoc,
3126                               ArrayRef<TypeSourceInfo *> Args,
3127                               SourceLocation RParenLoc) {
3128     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3129   }
3130 
3131   /// Build a new array type trait expression.
3132   ///
3133   /// By default, performs semantic analysis to build the new expression.
3134   /// Subclasses may override this routine to provide different behavior.
3135   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3136                                    SourceLocation StartLoc,
3137                                    TypeSourceInfo *TSInfo,
3138                                    Expr *DimExpr,
3139                                    SourceLocation RParenLoc) {
3140     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3141   }
3142 
3143   /// Build a new expression trait expression.
3144   ///
3145   /// By default, performs semantic analysis to build the new expression.
3146   /// Subclasses may override this routine to provide different behavior.
3147   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3148                                    SourceLocation StartLoc,
3149                                    Expr *Queried,
3150                                    SourceLocation RParenLoc) {
3151     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3152   }
3153 
3154   /// Build a new (previously unresolved) declaration reference
3155   /// 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 RebuildDependentScopeDeclRefExpr(
3160                                           NestedNameSpecifierLoc QualifierLoc,
3161                                           SourceLocation TemplateKWLoc,
3162                                        const DeclarationNameInfo &NameInfo,
3163                               const TemplateArgumentListInfo *TemplateArgs,
3164                                           bool IsAddressOfOperand,
3165                                           TypeSourceInfo **RecoveryTSI) {
3166     CXXScopeSpec SS;
3167     SS.Adopt(QualifierLoc);
3168 
3169     if (TemplateArgs || TemplateKWLoc.isValid())
3170       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3171                                                     TemplateArgs);
3172 
3173     return getSema().BuildQualifiedDeclarationNameExpr(
3174         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3175   }
3176 
3177   /// Build a new template-id expression.
3178   ///
3179   /// By default, performs semantic analysis to build the new expression.
3180   /// Subclasses may override this routine to provide different behavior.
3181   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3182                                    SourceLocation TemplateKWLoc,
3183                                    LookupResult &R,
3184                                    bool RequiresADL,
3185                               const TemplateArgumentListInfo *TemplateArgs) {
3186     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3187                                          TemplateArgs);
3188   }
3189 
3190   /// Build a new object-construction expression.
3191   ///
3192   /// By default, performs semantic analysis to build the new expression.
3193   /// Subclasses may override this routine to provide different behavior.
3194   ExprResult RebuildCXXConstructExpr(QualType T,
3195                                      SourceLocation Loc,
3196                                      CXXConstructorDecl *Constructor,
3197                                      bool IsElidable,
3198                                      MultiExprArg Args,
3199                                      bool HadMultipleCandidates,
3200                                      bool ListInitialization,
3201                                      bool StdInitListInitialization,
3202                                      bool RequiresZeroInit,
3203                              CXXConstructExpr::ConstructionKind ConstructKind,
3204                                      SourceRange ParenRange) {
3205     // Reconstruct the constructor we originally found, which might be
3206     // different if this is a call to an inherited constructor.
3207     CXXConstructorDecl *FoundCtor = Constructor;
3208     if (Constructor->isInheritingConstructor())
3209       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3210 
3211     SmallVector<Expr *, 8> ConvertedArgs;
3212     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3213                                           ConvertedArgs))
3214       return ExprError();
3215 
3216     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3217                                            IsElidable,
3218                                            ConvertedArgs,
3219                                            HadMultipleCandidates,
3220                                            ListInitialization,
3221                                            StdInitListInitialization,
3222                                            RequiresZeroInit, ConstructKind,
3223                                            ParenRange);
3224   }
3225 
3226   /// Build a new implicit construction via inherited constructor
3227   /// expression.
3228   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3229                                              CXXConstructorDecl *Constructor,
3230                                              bool ConstructsVBase,
3231                                              bool InheritedFromVBase) {
3232     return new (getSema().Context) CXXInheritedCtorInitExpr(
3233         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3234   }
3235 
3236   /// Build a new object-construction expression.
3237   ///
3238   /// By default, performs semantic analysis to build the new expression.
3239   /// Subclasses may override this routine to provide different behavior.
3240   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3241                                            SourceLocation LParenOrBraceLoc,
3242                                            MultiExprArg Args,
3243                                            SourceLocation RParenOrBraceLoc,
3244                                            bool ListInitialization) {
3245     return getSema().BuildCXXTypeConstructExpr(
3246         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3247   }
3248 
3249   /// Build a new object-construction expression.
3250   ///
3251   /// By default, performs semantic analysis to build the new expression.
3252   /// Subclasses may override this routine to provide different behavior.
3253   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3254                                                SourceLocation LParenLoc,
3255                                                MultiExprArg Args,
3256                                                SourceLocation RParenLoc,
3257                                                bool ListInitialization) {
3258     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3259                                                RParenLoc, ListInitialization);
3260   }
3261 
3262   /// Build a new member reference expression.
3263   ///
3264   /// By default, performs semantic analysis to build the new expression.
3265   /// Subclasses may override this routine to provide different behavior.
3266   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3267                                                 QualType BaseType,
3268                                                 bool IsArrow,
3269                                                 SourceLocation OperatorLoc,
3270                                           NestedNameSpecifierLoc QualifierLoc,
3271                                                 SourceLocation TemplateKWLoc,
3272                                             NamedDecl *FirstQualifierInScope,
3273                                    const DeclarationNameInfo &MemberNameInfo,
3274                               const TemplateArgumentListInfo *TemplateArgs) {
3275     CXXScopeSpec SS;
3276     SS.Adopt(QualifierLoc);
3277 
3278     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3279                                             OperatorLoc, IsArrow,
3280                                             SS, TemplateKWLoc,
3281                                             FirstQualifierInScope,
3282                                             MemberNameInfo,
3283                                             TemplateArgs, /*S*/nullptr);
3284   }
3285 
3286   /// Build a new member reference 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 RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3291                                          SourceLocation OperatorLoc,
3292                                          bool IsArrow,
3293                                          NestedNameSpecifierLoc QualifierLoc,
3294                                          SourceLocation TemplateKWLoc,
3295                                          NamedDecl *FirstQualifierInScope,
3296                                          LookupResult &R,
3297                                 const TemplateArgumentListInfo *TemplateArgs) {
3298     CXXScopeSpec SS;
3299     SS.Adopt(QualifierLoc);
3300 
3301     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3302                                             OperatorLoc, IsArrow,
3303                                             SS, TemplateKWLoc,
3304                                             FirstQualifierInScope,
3305                                             R, TemplateArgs, /*S*/nullptr);
3306   }
3307 
3308   /// Build a new noexcept expression.
3309   ///
3310   /// By default, performs semantic analysis to build the new expression.
3311   /// Subclasses may override this routine to provide different behavior.
3312   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3313     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3314   }
3315 
3316   /// Build a new expression to compute the length of a parameter pack.
3317   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3318                                    NamedDecl *Pack,
3319                                    SourceLocation PackLoc,
3320                                    SourceLocation RParenLoc,
3321                                    Optional<unsigned> Length,
3322                                    ArrayRef<TemplateArgument> PartialArgs) {
3323     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3324                                   RParenLoc, Length, PartialArgs);
3325   }
3326 
3327   /// Build a new expression representing a call to a source location
3328   ///  builtin.
3329   ///
3330   /// By default, performs semantic analysis to build the new expression.
3331   /// Subclasses may override this routine to provide different behavior.
3332   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3333                                   SourceLocation BuiltinLoc,
3334                                   SourceLocation RPLoc,
3335                                   DeclContext *ParentContext) {
3336     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3337   }
3338 
3339   /// Build a new Objective-C boxed expression.
3340   ///
3341   /// By default, performs semantic analysis to build the new expression.
3342   /// Subclasses may override this routine to provide different behavior.
3343   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3344       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3345       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3346       TemplateArgumentListInfo *TALI) {
3347     CXXScopeSpec SS;
3348     SS.Adopt(NNS);
3349     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3350                                                          ConceptNameInfo,
3351                                                          FoundDecl,
3352                                                          NamedConcept, TALI);
3353     if (Result.isInvalid())
3354       return ExprError();
3355     return Result;
3356   }
3357 
3358   /// \brief Build a new requires expression.
3359   ///
3360   /// By default, performs semantic analysis to build the new expression.
3361   /// Subclasses may override this routine to provide different behavior.
3362   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3363                                  RequiresExprBodyDecl *Body,
3364                                  ArrayRef<ParmVarDecl *> LocalParameters,
3365                                  ArrayRef<concepts::Requirement *> Requirements,
3366                                  SourceLocation ClosingBraceLoc) {
3367     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3368                                 LocalParameters, Requirements, ClosingBraceLoc);
3369   }
3370 
3371   concepts::TypeRequirement *
3372   RebuildTypeRequirement(
3373       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3374     return SemaRef.BuildTypeRequirement(SubstDiag);
3375   }
3376 
3377   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3378     return SemaRef.BuildTypeRequirement(T);
3379   }
3380 
3381   concepts::ExprRequirement *
3382   RebuildExprRequirement(
3383       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3384       SourceLocation NoexceptLoc,
3385       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3386     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3387                                         std::move(Ret));
3388   }
3389 
3390   concepts::ExprRequirement *
3391   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3392                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3393     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3394                                         std::move(Ret));
3395   }
3396 
3397   concepts::NestedRequirement *
3398   RebuildNestedRequirement(
3399       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3400     return SemaRef.BuildNestedRequirement(SubstDiag);
3401   }
3402 
3403   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3404     return SemaRef.BuildNestedRequirement(Constraint);
3405   }
3406 
3407   /// \brief Build a new Objective-C boxed expression.
3408   ///
3409   /// By default, performs semantic analysis to build the new expression.
3410   /// Subclasses may override this routine to provide different behavior.
3411   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3412     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3413   }
3414 
3415   /// Build a new Objective-C array literal.
3416   ///
3417   /// By default, performs semantic analysis to build the new expression.
3418   /// Subclasses may override this routine to provide different behavior.
3419   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3420                                      Expr **Elements, unsigned NumElements) {
3421     return getSema().BuildObjCArrayLiteral(Range,
3422                                            MultiExprArg(Elements, NumElements));
3423   }
3424 
3425   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3426                                          Expr *Base, Expr *Key,
3427                                          ObjCMethodDecl *getterMethod,
3428                                          ObjCMethodDecl *setterMethod) {
3429     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3430                                                    getterMethod, setterMethod);
3431   }
3432 
3433   /// Build a new Objective-C dictionary literal.
3434   ///
3435   /// By default, performs semantic analysis to build the new expression.
3436   /// Subclasses may override this routine to provide different behavior.
3437   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3438                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3439     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3440   }
3441 
3442   /// Build a new Objective-C \@encode expression.
3443   ///
3444   /// By default, performs semantic analysis to build the new expression.
3445   /// Subclasses may override this routine to provide different behavior.
3446   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3447                                          TypeSourceInfo *EncodeTypeInfo,
3448                                          SourceLocation RParenLoc) {
3449     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3450   }
3451 
3452   /// Build a new Objective-C class message.
3453   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3454                                           Selector Sel,
3455                                           ArrayRef<SourceLocation> SelectorLocs,
3456                                           ObjCMethodDecl *Method,
3457                                           SourceLocation LBracLoc,
3458                                           MultiExprArg Args,
3459                                           SourceLocation RBracLoc) {
3460     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3461                                      ReceiverTypeInfo->getType(),
3462                                      /*SuperLoc=*/SourceLocation(),
3463                                      Sel, Method, LBracLoc, SelectorLocs,
3464                                      RBracLoc, Args);
3465   }
3466 
3467   /// Build a new Objective-C instance message.
3468   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3469                                           Selector Sel,
3470                                           ArrayRef<SourceLocation> SelectorLocs,
3471                                           ObjCMethodDecl *Method,
3472                                           SourceLocation LBracLoc,
3473                                           MultiExprArg Args,
3474                                           SourceLocation RBracLoc) {
3475     return SemaRef.BuildInstanceMessage(Receiver,
3476                                         Receiver->getType(),
3477                                         /*SuperLoc=*/SourceLocation(),
3478                                         Sel, Method, LBracLoc, SelectorLocs,
3479                                         RBracLoc, Args);
3480   }
3481 
3482   /// Build a new Objective-C instance/class message to 'super'.
3483   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3484                                     Selector Sel,
3485                                     ArrayRef<SourceLocation> SelectorLocs,
3486                                     QualType SuperType,
3487                                     ObjCMethodDecl *Method,
3488                                     SourceLocation LBracLoc,
3489                                     MultiExprArg Args,
3490                                     SourceLocation RBracLoc) {
3491     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3492                                           SuperType,
3493                                           SuperLoc,
3494                                           Sel, Method, LBracLoc, SelectorLocs,
3495                                           RBracLoc, Args)
3496                                       : SemaRef.BuildClassMessage(nullptr,
3497                                           SuperType,
3498                                           SuperLoc,
3499                                           Sel, Method, LBracLoc, SelectorLocs,
3500                                           RBracLoc, Args);
3501 
3502 
3503   }
3504 
3505   /// Build a new Objective-C ivar reference expression.
3506   ///
3507   /// By default, performs semantic analysis to build the new expression.
3508   /// Subclasses may override this routine to provide different behavior.
3509   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3510                                           SourceLocation IvarLoc,
3511                                           bool IsArrow, bool IsFreeIvar) {
3512     CXXScopeSpec SS;
3513     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3514     ExprResult Result = getSema().BuildMemberReferenceExpr(
3515         BaseArg, BaseArg->getType(),
3516         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3517         /*FirstQualifierInScope=*/nullptr, NameInfo,
3518         /*TemplateArgs=*/nullptr,
3519         /*S=*/nullptr);
3520     if (IsFreeIvar && Result.isUsable())
3521       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3522     return Result;
3523   }
3524 
3525   /// Build a new Objective-C property reference expression.
3526   ///
3527   /// By default, performs semantic analysis to build the new expression.
3528   /// Subclasses may override this routine to provide different behavior.
3529   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3530                                         ObjCPropertyDecl *Property,
3531                                         SourceLocation PropertyLoc) {
3532     CXXScopeSpec SS;
3533     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3534     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3535                                               /*FIXME:*/PropertyLoc,
3536                                               /*IsArrow=*/false,
3537                                               SS, SourceLocation(),
3538                                               /*FirstQualifierInScope=*/nullptr,
3539                                               NameInfo,
3540                                               /*TemplateArgs=*/nullptr,
3541                                               /*S=*/nullptr);
3542   }
3543 
3544   /// Build a new Objective-C property reference expression.
3545   ///
3546   /// By default, performs semantic analysis to build the new expression.
3547   /// Subclasses may override this routine to provide different behavior.
3548   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3549                                         ObjCMethodDecl *Getter,
3550                                         ObjCMethodDecl *Setter,
3551                                         SourceLocation PropertyLoc) {
3552     // Since these expressions can only be value-dependent, we do not
3553     // need to perform semantic analysis again.
3554     return Owned(
3555       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3556                                                   VK_LValue, OK_ObjCProperty,
3557                                                   PropertyLoc, Base));
3558   }
3559 
3560   /// Build a new Objective-C "isa" expression.
3561   ///
3562   /// By default, performs semantic analysis to build the new expression.
3563   /// Subclasses may override this routine to provide different behavior.
3564   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3565                                 SourceLocation OpLoc, bool IsArrow) {
3566     CXXScopeSpec SS;
3567     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3568     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3569                                               OpLoc, IsArrow,
3570                                               SS, SourceLocation(),
3571                                               /*FirstQualifierInScope=*/nullptr,
3572                                               NameInfo,
3573                                               /*TemplateArgs=*/nullptr,
3574                                               /*S=*/nullptr);
3575   }
3576 
3577   /// Build a new shuffle vector expression.
3578   ///
3579   /// By default, performs semantic analysis to build the new expression.
3580   /// Subclasses may override this routine to provide different behavior.
3581   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3582                                       MultiExprArg SubExprs,
3583                                       SourceLocation RParenLoc) {
3584     // Find the declaration for __builtin_shufflevector
3585     const IdentifierInfo &Name
3586       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3587     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3588     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3589     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3590 
3591     // Build a reference to the __builtin_shufflevector builtin
3592     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3593     Expr *Callee = new (SemaRef.Context)
3594         DeclRefExpr(SemaRef.Context, Builtin, false,
3595                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3596     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3597     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3598                                        CK_BuiltinFnToFnPtr).get();
3599 
3600     // Build the CallExpr
3601     ExprResult TheCall = CallExpr::Create(
3602         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3603         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3604         FPOptionsOverride());
3605 
3606     // Type-check the __builtin_shufflevector expression.
3607     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3608   }
3609 
3610   /// Build a new convert vector expression.
3611   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3612                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3613                                       SourceLocation RParenLoc) {
3614     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3615                                          BuiltinLoc, RParenLoc);
3616   }
3617 
3618   /// Build a new template argument pack expansion.
3619   ///
3620   /// By default, performs semantic analysis to build a new pack expansion
3621   /// for a template argument. Subclasses may override this routine to provide
3622   /// different behavior.
3623   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3624                                            SourceLocation EllipsisLoc,
3625                                            Optional<unsigned> NumExpansions) {
3626     switch (Pattern.getArgument().getKind()) {
3627     case TemplateArgument::Expression: {
3628       ExprResult Result
3629         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3630                                        EllipsisLoc, NumExpansions);
3631       if (Result.isInvalid())
3632         return TemplateArgumentLoc();
3633 
3634       return TemplateArgumentLoc(Result.get(), Result.get());
3635     }
3636 
3637     case TemplateArgument::Template:
3638       return TemplateArgumentLoc(
3639           SemaRef.Context,
3640           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3641                            NumExpansions),
3642           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3643           EllipsisLoc);
3644 
3645     case TemplateArgument::Null:
3646     case TemplateArgument::Integral:
3647     case TemplateArgument::Declaration:
3648     case TemplateArgument::Pack:
3649     case TemplateArgument::TemplateExpansion:
3650     case TemplateArgument::NullPtr:
3651       llvm_unreachable("Pack expansion pattern has no parameter packs");
3652 
3653     case TemplateArgument::Type:
3654       if (TypeSourceInfo *Expansion
3655             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3656                                            EllipsisLoc,
3657                                            NumExpansions))
3658         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3659                                    Expansion);
3660       break;
3661     }
3662 
3663     return TemplateArgumentLoc();
3664   }
3665 
3666   /// Build a new expression pack expansion.
3667   ///
3668   /// By default, performs semantic analysis to build a new pack expansion
3669   /// for an expression. Subclasses may override this routine to provide
3670   /// different behavior.
3671   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3672                                   Optional<unsigned> NumExpansions) {
3673     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3674   }
3675 
3676   /// Build a new C++1z fold-expression.
3677   ///
3678   /// By default, performs semantic analysis in order to build a new fold
3679   /// expression.
3680   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3681                                 SourceLocation LParenLoc, Expr *LHS,
3682                                 BinaryOperatorKind Operator,
3683                                 SourceLocation EllipsisLoc, Expr *RHS,
3684                                 SourceLocation RParenLoc,
3685                                 Optional<unsigned> NumExpansions) {
3686     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3687                                       EllipsisLoc, RHS, RParenLoc,
3688                                       NumExpansions);
3689   }
3690 
3691   /// Build an empty C++1z fold-expression with the given operator.
3692   ///
3693   /// By default, produces the fallback value for the fold-expression, or
3694   /// produce an error if there is no fallback value.
3695   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3696                                      BinaryOperatorKind Operator) {
3697     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3698   }
3699 
3700   /// Build a new atomic operation expression.
3701   ///
3702   /// By default, performs semantic analysis to build the new expression.
3703   /// Subclasses may override this routine to provide different behavior.
3704   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3705                                AtomicExpr::AtomicOp Op,
3706                                SourceLocation RParenLoc) {
3707     // Use this for all of the locations, since we don't know the difference
3708     // between the call and the expr at this point.
3709     SourceRange Range{BuiltinLoc, RParenLoc};
3710     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3711                                      Sema::AtomicArgumentOrder::AST);
3712   }
3713 
3714   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3715                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3716     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3717   }
3718 
3719 private:
3720   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3721                                      QualType ObjectType,
3722                                      NamedDecl *FirstQualifierInScope,
3723                                      CXXScopeSpec &SS);
3724 
3725   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3726                                              QualType ObjectType,
3727                                              NamedDecl *FirstQualifierInScope,
3728                                              CXXScopeSpec &SS);
3729 
3730   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3731                                             NamedDecl *FirstQualifierInScope,
3732                                             CXXScopeSpec &SS);
3733 
3734   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3735                                       DependentNameTypeLoc TL,
3736                                       bool DeducibleTSTContext);
3737 };
3738 
3739 template <typename Derived>
3740 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3741   if (!S)
3742     return S;
3743 
3744   switch (S->getStmtClass()) {
3745   case Stmt::NoStmtClass: break;
3746 
3747   // Transform individual statement nodes
3748   // Pass SDK into statements that can produce a value
3749 #define STMT(Node, Parent)                                              \
3750   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3751 #define VALUESTMT(Node, Parent)                                         \
3752   case Stmt::Node##Class:                                               \
3753     return getDerived().Transform##Node(cast<Node>(S), SDK);
3754 #define ABSTRACT_STMT(Node)
3755 #define EXPR(Node, Parent)
3756 #include "clang/AST/StmtNodes.inc"
3757 
3758   // Transform expressions by calling TransformExpr.
3759 #define STMT(Node, Parent)
3760 #define ABSTRACT_STMT(Stmt)
3761 #define EXPR(Node, Parent) case Stmt::Node##Class:
3762 #include "clang/AST/StmtNodes.inc"
3763     {
3764       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3765 
3766       if (SDK == SDK_StmtExprResult)
3767         E = getSema().ActOnStmtExprResult(E);
3768       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3769     }
3770   }
3771 
3772   return S;
3773 }
3774 
3775 template<typename Derived>
3776 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3777   if (!S)
3778     return S;
3779 
3780   switch (S->getClauseKind()) {
3781   default: break;
3782   // Transform individual clause nodes
3783 #define GEN_CLANG_CLAUSE_CLASS
3784 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3785   case Enum:                                                                   \
3786     return getDerived().Transform##Class(cast<Class>(S));
3787 #include "llvm/Frontend/OpenMP/OMP.inc"
3788   }
3789 
3790   return S;
3791 }
3792 
3793 
3794 template<typename Derived>
3795 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3796   if (!E)
3797     return E;
3798 
3799   switch (E->getStmtClass()) {
3800     case Stmt::NoStmtClass: break;
3801 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3802 #define ABSTRACT_STMT(Stmt)
3803 #define EXPR(Node, Parent)                                              \
3804     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3805 #include "clang/AST/StmtNodes.inc"
3806   }
3807 
3808   return E;
3809 }
3810 
3811 template<typename Derived>
3812 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3813                                                         bool NotCopyInit) {
3814   // Initializers are instantiated like expressions, except that various outer
3815   // layers are stripped.
3816   if (!Init)
3817     return Init;
3818 
3819   if (auto *FE = dyn_cast<FullExpr>(Init))
3820     Init = FE->getSubExpr();
3821 
3822   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3823     Init = AIL->getCommonExpr();
3824 
3825   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3826     Init = MTE->getSubExpr();
3827 
3828   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3829     Init = Binder->getSubExpr();
3830 
3831   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3832     Init = ICE->getSubExprAsWritten();
3833 
3834   if (CXXStdInitializerListExpr *ILE =
3835           dyn_cast<CXXStdInitializerListExpr>(Init))
3836     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3837 
3838   // If this is copy-initialization, we only need to reconstruct
3839   // InitListExprs. Other forms of copy-initialization will be a no-op if
3840   // the initializer is already the right type.
3841   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3842   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3843     return getDerived().TransformExpr(Init);
3844 
3845   // Revert value-initialization back to empty parens.
3846   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3847     SourceRange Parens = VIE->getSourceRange();
3848     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3849                                              Parens.getEnd());
3850   }
3851 
3852   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3853   if (isa<ImplicitValueInitExpr>(Init))
3854     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3855                                              SourceLocation());
3856 
3857   // Revert initialization by constructor back to a parenthesized or braced list
3858   // of expressions. Any other form of initializer can just be reused directly.
3859   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3860     return getDerived().TransformExpr(Init);
3861 
3862   // If the initialization implicitly converted an initializer list to a
3863   // std::initializer_list object, unwrap the std::initializer_list too.
3864   if (Construct && Construct->isStdInitListInitialization())
3865     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3866 
3867   // Enter a list-init context if this was list initialization.
3868   EnterExpressionEvaluationContext Context(
3869       getSema(), EnterExpressionEvaluationContext::InitList,
3870       Construct->isListInitialization());
3871 
3872   SmallVector<Expr*, 8> NewArgs;
3873   bool ArgChanged = false;
3874   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3875                                   /*IsCall*/true, NewArgs, &ArgChanged))
3876     return ExprError();
3877 
3878   // If this was list initialization, revert to syntactic list form.
3879   if (Construct->isListInitialization())
3880     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3881                                         Construct->getEndLoc());
3882 
3883   // Build a ParenListExpr to represent anything else.
3884   SourceRange Parens = Construct->getParenOrBraceRange();
3885   if (Parens.isInvalid()) {
3886     // This was a variable declaration's initialization for which no initializer
3887     // was specified.
3888     assert(NewArgs.empty() &&
3889            "no parens or braces but have direct init with arguments?");
3890     return ExprEmpty();
3891   }
3892   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3893                                            Parens.getEnd());
3894 }
3895 
3896 template<typename Derived>
3897 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3898                                             unsigned NumInputs,
3899                                             bool IsCall,
3900                                       SmallVectorImpl<Expr *> &Outputs,
3901                                             bool *ArgChanged) {
3902   for (unsigned I = 0; I != NumInputs; ++I) {
3903     // If requested, drop call arguments that need to be dropped.
3904     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3905       if (ArgChanged)
3906         *ArgChanged = true;
3907 
3908       break;
3909     }
3910 
3911     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3912       Expr *Pattern = Expansion->getPattern();
3913 
3914       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3915       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3916       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3917 
3918       // Determine whether the set of unexpanded parameter packs can and should
3919       // be expanded.
3920       bool Expand = true;
3921       bool RetainExpansion = false;
3922       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3923       Optional<unsigned> NumExpansions = OrigNumExpansions;
3924       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3925                                                Pattern->getSourceRange(),
3926                                                Unexpanded,
3927                                                Expand, RetainExpansion,
3928                                                NumExpansions))
3929         return true;
3930 
3931       if (!Expand) {
3932         // The transform has determined that we should perform a simple
3933         // transformation on the pack expansion, producing another pack
3934         // expansion.
3935         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3936         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3937         if (OutPattern.isInvalid())
3938           return true;
3939 
3940         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3941                                                 Expansion->getEllipsisLoc(),
3942                                                            NumExpansions);
3943         if (Out.isInvalid())
3944           return true;
3945 
3946         if (ArgChanged)
3947           *ArgChanged = true;
3948         Outputs.push_back(Out.get());
3949         continue;
3950       }
3951 
3952       // Record right away that the argument was changed.  This needs
3953       // to happen even if the array expands to nothing.
3954       if (ArgChanged) *ArgChanged = true;
3955 
3956       // The transform has determined that we should perform an elementwise
3957       // expansion of the pattern. Do so.
3958       for (unsigned I = 0; I != *NumExpansions; ++I) {
3959         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3960         ExprResult Out = getDerived().TransformExpr(Pattern);
3961         if (Out.isInvalid())
3962           return true;
3963 
3964         if (Out.get()->containsUnexpandedParameterPack()) {
3965           Out = getDerived().RebuildPackExpansion(
3966               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3967           if (Out.isInvalid())
3968             return true;
3969         }
3970 
3971         Outputs.push_back(Out.get());
3972       }
3973 
3974       // If we're supposed to retain a pack expansion, do so by temporarily
3975       // forgetting the partially-substituted parameter pack.
3976       if (RetainExpansion) {
3977         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3978 
3979         ExprResult Out = getDerived().TransformExpr(Pattern);
3980         if (Out.isInvalid())
3981           return true;
3982 
3983         Out = getDerived().RebuildPackExpansion(
3984             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3985         if (Out.isInvalid())
3986           return true;
3987 
3988         Outputs.push_back(Out.get());
3989       }
3990 
3991       continue;
3992     }
3993 
3994     ExprResult Result =
3995       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3996              : getDerived().TransformExpr(Inputs[I]);
3997     if (Result.isInvalid())
3998       return true;
3999 
4000     if (Result.get() != Inputs[I] && ArgChanged)
4001       *ArgChanged = true;
4002 
4003     Outputs.push_back(Result.get());
4004   }
4005 
4006   return false;
4007 }
4008 
4009 template <typename Derived>
4010 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4011     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4012   if (Var) {
4013     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4014         getDerived().TransformDefinition(Var->getLocation(), Var));
4015 
4016     if (!ConditionVar)
4017       return Sema::ConditionError();
4018 
4019     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4020   }
4021 
4022   if (Expr) {
4023     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4024 
4025     if (CondExpr.isInvalid())
4026       return Sema::ConditionError();
4027 
4028     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
4029   }
4030 
4031   return Sema::ConditionResult();
4032 }
4033 
4034 template<typename Derived>
4035 NestedNameSpecifierLoc
4036 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4037                                                     NestedNameSpecifierLoc NNS,
4038                                                      QualType ObjectType,
4039                                              NamedDecl *FirstQualifierInScope) {
4040   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4041   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4042        Qualifier = Qualifier.getPrefix())
4043     Qualifiers.push_back(Qualifier);
4044 
4045   CXXScopeSpec SS;
4046   while (!Qualifiers.empty()) {
4047     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4048     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4049 
4050     switch (QNNS->getKind()) {
4051     case NestedNameSpecifier::Identifier: {
4052       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4053                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
4054       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4055                                               SS, FirstQualifierInScope, false))
4056         return NestedNameSpecifierLoc();
4057     }
4058       break;
4059 
4060     case NestedNameSpecifier::Namespace: {
4061       NamespaceDecl *NS
4062         = cast_or_null<NamespaceDecl>(
4063                                     getDerived().TransformDecl(
4064                                                           Q.getLocalBeginLoc(),
4065                                                        QNNS->getAsNamespace()));
4066       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4067       break;
4068     }
4069 
4070     case NestedNameSpecifier::NamespaceAlias: {
4071       NamespaceAliasDecl *Alias
4072         = cast_or_null<NamespaceAliasDecl>(
4073                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
4074                                                  QNNS->getAsNamespaceAlias()));
4075       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4076                 Q.getLocalEndLoc());
4077       break;
4078     }
4079 
4080     case NestedNameSpecifier::Global:
4081       // There is no meaningful transformation that one could perform on the
4082       // global scope.
4083       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4084       break;
4085 
4086     case NestedNameSpecifier::Super: {
4087       CXXRecordDecl *RD =
4088           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4089               SourceLocation(), QNNS->getAsRecordDecl()));
4090       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4091       break;
4092     }
4093 
4094     case NestedNameSpecifier::TypeSpecWithTemplate:
4095     case NestedNameSpecifier::TypeSpec: {
4096       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4097                                               FirstQualifierInScope, SS);
4098 
4099       if (!TL)
4100         return NestedNameSpecifierLoc();
4101 
4102       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4103           (SemaRef.getLangOpts().CPlusPlus11 &&
4104            TL.getType()->isEnumeralType())) {
4105         assert(!TL.getType().hasLocalQualifiers() &&
4106                "Can't get cv-qualifiers here");
4107         if (TL.getType()->isEnumeralType())
4108           SemaRef.Diag(TL.getBeginLoc(),
4109                        diag::warn_cxx98_compat_enum_nested_name_spec);
4110         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
4111                   Q.getLocalEndLoc());
4112         break;
4113       }
4114       // If the nested-name-specifier is an invalid type def, don't emit an
4115       // error because a previous error should have already been emitted.
4116       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4117       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4118         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4119           << TL.getType() << SS.getRange();
4120       }
4121       return NestedNameSpecifierLoc();
4122     }
4123     }
4124 
4125     // The qualifier-in-scope and object type only apply to the leftmost entity.
4126     FirstQualifierInScope = nullptr;
4127     ObjectType = QualType();
4128   }
4129 
4130   // Don't rebuild the nested-name-specifier if we don't have to.
4131   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4132       !getDerived().AlwaysRebuild())
4133     return NNS;
4134 
4135   // If we can re-use the source-location data from the original
4136   // nested-name-specifier, do so.
4137   if (SS.location_size() == NNS.getDataLength() &&
4138       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4139     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4140 
4141   // Allocate new nested-name-specifier location information.
4142   return SS.getWithLocInContext(SemaRef.Context);
4143 }
4144 
4145 template<typename Derived>
4146 DeclarationNameInfo
4147 TreeTransform<Derived>
4148 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4149   DeclarationName Name = NameInfo.getName();
4150   if (!Name)
4151     return DeclarationNameInfo();
4152 
4153   switch (Name.getNameKind()) {
4154   case DeclarationName::Identifier:
4155   case DeclarationName::ObjCZeroArgSelector:
4156   case DeclarationName::ObjCOneArgSelector:
4157   case DeclarationName::ObjCMultiArgSelector:
4158   case DeclarationName::CXXOperatorName:
4159   case DeclarationName::CXXLiteralOperatorName:
4160   case DeclarationName::CXXUsingDirective:
4161     return NameInfo;
4162 
4163   case DeclarationName::CXXDeductionGuideName: {
4164     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4165     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4166         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4167     if (!NewTemplate)
4168       return DeclarationNameInfo();
4169 
4170     DeclarationNameInfo NewNameInfo(NameInfo);
4171     NewNameInfo.setName(
4172         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4173     return NewNameInfo;
4174   }
4175 
4176   case DeclarationName::CXXConstructorName:
4177   case DeclarationName::CXXDestructorName:
4178   case DeclarationName::CXXConversionFunctionName: {
4179     TypeSourceInfo *NewTInfo;
4180     CanQualType NewCanTy;
4181     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4182       NewTInfo = getDerived().TransformType(OldTInfo);
4183       if (!NewTInfo)
4184         return DeclarationNameInfo();
4185       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4186     }
4187     else {
4188       NewTInfo = nullptr;
4189       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4190       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4191       if (NewT.isNull())
4192         return DeclarationNameInfo();
4193       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4194     }
4195 
4196     DeclarationName NewName
4197       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4198                                                            NewCanTy);
4199     DeclarationNameInfo NewNameInfo(NameInfo);
4200     NewNameInfo.setName(NewName);
4201     NewNameInfo.setNamedTypeInfo(NewTInfo);
4202     return NewNameInfo;
4203   }
4204   }
4205 
4206   llvm_unreachable("Unknown name kind.");
4207 }
4208 
4209 template<typename Derived>
4210 TemplateName
4211 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4212                                               TemplateName Name,
4213                                               SourceLocation NameLoc,
4214                                               QualType ObjectType,
4215                                               NamedDecl *FirstQualifierInScope,
4216                                               bool AllowInjectedClassName) {
4217   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4218     TemplateDecl *Template = QTN->getTemplateDecl();
4219     assert(Template && "qualified template name must refer to a template");
4220 
4221     TemplateDecl *TransTemplate
4222       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4223                                                               Template));
4224     if (!TransTemplate)
4225       return TemplateName();
4226 
4227     if (!getDerived().AlwaysRebuild() &&
4228         SS.getScopeRep() == QTN->getQualifier() &&
4229         TransTemplate == Template)
4230       return Name;
4231 
4232     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4233                                             TransTemplate);
4234   }
4235 
4236   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4237     if (SS.getScopeRep()) {
4238       // These apply to the scope specifier, not the template.
4239       ObjectType = QualType();
4240       FirstQualifierInScope = nullptr;
4241     }
4242 
4243     if (!getDerived().AlwaysRebuild() &&
4244         SS.getScopeRep() == DTN->getQualifier() &&
4245         ObjectType.isNull())
4246       return Name;
4247 
4248     // FIXME: Preserve the location of the "template" keyword.
4249     SourceLocation TemplateKWLoc = NameLoc;
4250 
4251     if (DTN->isIdentifier()) {
4252       return getDerived().RebuildTemplateName(SS,
4253                                               TemplateKWLoc,
4254                                               *DTN->getIdentifier(),
4255                                               NameLoc,
4256                                               ObjectType,
4257                                               FirstQualifierInScope,
4258                                               AllowInjectedClassName);
4259     }
4260 
4261     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4262                                             DTN->getOperator(), NameLoc,
4263                                             ObjectType, AllowInjectedClassName);
4264   }
4265 
4266   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4267     TemplateDecl *TransTemplate
4268       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4269                                                               Template));
4270     if (!TransTemplate)
4271       return TemplateName();
4272 
4273     if (!getDerived().AlwaysRebuild() &&
4274         TransTemplate == Template)
4275       return Name;
4276 
4277     return TemplateName(TransTemplate);
4278   }
4279 
4280   if (SubstTemplateTemplateParmPackStorage *SubstPack
4281       = Name.getAsSubstTemplateTemplateParmPack()) {
4282     TemplateTemplateParmDecl *TransParam
4283     = cast_or_null<TemplateTemplateParmDecl>(
4284             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4285     if (!TransParam)
4286       return TemplateName();
4287 
4288     if (!getDerived().AlwaysRebuild() &&
4289         TransParam == SubstPack->getParameterPack())
4290       return Name;
4291 
4292     return getDerived().RebuildTemplateName(TransParam,
4293                                             SubstPack->getArgumentPack());
4294   }
4295 
4296   // These should be getting filtered out before they reach the AST.
4297   llvm_unreachable("overloaded function decl survived to here");
4298 }
4299 
4300 template<typename Derived>
4301 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4302                                          const TemplateArgument &Arg,
4303                                          TemplateArgumentLoc &Output) {
4304   Output = getSema().getTrivialTemplateArgumentLoc(
4305       Arg, QualType(), getDerived().getBaseLocation());
4306 }
4307 
4308 template<typename Derived>
4309 bool TreeTransform<Derived>::TransformTemplateArgument(
4310                                          const TemplateArgumentLoc &Input,
4311                                          TemplateArgumentLoc &Output, bool Uneval) {
4312   const TemplateArgument &Arg = Input.getArgument();
4313   switch (Arg.getKind()) {
4314   case TemplateArgument::Null:
4315   case TemplateArgument::Pack:
4316     llvm_unreachable("Unexpected TemplateArgument");
4317 
4318   case TemplateArgument::Integral:
4319   case TemplateArgument::NullPtr:
4320   case TemplateArgument::Declaration: {
4321     // Transform a resolved template argument straight to a resolved template
4322     // argument. We get here when substituting into an already-substituted
4323     // template type argument during concept satisfaction checking.
4324     QualType T = Arg.getNonTypeTemplateArgumentType();
4325     QualType NewT = getDerived().TransformType(T);
4326     if (NewT.isNull())
4327       return true;
4328 
4329     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4330                        ? Arg.getAsDecl()
4331                        : nullptr;
4332     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4333                               getDerived().getBaseLocation(), D))
4334                         : nullptr;
4335     if (D && !NewD)
4336       return true;
4337 
4338     if (NewT == T && D == NewD)
4339       Output = Input;
4340     else if (Arg.getKind() == TemplateArgument::Integral)
4341       Output = TemplateArgumentLoc(
4342           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4343           TemplateArgumentLocInfo());
4344     else if (Arg.getKind() == TemplateArgument::NullPtr)
4345       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4346                                    TemplateArgumentLocInfo());
4347     else
4348       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4349                                    TemplateArgumentLocInfo());
4350 
4351     return false;
4352   }
4353 
4354   case TemplateArgument::Type: {
4355     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4356     if (!DI)
4357       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4358 
4359     DI = getDerived().TransformType(DI);
4360     if (!DI) return true;
4361 
4362     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4363     return false;
4364   }
4365 
4366   case TemplateArgument::Template: {
4367     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4368     if (QualifierLoc) {
4369       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4370       if (!QualifierLoc)
4371         return true;
4372     }
4373 
4374     CXXScopeSpec SS;
4375     SS.Adopt(QualifierLoc);
4376     TemplateName Template
4377       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4378                                            Input.getTemplateNameLoc());
4379     if (Template.isNull())
4380       return true;
4381 
4382     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4383                                  QualifierLoc, Input.getTemplateNameLoc());
4384     return false;
4385   }
4386 
4387   case TemplateArgument::TemplateExpansion:
4388     llvm_unreachable("Caller should expand pack expansions");
4389 
4390   case TemplateArgument::Expression: {
4391     // Template argument expressions are constant expressions.
4392     EnterExpressionEvaluationContext Unevaluated(
4393         getSema(),
4394         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4395                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4396         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4397         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4398 
4399     Expr *InputExpr = Input.getSourceExpression();
4400     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4401 
4402     ExprResult E = getDerived().TransformExpr(InputExpr);
4403     E = SemaRef.ActOnConstantExpression(E);
4404     if (E.isInvalid()) return true;
4405     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4406     return false;
4407   }
4408   }
4409 
4410   // Work around bogus GCC warning
4411   return true;
4412 }
4413 
4414 /// Iterator adaptor that invents template argument location information
4415 /// for each of the template arguments in its underlying iterator.
4416 template<typename Derived, typename InputIterator>
4417 class TemplateArgumentLocInventIterator {
4418   TreeTransform<Derived> &Self;
4419   InputIterator Iter;
4420 
4421 public:
4422   typedef TemplateArgumentLoc value_type;
4423   typedef TemplateArgumentLoc reference;
4424   typedef typename std::iterator_traits<InputIterator>::difference_type
4425     difference_type;
4426   typedef std::input_iterator_tag iterator_category;
4427 
4428   class pointer {
4429     TemplateArgumentLoc Arg;
4430 
4431   public:
4432     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4433 
4434     const TemplateArgumentLoc *operator->() const { return &Arg; }
4435   };
4436 
4437   TemplateArgumentLocInventIterator() { }
4438 
4439   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4440                                              InputIterator Iter)
4441     : Self(Self), Iter(Iter) { }
4442 
4443   TemplateArgumentLocInventIterator &operator++() {
4444     ++Iter;
4445     return *this;
4446   }
4447 
4448   TemplateArgumentLocInventIterator operator++(int) {
4449     TemplateArgumentLocInventIterator Old(*this);
4450     ++(*this);
4451     return Old;
4452   }
4453 
4454   reference operator*() const {
4455     TemplateArgumentLoc Result;
4456     Self.InventTemplateArgumentLoc(*Iter, Result);
4457     return Result;
4458   }
4459 
4460   pointer operator->() const { return pointer(**this); }
4461 
4462   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4463                          const TemplateArgumentLocInventIterator &Y) {
4464     return X.Iter == Y.Iter;
4465   }
4466 
4467   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4468                          const TemplateArgumentLocInventIterator &Y) {
4469     return X.Iter != Y.Iter;
4470   }
4471 };
4472 
4473 template<typename Derived>
4474 template<typename InputIterator>
4475 bool TreeTransform<Derived>::TransformTemplateArguments(
4476     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4477     bool Uneval) {
4478   for (; First != Last; ++First) {
4479     TemplateArgumentLoc Out;
4480     TemplateArgumentLoc In = *First;
4481 
4482     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4483       // Unpack argument packs, which we translate them into separate
4484       // arguments.
4485       // FIXME: We could do much better if we could guarantee that the
4486       // TemplateArgumentLocInfo for the pack expansion would be usable for
4487       // all of the template arguments in the argument pack.
4488       typedef TemplateArgumentLocInventIterator<Derived,
4489                                                 TemplateArgument::pack_iterator>
4490         PackLocIterator;
4491       if (TransformTemplateArguments(PackLocIterator(*this,
4492                                                  In.getArgument().pack_begin()),
4493                                      PackLocIterator(*this,
4494                                                    In.getArgument().pack_end()),
4495                                      Outputs, Uneval))
4496         return true;
4497 
4498       continue;
4499     }
4500 
4501     if (In.getArgument().isPackExpansion()) {
4502       // We have a pack expansion, for which we will be substituting into
4503       // the pattern.
4504       SourceLocation Ellipsis;
4505       Optional<unsigned> OrigNumExpansions;
4506       TemplateArgumentLoc Pattern
4507         = getSema().getTemplateArgumentPackExpansionPattern(
4508               In, Ellipsis, OrigNumExpansions);
4509 
4510       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4511       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4512       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4513 
4514       // Determine whether the set of unexpanded parameter packs can and should
4515       // be expanded.
4516       bool Expand = true;
4517       bool RetainExpansion = false;
4518       Optional<unsigned> NumExpansions = OrigNumExpansions;
4519       if (getDerived().TryExpandParameterPacks(Ellipsis,
4520                                                Pattern.getSourceRange(),
4521                                                Unexpanded,
4522                                                Expand,
4523                                                RetainExpansion,
4524                                                NumExpansions))
4525         return true;
4526 
4527       if (!Expand) {
4528         // The transform has determined that we should perform a simple
4529         // transformation on the pack expansion, producing another pack
4530         // expansion.
4531         TemplateArgumentLoc OutPattern;
4532         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4533         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4534           return true;
4535 
4536         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4537                                                 NumExpansions);
4538         if (Out.getArgument().isNull())
4539           return true;
4540 
4541         Outputs.addArgument(Out);
4542         continue;
4543       }
4544 
4545       // The transform has determined that we should perform an elementwise
4546       // expansion of the pattern. Do so.
4547       for (unsigned I = 0; I != *NumExpansions; ++I) {
4548         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4549 
4550         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4551           return true;
4552 
4553         if (Out.getArgument().containsUnexpandedParameterPack()) {
4554           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4555                                                   OrigNumExpansions);
4556           if (Out.getArgument().isNull())
4557             return true;
4558         }
4559 
4560         Outputs.addArgument(Out);
4561       }
4562 
4563       // If we're supposed to retain a pack expansion, do so by temporarily
4564       // forgetting the partially-substituted parameter pack.
4565       if (RetainExpansion) {
4566         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4567 
4568         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4569           return true;
4570 
4571         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4572                                                 OrigNumExpansions);
4573         if (Out.getArgument().isNull())
4574           return true;
4575 
4576         Outputs.addArgument(Out);
4577       }
4578 
4579       continue;
4580     }
4581 
4582     // The simple case:
4583     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4584       return true;
4585 
4586     Outputs.addArgument(Out);
4587   }
4588 
4589   return false;
4590 
4591 }
4592 
4593 //===----------------------------------------------------------------------===//
4594 // Type transformation
4595 //===----------------------------------------------------------------------===//
4596 
4597 template<typename Derived>
4598 QualType TreeTransform<Derived>::TransformType(QualType T) {
4599   if (getDerived().AlreadyTransformed(T))
4600     return T;
4601 
4602   // Temporary workaround.  All of these transformations should
4603   // eventually turn into transformations on TypeLocs.
4604   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4605                                                 getDerived().getBaseLocation());
4606 
4607   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4608 
4609   if (!NewDI)
4610     return QualType();
4611 
4612   return NewDI->getType();
4613 }
4614 
4615 template<typename Derived>
4616 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4617   // Refine the base location to the type's location.
4618   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4619                        getDerived().getBaseEntity());
4620   if (getDerived().AlreadyTransformed(DI->getType()))
4621     return DI;
4622 
4623   TypeLocBuilder TLB;
4624 
4625   TypeLoc TL = DI->getTypeLoc();
4626   TLB.reserve(TL.getFullDataSize());
4627 
4628   QualType Result = getDerived().TransformType(TLB, TL);
4629   if (Result.isNull())
4630     return nullptr;
4631 
4632   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4633 }
4634 
4635 template<typename Derived>
4636 QualType
4637 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4638   switch (T.getTypeLocClass()) {
4639 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4640 #define TYPELOC(CLASS, PARENT)                                                 \
4641   case TypeLoc::CLASS:                                                         \
4642     return getDerived().Transform##CLASS##Type(TLB,                            \
4643                                                T.castAs<CLASS##TypeLoc>());
4644 #include "clang/AST/TypeLocNodes.def"
4645   }
4646 
4647   llvm_unreachable("unhandled type loc!");
4648 }
4649 
4650 template<typename Derived>
4651 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4652   if (!isa<DependentNameType>(T))
4653     return TransformType(T);
4654 
4655   if (getDerived().AlreadyTransformed(T))
4656     return T;
4657   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4658                                                 getDerived().getBaseLocation());
4659   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4660   return NewDI ? NewDI->getType() : QualType();
4661 }
4662 
4663 template<typename Derived>
4664 TypeSourceInfo *
4665 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4666   if (!isa<DependentNameType>(DI->getType()))
4667     return TransformType(DI);
4668 
4669   // Refine the base location to the type's location.
4670   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4671                        getDerived().getBaseEntity());
4672   if (getDerived().AlreadyTransformed(DI->getType()))
4673     return DI;
4674 
4675   TypeLocBuilder TLB;
4676 
4677   TypeLoc TL = DI->getTypeLoc();
4678   TLB.reserve(TL.getFullDataSize());
4679 
4680   auto QTL = TL.getAs<QualifiedTypeLoc>();
4681   if (QTL)
4682     TL = QTL.getUnqualifiedLoc();
4683 
4684   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4685 
4686   QualType Result = getDerived().TransformDependentNameType(
4687       TLB, DNTL, /*DeducedTSTContext*/true);
4688   if (Result.isNull())
4689     return nullptr;
4690 
4691   if (QTL) {
4692     Result = getDerived().RebuildQualifiedType(Result, QTL);
4693     if (Result.isNull())
4694       return nullptr;
4695     TLB.TypeWasModifiedSafely(Result);
4696   }
4697 
4698   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4699 }
4700 
4701 template<typename Derived>
4702 QualType
4703 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4704                                                QualifiedTypeLoc T) {
4705   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4706   if (Result.isNull())
4707     return QualType();
4708 
4709   Result = getDerived().RebuildQualifiedType(Result, T);
4710 
4711   if (Result.isNull())
4712     return QualType();
4713 
4714   // RebuildQualifiedType might have updated the type, but not in a way
4715   // that invalidates the TypeLoc. (There's no location information for
4716   // qualifiers.)
4717   TLB.TypeWasModifiedSafely(Result);
4718 
4719   return Result;
4720 }
4721 
4722 template <typename Derived>
4723 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4724                                                       QualifiedTypeLoc TL) {
4725 
4726   SourceLocation Loc = TL.getBeginLoc();
4727   Qualifiers Quals = TL.getType().getLocalQualifiers();
4728 
4729   if (((T.getAddressSpace() != LangAS::Default &&
4730         Quals.getAddressSpace() != LangAS::Default)) &&
4731       T.getAddressSpace() != Quals.getAddressSpace()) {
4732     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4733         << TL.getType() << T;
4734     return QualType();
4735   }
4736 
4737   // C++ [dcl.fct]p7:
4738   //   [When] adding cv-qualifications on top of the function type [...] the
4739   //   cv-qualifiers are ignored.
4740   if (T->isFunctionType()) {
4741     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4742                                                      Quals.getAddressSpace());
4743     return T;
4744   }
4745 
4746   // C++ [dcl.ref]p1:
4747   //   when the cv-qualifiers are introduced through the use of a typedef-name
4748   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4749   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4750   // applied to a reference type.
4751   if (T->isReferenceType()) {
4752     // The only qualifier that applies to a reference type is restrict.
4753     if (!Quals.hasRestrict())
4754       return T;
4755     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4756   }
4757 
4758   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4759   // resulting type.
4760   if (Quals.hasObjCLifetime()) {
4761     if (!T->isObjCLifetimeType() && !T->isDependentType())
4762       Quals.removeObjCLifetime();
4763     else if (T.getObjCLifetime()) {
4764       // Objective-C ARC:
4765       //   A lifetime qualifier applied to a substituted template parameter
4766       //   overrides the lifetime qualifier from the template argument.
4767       const AutoType *AutoTy;
4768       if (const SubstTemplateTypeParmType *SubstTypeParam
4769                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4770         QualType Replacement = SubstTypeParam->getReplacementType();
4771         Qualifiers Qs = Replacement.getQualifiers();
4772         Qs.removeObjCLifetime();
4773         Replacement = SemaRef.Context.getQualifiedType(
4774             Replacement.getUnqualifiedType(), Qs);
4775         T = SemaRef.Context.getSubstTemplateTypeParmType(
4776             SubstTypeParam->getReplacedParameter(), Replacement);
4777       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4778         // 'auto' types behave the same way as template parameters.
4779         QualType Deduced = AutoTy->getDeducedType();
4780         Qualifiers Qs = Deduced.getQualifiers();
4781         Qs.removeObjCLifetime();
4782         Deduced =
4783             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4784         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4785                                         AutoTy->isDependentType(),
4786                                         /*isPack=*/false,
4787                                         AutoTy->getTypeConstraintConcept(),
4788                                         AutoTy->getTypeConstraintArguments());
4789       } else {
4790         // Otherwise, complain about the addition of a qualifier to an
4791         // already-qualified type.
4792         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4793         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4794         Quals.removeObjCLifetime();
4795       }
4796     }
4797   }
4798 
4799   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4800 }
4801 
4802 template<typename Derived>
4803 TypeLoc
4804 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4805                                                    QualType ObjectType,
4806                                                    NamedDecl *UnqualLookup,
4807                                                    CXXScopeSpec &SS) {
4808   if (getDerived().AlreadyTransformed(TL.getType()))
4809     return TL;
4810 
4811   TypeSourceInfo *TSI =
4812       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4813   if (TSI)
4814     return TSI->getTypeLoc();
4815   return TypeLoc();
4816 }
4817 
4818 template<typename Derived>
4819 TypeSourceInfo *
4820 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4821                                                    QualType ObjectType,
4822                                                    NamedDecl *UnqualLookup,
4823                                                    CXXScopeSpec &SS) {
4824   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4825     return TSInfo;
4826 
4827   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4828                                    UnqualLookup, SS);
4829 }
4830 
4831 template <typename Derived>
4832 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4833     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4834     CXXScopeSpec &SS) {
4835   QualType T = TL.getType();
4836   assert(!getDerived().AlreadyTransformed(T));
4837 
4838   TypeLocBuilder TLB;
4839   QualType Result;
4840 
4841   if (isa<TemplateSpecializationType>(T)) {
4842     TemplateSpecializationTypeLoc SpecTL =
4843         TL.castAs<TemplateSpecializationTypeLoc>();
4844 
4845     TemplateName Template = getDerived().TransformTemplateName(
4846         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4847         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4848     if (Template.isNull())
4849       return nullptr;
4850 
4851     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4852                                                               Template);
4853   } else if (isa<DependentTemplateSpecializationType>(T)) {
4854     DependentTemplateSpecializationTypeLoc SpecTL =
4855         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4856 
4857     TemplateName Template
4858       = getDerived().RebuildTemplateName(SS,
4859                                          SpecTL.getTemplateKeywordLoc(),
4860                                          *SpecTL.getTypePtr()->getIdentifier(),
4861                                          SpecTL.getTemplateNameLoc(),
4862                                          ObjectType, UnqualLookup,
4863                                          /*AllowInjectedClassName*/true);
4864     if (Template.isNull())
4865       return nullptr;
4866 
4867     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4868                                                                        SpecTL,
4869                                                                        Template,
4870                                                                        SS);
4871   } else {
4872     // Nothing special needs to be done for these.
4873     Result = getDerived().TransformType(TLB, TL);
4874   }
4875 
4876   if (Result.isNull())
4877     return nullptr;
4878 
4879   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4880 }
4881 
4882 template <class TyLoc> static inline
4883 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4884   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4885   NewT.setNameLoc(T.getNameLoc());
4886   return T.getType();
4887 }
4888 
4889 template<typename Derived>
4890 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4891                                                       BuiltinTypeLoc T) {
4892   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4893   NewT.setBuiltinLoc(T.getBuiltinLoc());
4894   if (T.needsExtraLocalData())
4895     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4896   return T.getType();
4897 }
4898 
4899 template<typename Derived>
4900 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4901                                                       ComplexTypeLoc T) {
4902   // FIXME: recurse?
4903   return TransformTypeSpecType(TLB, T);
4904 }
4905 
4906 template <typename Derived>
4907 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4908                                                        AdjustedTypeLoc TL) {
4909   // Adjustments applied during transformation are handled elsewhere.
4910   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4911 }
4912 
4913 template<typename Derived>
4914 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4915                                                       DecayedTypeLoc TL) {
4916   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4917   if (OriginalType.isNull())
4918     return QualType();
4919 
4920   QualType Result = TL.getType();
4921   if (getDerived().AlwaysRebuild() ||
4922       OriginalType != TL.getOriginalLoc().getType())
4923     Result = SemaRef.Context.getDecayedType(OriginalType);
4924   TLB.push<DecayedTypeLoc>(Result);
4925   // Nothing to set for DecayedTypeLoc.
4926   return Result;
4927 }
4928 
4929 template<typename Derived>
4930 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4931                                                       PointerTypeLoc TL) {
4932   QualType PointeeType
4933     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4934   if (PointeeType.isNull())
4935     return QualType();
4936 
4937   QualType Result = TL.getType();
4938   if (PointeeType->getAs<ObjCObjectType>()) {
4939     // A dependent pointer type 'T *' has is being transformed such
4940     // that an Objective-C class type is being replaced for 'T'. The
4941     // resulting pointer type is an ObjCObjectPointerType, not a
4942     // PointerType.
4943     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4944 
4945     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4946     NewT.setStarLoc(TL.getStarLoc());
4947     return Result;
4948   }
4949 
4950   if (getDerived().AlwaysRebuild() ||
4951       PointeeType != TL.getPointeeLoc().getType()) {
4952     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4953     if (Result.isNull())
4954       return QualType();
4955   }
4956 
4957   // Objective-C ARC can add lifetime qualifiers to the type that we're
4958   // pointing to.
4959   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4960 
4961   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4962   NewT.setSigilLoc(TL.getSigilLoc());
4963   return Result;
4964 }
4965 
4966 template<typename Derived>
4967 QualType
4968 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4969                                                   BlockPointerTypeLoc TL) {
4970   QualType PointeeType
4971     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4972   if (PointeeType.isNull())
4973     return QualType();
4974 
4975   QualType Result = TL.getType();
4976   if (getDerived().AlwaysRebuild() ||
4977       PointeeType != TL.getPointeeLoc().getType()) {
4978     Result = getDerived().RebuildBlockPointerType(PointeeType,
4979                                                   TL.getSigilLoc());
4980     if (Result.isNull())
4981       return QualType();
4982   }
4983 
4984   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4985   NewT.setSigilLoc(TL.getSigilLoc());
4986   return Result;
4987 }
4988 
4989 /// Transforms a reference type.  Note that somewhat paradoxically we
4990 /// don't care whether the type itself is an l-value type or an r-value
4991 /// type;  we only care if the type was *written* as an l-value type
4992 /// or an r-value type.
4993 template<typename Derived>
4994 QualType
4995 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4996                                                ReferenceTypeLoc TL) {
4997   const ReferenceType *T = TL.getTypePtr();
4998 
4999   // Note that this works with the pointee-as-written.
5000   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5001   if (PointeeType.isNull())
5002     return QualType();
5003 
5004   QualType Result = TL.getType();
5005   if (getDerived().AlwaysRebuild() ||
5006       PointeeType != T->getPointeeTypeAsWritten()) {
5007     Result = getDerived().RebuildReferenceType(PointeeType,
5008                                                T->isSpelledAsLValue(),
5009                                                TL.getSigilLoc());
5010     if (Result.isNull())
5011       return QualType();
5012   }
5013 
5014   // Objective-C ARC can add lifetime qualifiers to the type that we're
5015   // referring to.
5016   TLB.TypeWasModifiedSafely(
5017       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5018 
5019   // r-value references can be rebuilt as l-value references.
5020   ReferenceTypeLoc NewTL;
5021   if (isa<LValueReferenceType>(Result))
5022     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5023   else
5024     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5025   NewTL.setSigilLoc(TL.getSigilLoc());
5026 
5027   return Result;
5028 }
5029 
5030 template<typename Derived>
5031 QualType
5032 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5033                                                  LValueReferenceTypeLoc TL) {
5034   return TransformReferenceType(TLB, TL);
5035 }
5036 
5037 template<typename Derived>
5038 QualType
5039 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5040                                                  RValueReferenceTypeLoc TL) {
5041   return TransformReferenceType(TLB, TL);
5042 }
5043 
5044 template<typename Derived>
5045 QualType
5046 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5047                                                    MemberPointerTypeLoc TL) {
5048   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5049   if (PointeeType.isNull())
5050     return QualType();
5051 
5052   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5053   TypeSourceInfo *NewClsTInfo = nullptr;
5054   if (OldClsTInfo) {
5055     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5056     if (!NewClsTInfo)
5057       return QualType();
5058   }
5059 
5060   const MemberPointerType *T = TL.getTypePtr();
5061   QualType OldClsType = QualType(T->getClass(), 0);
5062   QualType NewClsType;
5063   if (NewClsTInfo)
5064     NewClsType = NewClsTInfo->getType();
5065   else {
5066     NewClsType = getDerived().TransformType(OldClsType);
5067     if (NewClsType.isNull())
5068       return QualType();
5069   }
5070 
5071   QualType Result = TL.getType();
5072   if (getDerived().AlwaysRebuild() ||
5073       PointeeType != T->getPointeeType() ||
5074       NewClsType != OldClsType) {
5075     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5076                                                    TL.getStarLoc());
5077     if (Result.isNull())
5078       return QualType();
5079   }
5080 
5081   // If we had to adjust the pointee type when building a member pointer, make
5082   // sure to push TypeLoc info for it.
5083   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5084   if (MPT && PointeeType != MPT->getPointeeType()) {
5085     assert(isa<AdjustedType>(MPT->getPointeeType()));
5086     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5087   }
5088 
5089   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5090   NewTL.setSigilLoc(TL.getSigilLoc());
5091   NewTL.setClassTInfo(NewClsTInfo);
5092 
5093   return Result;
5094 }
5095 
5096 template<typename Derived>
5097 QualType
5098 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5099                                                    ConstantArrayTypeLoc TL) {
5100   const ConstantArrayType *T = TL.getTypePtr();
5101   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5102   if (ElementType.isNull())
5103     return QualType();
5104 
5105   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5106   Expr *OldSize = TL.getSizeExpr();
5107   if (!OldSize)
5108     OldSize = const_cast<Expr*>(T->getSizeExpr());
5109   Expr *NewSize = nullptr;
5110   if (OldSize) {
5111     EnterExpressionEvaluationContext Unevaluated(
5112         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5113     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5114     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5115   }
5116 
5117   QualType Result = TL.getType();
5118   if (getDerived().AlwaysRebuild() ||
5119       ElementType != T->getElementType() ||
5120       (T->getSizeExpr() && NewSize != OldSize)) {
5121     Result = getDerived().RebuildConstantArrayType(ElementType,
5122                                                    T->getSizeModifier(),
5123                                                    T->getSize(), NewSize,
5124                                              T->getIndexTypeCVRQualifiers(),
5125                                                    TL.getBracketsRange());
5126     if (Result.isNull())
5127       return QualType();
5128   }
5129 
5130   // We might have either a ConstantArrayType or a VariableArrayType now:
5131   // a ConstantArrayType is allowed to have an element type which is a
5132   // VariableArrayType if the type is dependent.  Fortunately, all array
5133   // types have the same location layout.
5134   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5135   NewTL.setLBracketLoc(TL.getLBracketLoc());
5136   NewTL.setRBracketLoc(TL.getRBracketLoc());
5137   NewTL.setSizeExpr(NewSize);
5138 
5139   return Result;
5140 }
5141 
5142 template<typename Derived>
5143 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5144                                               TypeLocBuilder &TLB,
5145                                               IncompleteArrayTypeLoc TL) {
5146   const IncompleteArrayType *T = TL.getTypePtr();
5147   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5148   if (ElementType.isNull())
5149     return QualType();
5150 
5151   QualType Result = TL.getType();
5152   if (getDerived().AlwaysRebuild() ||
5153       ElementType != T->getElementType()) {
5154     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5155                                                      T->getSizeModifier(),
5156                                            T->getIndexTypeCVRQualifiers(),
5157                                                      TL.getBracketsRange());
5158     if (Result.isNull())
5159       return QualType();
5160   }
5161 
5162   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5163   NewTL.setLBracketLoc(TL.getLBracketLoc());
5164   NewTL.setRBracketLoc(TL.getRBracketLoc());
5165   NewTL.setSizeExpr(nullptr);
5166 
5167   return Result;
5168 }
5169 
5170 template<typename Derived>
5171 QualType
5172 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5173                                                    VariableArrayTypeLoc TL) {
5174   const VariableArrayType *T = TL.getTypePtr();
5175   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5176   if (ElementType.isNull())
5177     return QualType();
5178 
5179   ExprResult SizeResult;
5180   {
5181     EnterExpressionEvaluationContext Context(
5182         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5183     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5184   }
5185   if (SizeResult.isInvalid())
5186     return QualType();
5187   SizeResult =
5188       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5189   if (SizeResult.isInvalid())
5190     return QualType();
5191 
5192   Expr *Size = SizeResult.get();
5193 
5194   QualType Result = TL.getType();
5195   if (getDerived().AlwaysRebuild() ||
5196       ElementType != T->getElementType() ||
5197       Size != T->getSizeExpr()) {
5198     Result = getDerived().RebuildVariableArrayType(ElementType,
5199                                                    T->getSizeModifier(),
5200                                                    Size,
5201                                              T->getIndexTypeCVRQualifiers(),
5202                                                    TL.getBracketsRange());
5203     if (Result.isNull())
5204       return QualType();
5205   }
5206 
5207   // We might have constant size array now, but fortunately it has the same
5208   // location layout.
5209   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5210   NewTL.setLBracketLoc(TL.getLBracketLoc());
5211   NewTL.setRBracketLoc(TL.getRBracketLoc());
5212   NewTL.setSizeExpr(Size);
5213 
5214   return Result;
5215 }
5216 
5217 template<typename Derived>
5218 QualType
5219 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5220                                              DependentSizedArrayTypeLoc TL) {
5221   const DependentSizedArrayType *T = TL.getTypePtr();
5222   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5223   if (ElementType.isNull())
5224     return QualType();
5225 
5226   // Array bounds are constant expressions.
5227   EnterExpressionEvaluationContext Unevaluated(
5228       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5229 
5230   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5231   Expr *origSize = TL.getSizeExpr();
5232   if (!origSize) origSize = T->getSizeExpr();
5233 
5234   ExprResult sizeResult
5235     = getDerived().TransformExpr(origSize);
5236   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5237   if (sizeResult.isInvalid())
5238     return QualType();
5239 
5240   Expr *size = sizeResult.get();
5241 
5242   QualType Result = TL.getType();
5243   if (getDerived().AlwaysRebuild() ||
5244       ElementType != T->getElementType() ||
5245       size != origSize) {
5246     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5247                                                          T->getSizeModifier(),
5248                                                          size,
5249                                                 T->getIndexTypeCVRQualifiers(),
5250                                                         TL.getBracketsRange());
5251     if (Result.isNull())
5252       return QualType();
5253   }
5254 
5255   // We might have any sort of array type now, but fortunately they
5256   // all have the same location layout.
5257   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5258   NewTL.setLBracketLoc(TL.getLBracketLoc());
5259   NewTL.setRBracketLoc(TL.getRBracketLoc());
5260   NewTL.setSizeExpr(size);
5261 
5262   return Result;
5263 }
5264 
5265 template <typename Derived>
5266 QualType TreeTransform<Derived>::TransformDependentVectorType(
5267     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5268   const DependentVectorType *T = TL.getTypePtr();
5269   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5270   if (ElementType.isNull())
5271     return QualType();
5272 
5273   EnterExpressionEvaluationContext Unevaluated(
5274       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5275 
5276   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5277   Size = SemaRef.ActOnConstantExpression(Size);
5278   if (Size.isInvalid())
5279     return QualType();
5280 
5281   QualType Result = TL.getType();
5282   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5283       Size.get() != T->getSizeExpr()) {
5284     Result = getDerived().RebuildDependentVectorType(
5285         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5286     if (Result.isNull())
5287       return QualType();
5288   }
5289 
5290   // Result might be dependent or not.
5291   if (isa<DependentVectorType>(Result)) {
5292     DependentVectorTypeLoc NewTL =
5293         TLB.push<DependentVectorTypeLoc>(Result);
5294     NewTL.setNameLoc(TL.getNameLoc());
5295   } else {
5296     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5297     NewTL.setNameLoc(TL.getNameLoc());
5298   }
5299 
5300   return Result;
5301 }
5302 
5303 template<typename Derived>
5304 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5305                                       TypeLocBuilder &TLB,
5306                                       DependentSizedExtVectorTypeLoc TL) {
5307   const DependentSizedExtVectorType *T = TL.getTypePtr();
5308 
5309   // FIXME: ext vector locs should be nested
5310   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5311   if (ElementType.isNull())
5312     return QualType();
5313 
5314   // Vector sizes are constant expressions.
5315   EnterExpressionEvaluationContext Unevaluated(
5316       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5317 
5318   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5319   Size = SemaRef.ActOnConstantExpression(Size);
5320   if (Size.isInvalid())
5321     return QualType();
5322 
5323   QualType Result = TL.getType();
5324   if (getDerived().AlwaysRebuild() ||
5325       ElementType != T->getElementType() ||
5326       Size.get() != T->getSizeExpr()) {
5327     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5328                                                              Size.get(),
5329                                                          T->getAttributeLoc());
5330     if (Result.isNull())
5331       return QualType();
5332   }
5333 
5334   // Result might be dependent or not.
5335   if (isa<DependentSizedExtVectorType>(Result)) {
5336     DependentSizedExtVectorTypeLoc NewTL
5337       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5338     NewTL.setNameLoc(TL.getNameLoc());
5339   } else {
5340     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5341     NewTL.setNameLoc(TL.getNameLoc());
5342   }
5343 
5344   return Result;
5345 }
5346 
5347 template <typename Derived>
5348 QualType
5349 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5350                                                     ConstantMatrixTypeLoc TL) {
5351   const ConstantMatrixType *T = TL.getTypePtr();
5352   QualType ElementType = getDerived().TransformType(T->getElementType());
5353   if (ElementType.isNull())
5354     return QualType();
5355 
5356   QualType Result = TL.getType();
5357   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5358     Result = getDerived().RebuildConstantMatrixType(
5359         ElementType, T->getNumRows(), T->getNumColumns());
5360     if (Result.isNull())
5361       return QualType();
5362   }
5363 
5364   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5365   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5366   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5367   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5368   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5369 
5370   return Result;
5371 }
5372 
5373 template <typename Derived>
5374 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5375     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5376   const DependentSizedMatrixType *T = TL.getTypePtr();
5377 
5378   QualType ElementType = getDerived().TransformType(T->getElementType());
5379   if (ElementType.isNull()) {
5380     return QualType();
5381   }
5382 
5383   // Matrix dimensions are constant expressions.
5384   EnterExpressionEvaluationContext Unevaluated(
5385       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5386 
5387   Expr *origRows = TL.getAttrRowOperand();
5388   if (!origRows)
5389     origRows = T->getRowExpr();
5390   Expr *origColumns = TL.getAttrColumnOperand();
5391   if (!origColumns)
5392     origColumns = T->getColumnExpr();
5393 
5394   ExprResult rowResult = getDerived().TransformExpr(origRows);
5395   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5396   if (rowResult.isInvalid())
5397     return QualType();
5398 
5399   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5400   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5401   if (columnResult.isInvalid())
5402     return QualType();
5403 
5404   Expr *rows = rowResult.get();
5405   Expr *columns = columnResult.get();
5406 
5407   QualType Result = TL.getType();
5408   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5409       rows != origRows || columns != origColumns) {
5410     Result = getDerived().RebuildDependentSizedMatrixType(
5411         ElementType, rows, columns, T->getAttributeLoc());
5412 
5413     if (Result.isNull())
5414       return QualType();
5415   }
5416 
5417   // We might have any sort of matrix type now, but fortunately they
5418   // all have the same location layout.
5419   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5420   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5421   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5422   NewTL.setAttrRowOperand(rows);
5423   NewTL.setAttrColumnOperand(columns);
5424   return Result;
5425 }
5426 
5427 template <typename Derived>
5428 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5429     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5430   const DependentAddressSpaceType *T = TL.getTypePtr();
5431 
5432   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5433 
5434   if (pointeeType.isNull())
5435     return QualType();
5436 
5437   // Address spaces are constant expressions.
5438   EnterExpressionEvaluationContext Unevaluated(
5439       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5440 
5441   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5442   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5443   if (AddrSpace.isInvalid())
5444     return QualType();
5445 
5446   QualType Result = TL.getType();
5447   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5448       AddrSpace.get() != T->getAddrSpaceExpr()) {
5449     Result = getDerived().RebuildDependentAddressSpaceType(
5450         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5451     if (Result.isNull())
5452       return QualType();
5453   }
5454 
5455   // Result might be dependent or not.
5456   if (isa<DependentAddressSpaceType>(Result)) {
5457     DependentAddressSpaceTypeLoc NewTL =
5458         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5459 
5460     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5461     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5462     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5463 
5464   } else {
5465     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5466         Result, getDerived().getBaseLocation());
5467     TransformType(TLB, DI->getTypeLoc());
5468   }
5469 
5470   return Result;
5471 }
5472 
5473 template <typename Derived>
5474 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5475                                                      VectorTypeLoc TL) {
5476   const VectorType *T = TL.getTypePtr();
5477   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5478   if (ElementType.isNull())
5479     return QualType();
5480 
5481   QualType Result = TL.getType();
5482   if (getDerived().AlwaysRebuild() ||
5483       ElementType != T->getElementType()) {
5484     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5485                                             T->getVectorKind());
5486     if (Result.isNull())
5487       return QualType();
5488   }
5489 
5490   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5491   NewTL.setNameLoc(TL.getNameLoc());
5492 
5493   return Result;
5494 }
5495 
5496 template<typename Derived>
5497 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5498                                                         ExtVectorTypeLoc TL) {
5499   const VectorType *T = TL.getTypePtr();
5500   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5501   if (ElementType.isNull())
5502     return QualType();
5503 
5504   QualType Result = TL.getType();
5505   if (getDerived().AlwaysRebuild() ||
5506       ElementType != T->getElementType()) {
5507     Result = getDerived().RebuildExtVectorType(ElementType,
5508                                                T->getNumElements(),
5509                                                /*FIXME*/ SourceLocation());
5510     if (Result.isNull())
5511       return QualType();
5512   }
5513 
5514   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5515   NewTL.setNameLoc(TL.getNameLoc());
5516 
5517   return Result;
5518 }
5519 
5520 template <typename Derived>
5521 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5522     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5523     bool ExpectParameterPack) {
5524   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5525   TypeSourceInfo *NewDI = nullptr;
5526 
5527   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5528     // If we're substituting into a pack expansion type and we know the
5529     // length we want to expand to, just substitute for the pattern.
5530     TypeLoc OldTL = OldDI->getTypeLoc();
5531     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5532 
5533     TypeLocBuilder TLB;
5534     TypeLoc NewTL = OldDI->getTypeLoc();
5535     TLB.reserve(NewTL.getFullDataSize());
5536 
5537     QualType Result = getDerived().TransformType(TLB,
5538                                                OldExpansionTL.getPatternLoc());
5539     if (Result.isNull())
5540       return nullptr;
5541 
5542     Result = RebuildPackExpansionType(Result,
5543                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5544                                       OldExpansionTL.getEllipsisLoc(),
5545                                       NumExpansions);
5546     if (Result.isNull())
5547       return nullptr;
5548 
5549     PackExpansionTypeLoc NewExpansionTL
5550       = TLB.push<PackExpansionTypeLoc>(Result);
5551     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5552     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5553   } else
5554     NewDI = getDerived().TransformType(OldDI);
5555   if (!NewDI)
5556     return nullptr;
5557 
5558   if (NewDI == OldDI && indexAdjustment == 0)
5559     return OldParm;
5560 
5561   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5562                                              OldParm->getDeclContext(),
5563                                              OldParm->getInnerLocStart(),
5564                                              OldParm->getLocation(),
5565                                              OldParm->getIdentifier(),
5566                                              NewDI->getType(),
5567                                              NewDI,
5568                                              OldParm->getStorageClass(),
5569                                              /* DefArg */ nullptr);
5570   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5571                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5572   transformedLocalDecl(OldParm, {newParm});
5573   return newParm;
5574 }
5575 
5576 template <typename Derived>
5577 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5578     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5579     const QualType *ParamTypes,
5580     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5581     SmallVectorImpl<QualType> &OutParamTypes,
5582     SmallVectorImpl<ParmVarDecl *> *PVars,
5583     Sema::ExtParameterInfoBuilder &PInfos) {
5584   int indexAdjustment = 0;
5585 
5586   unsigned NumParams = Params.size();
5587   for (unsigned i = 0; i != NumParams; ++i) {
5588     if (ParmVarDecl *OldParm = Params[i]) {
5589       assert(OldParm->getFunctionScopeIndex() == i);
5590 
5591       Optional<unsigned> NumExpansions;
5592       ParmVarDecl *NewParm = nullptr;
5593       if (OldParm->isParameterPack()) {
5594         // We have a function parameter pack that may need to be expanded.
5595         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5596 
5597         // Find the parameter packs that could be expanded.
5598         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5599         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5600         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5601         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5602 
5603         // Determine whether we should expand the parameter packs.
5604         bool ShouldExpand = false;
5605         bool RetainExpansion = false;
5606         Optional<unsigned> OrigNumExpansions;
5607         if (Unexpanded.size() > 0) {
5608           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5609           NumExpansions = OrigNumExpansions;
5610           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5611                                                    Pattern.getSourceRange(),
5612                                                    Unexpanded,
5613                                                    ShouldExpand,
5614                                                    RetainExpansion,
5615                                                    NumExpansions)) {
5616             return true;
5617           }
5618         } else {
5619 #ifndef NDEBUG
5620           const AutoType *AT =
5621               Pattern.getType().getTypePtr()->getContainedAutoType();
5622           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5623                  "Could not find parameter packs or undeduced auto type!");
5624 #endif
5625         }
5626 
5627         if (ShouldExpand) {
5628           // Expand the function parameter pack into multiple, separate
5629           // parameters.
5630           getDerived().ExpandingFunctionParameterPack(OldParm);
5631           for (unsigned I = 0; I != *NumExpansions; ++I) {
5632             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5633             ParmVarDecl *NewParm
5634               = getDerived().TransformFunctionTypeParam(OldParm,
5635                                                         indexAdjustment++,
5636                                                         OrigNumExpansions,
5637                                                 /*ExpectParameterPack=*/false);
5638             if (!NewParm)
5639               return true;
5640 
5641             if (ParamInfos)
5642               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5643             OutParamTypes.push_back(NewParm->getType());
5644             if (PVars)
5645               PVars->push_back(NewParm);
5646           }
5647 
5648           // If we're supposed to retain a pack expansion, do so by temporarily
5649           // forgetting the partially-substituted parameter pack.
5650           if (RetainExpansion) {
5651             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5652             ParmVarDecl *NewParm
5653               = getDerived().TransformFunctionTypeParam(OldParm,
5654                                                         indexAdjustment++,
5655                                                         OrigNumExpansions,
5656                                                 /*ExpectParameterPack=*/false);
5657             if (!NewParm)
5658               return true;
5659 
5660             if (ParamInfos)
5661               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5662             OutParamTypes.push_back(NewParm->getType());
5663             if (PVars)
5664               PVars->push_back(NewParm);
5665           }
5666 
5667           // The next parameter should have the same adjustment as the
5668           // last thing we pushed, but we post-incremented indexAdjustment
5669           // on every push.  Also, if we push nothing, the adjustment should
5670           // go down by one.
5671           indexAdjustment--;
5672 
5673           // We're done with the pack expansion.
5674           continue;
5675         }
5676 
5677         // We'll substitute the parameter now without expanding the pack
5678         // expansion.
5679         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5680         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5681                                                           indexAdjustment,
5682                                                           NumExpansions,
5683                                                   /*ExpectParameterPack=*/true);
5684         assert(NewParm->isParameterPack() &&
5685                "Parameter pack no longer a parameter pack after "
5686                "transformation.");
5687       } else {
5688         NewParm = getDerived().TransformFunctionTypeParam(
5689             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5690       }
5691 
5692       if (!NewParm)
5693         return true;
5694 
5695       if (ParamInfos)
5696         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5697       OutParamTypes.push_back(NewParm->getType());
5698       if (PVars)
5699         PVars->push_back(NewParm);
5700       continue;
5701     }
5702 
5703     // Deal with the possibility that we don't have a parameter
5704     // declaration for this parameter.
5705     QualType OldType = ParamTypes[i];
5706     bool IsPackExpansion = false;
5707     Optional<unsigned> NumExpansions;
5708     QualType NewType;
5709     if (const PackExpansionType *Expansion
5710                                        = dyn_cast<PackExpansionType>(OldType)) {
5711       // We have a function parameter pack that may need to be expanded.
5712       QualType Pattern = Expansion->getPattern();
5713       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5714       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5715 
5716       // Determine whether we should expand the parameter packs.
5717       bool ShouldExpand = false;
5718       bool RetainExpansion = false;
5719       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5720                                                Unexpanded,
5721                                                ShouldExpand,
5722                                                RetainExpansion,
5723                                                NumExpansions)) {
5724         return true;
5725       }
5726 
5727       if (ShouldExpand) {
5728         // Expand the function parameter pack into multiple, separate
5729         // parameters.
5730         for (unsigned I = 0; I != *NumExpansions; ++I) {
5731           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5732           QualType NewType = getDerived().TransformType(Pattern);
5733           if (NewType.isNull())
5734             return true;
5735 
5736           if (NewType->containsUnexpandedParameterPack()) {
5737             NewType =
5738                 getSema().getASTContext().getPackExpansionType(NewType, None);
5739 
5740             if (NewType.isNull())
5741               return true;
5742           }
5743 
5744           if (ParamInfos)
5745             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5746           OutParamTypes.push_back(NewType);
5747           if (PVars)
5748             PVars->push_back(nullptr);
5749         }
5750 
5751         // We're done with the pack expansion.
5752         continue;
5753       }
5754 
5755       // If we're supposed to retain a pack expansion, do so by temporarily
5756       // forgetting the partially-substituted parameter pack.
5757       if (RetainExpansion) {
5758         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5759         QualType NewType = getDerived().TransformType(Pattern);
5760         if (NewType.isNull())
5761           return true;
5762 
5763         if (ParamInfos)
5764           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5765         OutParamTypes.push_back(NewType);
5766         if (PVars)
5767           PVars->push_back(nullptr);
5768       }
5769 
5770       // We'll substitute the parameter now without expanding the pack
5771       // expansion.
5772       OldType = Expansion->getPattern();
5773       IsPackExpansion = true;
5774       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5775       NewType = getDerived().TransformType(OldType);
5776     } else {
5777       NewType = getDerived().TransformType(OldType);
5778     }
5779 
5780     if (NewType.isNull())
5781       return true;
5782 
5783     if (IsPackExpansion)
5784       NewType = getSema().Context.getPackExpansionType(NewType,
5785                                                        NumExpansions);
5786 
5787     if (ParamInfos)
5788       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5789     OutParamTypes.push_back(NewType);
5790     if (PVars)
5791       PVars->push_back(nullptr);
5792   }
5793 
5794 #ifndef NDEBUG
5795   if (PVars) {
5796     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5797       if (ParmVarDecl *parm = (*PVars)[i])
5798         assert(parm->getFunctionScopeIndex() == i);
5799   }
5800 #endif
5801 
5802   return false;
5803 }
5804 
5805 template<typename Derived>
5806 QualType
5807 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5808                                                    FunctionProtoTypeLoc TL) {
5809   SmallVector<QualType, 4> ExceptionStorage;
5810   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5811   return getDerived().TransformFunctionProtoType(
5812       TLB, TL, nullptr, Qualifiers(),
5813       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5814         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5815                                             ExceptionStorage, Changed);
5816       });
5817 }
5818 
5819 template<typename Derived> template<typename Fn>
5820 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5821     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5822     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5823 
5824   // Transform the parameters and return type.
5825   //
5826   // We are required to instantiate the params and return type in source order.
5827   // When the function has a trailing return type, we instantiate the
5828   // parameters before the return type,  since the return type can then refer
5829   // to the parameters themselves (via decltype, sizeof, etc.).
5830   //
5831   SmallVector<QualType, 4> ParamTypes;
5832   SmallVector<ParmVarDecl*, 4> ParamDecls;
5833   Sema::ExtParameterInfoBuilder ExtParamInfos;
5834   const FunctionProtoType *T = TL.getTypePtr();
5835 
5836   QualType ResultType;
5837 
5838   if (T->hasTrailingReturn()) {
5839     if (getDerived().TransformFunctionTypeParams(
5840             TL.getBeginLoc(), TL.getParams(),
5841             TL.getTypePtr()->param_type_begin(),
5842             T->getExtParameterInfosOrNull(),
5843             ParamTypes, &ParamDecls, ExtParamInfos))
5844       return QualType();
5845 
5846     {
5847       // C++11 [expr.prim.general]p3:
5848       //   If a declaration declares a member function or member function
5849       //   template of a class X, the expression this is a prvalue of type
5850       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5851       //   and the end of the function-definition, member-declarator, or
5852       //   declarator.
5853       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5854 
5855       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5856       if (ResultType.isNull())
5857         return QualType();
5858     }
5859   }
5860   else {
5861     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5862     if (ResultType.isNull())
5863       return QualType();
5864 
5865     if (getDerived().TransformFunctionTypeParams(
5866             TL.getBeginLoc(), TL.getParams(),
5867             TL.getTypePtr()->param_type_begin(),
5868             T->getExtParameterInfosOrNull(),
5869             ParamTypes, &ParamDecls, ExtParamInfos))
5870       return QualType();
5871   }
5872 
5873   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5874 
5875   bool EPIChanged = false;
5876   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5877     return QualType();
5878 
5879   // Handle extended parameter information.
5880   if (auto NewExtParamInfos =
5881         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5882     if (!EPI.ExtParameterInfos ||
5883         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5884           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5885       EPIChanged = true;
5886     }
5887     EPI.ExtParameterInfos = NewExtParamInfos;
5888   } else if (EPI.ExtParameterInfos) {
5889     EPIChanged = true;
5890     EPI.ExtParameterInfos = nullptr;
5891   }
5892 
5893   QualType Result = TL.getType();
5894   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5895       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5896     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5897     if (Result.isNull())
5898       return QualType();
5899   }
5900 
5901   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5902   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5903   NewTL.setLParenLoc(TL.getLParenLoc());
5904   NewTL.setRParenLoc(TL.getRParenLoc());
5905   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5906   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5907   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5908     NewTL.setParam(i, ParamDecls[i]);
5909 
5910   return Result;
5911 }
5912 
5913 template<typename Derived>
5914 bool TreeTransform<Derived>::TransformExceptionSpec(
5915     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5916     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5917   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5918 
5919   // Instantiate a dynamic noexcept expression, if any.
5920   if (isComputedNoexcept(ESI.Type)) {
5921     EnterExpressionEvaluationContext Unevaluated(
5922         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5923     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5924     if (NoexceptExpr.isInvalid())
5925       return true;
5926 
5927     ExceptionSpecificationType EST = ESI.Type;
5928     NoexceptExpr =
5929         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5930     if (NoexceptExpr.isInvalid())
5931       return true;
5932 
5933     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5934       Changed = true;
5935     ESI.NoexceptExpr = NoexceptExpr.get();
5936     ESI.Type = EST;
5937   }
5938 
5939   if (ESI.Type != EST_Dynamic)
5940     return false;
5941 
5942   // Instantiate a dynamic exception specification's type.
5943   for (QualType T : ESI.Exceptions) {
5944     if (const PackExpansionType *PackExpansion =
5945             T->getAs<PackExpansionType>()) {
5946       Changed = true;
5947 
5948       // We have a pack expansion. Instantiate it.
5949       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5950       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5951                                               Unexpanded);
5952       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5953 
5954       // Determine whether the set of unexpanded parameter packs can and
5955       // should
5956       // be expanded.
5957       bool Expand = false;
5958       bool RetainExpansion = false;
5959       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5960       // FIXME: Track the location of the ellipsis (and track source location
5961       // information for the types in the exception specification in general).
5962       if (getDerived().TryExpandParameterPacks(
5963               Loc, SourceRange(), Unexpanded, Expand,
5964               RetainExpansion, NumExpansions))
5965         return true;
5966 
5967       if (!Expand) {
5968         // We can't expand this pack expansion into separate arguments yet;
5969         // just substitute into the pattern and create a new pack expansion
5970         // type.
5971         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5972         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5973         if (U.isNull())
5974           return true;
5975 
5976         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5977         Exceptions.push_back(U);
5978         continue;
5979       }
5980 
5981       // Substitute into the pack expansion pattern for each slice of the
5982       // pack.
5983       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5984         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5985 
5986         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5987         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5988           return true;
5989 
5990         Exceptions.push_back(U);
5991       }
5992     } else {
5993       QualType U = getDerived().TransformType(T);
5994       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5995         return true;
5996       if (T != U)
5997         Changed = true;
5998 
5999       Exceptions.push_back(U);
6000     }
6001   }
6002 
6003   ESI.Exceptions = Exceptions;
6004   if (ESI.Exceptions.empty())
6005     ESI.Type = EST_DynamicNone;
6006   return false;
6007 }
6008 
6009 template<typename Derived>
6010 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6011                                                  TypeLocBuilder &TLB,
6012                                                  FunctionNoProtoTypeLoc TL) {
6013   const FunctionNoProtoType *T = TL.getTypePtr();
6014   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6015   if (ResultType.isNull())
6016     return QualType();
6017 
6018   QualType Result = TL.getType();
6019   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6020     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6021 
6022   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6023   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6024   NewTL.setLParenLoc(TL.getLParenLoc());
6025   NewTL.setRParenLoc(TL.getRParenLoc());
6026   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6027 
6028   return Result;
6029 }
6030 
6031 template<typename Derived> QualType
6032 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
6033                                                  UnresolvedUsingTypeLoc TL) {
6034   const UnresolvedUsingType *T = TL.getTypePtr();
6035   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6036   if (!D)
6037     return QualType();
6038 
6039   QualType Result = TL.getType();
6040   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6041     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6042     if (Result.isNull())
6043       return QualType();
6044   }
6045 
6046   // We might get an arbitrary type spec type back.  We should at
6047   // least always get a type spec type, though.
6048   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6049   NewTL.setNameLoc(TL.getNameLoc());
6050 
6051   return Result;
6052 }
6053 
6054 template<typename Derived>
6055 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6056                                                       TypedefTypeLoc TL) {
6057   const TypedefType *T = TL.getTypePtr();
6058   TypedefNameDecl *Typedef
6059     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6060                                                                T->getDecl()));
6061   if (!Typedef)
6062     return QualType();
6063 
6064   QualType Result = TL.getType();
6065   if (getDerived().AlwaysRebuild() ||
6066       Typedef != T->getDecl()) {
6067     Result = getDerived().RebuildTypedefType(Typedef);
6068     if (Result.isNull())
6069       return QualType();
6070   }
6071 
6072   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6073   NewTL.setNameLoc(TL.getNameLoc());
6074 
6075   return Result;
6076 }
6077 
6078 template<typename Derived>
6079 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6080                                                       TypeOfExprTypeLoc TL) {
6081   // typeof expressions are not potentially evaluated contexts
6082   EnterExpressionEvaluationContext Unevaluated(
6083       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6084       Sema::ReuseLambdaContextDecl);
6085 
6086   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6087   if (E.isInvalid())
6088     return QualType();
6089 
6090   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6091   if (E.isInvalid())
6092     return QualType();
6093 
6094   QualType Result = TL.getType();
6095   if (getDerived().AlwaysRebuild() ||
6096       E.get() != TL.getUnderlyingExpr()) {
6097     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6098     if (Result.isNull())
6099       return QualType();
6100   }
6101   else E.get();
6102 
6103   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6104   NewTL.setTypeofLoc(TL.getTypeofLoc());
6105   NewTL.setLParenLoc(TL.getLParenLoc());
6106   NewTL.setRParenLoc(TL.getRParenLoc());
6107 
6108   return Result;
6109 }
6110 
6111 template<typename Derived>
6112 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6113                                                      TypeOfTypeLoc TL) {
6114   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6115   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6116   if (!New_Under_TI)
6117     return QualType();
6118 
6119   QualType Result = TL.getType();
6120   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6121     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6122     if (Result.isNull())
6123       return QualType();
6124   }
6125 
6126   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6127   NewTL.setTypeofLoc(TL.getTypeofLoc());
6128   NewTL.setLParenLoc(TL.getLParenLoc());
6129   NewTL.setRParenLoc(TL.getRParenLoc());
6130   NewTL.setUnderlyingTInfo(New_Under_TI);
6131 
6132   return Result;
6133 }
6134 
6135 template<typename Derived>
6136 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6137                                                        DecltypeTypeLoc TL) {
6138   const DecltypeType *T = TL.getTypePtr();
6139 
6140   // decltype expressions are not potentially evaluated contexts
6141   EnterExpressionEvaluationContext Unevaluated(
6142       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6143       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6144 
6145   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6146   if (E.isInvalid())
6147     return QualType();
6148 
6149   E = getSema().ActOnDecltypeExpression(E.get());
6150   if (E.isInvalid())
6151     return QualType();
6152 
6153   QualType Result = TL.getType();
6154   if (getDerived().AlwaysRebuild() ||
6155       E.get() != T->getUnderlyingExpr()) {
6156     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6157     if (Result.isNull())
6158       return QualType();
6159   }
6160   else E.get();
6161 
6162   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6163   NewTL.setNameLoc(TL.getNameLoc());
6164 
6165   return Result;
6166 }
6167 
6168 template<typename Derived>
6169 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6170                                                             TypeLocBuilder &TLB,
6171                                                      UnaryTransformTypeLoc TL) {
6172   QualType Result = TL.getType();
6173   if (Result->isDependentType()) {
6174     const UnaryTransformType *T = TL.getTypePtr();
6175     QualType NewBase =
6176       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6177     Result = getDerived().RebuildUnaryTransformType(NewBase,
6178                                                     T->getUTTKind(),
6179                                                     TL.getKWLoc());
6180     if (Result.isNull())
6181       return QualType();
6182   }
6183 
6184   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6185   NewTL.setKWLoc(TL.getKWLoc());
6186   NewTL.setParensRange(TL.getParensRange());
6187   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6188   return Result;
6189 }
6190 
6191 template<typename Derived>
6192 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6193     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6194   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6195 
6196   CXXScopeSpec SS;
6197   TemplateName TemplateName = getDerived().TransformTemplateName(
6198       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6199   if (TemplateName.isNull())
6200     return QualType();
6201 
6202   QualType OldDeduced = T->getDeducedType();
6203   QualType NewDeduced;
6204   if (!OldDeduced.isNull()) {
6205     NewDeduced = getDerived().TransformType(OldDeduced);
6206     if (NewDeduced.isNull())
6207       return QualType();
6208   }
6209 
6210   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6211       TemplateName, NewDeduced);
6212   if (Result.isNull())
6213     return QualType();
6214 
6215   DeducedTemplateSpecializationTypeLoc NewTL =
6216       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6217   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6218 
6219   return Result;
6220 }
6221 
6222 template<typename Derived>
6223 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6224                                                      RecordTypeLoc TL) {
6225   const RecordType *T = TL.getTypePtr();
6226   RecordDecl *Record
6227     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6228                                                           T->getDecl()));
6229   if (!Record)
6230     return QualType();
6231 
6232   QualType Result = TL.getType();
6233   if (getDerived().AlwaysRebuild() ||
6234       Record != T->getDecl()) {
6235     Result = getDerived().RebuildRecordType(Record);
6236     if (Result.isNull())
6237       return QualType();
6238   }
6239 
6240   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6241   NewTL.setNameLoc(TL.getNameLoc());
6242 
6243   return Result;
6244 }
6245 
6246 template<typename Derived>
6247 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6248                                                    EnumTypeLoc TL) {
6249   const EnumType *T = TL.getTypePtr();
6250   EnumDecl *Enum
6251     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6252                                                         T->getDecl()));
6253   if (!Enum)
6254     return QualType();
6255 
6256   QualType Result = TL.getType();
6257   if (getDerived().AlwaysRebuild() ||
6258       Enum != T->getDecl()) {
6259     Result = getDerived().RebuildEnumType(Enum);
6260     if (Result.isNull())
6261       return QualType();
6262   }
6263 
6264   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6265   NewTL.setNameLoc(TL.getNameLoc());
6266 
6267   return Result;
6268 }
6269 
6270 template<typename Derived>
6271 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6272                                          TypeLocBuilder &TLB,
6273                                          InjectedClassNameTypeLoc TL) {
6274   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6275                                        TL.getTypePtr()->getDecl());
6276   if (!D) return QualType();
6277 
6278   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6279   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6280   return T;
6281 }
6282 
6283 template<typename Derived>
6284 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6285                                                 TypeLocBuilder &TLB,
6286                                                 TemplateTypeParmTypeLoc TL) {
6287   return TransformTypeSpecType(TLB, TL);
6288 }
6289 
6290 template<typename Derived>
6291 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6292                                          TypeLocBuilder &TLB,
6293                                          SubstTemplateTypeParmTypeLoc TL) {
6294   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6295 
6296   // Substitute into the replacement type, which itself might involve something
6297   // that needs to be transformed. This only tends to occur with default
6298   // template arguments of template template parameters.
6299   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6300   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6301   if (Replacement.isNull())
6302     return QualType();
6303 
6304   // Always canonicalize the replacement type.
6305   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6306   QualType Result
6307     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6308                                                    Replacement);
6309 
6310   // Propagate type-source information.
6311   SubstTemplateTypeParmTypeLoc NewTL
6312     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6313   NewTL.setNameLoc(TL.getNameLoc());
6314   return Result;
6315 
6316 }
6317 
6318 template<typename Derived>
6319 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6320                                           TypeLocBuilder &TLB,
6321                                           SubstTemplateTypeParmPackTypeLoc TL) {
6322   return TransformTypeSpecType(TLB, TL);
6323 }
6324 
6325 template<typename Derived>
6326 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6327                                                         TypeLocBuilder &TLB,
6328                                            TemplateSpecializationTypeLoc TL) {
6329   const TemplateSpecializationType *T = TL.getTypePtr();
6330 
6331   // The nested-name-specifier never matters in a TemplateSpecializationType,
6332   // because we can't have a dependent nested-name-specifier anyway.
6333   CXXScopeSpec SS;
6334   TemplateName Template
6335     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6336                                          TL.getTemplateNameLoc());
6337   if (Template.isNull())
6338     return QualType();
6339 
6340   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6341 }
6342 
6343 template<typename Derived>
6344 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6345                                                      AtomicTypeLoc TL) {
6346   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6347   if (ValueType.isNull())
6348     return QualType();
6349 
6350   QualType Result = TL.getType();
6351   if (getDerived().AlwaysRebuild() ||
6352       ValueType != TL.getValueLoc().getType()) {
6353     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6354     if (Result.isNull())
6355       return QualType();
6356   }
6357 
6358   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6359   NewTL.setKWLoc(TL.getKWLoc());
6360   NewTL.setLParenLoc(TL.getLParenLoc());
6361   NewTL.setRParenLoc(TL.getRParenLoc());
6362 
6363   return Result;
6364 }
6365 
6366 template <typename Derived>
6367 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6368                                                    PipeTypeLoc TL) {
6369   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6370   if (ValueType.isNull())
6371     return QualType();
6372 
6373   QualType Result = TL.getType();
6374   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6375     const PipeType *PT = Result->castAs<PipeType>();
6376     bool isReadPipe = PT->isReadOnly();
6377     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6378     if (Result.isNull())
6379       return QualType();
6380   }
6381 
6382   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6383   NewTL.setKWLoc(TL.getKWLoc());
6384 
6385   return Result;
6386 }
6387 
6388 template <typename Derived>
6389 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6390                                                      ExtIntTypeLoc TL) {
6391   const ExtIntType *EIT = TL.getTypePtr();
6392   QualType Result = TL.getType();
6393 
6394   if (getDerived().AlwaysRebuild()) {
6395     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6396                                             EIT->getNumBits(), TL.getNameLoc());
6397     if (Result.isNull())
6398       return QualType();
6399   }
6400 
6401   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6402   NewTL.setNameLoc(TL.getNameLoc());
6403   return Result;
6404 }
6405 
6406 template <typename Derived>
6407 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6408     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6409   const DependentExtIntType *EIT = TL.getTypePtr();
6410 
6411   EnterExpressionEvaluationContext Unevaluated(
6412       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6413   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6414   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6415 
6416   if (BitsExpr.isInvalid())
6417     return QualType();
6418 
6419   QualType Result = TL.getType();
6420 
6421   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6422     Result = getDerived().RebuildDependentExtIntType(
6423         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6424 
6425     if (Result.isNull())
6426       return QualType();
6427   }
6428 
6429   if (isa<DependentExtIntType>(Result)) {
6430     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6431     NewTL.setNameLoc(TL.getNameLoc());
6432   } else {
6433     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6434     NewTL.setNameLoc(TL.getNameLoc());
6435   }
6436   return Result;
6437 }
6438 
6439   /// Simple iterator that traverses the template arguments in a
6440   /// container that provides a \c getArgLoc() member function.
6441   ///
6442   /// This iterator is intended to be used with the iterator form of
6443   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6444   template<typename ArgLocContainer>
6445   class TemplateArgumentLocContainerIterator {
6446     ArgLocContainer *Container;
6447     unsigned Index;
6448 
6449   public:
6450     typedef TemplateArgumentLoc value_type;
6451     typedef TemplateArgumentLoc reference;
6452     typedef int difference_type;
6453     typedef std::input_iterator_tag iterator_category;
6454 
6455     class pointer {
6456       TemplateArgumentLoc Arg;
6457 
6458     public:
6459       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6460 
6461       const TemplateArgumentLoc *operator->() const {
6462         return &Arg;
6463       }
6464     };
6465 
6466 
6467     TemplateArgumentLocContainerIterator() {}
6468 
6469     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6470                                  unsigned Index)
6471       : Container(&Container), Index(Index) { }
6472 
6473     TemplateArgumentLocContainerIterator &operator++() {
6474       ++Index;
6475       return *this;
6476     }
6477 
6478     TemplateArgumentLocContainerIterator operator++(int) {
6479       TemplateArgumentLocContainerIterator Old(*this);
6480       ++(*this);
6481       return Old;
6482     }
6483 
6484     TemplateArgumentLoc operator*() const {
6485       return Container->getArgLoc(Index);
6486     }
6487 
6488     pointer operator->() const {
6489       return pointer(Container->getArgLoc(Index));
6490     }
6491 
6492     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6493                            const TemplateArgumentLocContainerIterator &Y) {
6494       return X.Container == Y.Container && X.Index == Y.Index;
6495     }
6496 
6497     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6498                            const TemplateArgumentLocContainerIterator &Y) {
6499       return !(X == Y);
6500     }
6501   };
6502 
6503 template<typename Derived>
6504 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6505                                                    AutoTypeLoc TL) {
6506   const AutoType *T = TL.getTypePtr();
6507   QualType OldDeduced = T->getDeducedType();
6508   QualType NewDeduced;
6509   if (!OldDeduced.isNull()) {
6510     NewDeduced = getDerived().TransformType(OldDeduced);
6511     if (NewDeduced.isNull())
6512       return QualType();
6513   }
6514 
6515   ConceptDecl *NewCD = nullptr;
6516   TemplateArgumentListInfo NewTemplateArgs;
6517   NestedNameSpecifierLoc NewNestedNameSpec;
6518   if (TL.getTypePtr()->isConstrained()) {
6519     NewCD = cast_or_null<ConceptDecl>(
6520         getDerived().TransformDecl(
6521             TL.getConceptNameLoc(),
6522             TL.getTypePtr()->getTypeConstraintConcept()));
6523 
6524     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6525     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6526     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6527     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6528                                                 ArgIterator(TL,
6529                                                             TL.getNumArgs()),
6530                                                 NewTemplateArgs))
6531       return QualType();
6532 
6533     if (TL.getNestedNameSpecifierLoc()) {
6534       NewNestedNameSpec
6535         = getDerived().TransformNestedNameSpecifierLoc(
6536             TL.getNestedNameSpecifierLoc());
6537       if (!NewNestedNameSpec)
6538         return QualType();
6539     }
6540   }
6541 
6542   QualType Result = TL.getType();
6543   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6544       T->isDependentType()) {
6545     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6546     NewArgList.reserve(NewArgList.size());
6547     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6548       NewArgList.push_back(ArgLoc.getArgument());
6549     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6550                                           NewArgList);
6551     if (Result.isNull())
6552       return QualType();
6553   }
6554 
6555   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6556   NewTL.setNameLoc(TL.getNameLoc());
6557   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6558   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6559   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6560   NewTL.setFoundDecl(TL.getFoundDecl());
6561   NewTL.setLAngleLoc(TL.getLAngleLoc());
6562   NewTL.setRAngleLoc(TL.getRAngleLoc());
6563   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6564     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6565 
6566   return Result;
6567 }
6568 
6569 template <typename Derived>
6570 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6571                                                         TypeLocBuilder &TLB,
6572                                            TemplateSpecializationTypeLoc TL,
6573                                                       TemplateName Template) {
6574   TemplateArgumentListInfo NewTemplateArgs;
6575   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6576   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6577   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6578     ArgIterator;
6579   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6580                                               ArgIterator(TL, TL.getNumArgs()),
6581                                               NewTemplateArgs))
6582     return QualType();
6583 
6584   // FIXME: maybe don't rebuild if all the template arguments are the same.
6585 
6586   QualType Result =
6587     getDerived().RebuildTemplateSpecializationType(Template,
6588                                                    TL.getTemplateNameLoc(),
6589                                                    NewTemplateArgs);
6590 
6591   if (!Result.isNull()) {
6592     // Specializations of template template parameters are represented as
6593     // TemplateSpecializationTypes, and substitution of type alias templates
6594     // within a dependent context can transform them into
6595     // DependentTemplateSpecializationTypes.
6596     if (isa<DependentTemplateSpecializationType>(Result)) {
6597       DependentTemplateSpecializationTypeLoc NewTL
6598         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6599       NewTL.setElaboratedKeywordLoc(SourceLocation());
6600       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6601       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6602       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6603       NewTL.setLAngleLoc(TL.getLAngleLoc());
6604       NewTL.setRAngleLoc(TL.getRAngleLoc());
6605       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6606         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6607       return Result;
6608     }
6609 
6610     TemplateSpecializationTypeLoc NewTL
6611       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6612     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6613     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6614     NewTL.setLAngleLoc(TL.getLAngleLoc());
6615     NewTL.setRAngleLoc(TL.getRAngleLoc());
6616     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6617       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6618   }
6619 
6620   return Result;
6621 }
6622 
6623 template <typename Derived>
6624 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6625                                      TypeLocBuilder &TLB,
6626                                      DependentTemplateSpecializationTypeLoc TL,
6627                                      TemplateName Template,
6628                                      CXXScopeSpec &SS) {
6629   TemplateArgumentListInfo NewTemplateArgs;
6630   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6631   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6632   typedef TemplateArgumentLocContainerIterator<
6633             DependentTemplateSpecializationTypeLoc> ArgIterator;
6634   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6635                                               ArgIterator(TL, TL.getNumArgs()),
6636                                               NewTemplateArgs))
6637     return QualType();
6638 
6639   // FIXME: maybe don't rebuild if all the template arguments are the same.
6640 
6641   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6642     QualType Result
6643       = getSema().Context.getDependentTemplateSpecializationType(
6644                                                 TL.getTypePtr()->getKeyword(),
6645                                                          DTN->getQualifier(),
6646                                                          DTN->getIdentifier(),
6647                                                                NewTemplateArgs);
6648 
6649     DependentTemplateSpecializationTypeLoc NewTL
6650       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6651     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6652     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6653     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6654     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6655     NewTL.setLAngleLoc(TL.getLAngleLoc());
6656     NewTL.setRAngleLoc(TL.getRAngleLoc());
6657     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6658       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6659     return Result;
6660   }
6661 
6662   QualType Result
6663     = getDerived().RebuildTemplateSpecializationType(Template,
6664                                                      TL.getTemplateNameLoc(),
6665                                                      NewTemplateArgs);
6666 
6667   if (!Result.isNull()) {
6668     /// FIXME: Wrap this in an elaborated-type-specifier?
6669     TemplateSpecializationTypeLoc NewTL
6670       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6671     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6672     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6673     NewTL.setLAngleLoc(TL.getLAngleLoc());
6674     NewTL.setRAngleLoc(TL.getRAngleLoc());
6675     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6676       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6677   }
6678 
6679   return Result;
6680 }
6681 
6682 template<typename Derived>
6683 QualType
6684 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6685                                                 ElaboratedTypeLoc TL) {
6686   const ElaboratedType *T = TL.getTypePtr();
6687 
6688   NestedNameSpecifierLoc QualifierLoc;
6689   // NOTE: the qualifier in an ElaboratedType is optional.
6690   if (TL.getQualifierLoc()) {
6691     QualifierLoc
6692       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6693     if (!QualifierLoc)
6694       return QualType();
6695   }
6696 
6697   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6698   if (NamedT.isNull())
6699     return QualType();
6700 
6701   // C++0x [dcl.type.elab]p2:
6702   //   If the identifier resolves to a typedef-name or the simple-template-id
6703   //   resolves to an alias template specialization, the
6704   //   elaborated-type-specifier is ill-formed.
6705   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6706     if (const TemplateSpecializationType *TST =
6707           NamedT->getAs<TemplateSpecializationType>()) {
6708       TemplateName Template = TST->getTemplateName();
6709       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6710               Template.getAsTemplateDecl())) {
6711         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6712                      diag::err_tag_reference_non_tag)
6713             << TAT << Sema::NTK_TypeAliasTemplate
6714             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6715         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6716       }
6717     }
6718   }
6719 
6720   QualType Result = TL.getType();
6721   if (getDerived().AlwaysRebuild() ||
6722       QualifierLoc != TL.getQualifierLoc() ||
6723       NamedT != T->getNamedType()) {
6724     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6725                                                 T->getKeyword(),
6726                                                 QualifierLoc, NamedT);
6727     if (Result.isNull())
6728       return QualType();
6729   }
6730 
6731   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6732   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6733   NewTL.setQualifierLoc(QualifierLoc);
6734   return Result;
6735 }
6736 
6737 template<typename Derived>
6738 QualType TreeTransform<Derived>::TransformAttributedType(
6739                                                 TypeLocBuilder &TLB,
6740                                                 AttributedTypeLoc TL) {
6741   const AttributedType *oldType = TL.getTypePtr();
6742   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6743   if (modifiedType.isNull())
6744     return QualType();
6745 
6746   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6747   const Attr *oldAttr = TL.getAttr();
6748   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6749   if (oldAttr && !newAttr)
6750     return QualType();
6751 
6752   QualType result = TL.getType();
6753 
6754   // FIXME: dependent operand expressions?
6755   if (getDerived().AlwaysRebuild() ||
6756       modifiedType != oldType->getModifiedType()) {
6757     // TODO: this is really lame; we should really be rebuilding the
6758     // equivalent type from first principles.
6759     QualType equivalentType
6760       = getDerived().TransformType(oldType->getEquivalentType());
6761     if (equivalentType.isNull())
6762       return QualType();
6763 
6764     // Check whether we can add nullability; it is only represented as
6765     // type sugar, and therefore cannot be diagnosed in any other way.
6766     if (auto nullability = oldType->getImmediateNullability()) {
6767       if (!modifiedType->canHaveNullability()) {
6768         SemaRef.Diag(TL.getAttr()->getLocation(),
6769                      diag::err_nullability_nonpointer)
6770             << DiagNullabilityKind(*nullability, false) << modifiedType;
6771         return QualType();
6772       }
6773     }
6774 
6775     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6776                                                modifiedType,
6777                                                equivalentType);
6778   }
6779 
6780   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6781   newTL.setAttr(newAttr);
6782   return result;
6783 }
6784 
6785 template<typename Derived>
6786 QualType
6787 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6788                                            ParenTypeLoc 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() ||
6795       Inner != TL.getInnerLoc().getType()) {
6796     Result = getDerived().RebuildParenType(Inner);
6797     if (Result.isNull())
6798       return QualType();
6799   }
6800 
6801   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6802   NewTL.setLParenLoc(TL.getLParenLoc());
6803   NewTL.setRParenLoc(TL.getRParenLoc());
6804   return Result;
6805 }
6806 
6807 template <typename Derived>
6808 QualType
6809 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6810                                                     MacroQualifiedTypeLoc TL) {
6811   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6812   if (Inner.isNull())
6813     return QualType();
6814 
6815   QualType Result = TL.getType();
6816   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6817     Result =
6818         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6819     if (Result.isNull())
6820       return QualType();
6821   }
6822 
6823   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6824   NewTL.setExpansionLoc(TL.getExpansionLoc());
6825   return Result;
6826 }
6827 
6828 template<typename Derived>
6829 QualType TreeTransform<Derived>::TransformDependentNameType(
6830     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6831   return TransformDependentNameType(TLB, TL, false);
6832 }
6833 
6834 template<typename Derived>
6835 QualType TreeTransform<Derived>::TransformDependentNameType(
6836     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6837   const DependentNameType *T = TL.getTypePtr();
6838 
6839   NestedNameSpecifierLoc QualifierLoc
6840     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6841   if (!QualifierLoc)
6842     return QualType();
6843 
6844   QualType Result
6845     = getDerived().RebuildDependentNameType(T->getKeyword(),
6846                                             TL.getElaboratedKeywordLoc(),
6847                                             QualifierLoc,
6848                                             T->getIdentifier(),
6849                                             TL.getNameLoc(),
6850                                             DeducedTSTContext);
6851   if (Result.isNull())
6852     return QualType();
6853 
6854   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6855     QualType NamedT = ElabT->getNamedType();
6856     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6857 
6858     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6859     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6860     NewTL.setQualifierLoc(QualifierLoc);
6861   } else {
6862     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6863     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6864     NewTL.setQualifierLoc(QualifierLoc);
6865     NewTL.setNameLoc(TL.getNameLoc());
6866   }
6867   return Result;
6868 }
6869 
6870 template<typename Derived>
6871 QualType TreeTransform<Derived>::
6872           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6873                                  DependentTemplateSpecializationTypeLoc TL) {
6874   NestedNameSpecifierLoc QualifierLoc;
6875   if (TL.getQualifierLoc()) {
6876     QualifierLoc
6877       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6878     if (!QualifierLoc)
6879       return QualType();
6880   }
6881 
6882   return getDerived()
6883            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6884 }
6885 
6886 template<typename Derived>
6887 QualType TreeTransform<Derived>::
6888 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6889                                    DependentTemplateSpecializationTypeLoc TL,
6890                                        NestedNameSpecifierLoc QualifierLoc) {
6891   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6892 
6893   TemplateArgumentListInfo NewTemplateArgs;
6894   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6895   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6896 
6897   typedef TemplateArgumentLocContainerIterator<
6898   DependentTemplateSpecializationTypeLoc> ArgIterator;
6899   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6900                                               ArgIterator(TL, TL.getNumArgs()),
6901                                               NewTemplateArgs))
6902     return QualType();
6903 
6904   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6905       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6906       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6907       /*AllowInjectedClassName*/ false);
6908   if (Result.isNull())
6909     return QualType();
6910 
6911   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6912     QualType NamedT = ElabT->getNamedType();
6913 
6914     // Copy information relevant to the template specialization.
6915     TemplateSpecializationTypeLoc NamedTL
6916       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6917     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6918     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6919     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6920     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6921     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6922       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6923 
6924     // Copy information relevant to the elaborated type.
6925     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6926     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6927     NewTL.setQualifierLoc(QualifierLoc);
6928   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6929     DependentTemplateSpecializationTypeLoc SpecTL
6930       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6931     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6932     SpecTL.setQualifierLoc(QualifierLoc);
6933     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6934     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6935     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6936     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6937     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6938       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6939   } else {
6940     TemplateSpecializationTypeLoc SpecTL
6941       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6942     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6943     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6944     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6945     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6946     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6947       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6948   }
6949   return Result;
6950 }
6951 
6952 template<typename Derived>
6953 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6954                                                       PackExpansionTypeLoc TL) {
6955   QualType Pattern
6956     = getDerived().TransformType(TLB, TL.getPatternLoc());
6957   if (Pattern.isNull())
6958     return QualType();
6959 
6960   QualType Result = TL.getType();
6961   if (getDerived().AlwaysRebuild() ||
6962       Pattern != TL.getPatternLoc().getType()) {
6963     Result = getDerived().RebuildPackExpansionType(Pattern,
6964                                            TL.getPatternLoc().getSourceRange(),
6965                                                    TL.getEllipsisLoc(),
6966                                            TL.getTypePtr()->getNumExpansions());
6967     if (Result.isNull())
6968       return QualType();
6969   }
6970 
6971   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6972   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6973   return Result;
6974 }
6975 
6976 template<typename Derived>
6977 QualType
6978 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6979                                                    ObjCInterfaceTypeLoc TL) {
6980   // ObjCInterfaceType is never dependent.
6981   TLB.pushFullCopy(TL);
6982   return TL.getType();
6983 }
6984 
6985 template<typename Derived>
6986 QualType
6987 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6988                                                    ObjCTypeParamTypeLoc TL) {
6989   const ObjCTypeParamType *T = TL.getTypePtr();
6990   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6991       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6992   if (!OTP)
6993     return QualType();
6994 
6995   QualType Result = TL.getType();
6996   if (getDerived().AlwaysRebuild() ||
6997       OTP != T->getDecl()) {
6998     Result = getDerived().RebuildObjCTypeParamType(OTP,
6999                  TL.getProtocolLAngleLoc(),
7000                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
7001                                     TL.getNumProtocols()),
7002                  TL.getProtocolLocs(),
7003                  TL.getProtocolRAngleLoc());
7004     if (Result.isNull())
7005       return QualType();
7006   }
7007 
7008   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7009   if (TL.getNumProtocols()) {
7010     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7011     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7012       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7013     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7014   }
7015   return Result;
7016 }
7017 
7018 template<typename Derived>
7019 QualType
7020 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7021                                                 ObjCObjectTypeLoc TL) {
7022   // Transform base type.
7023   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7024   if (BaseType.isNull())
7025     return QualType();
7026 
7027   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7028 
7029   // Transform type arguments.
7030   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7031   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7032     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7033     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7034     QualType TypeArg = TypeArgInfo->getType();
7035     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7036       AnyChanged = true;
7037 
7038       // We have a pack expansion. Instantiate it.
7039       const auto *PackExpansion = PackExpansionLoc.getType()
7040                                     ->castAs<PackExpansionType>();
7041       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7042       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7043                                               Unexpanded);
7044       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7045 
7046       // Determine whether the set of unexpanded parameter packs can
7047       // and should be expanded.
7048       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7049       bool Expand = false;
7050       bool RetainExpansion = false;
7051       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7052       if (getDerived().TryExpandParameterPacks(
7053             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7054             Unexpanded, Expand, RetainExpansion, NumExpansions))
7055         return QualType();
7056 
7057       if (!Expand) {
7058         // We can't expand this pack expansion into separate arguments yet;
7059         // just substitute into the pattern and create a new pack expansion
7060         // type.
7061         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7062 
7063         TypeLocBuilder TypeArgBuilder;
7064         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7065         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7066                                                              PatternLoc);
7067         if (NewPatternType.isNull())
7068           return QualType();
7069 
7070         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7071                                       NewPatternType, NumExpansions);
7072         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7073         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7074         NewTypeArgInfos.push_back(
7075           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7076         continue;
7077       }
7078 
7079       // Substitute into the pack expansion pattern for each slice of the
7080       // pack.
7081       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7082         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7083 
7084         TypeLocBuilder TypeArgBuilder;
7085         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7086 
7087         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7088                                                          PatternLoc);
7089         if (NewTypeArg.isNull())
7090           return QualType();
7091 
7092         NewTypeArgInfos.push_back(
7093           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7094       }
7095 
7096       continue;
7097     }
7098 
7099     TypeLocBuilder TypeArgBuilder;
7100     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7101     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7102     if (NewTypeArg.isNull())
7103       return QualType();
7104 
7105     // If nothing changed, just keep the old TypeSourceInfo.
7106     if (NewTypeArg == TypeArg) {
7107       NewTypeArgInfos.push_back(TypeArgInfo);
7108       continue;
7109     }
7110 
7111     NewTypeArgInfos.push_back(
7112       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7113     AnyChanged = true;
7114   }
7115 
7116   QualType Result = TL.getType();
7117   if (getDerived().AlwaysRebuild() || AnyChanged) {
7118     // Rebuild the type.
7119     Result = getDerived().RebuildObjCObjectType(
7120         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7121         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7122         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7123         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7124 
7125     if (Result.isNull())
7126       return QualType();
7127   }
7128 
7129   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7130   NewT.setHasBaseTypeAsWritten(true);
7131   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7132   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7133     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7134   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7135   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7136   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7137     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7138   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7139   return Result;
7140 }
7141 
7142 template<typename Derived>
7143 QualType
7144 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7145                                                ObjCObjectPointerTypeLoc TL) {
7146   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7147   if (PointeeType.isNull())
7148     return QualType();
7149 
7150   QualType Result = TL.getType();
7151   if (getDerived().AlwaysRebuild() ||
7152       PointeeType != TL.getPointeeLoc().getType()) {
7153     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7154                                                        TL.getStarLoc());
7155     if (Result.isNull())
7156       return QualType();
7157   }
7158 
7159   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7160   NewT.setStarLoc(TL.getStarLoc());
7161   return Result;
7162 }
7163 
7164 //===----------------------------------------------------------------------===//
7165 // Statement transformation
7166 //===----------------------------------------------------------------------===//
7167 template<typename Derived>
7168 StmtResult
7169 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7170   return S;
7171 }
7172 
7173 template<typename Derived>
7174 StmtResult
7175 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7176   return getDerived().TransformCompoundStmt(S, false);
7177 }
7178 
7179 template<typename Derived>
7180 StmtResult
7181 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7182                                               bool IsStmtExpr) {
7183   Sema::CompoundScopeRAII CompoundScope(getSema());
7184 
7185   const Stmt *ExprResult = S->getStmtExprResult();
7186   bool SubStmtInvalid = false;
7187   bool SubStmtChanged = false;
7188   SmallVector<Stmt*, 8> Statements;
7189   for (auto *B : S->body()) {
7190     StmtResult Result = getDerived().TransformStmt(
7191         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7192 
7193     if (Result.isInvalid()) {
7194       // Immediately fail if this was a DeclStmt, since it's very
7195       // likely that this will cause problems for future statements.
7196       if (isa<DeclStmt>(B))
7197         return StmtError();
7198 
7199       // Otherwise, just keep processing substatements and fail later.
7200       SubStmtInvalid = true;
7201       continue;
7202     }
7203 
7204     SubStmtChanged = SubStmtChanged || Result.get() != B;
7205     Statements.push_back(Result.getAs<Stmt>());
7206   }
7207 
7208   if (SubStmtInvalid)
7209     return StmtError();
7210 
7211   if (!getDerived().AlwaysRebuild() &&
7212       !SubStmtChanged)
7213     return S;
7214 
7215   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7216                                           Statements,
7217                                           S->getRBracLoc(),
7218                                           IsStmtExpr);
7219 }
7220 
7221 template<typename Derived>
7222 StmtResult
7223 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7224   ExprResult LHS, RHS;
7225   {
7226     EnterExpressionEvaluationContext Unevaluated(
7227         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7228 
7229     // Transform the left-hand case value.
7230     LHS = getDerived().TransformExpr(S->getLHS());
7231     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7232     if (LHS.isInvalid())
7233       return StmtError();
7234 
7235     // Transform the right-hand case value (for the GNU case-range extension).
7236     RHS = getDerived().TransformExpr(S->getRHS());
7237     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7238     if (RHS.isInvalid())
7239       return StmtError();
7240   }
7241 
7242   // Build the case statement.
7243   // Case statements are always rebuilt so that they will attached to their
7244   // transformed switch statement.
7245   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7246                                                        LHS.get(),
7247                                                        S->getEllipsisLoc(),
7248                                                        RHS.get(),
7249                                                        S->getColonLoc());
7250   if (Case.isInvalid())
7251     return StmtError();
7252 
7253   // Transform the statement following the case
7254   StmtResult SubStmt =
7255       getDerived().TransformStmt(S->getSubStmt());
7256   if (SubStmt.isInvalid())
7257     return StmtError();
7258 
7259   // Attach the body to the case statement
7260   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7261 }
7262 
7263 template <typename Derived>
7264 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7265   // Transform the statement following the default case
7266   StmtResult SubStmt =
7267       getDerived().TransformStmt(S->getSubStmt());
7268   if (SubStmt.isInvalid())
7269     return StmtError();
7270 
7271   // Default statements are always rebuilt
7272   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7273                                          SubStmt.get());
7274 }
7275 
7276 template<typename Derived>
7277 StmtResult
7278 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7279   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7280   if (SubStmt.isInvalid())
7281     return StmtError();
7282 
7283   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7284                                         S->getDecl());
7285   if (!LD)
7286     return StmtError();
7287 
7288   // If we're transforming "in-place" (we're not creating new local
7289   // declarations), assume we're replacing the old label statement
7290   // and clear out the reference to it.
7291   if (LD == S->getDecl())
7292     S->getDecl()->setStmt(nullptr);
7293 
7294   // FIXME: Pass the real colon location in.
7295   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7296                                        cast<LabelDecl>(LD), SourceLocation(),
7297                                        SubStmt.get());
7298 }
7299 
7300 template <typename Derived>
7301 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7302   if (!R)
7303     return R;
7304 
7305   switch (R->getKind()) {
7306 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7307 #define ATTR(X)
7308 #define PRAGMA_SPELLING_ATTR(X)                                                \
7309   case attr::X:                                                                \
7310     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7311 #include "clang/Basic/AttrList.inc"
7312   default:
7313     return R;
7314   }
7315 }
7316 
7317 template <typename Derived>
7318 StmtResult
7319 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7320                                                 StmtDiscardKind SDK) {
7321   bool AttrsChanged = false;
7322   SmallVector<const Attr *, 1> Attrs;
7323 
7324   // Visit attributes and keep track if any are transformed.
7325   for (const auto *I : S->getAttrs()) {
7326     const Attr *R = getDerived().TransformAttr(I);
7327     AttrsChanged |= (I != R);
7328     if (R)
7329       Attrs.push_back(R);
7330   }
7331 
7332   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7333   if (SubStmt.isInvalid())
7334     return StmtError();
7335 
7336   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7337     return S;
7338 
7339   // If transforming the attributes failed for all of the attributes in the
7340   // statement, don't make an AttributedStmt without attributes.
7341   if (Attrs.empty())
7342     return SubStmt;
7343 
7344   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7345                                             SubStmt.get());
7346 }
7347 
7348 template<typename Derived>
7349 StmtResult
7350 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7351   // Transform the initialization statement
7352   StmtResult Init = getDerived().TransformStmt(S->getInit());
7353   if (Init.isInvalid())
7354     return StmtError();
7355 
7356   // Transform the condition
7357   Sema::ConditionResult Cond = getDerived().TransformCondition(
7358       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7359       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7360                        : Sema::ConditionKind::Boolean);
7361   if (Cond.isInvalid())
7362     return StmtError();
7363 
7364   // If this is a constexpr if, determine which arm we should instantiate.
7365   llvm::Optional<bool> ConstexprConditionValue;
7366   if (S->isConstexpr())
7367     ConstexprConditionValue = Cond.getKnownValue();
7368 
7369   // Transform the "then" branch.
7370   StmtResult Then;
7371   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7372     Then = getDerived().TransformStmt(S->getThen());
7373     if (Then.isInvalid())
7374       return StmtError();
7375   } else {
7376     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7377   }
7378 
7379   // Transform the "else" branch.
7380   StmtResult Else;
7381   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7382     Else = getDerived().TransformStmt(S->getElse());
7383     if (Else.isInvalid())
7384       return StmtError();
7385   }
7386 
7387   if (!getDerived().AlwaysRebuild() &&
7388       Init.get() == S->getInit() &&
7389       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7390       Then.get() == S->getThen() &&
7391       Else.get() == S->getElse())
7392     return S;
7393 
7394   return getDerived().RebuildIfStmt(
7395       S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond,
7396       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7397 }
7398 
7399 template<typename Derived>
7400 StmtResult
7401 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7402   // Transform the initialization statement
7403   StmtResult Init = getDerived().TransformStmt(S->getInit());
7404   if (Init.isInvalid())
7405     return StmtError();
7406 
7407   // Transform the condition.
7408   Sema::ConditionResult Cond = getDerived().TransformCondition(
7409       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7410       Sema::ConditionKind::Switch);
7411   if (Cond.isInvalid())
7412     return StmtError();
7413 
7414   // Rebuild the switch statement.
7415   StmtResult Switch =
7416       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7417                                           Init.get(), Cond, S->getRParenLoc());
7418   if (Switch.isInvalid())
7419     return StmtError();
7420 
7421   // Transform the body of the switch statement.
7422   StmtResult Body = getDerived().TransformStmt(S->getBody());
7423   if (Body.isInvalid())
7424     return StmtError();
7425 
7426   // Complete the switch statement.
7427   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7428                                             Body.get());
7429 }
7430 
7431 template<typename Derived>
7432 StmtResult
7433 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7434   // Transform the condition
7435   Sema::ConditionResult Cond = getDerived().TransformCondition(
7436       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7437       Sema::ConditionKind::Boolean);
7438   if (Cond.isInvalid())
7439     return StmtError();
7440 
7441   // Transform the body
7442   StmtResult Body = getDerived().TransformStmt(S->getBody());
7443   if (Body.isInvalid())
7444     return StmtError();
7445 
7446   if (!getDerived().AlwaysRebuild() &&
7447       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7448       Body.get() == S->getBody())
7449     return Owned(S);
7450 
7451   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7452                                        Cond, S->getRParenLoc(), Body.get());
7453 }
7454 
7455 template<typename Derived>
7456 StmtResult
7457 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7458   // Transform the body
7459   StmtResult Body = getDerived().TransformStmt(S->getBody());
7460   if (Body.isInvalid())
7461     return StmtError();
7462 
7463   // Transform the condition
7464   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7465   if (Cond.isInvalid())
7466     return StmtError();
7467 
7468   if (!getDerived().AlwaysRebuild() &&
7469       Cond.get() == S->getCond() &&
7470       Body.get() == S->getBody())
7471     return S;
7472 
7473   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7474                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7475                                     S->getRParenLoc());
7476 }
7477 
7478 template<typename Derived>
7479 StmtResult
7480 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7481   if (getSema().getLangOpts().OpenMP)
7482     getSema().startOpenMPLoop();
7483 
7484   // Transform the initialization statement
7485   StmtResult Init = getDerived().TransformStmt(S->getInit());
7486   if (Init.isInvalid())
7487     return StmtError();
7488 
7489   // In OpenMP loop region loop control variable must be captured and be
7490   // private. Perform analysis of first part (if any).
7491   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7492     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7493 
7494   // Transform the condition
7495   Sema::ConditionResult Cond = getDerived().TransformCondition(
7496       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7497       Sema::ConditionKind::Boolean);
7498   if (Cond.isInvalid())
7499     return StmtError();
7500 
7501   // Transform the increment
7502   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7503   if (Inc.isInvalid())
7504     return StmtError();
7505 
7506   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7507   if (S->getInc() && !FullInc.get())
7508     return StmtError();
7509 
7510   // Transform the body
7511   StmtResult Body = getDerived().TransformStmt(S->getBody());
7512   if (Body.isInvalid())
7513     return StmtError();
7514 
7515   if (!getDerived().AlwaysRebuild() &&
7516       Init.get() == S->getInit() &&
7517       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7518       Inc.get() == S->getInc() &&
7519       Body.get() == S->getBody())
7520     return S;
7521 
7522   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7523                                      Init.get(), Cond, FullInc,
7524                                      S->getRParenLoc(), Body.get());
7525 }
7526 
7527 template<typename Derived>
7528 StmtResult
7529 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7530   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7531                                         S->getLabel());
7532   if (!LD)
7533     return StmtError();
7534 
7535   // Goto statements must always be rebuilt, to resolve the label.
7536   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7537                                       cast<LabelDecl>(LD));
7538 }
7539 
7540 template<typename Derived>
7541 StmtResult
7542 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7543   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7544   if (Target.isInvalid())
7545     return StmtError();
7546   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7547 
7548   if (!getDerived().AlwaysRebuild() &&
7549       Target.get() == S->getTarget())
7550     return S;
7551 
7552   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7553                                               Target.get());
7554 }
7555 
7556 template<typename Derived>
7557 StmtResult
7558 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7559   return S;
7560 }
7561 
7562 template<typename Derived>
7563 StmtResult
7564 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7565   return S;
7566 }
7567 
7568 template<typename Derived>
7569 StmtResult
7570 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7571   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7572                                                         /*NotCopyInit*/false);
7573   if (Result.isInvalid())
7574     return StmtError();
7575 
7576   // FIXME: We always rebuild the return statement because there is no way
7577   // to tell whether the return type of the function has changed.
7578   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7579 }
7580 
7581 template<typename Derived>
7582 StmtResult
7583 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7584   bool DeclChanged = false;
7585   SmallVector<Decl *, 4> Decls;
7586   for (auto *D : S->decls()) {
7587     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7588     if (!Transformed)
7589       return StmtError();
7590 
7591     if (Transformed != D)
7592       DeclChanged = true;
7593 
7594     Decls.push_back(Transformed);
7595   }
7596 
7597   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7598     return S;
7599 
7600   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7601 }
7602 
7603 template<typename Derived>
7604 StmtResult
7605 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7606 
7607   SmallVector<Expr*, 8> Constraints;
7608   SmallVector<Expr*, 8> Exprs;
7609   SmallVector<IdentifierInfo *, 4> Names;
7610 
7611   ExprResult AsmString;
7612   SmallVector<Expr*, 8> Clobbers;
7613 
7614   bool ExprsChanged = false;
7615 
7616   // Go through the outputs.
7617   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7618     Names.push_back(S->getOutputIdentifier(I));
7619 
7620     // No need to transform the constraint literal.
7621     Constraints.push_back(S->getOutputConstraintLiteral(I));
7622 
7623     // Transform the output expr.
7624     Expr *OutputExpr = S->getOutputExpr(I);
7625     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7626     if (Result.isInvalid())
7627       return StmtError();
7628 
7629     ExprsChanged |= Result.get() != OutputExpr;
7630 
7631     Exprs.push_back(Result.get());
7632   }
7633 
7634   // Go through the inputs.
7635   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7636     Names.push_back(S->getInputIdentifier(I));
7637 
7638     // No need to transform the constraint literal.
7639     Constraints.push_back(S->getInputConstraintLiteral(I));
7640 
7641     // Transform the input expr.
7642     Expr *InputExpr = S->getInputExpr(I);
7643     ExprResult Result = getDerived().TransformExpr(InputExpr);
7644     if (Result.isInvalid())
7645       return StmtError();
7646 
7647     ExprsChanged |= Result.get() != InputExpr;
7648 
7649     Exprs.push_back(Result.get());
7650   }
7651 
7652   // Go through the Labels.
7653   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7654     Names.push_back(S->getLabelIdentifier(I));
7655 
7656     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7657     if (Result.isInvalid())
7658       return StmtError();
7659     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7660     Exprs.push_back(Result.get());
7661   }
7662   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7663     return S;
7664 
7665   // Go through the clobbers.
7666   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7667     Clobbers.push_back(S->getClobberStringLiteral(I));
7668 
7669   // No need to transform the asm string literal.
7670   AsmString = S->getAsmString();
7671   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7672                                         S->isVolatile(), S->getNumOutputs(),
7673                                         S->getNumInputs(), Names.data(),
7674                                         Constraints, Exprs, AsmString.get(),
7675                                         Clobbers, S->getNumLabels(),
7676                                         S->getRParenLoc());
7677 }
7678 
7679 template<typename Derived>
7680 StmtResult
7681 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7682   ArrayRef<Token> AsmToks =
7683     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7684 
7685   bool HadError = false, HadChange = false;
7686 
7687   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7688   SmallVector<Expr*, 8> TransformedExprs;
7689   TransformedExprs.reserve(SrcExprs.size());
7690   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7691     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7692     if (!Result.isUsable()) {
7693       HadError = true;
7694     } else {
7695       HadChange |= (Result.get() != SrcExprs[i]);
7696       TransformedExprs.push_back(Result.get());
7697     }
7698   }
7699 
7700   if (HadError) return StmtError();
7701   if (!HadChange && !getDerived().AlwaysRebuild())
7702     return Owned(S);
7703 
7704   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7705                                        AsmToks, S->getAsmString(),
7706                                        S->getNumOutputs(), S->getNumInputs(),
7707                                        S->getAllConstraints(), S->getClobbers(),
7708                                        TransformedExprs, S->getEndLoc());
7709 }
7710 
7711 // C++ Coroutines TS
7712 
7713 template<typename Derived>
7714 StmtResult
7715 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7716   auto *ScopeInfo = SemaRef.getCurFunction();
7717   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7718   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7719          ScopeInfo->NeedsCoroutineSuspends &&
7720          ScopeInfo->CoroutineSuspends.first == nullptr &&
7721          ScopeInfo->CoroutineSuspends.second == nullptr &&
7722          "expected clean scope info");
7723 
7724   // Set that we have (possibly-invalid) suspend points before we do anything
7725   // that may fail.
7726   ScopeInfo->setNeedsCoroutineSuspends(false);
7727 
7728   // We re-build the coroutine promise object (and the coroutine parameters its
7729   // type and constructor depend on) based on the types used in our current
7730   // function. We must do so, and set it on the current FunctionScopeInfo,
7731   // before attempting to transform the other parts of the coroutine body
7732   // statement, such as the implicit suspend statements (because those
7733   // statements reference the FunctionScopeInfo::CoroutinePromise).
7734   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7735     return StmtError();
7736   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7737   if (!Promise)
7738     return StmtError();
7739   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7740   ScopeInfo->CoroutinePromise = Promise;
7741 
7742   // Transform the implicit coroutine statements constructed using dependent
7743   // types during the previous parse: initial and final suspensions, the return
7744   // object, and others. We also transform the coroutine function's body.
7745   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7746   if (InitSuspend.isInvalid())
7747     return StmtError();
7748   StmtResult FinalSuspend =
7749       getDerived().TransformStmt(S->getFinalSuspendStmt());
7750   if (FinalSuspend.isInvalid() ||
7751       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7752     return StmtError();
7753   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7754   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7755 
7756   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7757   if (BodyRes.isInvalid())
7758     return StmtError();
7759 
7760   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7761   if (Builder.isInvalid())
7762     return StmtError();
7763 
7764   Expr *ReturnObject = S->getReturnValueInit();
7765   assert(ReturnObject && "the return object is expected to be valid");
7766   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7767                                                      /*NoCopyInit*/ false);
7768   if (Res.isInvalid())
7769     return StmtError();
7770   Builder.ReturnValue = Res.get();
7771 
7772   // If during the previous parse the coroutine still had a dependent promise
7773   // statement, we may need to build some implicit coroutine statements
7774   // (such as exception and fallthrough handlers) for the first time.
7775   if (S->hasDependentPromiseType()) {
7776     // We can only build these statements, however, if the current promise type
7777     // is not dependent.
7778     if (!Promise->getType()->isDependentType()) {
7779       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7780              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7781              "these nodes should not have been built yet");
7782       if (!Builder.buildDependentStatements())
7783         return StmtError();
7784     }
7785   } else {
7786     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7787       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7788       if (Res.isInvalid())
7789         return StmtError();
7790       Builder.OnFallthrough = Res.get();
7791     }
7792 
7793     if (auto *OnException = S->getExceptionHandler()) {
7794       StmtResult Res = getDerived().TransformStmt(OnException);
7795       if (Res.isInvalid())
7796         return StmtError();
7797       Builder.OnException = Res.get();
7798     }
7799 
7800     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7801       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7802       if (Res.isInvalid())
7803         return StmtError();
7804       Builder.ReturnStmtOnAllocFailure = Res.get();
7805     }
7806 
7807     // Transform any additional statements we may have already built
7808     assert(S->getAllocate() && S->getDeallocate() &&
7809            "allocation and deallocation calls must already be built");
7810     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7811     if (AllocRes.isInvalid())
7812       return StmtError();
7813     Builder.Allocate = AllocRes.get();
7814 
7815     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7816     if (DeallocRes.isInvalid())
7817       return StmtError();
7818     Builder.Deallocate = DeallocRes.get();
7819 
7820     assert(S->getResultDecl() && "ResultDecl must already be built");
7821     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7822     if (ResultDecl.isInvalid())
7823       return StmtError();
7824     Builder.ResultDecl = ResultDecl.get();
7825 
7826     if (auto *ReturnStmt = S->getReturnStmt()) {
7827       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7828       if (Res.isInvalid())
7829         return StmtError();
7830       Builder.ReturnStmt = Res.get();
7831     }
7832   }
7833 
7834   return getDerived().RebuildCoroutineBodyStmt(Builder);
7835 }
7836 
7837 template<typename Derived>
7838 StmtResult
7839 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7840   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7841                                                         /*NotCopyInit*/false);
7842   if (Result.isInvalid())
7843     return StmtError();
7844 
7845   // Always rebuild; we don't know if this needs to be injected into a new
7846   // context or if the promise type has changed.
7847   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7848                                           S->isImplicit());
7849 }
7850 
7851 template<typename Derived>
7852 ExprResult
7853 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7854   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7855                                                         /*NotCopyInit*/false);
7856   if (Result.isInvalid())
7857     return ExprError();
7858 
7859   // Always rebuild; we don't know if this needs to be injected into a new
7860   // context or if the promise type has changed.
7861   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7862                                          E->isImplicit());
7863 }
7864 
7865 template <typename Derived>
7866 ExprResult
7867 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7868   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7869                                                         /*NotCopyInit*/ false);
7870   if (OperandResult.isInvalid())
7871     return ExprError();
7872 
7873   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7874           E->getOperatorCoawaitLookup());
7875 
7876   if (LookupResult.isInvalid())
7877     return ExprError();
7878 
7879   // Always rebuild; we don't know if this needs to be injected into a new
7880   // context or if the promise type has changed.
7881   return getDerived().RebuildDependentCoawaitExpr(
7882       E->getKeywordLoc(), OperandResult.get(),
7883       cast<UnresolvedLookupExpr>(LookupResult.get()));
7884 }
7885 
7886 template<typename Derived>
7887 ExprResult
7888 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7889   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7890                                                         /*NotCopyInit*/false);
7891   if (Result.isInvalid())
7892     return ExprError();
7893 
7894   // Always rebuild; we don't know if this needs to be injected into a new
7895   // context or if the promise type has changed.
7896   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7897 }
7898 
7899 // Objective-C Statements.
7900 
7901 template<typename Derived>
7902 StmtResult
7903 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7904   // Transform the body of the @try.
7905   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7906   if (TryBody.isInvalid())
7907     return StmtError();
7908 
7909   // Transform the @catch statements (if present).
7910   bool AnyCatchChanged = false;
7911   SmallVector<Stmt*, 8> CatchStmts;
7912   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7913     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7914     if (Catch.isInvalid())
7915       return StmtError();
7916     if (Catch.get() != S->getCatchStmt(I))
7917       AnyCatchChanged = true;
7918     CatchStmts.push_back(Catch.get());
7919   }
7920 
7921   // Transform the @finally statement (if present).
7922   StmtResult Finally;
7923   if (S->getFinallyStmt()) {
7924     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7925     if (Finally.isInvalid())
7926       return StmtError();
7927   }
7928 
7929   // If nothing changed, just retain this statement.
7930   if (!getDerived().AlwaysRebuild() &&
7931       TryBody.get() == S->getTryBody() &&
7932       !AnyCatchChanged &&
7933       Finally.get() == S->getFinallyStmt())
7934     return S;
7935 
7936   // Build a new statement.
7937   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7938                                            CatchStmts, Finally.get());
7939 }
7940 
7941 template<typename Derived>
7942 StmtResult
7943 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7944   // Transform the @catch parameter, if there is one.
7945   VarDecl *Var = nullptr;
7946   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7947     TypeSourceInfo *TSInfo = nullptr;
7948     if (FromVar->getTypeSourceInfo()) {
7949       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7950       if (!TSInfo)
7951         return StmtError();
7952     }
7953 
7954     QualType T;
7955     if (TSInfo)
7956       T = TSInfo->getType();
7957     else {
7958       T = getDerived().TransformType(FromVar->getType());
7959       if (T.isNull())
7960         return StmtError();
7961     }
7962 
7963     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7964     if (!Var)
7965       return StmtError();
7966   }
7967 
7968   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7969   if (Body.isInvalid())
7970     return StmtError();
7971 
7972   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7973                                              S->getRParenLoc(),
7974                                              Var, Body.get());
7975 }
7976 
7977 template<typename Derived>
7978 StmtResult
7979 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7980   // Transform the body.
7981   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7982   if (Body.isInvalid())
7983     return StmtError();
7984 
7985   // If nothing changed, just retain this statement.
7986   if (!getDerived().AlwaysRebuild() &&
7987       Body.get() == S->getFinallyBody())
7988     return S;
7989 
7990   // Build a new statement.
7991   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7992                                                Body.get());
7993 }
7994 
7995 template<typename Derived>
7996 StmtResult
7997 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7998   ExprResult Operand;
7999   if (S->getThrowExpr()) {
8000     Operand = getDerived().TransformExpr(S->getThrowExpr());
8001     if (Operand.isInvalid())
8002       return StmtError();
8003   }
8004 
8005   if (!getDerived().AlwaysRebuild() &&
8006       Operand.get() == S->getThrowExpr())
8007     return S;
8008 
8009   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8010 }
8011 
8012 template<typename Derived>
8013 StmtResult
8014 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8015                                                   ObjCAtSynchronizedStmt *S) {
8016   // Transform the object we are locking.
8017   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8018   if (Object.isInvalid())
8019     return StmtError();
8020   Object =
8021     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8022                                                   Object.get());
8023   if (Object.isInvalid())
8024     return StmtError();
8025 
8026   // Transform the body.
8027   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8028   if (Body.isInvalid())
8029     return StmtError();
8030 
8031   // If nothing change, just retain the current statement.
8032   if (!getDerived().AlwaysRebuild() &&
8033       Object.get() == S->getSynchExpr() &&
8034       Body.get() == S->getSynchBody())
8035     return S;
8036 
8037   // Build a new statement.
8038   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8039                                                     Object.get(), Body.get());
8040 }
8041 
8042 template<typename Derived>
8043 StmtResult
8044 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8045                                               ObjCAutoreleasePoolStmt *S) {
8046   // Transform the body.
8047   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8048   if (Body.isInvalid())
8049     return StmtError();
8050 
8051   // If nothing changed, just retain this statement.
8052   if (!getDerived().AlwaysRebuild() &&
8053       Body.get() == S->getSubStmt())
8054     return S;
8055 
8056   // Build a new statement.
8057   return getDerived().RebuildObjCAutoreleasePoolStmt(
8058                         S->getAtLoc(), Body.get());
8059 }
8060 
8061 template<typename Derived>
8062 StmtResult
8063 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8064                                                   ObjCForCollectionStmt *S) {
8065   // Transform the element statement.
8066   StmtResult Element =
8067       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8068   if (Element.isInvalid())
8069     return StmtError();
8070 
8071   // Transform the collection expression.
8072   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8073   if (Collection.isInvalid())
8074     return StmtError();
8075 
8076   // Transform the body.
8077   StmtResult Body = getDerived().TransformStmt(S->getBody());
8078   if (Body.isInvalid())
8079     return StmtError();
8080 
8081   // If nothing changed, just retain this statement.
8082   if (!getDerived().AlwaysRebuild() &&
8083       Element.get() == S->getElement() &&
8084       Collection.get() == S->getCollection() &&
8085       Body.get() == S->getBody())
8086     return S;
8087 
8088   // Build a new statement.
8089   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8090                                                    Element.get(),
8091                                                    Collection.get(),
8092                                                    S->getRParenLoc(),
8093                                                    Body.get());
8094 }
8095 
8096 template <typename Derived>
8097 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8098   // Transform the exception declaration, if any.
8099   VarDecl *Var = nullptr;
8100   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8101     TypeSourceInfo *T =
8102         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8103     if (!T)
8104       return StmtError();
8105 
8106     Var = getDerived().RebuildExceptionDecl(
8107         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8108         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8109     if (!Var || Var->isInvalidDecl())
8110       return StmtError();
8111   }
8112 
8113   // Transform the actual exception handler.
8114   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8115   if (Handler.isInvalid())
8116     return StmtError();
8117 
8118   if (!getDerived().AlwaysRebuild() && !Var &&
8119       Handler.get() == S->getHandlerBlock())
8120     return S;
8121 
8122   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8123 }
8124 
8125 template <typename Derived>
8126 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8127   // Transform the try block itself.
8128   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8129   if (TryBlock.isInvalid())
8130     return StmtError();
8131 
8132   // Transform the handlers.
8133   bool HandlerChanged = false;
8134   SmallVector<Stmt *, 8> Handlers;
8135   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8136     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8137     if (Handler.isInvalid())
8138       return StmtError();
8139 
8140     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8141     Handlers.push_back(Handler.getAs<Stmt>());
8142   }
8143 
8144   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8145       !HandlerChanged)
8146     return S;
8147 
8148   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8149                                         Handlers);
8150 }
8151 
8152 template<typename Derived>
8153 StmtResult
8154 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8155   StmtResult Init =
8156       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8157   if (Init.isInvalid())
8158     return StmtError();
8159 
8160   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8161   if (Range.isInvalid())
8162     return StmtError();
8163 
8164   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8165   if (Begin.isInvalid())
8166     return StmtError();
8167   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8168   if (End.isInvalid())
8169     return StmtError();
8170 
8171   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8172   if (Cond.isInvalid())
8173     return StmtError();
8174   if (Cond.get())
8175     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8176   if (Cond.isInvalid())
8177     return StmtError();
8178   if (Cond.get())
8179     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8180 
8181   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8182   if (Inc.isInvalid())
8183     return StmtError();
8184   if (Inc.get())
8185     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8186 
8187   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8188   if (LoopVar.isInvalid())
8189     return StmtError();
8190 
8191   StmtResult NewStmt = S;
8192   if (getDerived().AlwaysRebuild() ||
8193       Init.get() != S->getInit() ||
8194       Range.get() != S->getRangeStmt() ||
8195       Begin.get() != S->getBeginStmt() ||
8196       End.get() != S->getEndStmt() ||
8197       Cond.get() != S->getCond() ||
8198       Inc.get() != S->getInc() ||
8199       LoopVar.get() != S->getLoopVarStmt()) {
8200     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8201                                                   S->getCoawaitLoc(), Init.get(),
8202                                                   S->getColonLoc(), Range.get(),
8203                                                   Begin.get(), End.get(),
8204                                                   Cond.get(),
8205                                                   Inc.get(), LoopVar.get(),
8206                                                   S->getRParenLoc());
8207     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8208       // Might not have attached any initializer to the loop variable.
8209       getSema().ActOnInitializerError(
8210           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8211       return StmtError();
8212     }
8213   }
8214 
8215   StmtResult Body = getDerived().TransformStmt(S->getBody());
8216   if (Body.isInvalid())
8217     return StmtError();
8218 
8219   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8220   // it now so we have a new statement to attach the body to.
8221   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8222     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8223                                                   S->getCoawaitLoc(), Init.get(),
8224                                                   S->getColonLoc(), Range.get(),
8225                                                   Begin.get(), End.get(),
8226                                                   Cond.get(),
8227                                                   Inc.get(), LoopVar.get(),
8228                                                   S->getRParenLoc());
8229     if (NewStmt.isInvalid())
8230       return StmtError();
8231   }
8232 
8233   if (NewStmt.get() == S)
8234     return S;
8235 
8236   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8237 }
8238 
8239 template<typename Derived>
8240 StmtResult
8241 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8242                                                     MSDependentExistsStmt *S) {
8243   // Transform the nested-name-specifier, if any.
8244   NestedNameSpecifierLoc QualifierLoc;
8245   if (S->getQualifierLoc()) {
8246     QualifierLoc
8247       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8248     if (!QualifierLoc)
8249       return StmtError();
8250   }
8251 
8252   // Transform the declaration name.
8253   DeclarationNameInfo NameInfo = S->getNameInfo();
8254   if (NameInfo.getName()) {
8255     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8256     if (!NameInfo.getName())
8257       return StmtError();
8258   }
8259 
8260   // Check whether anything changed.
8261   if (!getDerived().AlwaysRebuild() &&
8262       QualifierLoc == S->getQualifierLoc() &&
8263       NameInfo.getName() == S->getNameInfo().getName())
8264     return S;
8265 
8266   // Determine whether this name exists, if we can.
8267   CXXScopeSpec SS;
8268   SS.Adopt(QualifierLoc);
8269   bool Dependent = false;
8270   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8271   case Sema::IER_Exists:
8272     if (S->isIfExists())
8273       break;
8274 
8275     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8276 
8277   case Sema::IER_DoesNotExist:
8278     if (S->isIfNotExists())
8279       break;
8280 
8281     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8282 
8283   case Sema::IER_Dependent:
8284     Dependent = true;
8285     break;
8286 
8287   case Sema::IER_Error:
8288     return StmtError();
8289   }
8290 
8291   // We need to continue with the instantiation, so do so now.
8292   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8293   if (SubStmt.isInvalid())
8294     return StmtError();
8295 
8296   // If we have resolved the name, just transform to the substatement.
8297   if (!Dependent)
8298     return SubStmt;
8299 
8300   // The name is still dependent, so build a dependent expression again.
8301   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8302                                                    S->isIfExists(),
8303                                                    QualifierLoc,
8304                                                    NameInfo,
8305                                                    SubStmt.get());
8306 }
8307 
8308 template<typename Derived>
8309 ExprResult
8310 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8311   NestedNameSpecifierLoc QualifierLoc;
8312   if (E->getQualifierLoc()) {
8313     QualifierLoc
8314     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8315     if (!QualifierLoc)
8316       return ExprError();
8317   }
8318 
8319   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8320     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8321   if (!PD)
8322     return ExprError();
8323 
8324   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8325   if (Base.isInvalid())
8326     return ExprError();
8327 
8328   return new (SemaRef.getASTContext())
8329       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8330                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8331                         QualifierLoc, E->getMemberLoc());
8332 }
8333 
8334 template <typename Derived>
8335 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8336     MSPropertySubscriptExpr *E) {
8337   auto BaseRes = getDerived().TransformExpr(E->getBase());
8338   if (BaseRes.isInvalid())
8339     return ExprError();
8340   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8341   if (IdxRes.isInvalid())
8342     return ExprError();
8343 
8344   if (!getDerived().AlwaysRebuild() &&
8345       BaseRes.get() == E->getBase() &&
8346       IdxRes.get() == E->getIdx())
8347     return E;
8348 
8349   return getDerived().RebuildArraySubscriptExpr(
8350       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8351 }
8352 
8353 template <typename Derived>
8354 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8355   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8356   if (TryBlock.isInvalid())
8357     return StmtError();
8358 
8359   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8360   if (Handler.isInvalid())
8361     return StmtError();
8362 
8363   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8364       Handler.get() == S->getHandler())
8365     return S;
8366 
8367   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8368                                         TryBlock.get(), Handler.get());
8369 }
8370 
8371 template <typename Derived>
8372 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8373   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8374   if (Block.isInvalid())
8375     return StmtError();
8376 
8377   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8378 }
8379 
8380 template <typename Derived>
8381 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8382   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8383   if (FilterExpr.isInvalid())
8384     return StmtError();
8385 
8386   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8387   if (Block.isInvalid())
8388     return StmtError();
8389 
8390   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8391                                            Block.get());
8392 }
8393 
8394 template <typename Derived>
8395 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8396   if (isa<SEHFinallyStmt>(Handler))
8397     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8398   else
8399     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8400 }
8401 
8402 template<typename Derived>
8403 StmtResult
8404 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8405   return S;
8406 }
8407 
8408 //===----------------------------------------------------------------------===//
8409 // OpenMP directive transformation
8410 //===----------------------------------------------------------------------===//
8411 
8412 template <typename Derived>
8413 StmtResult
8414 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8415   // OMPCanonicalLoops are eliminated during transformation, since they will be
8416   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8417   // after transformation.
8418   return getDerived().TransformStmt(L->getLoopStmt());
8419 }
8420 
8421 template <typename Derived>
8422 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8423     OMPExecutableDirective *D) {
8424 
8425   // Transform the clauses
8426   llvm::SmallVector<OMPClause *, 16> TClauses;
8427   ArrayRef<OMPClause *> Clauses = D->clauses();
8428   TClauses.reserve(Clauses.size());
8429   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8430        I != E; ++I) {
8431     if (*I) {
8432       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8433       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8434       getDerived().getSema().EndOpenMPClause();
8435       if (Clause)
8436         TClauses.push_back(Clause);
8437     } else {
8438       TClauses.push_back(nullptr);
8439     }
8440   }
8441   StmtResult AssociatedStmt;
8442   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8443     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8444                                                   /*CurScope=*/nullptr);
8445     StmtResult Body;
8446     {
8447       Sema::CompoundScopeRAII CompoundScope(getSema());
8448       Stmt *CS;
8449       if (D->getDirectiveKind() == OMPD_atomic ||
8450           D->getDirectiveKind() == OMPD_critical ||
8451           D->getDirectiveKind() == OMPD_section ||
8452           D->getDirectiveKind() == OMPD_master)
8453         CS = D->getAssociatedStmt();
8454       else
8455         CS = D->getRawStmt();
8456       Body = getDerived().TransformStmt(CS);
8457       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8458           getSema().getLangOpts().OpenMPIRBuilder)
8459         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8460     }
8461     AssociatedStmt =
8462         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8463     if (AssociatedStmt.isInvalid()) {
8464       return StmtError();
8465     }
8466   }
8467   if (TClauses.size() != Clauses.size()) {
8468     return StmtError();
8469   }
8470 
8471   // Transform directive name for 'omp critical' directive.
8472   DeclarationNameInfo DirName;
8473   if (D->getDirectiveKind() == OMPD_critical) {
8474     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8475     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8476   }
8477   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8478   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8479     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8480   } else if (D->getDirectiveKind() == OMPD_cancel) {
8481     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8482   }
8483 
8484   return getDerived().RebuildOMPExecutableDirective(
8485       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8486       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8487 }
8488 
8489 template <typename Derived>
8490 StmtResult
8491 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8492   DeclarationNameInfo DirName;
8493   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8494                                              D->getBeginLoc());
8495   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8496   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8497   return Res;
8498 }
8499 
8500 template <typename Derived>
8501 StmtResult
8502 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8503   DeclarationNameInfo DirName;
8504   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8505                                              D->getBeginLoc());
8506   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8507   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8508   return Res;
8509 }
8510 
8511 template <typename Derived>
8512 StmtResult
8513 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8514   DeclarationNameInfo DirName;
8515   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8516                                              nullptr, D->getBeginLoc());
8517   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8518   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8519   return Res;
8520 }
8521 
8522 template <typename Derived>
8523 StmtResult
8524 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8525   DeclarationNameInfo DirName;
8526   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8527                                              D->getBeginLoc());
8528   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8529   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8530   return Res;
8531 }
8532 
8533 template <typename Derived>
8534 StmtResult
8535 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8536   DeclarationNameInfo DirName;
8537   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8538                                              D->getBeginLoc());
8539   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8540   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8541   return Res;
8542 }
8543 
8544 template <typename Derived>
8545 StmtResult
8546 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8547   DeclarationNameInfo DirName;
8548   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8549                                              D->getBeginLoc());
8550   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8551   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8552   return Res;
8553 }
8554 
8555 template <typename Derived>
8556 StmtResult
8557 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8558   DeclarationNameInfo DirName;
8559   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8560                                              D->getBeginLoc());
8561   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8562   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8563   return Res;
8564 }
8565 
8566 template <typename Derived>
8567 StmtResult
8568 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8569   DeclarationNameInfo DirName;
8570   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8571                                              D->getBeginLoc());
8572   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8573   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8574   return Res;
8575 }
8576 
8577 template <typename Derived>
8578 StmtResult
8579 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8580   DeclarationNameInfo DirName;
8581   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8582                                              D->getBeginLoc());
8583   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8584   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8585   return Res;
8586 }
8587 
8588 template <typename Derived>
8589 StmtResult
8590 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8591   getDerived().getSema().StartOpenMPDSABlock(
8592       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8593   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8594   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8595   return Res;
8596 }
8597 
8598 template <typename Derived>
8599 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8600     OMPParallelForDirective *D) {
8601   DeclarationNameInfo DirName;
8602   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8603                                              nullptr, D->getBeginLoc());
8604   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8605   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8606   return Res;
8607 }
8608 
8609 template <typename Derived>
8610 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8611     OMPParallelForSimdDirective *D) {
8612   DeclarationNameInfo DirName;
8613   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8614                                              nullptr, D->getBeginLoc());
8615   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8616   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8617   return Res;
8618 }
8619 
8620 template <typename Derived>
8621 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8622     OMPParallelMasterDirective *D) {
8623   DeclarationNameInfo DirName;
8624   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8625                                              nullptr, D->getBeginLoc());
8626   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8627   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8628   return Res;
8629 }
8630 
8631 template <typename Derived>
8632 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8633     OMPParallelSectionsDirective *D) {
8634   DeclarationNameInfo DirName;
8635   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8636                                              nullptr, D->getBeginLoc());
8637   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8638   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8639   return Res;
8640 }
8641 
8642 template <typename Derived>
8643 StmtResult
8644 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8645   DeclarationNameInfo DirName;
8646   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8647                                              D->getBeginLoc());
8648   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8649   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8650   return Res;
8651 }
8652 
8653 template <typename Derived>
8654 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8655     OMPTaskyieldDirective *D) {
8656   DeclarationNameInfo DirName;
8657   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8658                                              D->getBeginLoc());
8659   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8660   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8661   return Res;
8662 }
8663 
8664 template <typename Derived>
8665 StmtResult
8666 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8667   DeclarationNameInfo DirName;
8668   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8669                                              D->getBeginLoc());
8670   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8671   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8672   return Res;
8673 }
8674 
8675 template <typename Derived>
8676 StmtResult
8677 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8678   DeclarationNameInfo DirName;
8679   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8680                                              D->getBeginLoc());
8681   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8682   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8683   return Res;
8684 }
8685 
8686 template <typename Derived>
8687 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8688     OMPTaskgroupDirective *D) {
8689   DeclarationNameInfo DirName;
8690   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8691                                              D->getBeginLoc());
8692   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8693   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8694   return Res;
8695 }
8696 
8697 template <typename Derived>
8698 StmtResult
8699 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8700   DeclarationNameInfo DirName;
8701   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8702                                              D->getBeginLoc());
8703   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8704   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8705   return Res;
8706 }
8707 
8708 template <typename Derived>
8709 StmtResult
8710 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8711   DeclarationNameInfo DirName;
8712   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8713                                              D->getBeginLoc());
8714   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8715   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8716   return Res;
8717 }
8718 
8719 template <typename Derived>
8720 StmtResult
8721 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8722   DeclarationNameInfo DirName;
8723   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8724                                              D->getBeginLoc());
8725   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8726   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8727   return Res;
8728 }
8729 
8730 template <typename Derived>
8731 StmtResult
8732 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8733   DeclarationNameInfo DirName;
8734   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8735                                              D->getBeginLoc());
8736   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8737   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8738   return Res;
8739 }
8740 
8741 template <typename Derived>
8742 StmtResult
8743 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8744   DeclarationNameInfo DirName;
8745   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8746                                              D->getBeginLoc());
8747   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8748   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8749   return Res;
8750 }
8751 
8752 template <typename Derived>
8753 StmtResult
8754 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8755   DeclarationNameInfo DirName;
8756   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8757                                              D->getBeginLoc());
8758   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8759   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8760   return Res;
8761 }
8762 
8763 template <typename Derived>
8764 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8765     OMPTargetDataDirective *D) {
8766   DeclarationNameInfo DirName;
8767   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8768                                              D->getBeginLoc());
8769   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8770   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8771   return Res;
8772 }
8773 
8774 template <typename Derived>
8775 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8776     OMPTargetEnterDataDirective *D) {
8777   DeclarationNameInfo DirName;
8778   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8779                                              nullptr, D->getBeginLoc());
8780   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8781   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8782   return Res;
8783 }
8784 
8785 template <typename Derived>
8786 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8787     OMPTargetExitDataDirective *D) {
8788   DeclarationNameInfo DirName;
8789   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8790                                              nullptr, D->getBeginLoc());
8791   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8792   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8793   return Res;
8794 }
8795 
8796 template <typename Derived>
8797 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8798     OMPTargetParallelDirective *D) {
8799   DeclarationNameInfo DirName;
8800   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8801                                              nullptr, D->getBeginLoc());
8802   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8803   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8804   return Res;
8805 }
8806 
8807 template <typename Derived>
8808 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8809     OMPTargetParallelForDirective *D) {
8810   DeclarationNameInfo DirName;
8811   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8812                                              nullptr, D->getBeginLoc());
8813   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8814   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8815   return Res;
8816 }
8817 
8818 template <typename Derived>
8819 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8820     OMPTargetUpdateDirective *D) {
8821   DeclarationNameInfo DirName;
8822   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8823                                              nullptr, D->getBeginLoc());
8824   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8825   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8826   return Res;
8827 }
8828 
8829 template <typename Derived>
8830 StmtResult
8831 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8832   DeclarationNameInfo DirName;
8833   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8834                                              D->getBeginLoc());
8835   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8836   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8837   return Res;
8838 }
8839 
8840 template <typename Derived>
8841 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8842     OMPCancellationPointDirective *D) {
8843   DeclarationNameInfo DirName;
8844   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8845                                              nullptr, D->getBeginLoc());
8846   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8847   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8848   return Res;
8849 }
8850 
8851 template <typename Derived>
8852 StmtResult
8853 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8854   DeclarationNameInfo DirName;
8855   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8856                                              D->getBeginLoc());
8857   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8858   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8859   return Res;
8860 }
8861 
8862 template <typename Derived>
8863 StmtResult
8864 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8865   DeclarationNameInfo DirName;
8866   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8867                                              D->getBeginLoc());
8868   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8869   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8870   return Res;
8871 }
8872 
8873 template <typename Derived>
8874 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8875     OMPTaskLoopSimdDirective *D) {
8876   DeclarationNameInfo DirName;
8877   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8878                                              nullptr, D->getBeginLoc());
8879   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8880   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8881   return Res;
8882 }
8883 
8884 template <typename Derived>
8885 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8886     OMPMasterTaskLoopDirective *D) {
8887   DeclarationNameInfo DirName;
8888   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8889                                              nullptr, D->getBeginLoc());
8890   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8891   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8892   return Res;
8893 }
8894 
8895 template <typename Derived>
8896 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8897     OMPMasterTaskLoopSimdDirective *D) {
8898   DeclarationNameInfo DirName;
8899   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8900                                              nullptr, D->getBeginLoc());
8901   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8902   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8903   return Res;
8904 }
8905 
8906 template <typename Derived>
8907 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8908     OMPParallelMasterTaskLoopDirective *D) {
8909   DeclarationNameInfo DirName;
8910   getDerived().getSema().StartOpenMPDSABlock(
8911       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8912   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8913   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8914   return Res;
8915 }
8916 
8917 template <typename Derived>
8918 StmtResult
8919 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8920     OMPParallelMasterTaskLoopSimdDirective *D) {
8921   DeclarationNameInfo DirName;
8922   getDerived().getSema().StartOpenMPDSABlock(
8923       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8924   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8925   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8926   return Res;
8927 }
8928 
8929 template <typename Derived>
8930 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8931     OMPDistributeDirective *D) {
8932   DeclarationNameInfo DirName;
8933   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8934                                              D->getBeginLoc());
8935   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8936   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8937   return Res;
8938 }
8939 
8940 template <typename Derived>
8941 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8942     OMPDistributeParallelForDirective *D) {
8943   DeclarationNameInfo DirName;
8944   getDerived().getSema().StartOpenMPDSABlock(
8945       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8946   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8947   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8948   return Res;
8949 }
8950 
8951 template <typename Derived>
8952 StmtResult
8953 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8954     OMPDistributeParallelForSimdDirective *D) {
8955   DeclarationNameInfo DirName;
8956   getDerived().getSema().StartOpenMPDSABlock(
8957       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8958   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8959   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8960   return Res;
8961 }
8962 
8963 template <typename Derived>
8964 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8965     OMPDistributeSimdDirective *D) {
8966   DeclarationNameInfo DirName;
8967   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8968                                              nullptr, D->getBeginLoc());
8969   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8970   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8971   return Res;
8972 }
8973 
8974 template <typename Derived>
8975 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8976     OMPTargetParallelForSimdDirective *D) {
8977   DeclarationNameInfo DirName;
8978   getDerived().getSema().StartOpenMPDSABlock(
8979       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8980   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8981   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8982   return Res;
8983 }
8984 
8985 template <typename Derived>
8986 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8987     OMPTargetSimdDirective *D) {
8988   DeclarationNameInfo DirName;
8989   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8990                                              D->getBeginLoc());
8991   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8992   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8993   return Res;
8994 }
8995 
8996 template <typename Derived>
8997 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8998     OMPTeamsDistributeDirective *D) {
8999   DeclarationNameInfo DirName;
9000   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9001                                              nullptr, D->getBeginLoc());
9002   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9003   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9004   return Res;
9005 }
9006 
9007 template <typename Derived>
9008 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9009     OMPTeamsDistributeSimdDirective *D) {
9010   DeclarationNameInfo DirName;
9011   getDerived().getSema().StartOpenMPDSABlock(
9012       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9013   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9014   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9015   return Res;
9016 }
9017 
9018 template <typename Derived>
9019 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9020     OMPTeamsDistributeParallelForSimdDirective *D) {
9021   DeclarationNameInfo DirName;
9022   getDerived().getSema().StartOpenMPDSABlock(
9023       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9024       D->getBeginLoc());
9025   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9026   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9027   return Res;
9028 }
9029 
9030 template <typename Derived>
9031 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9032     OMPTeamsDistributeParallelForDirective *D) {
9033   DeclarationNameInfo DirName;
9034   getDerived().getSema().StartOpenMPDSABlock(
9035       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9036   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9037   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9038   return Res;
9039 }
9040 
9041 template <typename Derived>
9042 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9043     OMPTargetTeamsDirective *D) {
9044   DeclarationNameInfo DirName;
9045   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9046                                              nullptr, D->getBeginLoc());
9047   auto Res = getDerived().TransformOMPExecutableDirective(D);
9048   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9049   return Res;
9050 }
9051 
9052 template <typename Derived>
9053 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9054     OMPTargetTeamsDistributeDirective *D) {
9055   DeclarationNameInfo DirName;
9056   getDerived().getSema().StartOpenMPDSABlock(
9057       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9058   auto Res = getDerived().TransformOMPExecutableDirective(D);
9059   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9060   return Res;
9061 }
9062 
9063 template <typename Derived>
9064 StmtResult
9065 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9066     OMPTargetTeamsDistributeParallelForDirective *D) {
9067   DeclarationNameInfo DirName;
9068   getDerived().getSema().StartOpenMPDSABlock(
9069       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9070       D->getBeginLoc());
9071   auto Res = getDerived().TransformOMPExecutableDirective(D);
9072   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9073   return Res;
9074 }
9075 
9076 template <typename Derived>
9077 StmtResult TreeTransform<Derived>::
9078     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9079         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9080   DeclarationNameInfo DirName;
9081   getDerived().getSema().StartOpenMPDSABlock(
9082       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9083       D->getBeginLoc());
9084   auto Res = getDerived().TransformOMPExecutableDirective(D);
9085   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9086   return Res;
9087 }
9088 
9089 template <typename Derived>
9090 StmtResult
9091 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9092     OMPTargetTeamsDistributeSimdDirective *D) {
9093   DeclarationNameInfo DirName;
9094   getDerived().getSema().StartOpenMPDSABlock(
9095       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9096   auto Res = getDerived().TransformOMPExecutableDirective(D);
9097   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9098   return Res;
9099 }
9100 
9101 template <typename Derived>
9102 StmtResult
9103 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9104   DeclarationNameInfo DirName;
9105   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9106                                              D->getBeginLoc());
9107   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9108   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9109   return Res;
9110 }
9111 
9112 template <typename Derived>
9113 StmtResult
9114 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9115   DeclarationNameInfo DirName;
9116   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9117                                              D->getBeginLoc());
9118   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9119   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9120   return Res;
9121 }
9122 
9123 template <typename Derived>
9124 StmtResult
9125 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9126   DeclarationNameInfo DirName;
9127   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9128                                              D->getBeginLoc());
9129   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9130   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9131   return Res;
9132 }
9133 
9134 //===----------------------------------------------------------------------===//
9135 // OpenMP clause transformation
9136 //===----------------------------------------------------------------------===//
9137 template <typename Derived>
9138 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9139   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9140   if (Cond.isInvalid())
9141     return nullptr;
9142   return getDerived().RebuildOMPIfClause(
9143       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9144       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9145 }
9146 
9147 template <typename Derived>
9148 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9149   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9150   if (Cond.isInvalid())
9151     return nullptr;
9152   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9153                                             C->getLParenLoc(), C->getEndLoc());
9154 }
9155 
9156 template <typename Derived>
9157 OMPClause *
9158 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9159   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9160   if (NumThreads.isInvalid())
9161     return nullptr;
9162   return getDerived().RebuildOMPNumThreadsClause(
9163       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9164 }
9165 
9166 template <typename Derived>
9167 OMPClause *
9168 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9169   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9170   if (E.isInvalid())
9171     return nullptr;
9172   return getDerived().RebuildOMPSafelenClause(
9173       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9174 }
9175 
9176 template <typename Derived>
9177 OMPClause *
9178 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9179   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9180   if (E.isInvalid())
9181     return nullptr;
9182   return getDerived().RebuildOMPAllocatorClause(
9183       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9184 }
9185 
9186 template <typename Derived>
9187 OMPClause *
9188 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9189   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9190   if (E.isInvalid())
9191     return nullptr;
9192   return getDerived().RebuildOMPSimdlenClause(
9193       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9194 }
9195 
9196 template <typename Derived>
9197 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9198   SmallVector<Expr *, 4> TransformedSizes;
9199   TransformedSizes.reserve(C->getNumSizes());
9200   bool Changed = false;
9201   for (Expr *E : C->getSizesRefs()) {
9202     if (!E) {
9203       TransformedSizes.push_back(nullptr);
9204       continue;
9205     }
9206 
9207     ExprResult T = getDerived().TransformExpr(E);
9208     if (T.isInvalid())
9209       return nullptr;
9210     if (E != T.get())
9211       Changed = true;
9212     TransformedSizes.push_back(T.get());
9213   }
9214 
9215   if (!Changed && !getDerived().AlwaysRebuild())
9216     return C;
9217   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9218                                C->getLParenLoc(), C->getEndLoc());
9219 }
9220 
9221 template <typename Derived>
9222 OMPClause *
9223 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9224   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9225   if (E.isInvalid())
9226     return nullptr;
9227   return getDerived().RebuildOMPCollapseClause(
9228       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9229 }
9230 
9231 template <typename Derived>
9232 OMPClause *
9233 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9234   return getDerived().RebuildOMPDefaultClause(
9235       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9236       C->getLParenLoc(), C->getEndLoc());
9237 }
9238 
9239 template <typename Derived>
9240 OMPClause *
9241 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9242   return getDerived().RebuildOMPProcBindClause(
9243       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9244       C->getLParenLoc(), C->getEndLoc());
9245 }
9246 
9247 template <typename Derived>
9248 OMPClause *
9249 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9250   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9251   if (E.isInvalid())
9252     return nullptr;
9253   return getDerived().RebuildOMPScheduleClause(
9254       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9255       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9256       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9257       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9258 }
9259 
9260 template <typename Derived>
9261 OMPClause *
9262 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9263   ExprResult E;
9264   if (auto *Num = C->getNumForLoops()) {
9265     E = getDerived().TransformExpr(Num);
9266     if (E.isInvalid())
9267       return nullptr;
9268   }
9269   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9270                                               C->getLParenLoc(), E.get());
9271 }
9272 
9273 template <typename Derived>
9274 OMPClause *
9275 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9276   ExprResult E;
9277   if (Expr *Evt = C->getEventHandler()) {
9278     E = getDerived().TransformExpr(Evt);
9279     if (E.isInvalid())
9280       return nullptr;
9281   }
9282   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9283                                              C->getLParenLoc(), C->getEndLoc());
9284 }
9285 
9286 template <typename Derived>
9287 OMPClause *
9288 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9289   // No need to rebuild this clause, no template-dependent parameters.
9290   return C;
9291 }
9292 
9293 template <typename Derived>
9294 OMPClause *
9295 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9296   // No need to rebuild this clause, no template-dependent parameters.
9297   return C;
9298 }
9299 
9300 template <typename Derived>
9301 OMPClause *
9302 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9303   // No need to rebuild this clause, no template-dependent parameters.
9304   return C;
9305 }
9306 
9307 template <typename Derived>
9308 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9309   // No need to rebuild this clause, no template-dependent parameters.
9310   return C;
9311 }
9312 
9313 template <typename Derived>
9314 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9315   // No need to rebuild this clause, no template-dependent parameters.
9316   return C;
9317 }
9318 
9319 template <typename Derived>
9320 OMPClause *
9321 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9322   // No need to rebuild this clause, no template-dependent parameters.
9323   return C;
9324 }
9325 
9326 template <typename Derived>
9327 OMPClause *
9328 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9329   // No need to rebuild this clause, no template-dependent parameters.
9330   return C;
9331 }
9332 
9333 template <typename Derived>
9334 OMPClause *
9335 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9336   // No need to rebuild this clause, no template-dependent parameters.
9337   return C;
9338 }
9339 
9340 template <typename Derived>
9341 OMPClause *
9342 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9343   // No need to rebuild this clause, no template-dependent parameters.
9344   return C;
9345 }
9346 
9347 template <typename Derived>
9348 OMPClause *
9349 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9350   // No need to rebuild this clause, no template-dependent parameters.
9351   return C;
9352 }
9353 
9354 template <typename Derived>
9355 OMPClause *
9356 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9357   // No need to rebuild this clause, no template-dependent parameters.
9358   return C;
9359 }
9360 
9361 template <typename Derived>
9362 OMPClause *
9363 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9364   // No need to rebuild this clause, no template-dependent parameters.
9365   return C;
9366 }
9367 
9368 template <typename Derived>
9369 OMPClause *
9370 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9371   // No need to rebuild this clause, no template-dependent parameters.
9372   return C;
9373 }
9374 
9375 template <typename Derived>
9376 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9377   // No need to rebuild this clause, no template-dependent parameters.
9378   return C;
9379 }
9380 
9381 template <typename Derived>
9382 OMPClause *
9383 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9384   // No need to rebuild this clause, no template-dependent parameters.
9385   return C;
9386 }
9387 
9388 template <typename Derived>
9389 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9390   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9391   if (IVR.isInvalid())
9392     return nullptr;
9393 
9394   llvm::SmallVector<Expr *, 8> PrefExprs;
9395   PrefExprs.reserve(C->varlist_size() - 1);
9396   for (Expr *E : llvm::drop_begin(C->varlists())) {
9397     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9398     if (ER.isInvalid())
9399       return nullptr;
9400     PrefExprs.push_back(ER.get());
9401   }
9402   return getDerived().RebuildOMPInitClause(
9403       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9404       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9405 }
9406 
9407 template <typename Derived>
9408 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9409   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9410   if (ER.isInvalid())
9411     return nullptr;
9412   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9413                                           C->getLParenLoc(), C->getVarLoc(),
9414                                           C->getEndLoc());
9415 }
9416 
9417 template <typename Derived>
9418 OMPClause *
9419 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9420   ExprResult ER;
9421   if (Expr *IV = C->getInteropVar()) {
9422     ER = getDerived().TransformExpr(IV);
9423     if (ER.isInvalid())
9424       return nullptr;
9425   }
9426   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9427                                               C->getLParenLoc(), C->getVarLoc(),
9428                                               C->getEndLoc());
9429 }
9430 
9431 template <typename Derived>
9432 OMPClause *
9433 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9434   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9435   if (Cond.isInvalid())
9436     return nullptr;
9437   return getDerived().RebuildOMPNovariantsClause(
9438       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9439 }
9440 
9441 template <typename Derived>
9442 OMPClause *
9443 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9444   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9445   if (Cond.isInvalid())
9446     return nullptr;
9447   return getDerived().RebuildOMPNocontextClause(
9448       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9449 }
9450 
9451 template <typename Derived>
9452 OMPClause *
9453 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9454   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9455   if (ThreadID.isInvalid())
9456     return nullptr;
9457   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9458                                              C->getLParenLoc(), C->getEndLoc());
9459 }
9460 
9461 template <typename Derived>
9462 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9463     OMPUnifiedAddressClause *C) {
9464   llvm_unreachable("unified_address clause cannot appear in dependent context");
9465 }
9466 
9467 template <typename Derived>
9468 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9469     OMPUnifiedSharedMemoryClause *C) {
9470   llvm_unreachable(
9471       "unified_shared_memory clause cannot appear in dependent context");
9472 }
9473 
9474 template <typename Derived>
9475 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9476     OMPReverseOffloadClause *C) {
9477   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9478 }
9479 
9480 template <typename Derived>
9481 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9482     OMPDynamicAllocatorsClause *C) {
9483   llvm_unreachable(
9484       "dynamic_allocators clause cannot appear in dependent context");
9485 }
9486 
9487 template <typename Derived>
9488 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9489     OMPAtomicDefaultMemOrderClause *C) {
9490   llvm_unreachable(
9491       "atomic_default_mem_order clause cannot appear in dependent context");
9492 }
9493 
9494 template <typename Derived>
9495 OMPClause *
9496 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9497   llvm::SmallVector<Expr *, 16> Vars;
9498   Vars.reserve(C->varlist_size());
9499   for (auto *VE : C->varlists()) {
9500     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9501     if (EVar.isInvalid())
9502       return nullptr;
9503     Vars.push_back(EVar.get());
9504   }
9505   return getDerived().RebuildOMPPrivateClause(
9506       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9507 }
9508 
9509 template <typename Derived>
9510 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9511     OMPFirstprivateClause *C) {
9512   llvm::SmallVector<Expr *, 16> Vars;
9513   Vars.reserve(C->varlist_size());
9514   for (auto *VE : C->varlists()) {
9515     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9516     if (EVar.isInvalid())
9517       return nullptr;
9518     Vars.push_back(EVar.get());
9519   }
9520   return getDerived().RebuildOMPFirstprivateClause(
9521       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9522 }
9523 
9524 template <typename Derived>
9525 OMPClause *
9526 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9527   llvm::SmallVector<Expr *, 16> Vars;
9528   Vars.reserve(C->varlist_size());
9529   for (auto *VE : C->varlists()) {
9530     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9531     if (EVar.isInvalid())
9532       return nullptr;
9533     Vars.push_back(EVar.get());
9534   }
9535   return getDerived().RebuildOMPLastprivateClause(
9536       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9537       C->getLParenLoc(), C->getEndLoc());
9538 }
9539 
9540 template <typename Derived>
9541 OMPClause *
9542 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9543   llvm::SmallVector<Expr *, 16> Vars;
9544   Vars.reserve(C->varlist_size());
9545   for (auto *VE : C->varlists()) {
9546     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9547     if (EVar.isInvalid())
9548       return nullptr;
9549     Vars.push_back(EVar.get());
9550   }
9551   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9552                                              C->getLParenLoc(), C->getEndLoc());
9553 }
9554 
9555 template <typename Derived>
9556 OMPClause *
9557 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9558   llvm::SmallVector<Expr *, 16> Vars;
9559   Vars.reserve(C->varlist_size());
9560   for (auto *VE : C->varlists()) {
9561     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9562     if (EVar.isInvalid())
9563       return nullptr;
9564     Vars.push_back(EVar.get());
9565   }
9566   CXXScopeSpec ReductionIdScopeSpec;
9567   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9568 
9569   DeclarationNameInfo NameInfo = C->getNameInfo();
9570   if (NameInfo.getName()) {
9571     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9572     if (!NameInfo.getName())
9573       return nullptr;
9574   }
9575   // Build a list of all UDR decls with the same names ranged by the Scopes.
9576   // The Scope boundary is a duplication of the previous decl.
9577   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9578   for (auto *E : C->reduction_ops()) {
9579     // Transform all the decls.
9580     if (E) {
9581       auto *ULE = cast<UnresolvedLookupExpr>(E);
9582       UnresolvedSet<8> Decls;
9583       for (auto *D : ULE->decls()) {
9584         NamedDecl *InstD =
9585             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9586         Decls.addDecl(InstD, InstD->getAccess());
9587       }
9588       UnresolvedReductions.push_back(
9589        UnresolvedLookupExpr::Create(
9590           SemaRef.Context, /*NamingClass=*/nullptr,
9591           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9592           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9593           Decls.begin(), Decls.end()));
9594     } else
9595       UnresolvedReductions.push_back(nullptr);
9596   }
9597   return getDerived().RebuildOMPReductionClause(
9598       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9599       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9600       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9601 }
9602 
9603 template <typename Derived>
9604 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9605     OMPTaskReductionClause *C) {
9606   llvm::SmallVector<Expr *, 16> Vars;
9607   Vars.reserve(C->varlist_size());
9608   for (auto *VE : C->varlists()) {
9609     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9610     if (EVar.isInvalid())
9611       return nullptr;
9612     Vars.push_back(EVar.get());
9613   }
9614   CXXScopeSpec ReductionIdScopeSpec;
9615   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9616 
9617   DeclarationNameInfo NameInfo = C->getNameInfo();
9618   if (NameInfo.getName()) {
9619     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9620     if (!NameInfo.getName())
9621       return nullptr;
9622   }
9623   // Build a list of all UDR decls with the same names ranged by the Scopes.
9624   // The Scope boundary is a duplication of the previous decl.
9625   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9626   for (auto *E : C->reduction_ops()) {
9627     // Transform all the decls.
9628     if (E) {
9629       auto *ULE = cast<UnresolvedLookupExpr>(E);
9630       UnresolvedSet<8> Decls;
9631       for (auto *D : ULE->decls()) {
9632         NamedDecl *InstD =
9633             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9634         Decls.addDecl(InstD, InstD->getAccess());
9635       }
9636       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9637           SemaRef.Context, /*NamingClass=*/nullptr,
9638           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9639           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9640     } else
9641       UnresolvedReductions.push_back(nullptr);
9642   }
9643   return getDerived().RebuildOMPTaskReductionClause(
9644       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9645       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9646 }
9647 
9648 template <typename Derived>
9649 OMPClause *
9650 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9651   llvm::SmallVector<Expr *, 16> Vars;
9652   Vars.reserve(C->varlist_size());
9653   for (auto *VE : C->varlists()) {
9654     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9655     if (EVar.isInvalid())
9656       return nullptr;
9657     Vars.push_back(EVar.get());
9658   }
9659   CXXScopeSpec ReductionIdScopeSpec;
9660   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9661 
9662   DeclarationNameInfo NameInfo = C->getNameInfo();
9663   if (NameInfo.getName()) {
9664     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9665     if (!NameInfo.getName())
9666       return nullptr;
9667   }
9668   // Build a list of all UDR decls with the same names ranged by the Scopes.
9669   // The Scope boundary is a duplication of the previous decl.
9670   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9671   for (auto *E : C->reduction_ops()) {
9672     // Transform all the decls.
9673     if (E) {
9674       auto *ULE = cast<UnresolvedLookupExpr>(E);
9675       UnresolvedSet<8> Decls;
9676       for (auto *D : ULE->decls()) {
9677         NamedDecl *InstD =
9678             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9679         Decls.addDecl(InstD, InstD->getAccess());
9680       }
9681       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9682           SemaRef.Context, /*NamingClass=*/nullptr,
9683           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9684           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9685     } else
9686       UnresolvedReductions.push_back(nullptr);
9687   }
9688   return getDerived().RebuildOMPInReductionClause(
9689       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9690       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9691 }
9692 
9693 template <typename Derived>
9694 OMPClause *
9695 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9696   llvm::SmallVector<Expr *, 16> Vars;
9697   Vars.reserve(C->varlist_size());
9698   for (auto *VE : C->varlists()) {
9699     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9700     if (EVar.isInvalid())
9701       return nullptr;
9702     Vars.push_back(EVar.get());
9703   }
9704   ExprResult Step = getDerived().TransformExpr(C->getStep());
9705   if (Step.isInvalid())
9706     return nullptr;
9707   return getDerived().RebuildOMPLinearClause(
9708       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9709       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9710 }
9711 
9712 template <typename Derived>
9713 OMPClause *
9714 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9715   llvm::SmallVector<Expr *, 16> Vars;
9716   Vars.reserve(C->varlist_size());
9717   for (auto *VE : C->varlists()) {
9718     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9719     if (EVar.isInvalid())
9720       return nullptr;
9721     Vars.push_back(EVar.get());
9722   }
9723   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9724   if (Alignment.isInvalid())
9725     return nullptr;
9726   return getDerived().RebuildOMPAlignedClause(
9727       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9728       C->getColonLoc(), C->getEndLoc());
9729 }
9730 
9731 template <typename Derived>
9732 OMPClause *
9733 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9734   llvm::SmallVector<Expr *, 16> Vars;
9735   Vars.reserve(C->varlist_size());
9736   for (auto *VE : C->varlists()) {
9737     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9738     if (EVar.isInvalid())
9739       return nullptr;
9740     Vars.push_back(EVar.get());
9741   }
9742   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9743                                              C->getLParenLoc(), C->getEndLoc());
9744 }
9745 
9746 template <typename Derived>
9747 OMPClause *
9748 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9749   llvm::SmallVector<Expr *, 16> Vars;
9750   Vars.reserve(C->varlist_size());
9751   for (auto *VE : C->varlists()) {
9752     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9753     if (EVar.isInvalid())
9754       return nullptr;
9755     Vars.push_back(EVar.get());
9756   }
9757   return getDerived().RebuildOMPCopyprivateClause(
9758       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9759 }
9760 
9761 template <typename Derived>
9762 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9763   llvm::SmallVector<Expr *, 16> Vars;
9764   Vars.reserve(C->varlist_size());
9765   for (auto *VE : C->varlists()) {
9766     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9767     if (EVar.isInvalid())
9768       return nullptr;
9769     Vars.push_back(EVar.get());
9770   }
9771   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9772                                             C->getLParenLoc(), C->getEndLoc());
9773 }
9774 
9775 template <typename Derived>
9776 OMPClause *
9777 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9778   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9779   if (E.isInvalid())
9780     return nullptr;
9781   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9782                                              C->getLParenLoc(), C->getEndLoc());
9783 }
9784 
9785 template <typename Derived>
9786 OMPClause *
9787 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9788   llvm::SmallVector<Expr *, 16> Vars;
9789   Expr *DepModifier = C->getModifier();
9790   if (DepModifier) {
9791     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9792     if (DepModRes.isInvalid())
9793       return nullptr;
9794     DepModifier = DepModRes.get();
9795   }
9796   Vars.reserve(C->varlist_size());
9797   for (auto *VE : C->varlists()) {
9798     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9799     if (EVar.isInvalid())
9800       return nullptr;
9801     Vars.push_back(EVar.get());
9802   }
9803   return getDerived().RebuildOMPDependClause(
9804       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9805       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9806       C->getEndLoc());
9807 }
9808 
9809 template <typename Derived>
9810 OMPClause *
9811 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9812   ExprResult E = getDerived().TransformExpr(C->getDevice());
9813   if (E.isInvalid())
9814     return nullptr;
9815   return getDerived().RebuildOMPDeviceClause(
9816       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9817       C->getModifierLoc(), C->getEndLoc());
9818 }
9819 
9820 template <typename Derived, class T>
9821 bool transformOMPMappableExprListClause(
9822     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9823     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9824     DeclarationNameInfo &MapperIdInfo,
9825     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9826   // Transform expressions in the list.
9827   Vars.reserve(C->varlist_size());
9828   for (auto *VE : C->varlists()) {
9829     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9830     if (EVar.isInvalid())
9831       return true;
9832     Vars.push_back(EVar.get());
9833   }
9834   // Transform mapper scope specifier and identifier.
9835   NestedNameSpecifierLoc QualifierLoc;
9836   if (C->getMapperQualifierLoc()) {
9837     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9838         C->getMapperQualifierLoc());
9839     if (!QualifierLoc)
9840       return true;
9841   }
9842   MapperIdScopeSpec.Adopt(QualifierLoc);
9843   MapperIdInfo = C->getMapperIdInfo();
9844   if (MapperIdInfo.getName()) {
9845     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9846     if (!MapperIdInfo.getName())
9847       return true;
9848   }
9849   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9850   // the previous user-defined mapper lookup in dependent environment.
9851   for (auto *E : C->mapperlists()) {
9852     // Transform all the decls.
9853     if (E) {
9854       auto *ULE = cast<UnresolvedLookupExpr>(E);
9855       UnresolvedSet<8> Decls;
9856       for (auto *D : ULE->decls()) {
9857         NamedDecl *InstD =
9858             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9859         Decls.addDecl(InstD, InstD->getAccess());
9860       }
9861       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9862           TT.getSema().Context, /*NamingClass=*/nullptr,
9863           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9864           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9865           Decls.end()));
9866     } else {
9867       UnresolvedMappers.push_back(nullptr);
9868     }
9869   }
9870   return false;
9871 }
9872 
9873 template <typename Derived>
9874 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9875   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9876   llvm::SmallVector<Expr *, 16> Vars;
9877   CXXScopeSpec MapperIdScopeSpec;
9878   DeclarationNameInfo MapperIdInfo;
9879   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9880   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9881           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9882     return nullptr;
9883   return getDerived().RebuildOMPMapClause(
9884       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9885       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9886       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9887 }
9888 
9889 template <typename Derived>
9890 OMPClause *
9891 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9892   Expr *Allocator = C->getAllocator();
9893   if (Allocator) {
9894     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9895     if (AllocatorRes.isInvalid())
9896       return nullptr;
9897     Allocator = AllocatorRes.get();
9898   }
9899   llvm::SmallVector<Expr *, 16> Vars;
9900   Vars.reserve(C->varlist_size());
9901   for (auto *VE : C->varlists()) {
9902     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9903     if (EVar.isInvalid())
9904       return nullptr;
9905     Vars.push_back(EVar.get());
9906   }
9907   return getDerived().RebuildOMPAllocateClause(
9908       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9909       C->getEndLoc());
9910 }
9911 
9912 template <typename Derived>
9913 OMPClause *
9914 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9915   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9916   if (E.isInvalid())
9917     return nullptr;
9918   return getDerived().RebuildOMPNumTeamsClause(
9919       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9920 }
9921 
9922 template <typename Derived>
9923 OMPClause *
9924 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9925   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9926   if (E.isInvalid())
9927     return nullptr;
9928   return getDerived().RebuildOMPThreadLimitClause(
9929       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9930 }
9931 
9932 template <typename Derived>
9933 OMPClause *
9934 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9935   ExprResult E = getDerived().TransformExpr(C->getPriority());
9936   if (E.isInvalid())
9937     return nullptr;
9938   return getDerived().RebuildOMPPriorityClause(
9939       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9940 }
9941 
9942 template <typename Derived>
9943 OMPClause *
9944 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9945   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9946   if (E.isInvalid())
9947     return nullptr;
9948   return getDerived().RebuildOMPGrainsizeClause(
9949       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9950 }
9951 
9952 template <typename Derived>
9953 OMPClause *
9954 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9955   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9956   if (E.isInvalid())
9957     return nullptr;
9958   return getDerived().RebuildOMPNumTasksClause(
9959       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9960 }
9961 
9962 template <typename Derived>
9963 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9964   ExprResult E = getDerived().TransformExpr(C->getHint());
9965   if (E.isInvalid())
9966     return nullptr;
9967   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9968                                            C->getLParenLoc(), C->getEndLoc());
9969 }
9970 
9971 template <typename Derived>
9972 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9973     OMPDistScheduleClause *C) {
9974   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9975   if (E.isInvalid())
9976     return nullptr;
9977   return getDerived().RebuildOMPDistScheduleClause(
9978       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9979       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9980 }
9981 
9982 template <typename Derived>
9983 OMPClause *
9984 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9985   // Rebuild Defaultmap Clause since we need to invoke the checking of
9986   // defaultmap(none:variable-category) after template initialization.
9987   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9988                                                  C->getDefaultmapKind(),
9989                                                  C->getBeginLoc(),
9990                                                  C->getLParenLoc(),
9991                                                  C->getDefaultmapModifierLoc(),
9992                                                  C->getDefaultmapKindLoc(),
9993                                                  C->getEndLoc());
9994 }
9995 
9996 template <typename Derived>
9997 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9998   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9999   llvm::SmallVector<Expr *, 16> Vars;
10000   CXXScopeSpec MapperIdScopeSpec;
10001   DeclarationNameInfo MapperIdInfo;
10002   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10003   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10004           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10005     return nullptr;
10006   return getDerived().RebuildOMPToClause(
10007       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10008       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10009 }
10010 
10011 template <typename Derived>
10012 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10013   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10014   llvm::SmallVector<Expr *, 16> Vars;
10015   CXXScopeSpec MapperIdScopeSpec;
10016   DeclarationNameInfo MapperIdInfo;
10017   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10018   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10019           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10020     return nullptr;
10021   return getDerived().RebuildOMPFromClause(
10022       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10023       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10024 }
10025 
10026 template <typename Derived>
10027 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10028     OMPUseDevicePtrClause *C) {
10029   llvm::SmallVector<Expr *, 16> Vars;
10030   Vars.reserve(C->varlist_size());
10031   for (auto *VE : C->varlists()) {
10032     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10033     if (EVar.isInvalid())
10034       return nullptr;
10035     Vars.push_back(EVar.get());
10036   }
10037   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10038   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10039 }
10040 
10041 template <typename Derived>
10042 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10043     OMPUseDeviceAddrClause *C) {
10044   llvm::SmallVector<Expr *, 16> Vars;
10045   Vars.reserve(C->varlist_size());
10046   for (auto *VE : C->varlists()) {
10047     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10048     if (EVar.isInvalid())
10049       return nullptr;
10050     Vars.push_back(EVar.get());
10051   }
10052   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10053   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10054 }
10055 
10056 template <typename Derived>
10057 OMPClause *
10058 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10059   llvm::SmallVector<Expr *, 16> Vars;
10060   Vars.reserve(C->varlist_size());
10061   for (auto *VE : C->varlists()) {
10062     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10063     if (EVar.isInvalid())
10064       return nullptr;
10065     Vars.push_back(EVar.get());
10066   }
10067   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10068   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10069 }
10070 
10071 template <typename Derived>
10072 OMPClause *
10073 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10074   llvm::SmallVector<Expr *, 16> Vars;
10075   Vars.reserve(C->varlist_size());
10076   for (auto *VE : C->varlists()) {
10077     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10078     if (EVar.isInvalid())
10079       return nullptr;
10080     Vars.push_back(EVar.get());
10081   }
10082   return getDerived().RebuildOMPNontemporalClause(
10083       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10084 }
10085 
10086 template <typename Derived>
10087 OMPClause *
10088 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10089   llvm::SmallVector<Expr *, 16> Vars;
10090   Vars.reserve(C->varlist_size());
10091   for (auto *VE : C->varlists()) {
10092     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10093     if (EVar.isInvalid())
10094       return nullptr;
10095     Vars.push_back(EVar.get());
10096   }
10097   return getDerived().RebuildOMPInclusiveClause(
10098       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10099 }
10100 
10101 template <typename Derived>
10102 OMPClause *
10103 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10104   llvm::SmallVector<Expr *, 16> Vars;
10105   Vars.reserve(C->varlist_size());
10106   for (auto *VE : C->varlists()) {
10107     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10108     if (EVar.isInvalid())
10109       return nullptr;
10110     Vars.push_back(EVar.get());
10111   }
10112   return getDerived().RebuildOMPExclusiveClause(
10113       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10114 }
10115 
10116 template <typename Derived>
10117 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10118     OMPUsesAllocatorsClause *C) {
10119   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10120   Data.reserve(C->getNumberOfAllocators());
10121   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10122     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10123     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10124     if (Allocator.isInvalid())
10125       continue;
10126     ExprResult AllocatorTraits;
10127     if (Expr *AT = D.AllocatorTraits) {
10128       AllocatorTraits = getDerived().TransformExpr(AT);
10129       if (AllocatorTraits.isInvalid())
10130         continue;
10131     }
10132     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10133     NewD.Allocator = Allocator.get();
10134     NewD.AllocatorTraits = AllocatorTraits.get();
10135     NewD.LParenLoc = D.LParenLoc;
10136     NewD.RParenLoc = D.RParenLoc;
10137   }
10138   return getDerived().RebuildOMPUsesAllocatorsClause(
10139       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10140 }
10141 
10142 template <typename Derived>
10143 OMPClause *
10144 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10145   SmallVector<Expr *, 4> Locators;
10146   Locators.reserve(C->varlist_size());
10147   ExprResult ModifierRes;
10148   if (Expr *Modifier = C->getModifier()) {
10149     ModifierRes = getDerived().TransformExpr(Modifier);
10150     if (ModifierRes.isInvalid())
10151       return nullptr;
10152   }
10153   for (Expr *E : C->varlists()) {
10154     ExprResult Locator = getDerived().TransformExpr(E);
10155     if (Locator.isInvalid())
10156       continue;
10157     Locators.push_back(Locator.get());
10158   }
10159   return getDerived().RebuildOMPAffinityClause(
10160       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10161       ModifierRes.get(), Locators);
10162 }
10163 
10164 template <typename Derived>
10165 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10166   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10167                                             C->getBeginLoc(), C->getLParenLoc(),
10168                                             C->getEndLoc());
10169 }
10170 
10171 //===----------------------------------------------------------------------===//
10172 // Expression transformation
10173 //===----------------------------------------------------------------------===//
10174 template<typename Derived>
10175 ExprResult
10176 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10177   return TransformExpr(E->getSubExpr());
10178 }
10179 
10180 template<typename Derived>
10181 ExprResult
10182 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10183   if (!E->isTypeDependent())
10184     return E;
10185 
10186   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10187                                             E->getIdentKind());
10188 }
10189 
10190 template<typename Derived>
10191 ExprResult
10192 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10193   NestedNameSpecifierLoc QualifierLoc;
10194   if (E->getQualifierLoc()) {
10195     QualifierLoc
10196       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10197     if (!QualifierLoc)
10198       return ExprError();
10199   }
10200 
10201   ValueDecl *ND
10202     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10203                                                          E->getDecl()));
10204   if (!ND)
10205     return ExprError();
10206 
10207   NamedDecl *Found = ND;
10208   if (E->getFoundDecl() != E->getDecl()) {
10209     Found = cast_or_null<NamedDecl>(
10210         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10211     if (!Found)
10212       return ExprError();
10213   }
10214 
10215   DeclarationNameInfo NameInfo = E->getNameInfo();
10216   if (NameInfo.getName()) {
10217     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10218     if (!NameInfo.getName())
10219       return ExprError();
10220   }
10221 
10222   if (!getDerived().AlwaysRebuild() &&
10223       QualifierLoc == E->getQualifierLoc() &&
10224       ND == E->getDecl() &&
10225       Found == E->getFoundDecl() &&
10226       NameInfo.getName() == E->getDecl()->getDeclName() &&
10227       !E->hasExplicitTemplateArgs()) {
10228 
10229     // Mark it referenced in the new context regardless.
10230     // FIXME: this is a bit instantiation-specific.
10231     SemaRef.MarkDeclRefReferenced(E);
10232 
10233     return E;
10234   }
10235 
10236   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10237   if (E->hasExplicitTemplateArgs()) {
10238     TemplateArgs = &TransArgs;
10239     TransArgs.setLAngleLoc(E->getLAngleLoc());
10240     TransArgs.setRAngleLoc(E->getRAngleLoc());
10241     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10242                                                 E->getNumTemplateArgs(),
10243                                                 TransArgs))
10244       return ExprError();
10245   }
10246 
10247   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10248                                          Found, TemplateArgs);
10249 }
10250 
10251 template<typename Derived>
10252 ExprResult
10253 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10254   return E;
10255 }
10256 
10257 template <typename Derived>
10258 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10259     FixedPointLiteral *E) {
10260   return E;
10261 }
10262 
10263 template<typename Derived>
10264 ExprResult
10265 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10266   return E;
10267 }
10268 
10269 template<typename Derived>
10270 ExprResult
10271 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10272   return E;
10273 }
10274 
10275 template<typename Derived>
10276 ExprResult
10277 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10278   return E;
10279 }
10280 
10281 template<typename Derived>
10282 ExprResult
10283 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10284   return E;
10285 }
10286 
10287 template<typename Derived>
10288 ExprResult
10289 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10290   if (FunctionDecl *FD = E->getDirectCallee())
10291     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10292   return SemaRef.MaybeBindToTemporary(E);
10293 }
10294 
10295 template<typename Derived>
10296 ExprResult
10297 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10298   ExprResult ControllingExpr =
10299     getDerived().TransformExpr(E->getControllingExpr());
10300   if (ControllingExpr.isInvalid())
10301     return ExprError();
10302 
10303   SmallVector<Expr *, 4> AssocExprs;
10304   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10305   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10306     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10307     if (TSI) {
10308       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10309       if (!AssocType)
10310         return ExprError();
10311       AssocTypes.push_back(AssocType);
10312     } else {
10313       AssocTypes.push_back(nullptr);
10314     }
10315 
10316     ExprResult AssocExpr =
10317         getDerived().TransformExpr(Assoc.getAssociationExpr());
10318     if (AssocExpr.isInvalid())
10319       return ExprError();
10320     AssocExprs.push_back(AssocExpr.get());
10321   }
10322 
10323   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10324                                                   E->getDefaultLoc(),
10325                                                   E->getRParenLoc(),
10326                                                   ControllingExpr.get(),
10327                                                   AssocTypes,
10328                                                   AssocExprs);
10329 }
10330 
10331 template<typename Derived>
10332 ExprResult
10333 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10334   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10335   if (SubExpr.isInvalid())
10336     return ExprError();
10337 
10338   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10339     return E;
10340 
10341   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10342                                        E->getRParen());
10343 }
10344 
10345 /// The operand of a unary address-of operator has special rules: it's
10346 /// allowed to refer to a non-static member of a class even if there's no 'this'
10347 /// object available.
10348 template<typename Derived>
10349 ExprResult
10350 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10351   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10352     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10353   else
10354     return getDerived().TransformExpr(E);
10355 }
10356 
10357 template<typename Derived>
10358 ExprResult
10359 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10360   ExprResult SubExpr;
10361   if (E->getOpcode() == UO_AddrOf)
10362     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10363   else
10364     SubExpr = TransformExpr(E->getSubExpr());
10365   if (SubExpr.isInvalid())
10366     return ExprError();
10367 
10368   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10369     return E;
10370 
10371   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10372                                            E->getOpcode(),
10373                                            SubExpr.get());
10374 }
10375 
10376 template<typename Derived>
10377 ExprResult
10378 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10379   // Transform the type.
10380   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10381   if (!Type)
10382     return ExprError();
10383 
10384   // Transform all of the components into components similar to what the
10385   // parser uses.
10386   // FIXME: It would be slightly more efficient in the non-dependent case to
10387   // just map FieldDecls, rather than requiring the rebuilder to look for
10388   // the fields again. However, __builtin_offsetof is rare enough in
10389   // template code that we don't care.
10390   bool ExprChanged = false;
10391   typedef Sema::OffsetOfComponent Component;
10392   SmallVector<Component, 4> Components;
10393   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10394     const OffsetOfNode &ON = E->getComponent(I);
10395     Component Comp;
10396     Comp.isBrackets = true;
10397     Comp.LocStart = ON.getSourceRange().getBegin();
10398     Comp.LocEnd = ON.getSourceRange().getEnd();
10399     switch (ON.getKind()) {
10400     case OffsetOfNode::Array: {
10401       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10402       ExprResult Index = getDerived().TransformExpr(FromIndex);
10403       if (Index.isInvalid())
10404         return ExprError();
10405 
10406       ExprChanged = ExprChanged || Index.get() != FromIndex;
10407       Comp.isBrackets = true;
10408       Comp.U.E = Index.get();
10409       break;
10410     }
10411 
10412     case OffsetOfNode::Field:
10413     case OffsetOfNode::Identifier:
10414       Comp.isBrackets = false;
10415       Comp.U.IdentInfo = ON.getFieldName();
10416       if (!Comp.U.IdentInfo)
10417         continue;
10418 
10419       break;
10420 
10421     case OffsetOfNode::Base:
10422       // Will be recomputed during the rebuild.
10423       continue;
10424     }
10425 
10426     Components.push_back(Comp);
10427   }
10428 
10429   // If nothing changed, retain the existing expression.
10430   if (!getDerived().AlwaysRebuild() &&
10431       Type == E->getTypeSourceInfo() &&
10432       !ExprChanged)
10433     return E;
10434 
10435   // Build a new offsetof expression.
10436   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10437                                           Components, E->getRParenLoc());
10438 }
10439 
10440 template<typename Derived>
10441 ExprResult
10442 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10443   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10444          "opaque value expression requires transformation");
10445   return E;
10446 }
10447 
10448 template<typename Derived>
10449 ExprResult
10450 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10451   return E;
10452 }
10453 
10454 template <typename Derived>
10455 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10456   llvm::SmallVector<Expr *, 8> Children;
10457   bool Changed = false;
10458   for (Expr *C : E->subExpressions()) {
10459     ExprResult NewC = getDerived().TransformExpr(C);
10460     if (NewC.isInvalid())
10461       return ExprError();
10462     Children.push_back(NewC.get());
10463 
10464     Changed |= NewC.get() != C;
10465   }
10466   if (!getDerived().AlwaysRebuild() && !Changed)
10467     return E;
10468   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10469                                           Children, E->getType());
10470 }
10471 
10472 template<typename Derived>
10473 ExprResult
10474 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10475   // Rebuild the syntactic form.  The original syntactic form has
10476   // opaque-value expressions in it, so strip those away and rebuild
10477   // the result.  This is a really awful way of doing this, but the
10478   // better solution (rebuilding the semantic expressions and
10479   // rebinding OVEs as necessary) doesn't work; we'd need
10480   // TreeTransform to not strip away implicit conversions.
10481   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10482   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10483   if (result.isInvalid()) return ExprError();
10484 
10485   // If that gives us a pseudo-object result back, the pseudo-object
10486   // expression must have been an lvalue-to-rvalue conversion which we
10487   // should reapply.
10488   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10489     result = SemaRef.checkPseudoObjectRValue(result.get());
10490 
10491   return result;
10492 }
10493 
10494 template<typename Derived>
10495 ExprResult
10496 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10497                                                 UnaryExprOrTypeTraitExpr *E) {
10498   if (E->isArgumentType()) {
10499     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10500 
10501     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10502     if (!NewT)
10503       return ExprError();
10504 
10505     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10506       return E;
10507 
10508     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10509                                                     E->getKind(),
10510                                                     E->getSourceRange());
10511   }
10512 
10513   // C++0x [expr.sizeof]p1:
10514   //   The operand is either an expression, which is an unevaluated operand
10515   //   [...]
10516   EnterExpressionEvaluationContext Unevaluated(
10517       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10518       Sema::ReuseLambdaContextDecl);
10519 
10520   // Try to recover if we have something like sizeof(T::X) where X is a type.
10521   // Notably, there must be *exactly* one set of parens if X is a type.
10522   TypeSourceInfo *RecoveryTSI = nullptr;
10523   ExprResult SubExpr;
10524   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10525   if (auto *DRE =
10526           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10527     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10528         PE, DRE, false, &RecoveryTSI);
10529   else
10530     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10531 
10532   if (RecoveryTSI) {
10533     return getDerived().RebuildUnaryExprOrTypeTrait(
10534         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10535   } else if (SubExpr.isInvalid())
10536     return ExprError();
10537 
10538   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10539     return E;
10540 
10541   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10542                                                   E->getOperatorLoc(),
10543                                                   E->getKind(),
10544                                                   E->getSourceRange());
10545 }
10546 
10547 template<typename Derived>
10548 ExprResult
10549 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10550   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10551   if (LHS.isInvalid())
10552     return ExprError();
10553 
10554   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10555   if (RHS.isInvalid())
10556     return ExprError();
10557 
10558 
10559   if (!getDerived().AlwaysRebuild() &&
10560       LHS.get() == E->getLHS() &&
10561       RHS.get() == E->getRHS())
10562     return E;
10563 
10564   return getDerived().RebuildArraySubscriptExpr(
10565       LHS.get(),
10566       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10567 }
10568 
10569 template <typename Derived>
10570 ExprResult
10571 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10572   ExprResult Base = getDerived().TransformExpr(E->getBase());
10573   if (Base.isInvalid())
10574     return ExprError();
10575 
10576   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10577   if (RowIdx.isInvalid())
10578     return ExprError();
10579 
10580   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10581   if (ColumnIdx.isInvalid())
10582     return ExprError();
10583 
10584   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10585       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10586     return E;
10587 
10588   return getDerived().RebuildMatrixSubscriptExpr(
10589       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10590 }
10591 
10592 template <typename Derived>
10593 ExprResult
10594 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10595   ExprResult Base = getDerived().TransformExpr(E->getBase());
10596   if (Base.isInvalid())
10597     return ExprError();
10598 
10599   ExprResult LowerBound;
10600   if (E->getLowerBound()) {
10601     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10602     if (LowerBound.isInvalid())
10603       return ExprError();
10604   }
10605 
10606   ExprResult Length;
10607   if (E->getLength()) {
10608     Length = getDerived().TransformExpr(E->getLength());
10609     if (Length.isInvalid())
10610       return ExprError();
10611   }
10612 
10613   ExprResult Stride;
10614   if (Expr *Str = E->getStride()) {
10615     Stride = getDerived().TransformExpr(Str);
10616     if (Stride.isInvalid())
10617       return ExprError();
10618   }
10619 
10620   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10621       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10622     return E;
10623 
10624   return getDerived().RebuildOMPArraySectionExpr(
10625       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10626       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10627       E->getRBracketLoc());
10628 }
10629 
10630 template <typename Derived>
10631 ExprResult
10632 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10633   ExprResult Base = getDerived().TransformExpr(E->getBase());
10634   if (Base.isInvalid())
10635     return ExprError();
10636 
10637   SmallVector<Expr *, 4> Dims;
10638   bool ErrorFound = false;
10639   for (Expr *Dim : E->getDimensions()) {
10640     ExprResult DimRes = getDerived().TransformExpr(Dim);
10641     if (DimRes.isInvalid()) {
10642       ErrorFound = true;
10643       continue;
10644     }
10645     Dims.push_back(DimRes.get());
10646   }
10647 
10648   if (ErrorFound)
10649     return ExprError();
10650   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10651                                                  E->getRParenLoc(), Dims,
10652                                                  E->getBracketsRanges());
10653 }
10654 
10655 template <typename Derived>
10656 ExprResult
10657 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10658   unsigned NumIterators = E->numOfIterators();
10659   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10660 
10661   bool ErrorFound = false;
10662   bool NeedToRebuild = getDerived().AlwaysRebuild();
10663   for (unsigned I = 0; I < NumIterators; ++I) {
10664     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10665     Data[I].DeclIdent = D->getIdentifier();
10666     Data[I].DeclIdentLoc = D->getLocation();
10667     if (D->getLocation() == D->getBeginLoc()) {
10668       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10669              "Implicit type must be int.");
10670     } else {
10671       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10672       QualType DeclTy = getDerived().TransformType(D->getType());
10673       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10674     }
10675     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10676     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10677     ExprResult End = getDerived().TransformExpr(Range.End);
10678     ExprResult Step = getDerived().TransformExpr(Range.Step);
10679     ErrorFound = ErrorFound ||
10680                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10681                                                !Data[I].Type.get().isNull())) ||
10682                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10683     if (ErrorFound)
10684       continue;
10685     Data[I].Range.Begin = Begin.get();
10686     Data[I].Range.End = End.get();
10687     Data[I].Range.Step = Step.get();
10688     Data[I].AssignLoc = E->getAssignLoc(I);
10689     Data[I].ColonLoc = E->getColonLoc(I);
10690     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10691     NeedToRebuild =
10692         NeedToRebuild ||
10693         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10694                                        D->getType().getTypePtrOrNull()) ||
10695         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10696         Range.Step != Data[I].Range.Step;
10697   }
10698   if (ErrorFound)
10699     return ExprError();
10700   if (!NeedToRebuild)
10701     return E;
10702 
10703   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10704       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10705   if (!Res.isUsable())
10706     return Res;
10707   auto *IE = cast<OMPIteratorExpr>(Res.get());
10708   for (unsigned I = 0; I < NumIterators; ++I)
10709     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10710                                       IE->getIteratorDecl(I));
10711   return Res;
10712 }
10713 
10714 template<typename Derived>
10715 ExprResult
10716 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10717   // Transform the callee.
10718   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10719   if (Callee.isInvalid())
10720     return ExprError();
10721 
10722   // Transform arguments.
10723   bool ArgChanged = false;
10724   SmallVector<Expr*, 8> Args;
10725   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10726                                   &ArgChanged))
10727     return ExprError();
10728 
10729   if (!getDerived().AlwaysRebuild() &&
10730       Callee.get() == E->getCallee() &&
10731       !ArgChanged)
10732     return SemaRef.MaybeBindToTemporary(E);
10733 
10734   // FIXME: Wrong source location information for the '('.
10735   SourceLocation FakeLParenLoc
10736     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10737 
10738   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10739   if (E->hasStoredFPFeatures()) {
10740     FPOptionsOverride NewOverrides = E->getFPFeatures();
10741     getSema().CurFPFeatures =
10742         NewOverrides.applyOverrides(getSema().getLangOpts());
10743     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10744   }
10745 
10746   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10747                                       Args,
10748                                       E->getRParenLoc());
10749 }
10750 
10751 template<typename Derived>
10752 ExprResult
10753 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10754   ExprResult Base = getDerived().TransformExpr(E->getBase());
10755   if (Base.isInvalid())
10756     return ExprError();
10757 
10758   NestedNameSpecifierLoc QualifierLoc;
10759   if (E->hasQualifier()) {
10760     QualifierLoc
10761       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10762 
10763     if (!QualifierLoc)
10764       return ExprError();
10765   }
10766   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10767 
10768   ValueDecl *Member
10769     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10770                                                          E->getMemberDecl()));
10771   if (!Member)
10772     return ExprError();
10773 
10774   NamedDecl *FoundDecl = E->getFoundDecl();
10775   if (FoundDecl == E->getMemberDecl()) {
10776     FoundDecl = Member;
10777   } else {
10778     FoundDecl = cast_or_null<NamedDecl>(
10779                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10780     if (!FoundDecl)
10781       return ExprError();
10782   }
10783 
10784   if (!getDerived().AlwaysRebuild() &&
10785       Base.get() == E->getBase() &&
10786       QualifierLoc == E->getQualifierLoc() &&
10787       Member == E->getMemberDecl() &&
10788       FoundDecl == E->getFoundDecl() &&
10789       !E->hasExplicitTemplateArgs()) {
10790 
10791     // Mark it referenced in the new context regardless.
10792     // FIXME: this is a bit instantiation-specific.
10793     SemaRef.MarkMemberReferenced(E);
10794 
10795     return E;
10796   }
10797 
10798   TemplateArgumentListInfo TransArgs;
10799   if (E->hasExplicitTemplateArgs()) {
10800     TransArgs.setLAngleLoc(E->getLAngleLoc());
10801     TransArgs.setRAngleLoc(E->getRAngleLoc());
10802     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10803                                                 E->getNumTemplateArgs(),
10804                                                 TransArgs))
10805       return ExprError();
10806   }
10807 
10808   // FIXME: Bogus source location for the operator
10809   SourceLocation FakeOperatorLoc =
10810       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10811 
10812   // FIXME: to do this check properly, we will need to preserve the
10813   // first-qualifier-in-scope here, just in case we had a dependent
10814   // base (and therefore couldn't do the check) and a
10815   // nested-name-qualifier (and therefore could do the lookup).
10816   NamedDecl *FirstQualifierInScope = nullptr;
10817   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10818   if (MemberNameInfo.getName()) {
10819     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10820     if (!MemberNameInfo.getName())
10821       return ExprError();
10822   }
10823 
10824   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10825                                         E->isArrow(),
10826                                         QualifierLoc,
10827                                         TemplateKWLoc,
10828                                         MemberNameInfo,
10829                                         Member,
10830                                         FoundDecl,
10831                                         (E->hasExplicitTemplateArgs()
10832                                            ? &TransArgs : nullptr),
10833                                         FirstQualifierInScope);
10834 }
10835 
10836 template<typename Derived>
10837 ExprResult
10838 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10839   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10840   if (LHS.isInvalid())
10841     return ExprError();
10842 
10843   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10844   if (RHS.isInvalid())
10845     return ExprError();
10846 
10847   if (!getDerived().AlwaysRebuild() &&
10848       LHS.get() == E->getLHS() &&
10849       RHS.get() == E->getRHS())
10850     return E;
10851 
10852   if (E->isCompoundAssignmentOp())
10853     // FPFeatures has already been established from trailing storage
10854     return getDerived().RebuildBinaryOperator(
10855         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10856   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10857   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10858   getSema().CurFPFeatures =
10859       NewOverrides.applyOverrides(getSema().getLangOpts());
10860   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10861   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10862                                             LHS.get(), RHS.get());
10863 }
10864 
10865 template <typename Derived>
10866 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10867     CXXRewrittenBinaryOperator *E) {
10868   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10869 
10870   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10871   if (LHS.isInvalid())
10872     return ExprError();
10873 
10874   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10875   if (RHS.isInvalid())
10876     return ExprError();
10877 
10878   if (!getDerived().AlwaysRebuild() &&
10879       LHS.get() == Decomp.LHS &&
10880       RHS.get() == Decomp.RHS)
10881     return E;
10882 
10883   // Extract the already-resolved callee declarations so that we can restrict
10884   // ourselves to using them as the unqualified lookup results when rebuilding.
10885   UnresolvedSet<2> UnqualLookups;
10886   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10887                             const_cast<Expr *>(Decomp.InnerBinOp)};
10888   for (Expr *PossibleBinOp : PossibleBinOps) {
10889     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10890     if (!Op)
10891       continue;
10892     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10893     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10894       continue;
10895 
10896     // Transform the callee in case we built a call to a local extern
10897     // declaration.
10898     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10899         E->getOperatorLoc(), Callee->getFoundDecl()));
10900     if (!Found)
10901       return ExprError();
10902     UnqualLookups.addDecl(Found);
10903   }
10904 
10905   return getDerived().RebuildCXXRewrittenBinaryOperator(
10906       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10907 }
10908 
10909 template<typename Derived>
10910 ExprResult
10911 TreeTransform<Derived>::TransformCompoundAssignOperator(
10912                                                       CompoundAssignOperator *E) {
10913   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10914   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10915   getSema().CurFPFeatures =
10916       NewOverrides.applyOverrides(getSema().getLangOpts());
10917   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10918   return getDerived().TransformBinaryOperator(E);
10919 }
10920 
10921 template<typename Derived>
10922 ExprResult TreeTransform<Derived>::
10923 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10924   // Just rebuild the common and RHS expressions and see whether we
10925   // get any changes.
10926 
10927   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10928   if (commonExpr.isInvalid())
10929     return ExprError();
10930 
10931   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10932   if (rhs.isInvalid())
10933     return ExprError();
10934 
10935   if (!getDerived().AlwaysRebuild() &&
10936       commonExpr.get() == e->getCommon() &&
10937       rhs.get() == e->getFalseExpr())
10938     return e;
10939 
10940   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10941                                                  e->getQuestionLoc(),
10942                                                  nullptr,
10943                                                  e->getColonLoc(),
10944                                                  rhs.get());
10945 }
10946 
10947 template<typename Derived>
10948 ExprResult
10949 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10950   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10951   if (Cond.isInvalid())
10952     return ExprError();
10953 
10954   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10955   if (LHS.isInvalid())
10956     return ExprError();
10957 
10958   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10959   if (RHS.isInvalid())
10960     return ExprError();
10961 
10962   if (!getDerived().AlwaysRebuild() &&
10963       Cond.get() == E->getCond() &&
10964       LHS.get() == E->getLHS() &&
10965       RHS.get() == E->getRHS())
10966     return E;
10967 
10968   return getDerived().RebuildConditionalOperator(Cond.get(),
10969                                                  E->getQuestionLoc(),
10970                                                  LHS.get(),
10971                                                  E->getColonLoc(),
10972                                                  RHS.get());
10973 }
10974 
10975 template<typename Derived>
10976 ExprResult
10977 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10978   // Implicit casts are eliminated during transformation, since they
10979   // will be recomputed by semantic analysis after transformation.
10980   return getDerived().TransformExpr(E->getSubExprAsWritten());
10981 }
10982 
10983 template<typename Derived>
10984 ExprResult
10985 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10986   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10987   if (!Type)
10988     return ExprError();
10989 
10990   ExprResult SubExpr
10991     = getDerived().TransformExpr(E->getSubExprAsWritten());
10992   if (SubExpr.isInvalid())
10993     return ExprError();
10994 
10995   if (!getDerived().AlwaysRebuild() &&
10996       Type == E->getTypeInfoAsWritten() &&
10997       SubExpr.get() == E->getSubExpr())
10998     return E;
10999 
11000   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11001                                             Type,
11002                                             E->getRParenLoc(),
11003                                             SubExpr.get());
11004 }
11005 
11006 template<typename Derived>
11007 ExprResult
11008 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11009   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11010   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11011   if (!NewT)
11012     return ExprError();
11013 
11014   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11015   if (Init.isInvalid())
11016     return ExprError();
11017 
11018   if (!getDerived().AlwaysRebuild() &&
11019       OldT == NewT &&
11020       Init.get() == E->getInitializer())
11021     return SemaRef.MaybeBindToTemporary(E);
11022 
11023   // Note: the expression type doesn't necessarily match the
11024   // type-as-written, but that's okay, because it should always be
11025   // derivable from the initializer.
11026 
11027   return getDerived().RebuildCompoundLiteralExpr(
11028       E->getLParenLoc(), NewT,
11029       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11030 }
11031 
11032 template<typename Derived>
11033 ExprResult
11034 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11035   ExprResult Base = getDerived().TransformExpr(E->getBase());
11036   if (Base.isInvalid())
11037     return ExprError();
11038 
11039   if (!getDerived().AlwaysRebuild() &&
11040       Base.get() == E->getBase())
11041     return E;
11042 
11043   // FIXME: Bad source location
11044   SourceLocation FakeOperatorLoc =
11045       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11046   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11047                                                   E->getAccessorLoc(),
11048                                                   E->getAccessor());
11049 }
11050 
11051 template<typename Derived>
11052 ExprResult
11053 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11054   if (InitListExpr *Syntactic = E->getSyntacticForm())
11055     E = Syntactic;
11056 
11057   bool InitChanged = false;
11058 
11059   EnterExpressionEvaluationContext Context(
11060       getSema(), EnterExpressionEvaluationContext::InitList);
11061 
11062   SmallVector<Expr*, 4> Inits;
11063   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11064                                   Inits, &InitChanged))
11065     return ExprError();
11066 
11067   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11068     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11069     // in some cases. We can't reuse it in general, because the syntactic and
11070     // semantic forms are linked, and we can't know that semantic form will
11071     // match even if the syntactic form does.
11072   }
11073 
11074   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11075                                       E->getRBraceLoc());
11076 }
11077 
11078 template<typename Derived>
11079 ExprResult
11080 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11081   Designation Desig;
11082 
11083   // transform the initializer value
11084   ExprResult Init = getDerived().TransformExpr(E->getInit());
11085   if (Init.isInvalid())
11086     return ExprError();
11087 
11088   // transform the designators.
11089   SmallVector<Expr*, 4> ArrayExprs;
11090   bool ExprChanged = false;
11091   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11092     if (D.isFieldDesignator()) {
11093       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11094                                                D.getDotLoc(),
11095                                                D.getFieldLoc()));
11096       if (D.getField()) {
11097         FieldDecl *Field = cast_or_null<FieldDecl>(
11098             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11099         if (Field != D.getField())
11100           // Rebuild the expression when the transformed FieldDecl is
11101           // different to the already assigned FieldDecl.
11102           ExprChanged = true;
11103       } else {
11104         // Ensure that the designator expression is rebuilt when there isn't
11105         // a resolved FieldDecl in the designator as we don't want to assign
11106         // a FieldDecl to a pattern designator that will be instantiated again.
11107         ExprChanged = true;
11108       }
11109       continue;
11110     }
11111 
11112     if (D.isArrayDesignator()) {
11113       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11114       if (Index.isInvalid())
11115         return ExprError();
11116 
11117       Desig.AddDesignator(
11118           Designator::getArray(Index.get(), D.getLBracketLoc()));
11119 
11120       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11121       ArrayExprs.push_back(Index.get());
11122       continue;
11123     }
11124 
11125     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11126     ExprResult Start
11127       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11128     if (Start.isInvalid())
11129       return ExprError();
11130 
11131     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11132     if (End.isInvalid())
11133       return ExprError();
11134 
11135     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11136                                                   End.get(),
11137                                                   D.getLBracketLoc(),
11138                                                   D.getEllipsisLoc()));
11139 
11140     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11141                   End.get() != E->getArrayRangeEnd(D);
11142 
11143     ArrayExprs.push_back(Start.get());
11144     ArrayExprs.push_back(End.get());
11145   }
11146 
11147   if (!getDerived().AlwaysRebuild() &&
11148       Init.get() == E->getInit() &&
11149       !ExprChanged)
11150     return E;
11151 
11152   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11153                                                 E->getEqualOrColonLoc(),
11154                                                 E->usesGNUSyntax(), Init.get());
11155 }
11156 
11157 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11158 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11159 template<typename Derived>
11160 ExprResult
11161 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11162     DesignatedInitUpdateExpr *E) {
11163   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11164                    "initializer");
11165   return ExprError();
11166 }
11167 
11168 template<typename Derived>
11169 ExprResult
11170 TreeTransform<Derived>::TransformNoInitExpr(
11171     NoInitExpr *E) {
11172   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11173   return ExprError();
11174 }
11175 
11176 template<typename Derived>
11177 ExprResult
11178 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11179   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11180   return ExprError();
11181 }
11182 
11183 template<typename Derived>
11184 ExprResult
11185 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11186   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11187   return ExprError();
11188 }
11189 
11190 template<typename Derived>
11191 ExprResult
11192 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11193                                                      ImplicitValueInitExpr *E) {
11194   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11195 
11196   // FIXME: Will we ever have proper type location here? Will we actually
11197   // need to transform the type?
11198   QualType T = getDerived().TransformType(E->getType());
11199   if (T.isNull())
11200     return ExprError();
11201 
11202   if (!getDerived().AlwaysRebuild() &&
11203       T == E->getType())
11204     return E;
11205 
11206   return getDerived().RebuildImplicitValueInitExpr(T);
11207 }
11208 
11209 template<typename Derived>
11210 ExprResult
11211 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11212   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11213   if (!TInfo)
11214     return ExprError();
11215 
11216   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11217   if (SubExpr.isInvalid())
11218     return ExprError();
11219 
11220   if (!getDerived().AlwaysRebuild() &&
11221       TInfo == E->getWrittenTypeInfo() &&
11222       SubExpr.get() == E->getSubExpr())
11223     return E;
11224 
11225   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11226                                        TInfo, E->getRParenLoc());
11227 }
11228 
11229 template<typename Derived>
11230 ExprResult
11231 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11232   bool ArgumentChanged = false;
11233   SmallVector<Expr*, 4> Inits;
11234   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11235                      &ArgumentChanged))
11236     return ExprError();
11237 
11238   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11239                                            Inits,
11240                                            E->getRParenLoc());
11241 }
11242 
11243 /// Transform an address-of-label expression.
11244 ///
11245 /// By default, the transformation of an address-of-label expression always
11246 /// rebuilds the expression, so that the label identifier can be resolved to
11247 /// the corresponding label statement by semantic analysis.
11248 template<typename Derived>
11249 ExprResult
11250 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11251   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11252                                         E->getLabel());
11253   if (!LD)
11254     return ExprError();
11255 
11256   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11257                                            cast<LabelDecl>(LD));
11258 }
11259 
11260 template<typename Derived>
11261 ExprResult
11262 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11263   SemaRef.ActOnStartStmtExpr();
11264   StmtResult SubStmt
11265     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11266   if (SubStmt.isInvalid()) {
11267     SemaRef.ActOnStmtExprError();
11268     return ExprError();
11269   }
11270 
11271   unsigned OldDepth = E->getTemplateDepth();
11272   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11273 
11274   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11275       SubStmt.get() == E->getSubStmt()) {
11276     // Calling this an 'error' is unintuitive, but it does the right thing.
11277     SemaRef.ActOnStmtExprError();
11278     return SemaRef.MaybeBindToTemporary(E);
11279   }
11280 
11281   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11282                                       E->getRParenLoc(), NewDepth);
11283 }
11284 
11285 template<typename Derived>
11286 ExprResult
11287 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11288   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11289   if (Cond.isInvalid())
11290     return ExprError();
11291 
11292   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11293   if (LHS.isInvalid())
11294     return ExprError();
11295 
11296   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11297   if (RHS.isInvalid())
11298     return ExprError();
11299 
11300   if (!getDerived().AlwaysRebuild() &&
11301       Cond.get() == E->getCond() &&
11302       LHS.get() == E->getLHS() &&
11303       RHS.get() == E->getRHS())
11304     return E;
11305 
11306   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11307                                         Cond.get(), LHS.get(), RHS.get(),
11308                                         E->getRParenLoc());
11309 }
11310 
11311 template<typename Derived>
11312 ExprResult
11313 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11314   return E;
11315 }
11316 
11317 template<typename Derived>
11318 ExprResult
11319 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11320   switch (E->getOperator()) {
11321   case OO_New:
11322   case OO_Delete:
11323   case OO_Array_New:
11324   case OO_Array_Delete:
11325     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11326 
11327   case OO_Call: {
11328     // This is a call to an object's operator().
11329     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11330 
11331     // Transform the object itself.
11332     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11333     if (Object.isInvalid())
11334       return ExprError();
11335 
11336     // FIXME: Poor location information
11337     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11338         static_cast<Expr *>(Object.get())->getEndLoc());
11339 
11340     // Transform the call arguments.
11341     SmallVector<Expr*, 8> Args;
11342     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11343                                     Args))
11344       return ExprError();
11345 
11346     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11347                                         E->getEndLoc());
11348   }
11349 
11350 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11351   case OO_##Name:
11352 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11353 #include "clang/Basic/OperatorKinds.def"
11354   case OO_Subscript:
11355     // Handled below.
11356     break;
11357 
11358   case OO_Conditional:
11359     llvm_unreachable("conditional operator is not actually overloadable");
11360 
11361   case OO_None:
11362   case NUM_OVERLOADED_OPERATORS:
11363     llvm_unreachable("not an overloaded operator?");
11364   }
11365 
11366   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11367   if (Callee.isInvalid())
11368     return ExprError();
11369 
11370   ExprResult First;
11371   if (E->getOperator() == OO_Amp)
11372     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11373   else
11374     First = getDerived().TransformExpr(E->getArg(0));
11375   if (First.isInvalid())
11376     return ExprError();
11377 
11378   ExprResult Second;
11379   if (E->getNumArgs() == 2) {
11380     Second = getDerived().TransformExpr(E->getArg(1));
11381     if (Second.isInvalid())
11382       return ExprError();
11383   }
11384 
11385   if (!getDerived().AlwaysRebuild() &&
11386       Callee.get() == E->getCallee() &&
11387       First.get() == E->getArg(0) &&
11388       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11389     return SemaRef.MaybeBindToTemporary(E);
11390 
11391   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11392   FPOptionsOverride NewOverrides(E->getFPFeatures());
11393   getSema().CurFPFeatures =
11394       NewOverrides.applyOverrides(getSema().getLangOpts());
11395   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11396 
11397   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11398                                                  E->getOperatorLoc(),
11399                                                  Callee.get(),
11400                                                  First.get(),
11401                                                  Second.get());
11402 }
11403 
11404 template<typename Derived>
11405 ExprResult
11406 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11407   return getDerived().TransformCallExpr(E);
11408 }
11409 
11410 template <typename Derived>
11411 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11412   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11413                          getSema().CurContext != E->getParentContext();
11414 
11415   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11416     return E;
11417 
11418   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11419                                            E->getEndLoc(),
11420                                            getSema().CurContext);
11421 }
11422 
11423 template<typename Derived>
11424 ExprResult
11425 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11426   // Transform the callee.
11427   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11428   if (Callee.isInvalid())
11429     return ExprError();
11430 
11431   // Transform exec config.
11432   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11433   if (EC.isInvalid())
11434     return ExprError();
11435 
11436   // Transform arguments.
11437   bool ArgChanged = false;
11438   SmallVector<Expr*, 8> Args;
11439   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11440                                   &ArgChanged))
11441     return ExprError();
11442 
11443   if (!getDerived().AlwaysRebuild() &&
11444       Callee.get() == E->getCallee() &&
11445       !ArgChanged)
11446     return SemaRef.MaybeBindToTemporary(E);
11447 
11448   // FIXME: Wrong source location information for the '('.
11449   SourceLocation FakeLParenLoc
11450     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11451   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11452                                       Args,
11453                                       E->getRParenLoc(), EC.get());
11454 }
11455 
11456 template<typename Derived>
11457 ExprResult
11458 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11459   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11460   if (!Type)
11461     return ExprError();
11462 
11463   ExprResult SubExpr
11464     = getDerived().TransformExpr(E->getSubExprAsWritten());
11465   if (SubExpr.isInvalid())
11466     return ExprError();
11467 
11468   if (!getDerived().AlwaysRebuild() &&
11469       Type == E->getTypeInfoAsWritten() &&
11470       SubExpr.get() == E->getSubExpr())
11471     return E;
11472   return getDerived().RebuildCXXNamedCastExpr(
11473       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11474       Type, E->getAngleBrackets().getEnd(),
11475       // FIXME. this should be '(' location
11476       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11477 }
11478 
11479 template<typename Derived>
11480 ExprResult
11481 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11482   TypeSourceInfo *TSI =
11483       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11484   if (!TSI)
11485     return ExprError();
11486 
11487   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11488   if (Sub.isInvalid())
11489     return ExprError();
11490 
11491   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11492                                                 Sub.get(), BCE->getEndLoc());
11493 }
11494 
11495 template<typename Derived>
11496 ExprResult
11497 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11498   return getDerived().TransformCXXNamedCastExpr(E);
11499 }
11500 
11501 template<typename Derived>
11502 ExprResult
11503 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11504   return getDerived().TransformCXXNamedCastExpr(E);
11505 }
11506 
11507 template<typename Derived>
11508 ExprResult
11509 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11510                                                       CXXReinterpretCastExpr *E) {
11511   return getDerived().TransformCXXNamedCastExpr(E);
11512 }
11513 
11514 template<typename Derived>
11515 ExprResult
11516 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11517   return getDerived().TransformCXXNamedCastExpr(E);
11518 }
11519 
11520 template<typename Derived>
11521 ExprResult
11522 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11523   return getDerived().TransformCXXNamedCastExpr(E);
11524 }
11525 
11526 template<typename Derived>
11527 ExprResult
11528 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11529                                                      CXXFunctionalCastExpr *E) {
11530   TypeSourceInfo *Type =
11531       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11532   if (!Type)
11533     return ExprError();
11534 
11535   ExprResult SubExpr
11536     = getDerived().TransformExpr(E->getSubExprAsWritten());
11537   if (SubExpr.isInvalid())
11538     return ExprError();
11539 
11540   if (!getDerived().AlwaysRebuild() &&
11541       Type == E->getTypeInfoAsWritten() &&
11542       SubExpr.get() == E->getSubExpr())
11543     return E;
11544 
11545   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11546                                                    E->getLParenLoc(),
11547                                                    SubExpr.get(),
11548                                                    E->getRParenLoc(),
11549                                                    E->isListInitialization());
11550 }
11551 
11552 template<typename Derived>
11553 ExprResult
11554 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11555   if (E->isTypeOperand()) {
11556     TypeSourceInfo *TInfo
11557       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11558     if (!TInfo)
11559       return ExprError();
11560 
11561     if (!getDerived().AlwaysRebuild() &&
11562         TInfo == E->getTypeOperandSourceInfo())
11563       return E;
11564 
11565     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11566                                              TInfo, E->getEndLoc());
11567   }
11568 
11569   // We don't know whether the subexpression is potentially evaluated until
11570   // after we perform semantic analysis.  We speculatively assume it is
11571   // unevaluated; it will get fixed later if the subexpression is in fact
11572   // potentially evaluated.
11573   EnterExpressionEvaluationContext Unevaluated(
11574       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11575       Sema::ReuseLambdaContextDecl);
11576 
11577   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11578   if (SubExpr.isInvalid())
11579     return ExprError();
11580 
11581   if (!getDerived().AlwaysRebuild() &&
11582       SubExpr.get() == E->getExprOperand())
11583     return E;
11584 
11585   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11586                                            SubExpr.get(), E->getEndLoc());
11587 }
11588 
11589 template<typename Derived>
11590 ExprResult
11591 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11592   if (E->isTypeOperand()) {
11593     TypeSourceInfo *TInfo
11594       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11595     if (!TInfo)
11596       return ExprError();
11597 
11598     if (!getDerived().AlwaysRebuild() &&
11599         TInfo == E->getTypeOperandSourceInfo())
11600       return E;
11601 
11602     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11603                                              TInfo, E->getEndLoc());
11604   }
11605 
11606   EnterExpressionEvaluationContext Unevaluated(
11607       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11608 
11609   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11610   if (SubExpr.isInvalid())
11611     return ExprError();
11612 
11613   if (!getDerived().AlwaysRebuild() &&
11614       SubExpr.get() == E->getExprOperand())
11615     return E;
11616 
11617   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11618                                            SubExpr.get(), E->getEndLoc());
11619 }
11620 
11621 template<typename Derived>
11622 ExprResult
11623 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11624   return E;
11625 }
11626 
11627 template<typename Derived>
11628 ExprResult
11629 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11630                                                      CXXNullPtrLiteralExpr *E) {
11631   return E;
11632 }
11633 
11634 template<typename Derived>
11635 ExprResult
11636 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11637   QualType T = getSema().getCurrentThisType();
11638 
11639   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11640     // Mark it referenced in the new context regardless.
11641     // FIXME: this is a bit instantiation-specific.
11642     getSema().MarkThisReferenced(E);
11643     return E;
11644   }
11645 
11646   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11647 }
11648 
11649 template<typename Derived>
11650 ExprResult
11651 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11652   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11653   if (SubExpr.isInvalid())
11654     return ExprError();
11655 
11656   if (!getDerived().AlwaysRebuild() &&
11657       SubExpr.get() == E->getSubExpr())
11658     return E;
11659 
11660   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11661                                           E->isThrownVariableInScope());
11662 }
11663 
11664 template<typename Derived>
11665 ExprResult
11666 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11667   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11668       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11669   if (!Param)
11670     return ExprError();
11671 
11672   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11673       E->getUsedContext() == SemaRef.CurContext)
11674     return E;
11675 
11676   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11677 }
11678 
11679 template<typename Derived>
11680 ExprResult
11681 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11682   FieldDecl *Field = cast_or_null<FieldDecl>(
11683       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11684   if (!Field)
11685     return ExprError();
11686 
11687   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11688       E->getUsedContext() == SemaRef.CurContext)
11689     return E;
11690 
11691   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11692 }
11693 
11694 template<typename Derived>
11695 ExprResult
11696 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11697                                                     CXXScalarValueInitExpr *E) {
11698   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11699   if (!T)
11700     return ExprError();
11701 
11702   if (!getDerived().AlwaysRebuild() &&
11703       T == E->getTypeSourceInfo())
11704     return E;
11705 
11706   return getDerived().RebuildCXXScalarValueInitExpr(T,
11707                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11708                                                     E->getRParenLoc());
11709 }
11710 
11711 template<typename Derived>
11712 ExprResult
11713 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11714   // Transform the type that we're allocating
11715   TypeSourceInfo *AllocTypeInfo =
11716       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11717   if (!AllocTypeInfo)
11718     return ExprError();
11719 
11720   // Transform the size of the array we're allocating (if any).
11721   Optional<Expr *> ArraySize;
11722   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11723     ExprResult NewArraySize;
11724     if (*OldArraySize) {
11725       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11726       if (NewArraySize.isInvalid())
11727         return ExprError();
11728     }
11729     ArraySize = NewArraySize.get();
11730   }
11731 
11732   // Transform the placement arguments (if any).
11733   bool ArgumentChanged = false;
11734   SmallVector<Expr*, 8> PlacementArgs;
11735   if (getDerived().TransformExprs(E->getPlacementArgs(),
11736                                   E->getNumPlacementArgs(), true,
11737                                   PlacementArgs, &ArgumentChanged))
11738     return ExprError();
11739 
11740   // Transform the initializer (if any).
11741   Expr *OldInit = E->getInitializer();
11742   ExprResult NewInit;
11743   if (OldInit)
11744     NewInit = getDerived().TransformInitializer(OldInit, true);
11745   if (NewInit.isInvalid())
11746     return ExprError();
11747 
11748   // Transform new operator and delete operator.
11749   FunctionDecl *OperatorNew = nullptr;
11750   if (E->getOperatorNew()) {
11751     OperatorNew = cast_or_null<FunctionDecl>(
11752         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11753     if (!OperatorNew)
11754       return ExprError();
11755   }
11756 
11757   FunctionDecl *OperatorDelete = nullptr;
11758   if (E->getOperatorDelete()) {
11759     OperatorDelete = cast_or_null<FunctionDecl>(
11760         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11761     if (!OperatorDelete)
11762       return ExprError();
11763   }
11764 
11765   if (!getDerived().AlwaysRebuild() &&
11766       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11767       ArraySize == E->getArraySize() &&
11768       NewInit.get() == OldInit &&
11769       OperatorNew == E->getOperatorNew() &&
11770       OperatorDelete == E->getOperatorDelete() &&
11771       !ArgumentChanged) {
11772     // Mark any declarations we need as referenced.
11773     // FIXME: instantiation-specific.
11774     if (OperatorNew)
11775       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11776     if (OperatorDelete)
11777       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11778 
11779     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11780       QualType ElementType
11781         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11782       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11783         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11784         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11785           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11786         }
11787       }
11788     }
11789 
11790     return E;
11791   }
11792 
11793   QualType AllocType = AllocTypeInfo->getType();
11794   if (!ArraySize) {
11795     // If no array size was specified, but the new expression was
11796     // instantiated with an array type (e.g., "new T" where T is
11797     // instantiated with "int[4]"), extract the outer bound from the
11798     // array type as our array size. We do this with constant and
11799     // dependently-sized array types.
11800     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11801     if (!ArrayT) {
11802       // Do nothing
11803     } else if (const ConstantArrayType *ConsArrayT
11804                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11805       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11806                                          SemaRef.Context.getSizeType(),
11807                                          /*FIXME:*/ E->getBeginLoc());
11808       AllocType = ConsArrayT->getElementType();
11809     } else if (const DependentSizedArrayType *DepArrayT
11810                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11811       if (DepArrayT->getSizeExpr()) {
11812         ArraySize = DepArrayT->getSizeExpr();
11813         AllocType = DepArrayT->getElementType();
11814       }
11815     }
11816   }
11817 
11818   return getDerived().RebuildCXXNewExpr(
11819       E->getBeginLoc(), E->isGlobalNew(),
11820       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11821       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11822       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11823 }
11824 
11825 template<typename Derived>
11826 ExprResult
11827 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11828   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11829   if (Operand.isInvalid())
11830     return ExprError();
11831 
11832   // Transform the delete operator, if known.
11833   FunctionDecl *OperatorDelete = nullptr;
11834   if (E->getOperatorDelete()) {
11835     OperatorDelete = cast_or_null<FunctionDecl>(
11836         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11837     if (!OperatorDelete)
11838       return ExprError();
11839   }
11840 
11841   if (!getDerived().AlwaysRebuild() &&
11842       Operand.get() == E->getArgument() &&
11843       OperatorDelete == E->getOperatorDelete()) {
11844     // Mark any declarations we need as referenced.
11845     // FIXME: instantiation-specific.
11846     if (OperatorDelete)
11847       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11848 
11849     if (!E->getArgument()->isTypeDependent()) {
11850       QualType Destroyed = SemaRef.Context.getBaseElementType(
11851                                                          E->getDestroyedType());
11852       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11853         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11854         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11855                                        SemaRef.LookupDestructor(Record));
11856       }
11857     }
11858 
11859     return E;
11860   }
11861 
11862   return getDerived().RebuildCXXDeleteExpr(
11863       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11864 }
11865 
11866 template<typename Derived>
11867 ExprResult
11868 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11869                                                      CXXPseudoDestructorExpr *E) {
11870   ExprResult Base = getDerived().TransformExpr(E->getBase());
11871   if (Base.isInvalid())
11872     return ExprError();
11873 
11874   ParsedType ObjectTypePtr;
11875   bool MayBePseudoDestructor = false;
11876   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11877                                               E->getOperatorLoc(),
11878                                         E->isArrow()? tok::arrow : tok::period,
11879                                               ObjectTypePtr,
11880                                               MayBePseudoDestructor);
11881   if (Base.isInvalid())
11882     return ExprError();
11883 
11884   QualType ObjectType = ObjectTypePtr.get();
11885   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11886   if (QualifierLoc) {
11887     QualifierLoc
11888       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11889     if (!QualifierLoc)
11890       return ExprError();
11891   }
11892   CXXScopeSpec SS;
11893   SS.Adopt(QualifierLoc);
11894 
11895   PseudoDestructorTypeStorage Destroyed;
11896   if (E->getDestroyedTypeInfo()) {
11897     TypeSourceInfo *DestroyedTypeInfo
11898       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11899                                                 ObjectType, nullptr, SS);
11900     if (!DestroyedTypeInfo)
11901       return ExprError();
11902     Destroyed = DestroyedTypeInfo;
11903   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11904     // We aren't likely to be able to resolve the identifier down to a type
11905     // now anyway, so just retain the identifier.
11906     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11907                                             E->getDestroyedTypeLoc());
11908   } else {
11909     // Look for a destructor known with the given name.
11910     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11911                                               *E->getDestroyedTypeIdentifier(),
11912                                                 E->getDestroyedTypeLoc(),
11913                                                 /*Scope=*/nullptr,
11914                                                 SS, ObjectTypePtr,
11915                                                 false);
11916     if (!T)
11917       return ExprError();
11918 
11919     Destroyed
11920       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11921                                                  E->getDestroyedTypeLoc());
11922   }
11923 
11924   TypeSourceInfo *ScopeTypeInfo = nullptr;
11925   if (E->getScopeTypeInfo()) {
11926     CXXScopeSpec EmptySS;
11927     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11928                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11929     if (!ScopeTypeInfo)
11930       return ExprError();
11931   }
11932 
11933   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11934                                                      E->getOperatorLoc(),
11935                                                      E->isArrow(),
11936                                                      SS,
11937                                                      ScopeTypeInfo,
11938                                                      E->getColonColonLoc(),
11939                                                      E->getTildeLoc(),
11940                                                      Destroyed);
11941 }
11942 
11943 template <typename Derived>
11944 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11945                                                         bool RequiresADL,
11946                                                         LookupResult &R) {
11947   // Transform all the decls.
11948   bool AllEmptyPacks = true;
11949   for (auto *OldD : Old->decls()) {
11950     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11951     if (!InstD) {
11952       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11953       // This can happen because of dependent hiding.
11954       if (isa<UsingShadowDecl>(OldD))
11955         continue;
11956       else {
11957         R.clear();
11958         return true;
11959       }
11960     }
11961 
11962     // Expand using pack declarations.
11963     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11964     ArrayRef<NamedDecl*> Decls = SingleDecl;
11965     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11966       Decls = UPD->expansions();
11967 
11968     // Expand using declarations.
11969     for (auto *D : Decls) {
11970       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11971         for (auto *SD : UD->shadows())
11972           R.addDecl(SD);
11973       } else {
11974         R.addDecl(D);
11975       }
11976     }
11977 
11978     AllEmptyPacks &= Decls.empty();
11979   };
11980 
11981   // C++ [temp.res]/8.4.2:
11982   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11983   //   a name in the template definition found a using-declaration, but the
11984   //   lookup in the corresponding scope in the instantiation odoes not find
11985   //   any declarations because the using-declaration was a pack expansion and
11986   //   the corresponding pack is empty
11987   if (AllEmptyPacks && !RequiresADL) {
11988     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11989         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11990     return true;
11991   }
11992 
11993   // Resolve a kind, but don't do any further analysis.  If it's
11994   // ambiguous, the callee needs to deal with it.
11995   R.resolveKind();
11996   return false;
11997 }
11998 
11999 template<typename Derived>
12000 ExprResult
12001 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12002                                                   UnresolvedLookupExpr *Old) {
12003   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12004                  Sema::LookupOrdinaryName);
12005 
12006   // Transform the declaration set.
12007   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12008     return ExprError();
12009 
12010   // Rebuild the nested-name qualifier, if present.
12011   CXXScopeSpec SS;
12012   if (Old->getQualifierLoc()) {
12013     NestedNameSpecifierLoc QualifierLoc
12014       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12015     if (!QualifierLoc)
12016       return ExprError();
12017 
12018     SS.Adopt(QualifierLoc);
12019   }
12020 
12021   if (Old->getNamingClass()) {
12022     CXXRecordDecl *NamingClass
12023       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12024                                                             Old->getNameLoc(),
12025                                                         Old->getNamingClass()));
12026     if (!NamingClass) {
12027       R.clear();
12028       return ExprError();
12029     }
12030 
12031     R.setNamingClass(NamingClass);
12032   }
12033 
12034   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12035 
12036   // If we have neither explicit template arguments, nor the template keyword,
12037   // it's a normal declaration name or member reference.
12038   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12039     NamedDecl *D = R.getAsSingle<NamedDecl>();
12040     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12041     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12042     // give a good diagnostic.
12043     if (D && D->isCXXInstanceMember()) {
12044       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12045                                                      /*TemplateArgs=*/nullptr,
12046                                                      /*Scope=*/nullptr);
12047     }
12048 
12049     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12050   }
12051 
12052   // If we have template arguments, rebuild them, then rebuild the
12053   // templateid expression.
12054   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12055   if (Old->hasExplicitTemplateArgs() &&
12056       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12057                                               Old->getNumTemplateArgs(),
12058                                               TransArgs)) {
12059     R.clear();
12060     return ExprError();
12061   }
12062 
12063   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12064                                             Old->requiresADL(), &TransArgs);
12065 }
12066 
12067 template<typename Derived>
12068 ExprResult
12069 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12070   bool ArgChanged = false;
12071   SmallVector<TypeSourceInfo *, 4> Args;
12072   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12073     TypeSourceInfo *From = E->getArg(I);
12074     TypeLoc FromTL = From->getTypeLoc();
12075     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12076       TypeLocBuilder TLB;
12077       TLB.reserve(FromTL.getFullDataSize());
12078       QualType To = getDerived().TransformType(TLB, FromTL);
12079       if (To.isNull())
12080         return ExprError();
12081 
12082       if (To == From->getType())
12083         Args.push_back(From);
12084       else {
12085         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12086         ArgChanged = true;
12087       }
12088       continue;
12089     }
12090 
12091     ArgChanged = true;
12092 
12093     // We have a pack expansion. Instantiate it.
12094     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12095     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12096     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12097     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12098 
12099     // Determine whether the set of unexpanded parameter packs can and should
12100     // be expanded.
12101     bool Expand = true;
12102     bool RetainExpansion = false;
12103     Optional<unsigned> OrigNumExpansions =
12104         ExpansionTL.getTypePtr()->getNumExpansions();
12105     Optional<unsigned> NumExpansions = OrigNumExpansions;
12106     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12107                                              PatternTL.getSourceRange(),
12108                                              Unexpanded,
12109                                              Expand, RetainExpansion,
12110                                              NumExpansions))
12111       return ExprError();
12112 
12113     if (!Expand) {
12114       // The transform has determined that we should perform a simple
12115       // transformation on the pack expansion, producing another pack
12116       // expansion.
12117       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12118 
12119       TypeLocBuilder TLB;
12120       TLB.reserve(From->getTypeLoc().getFullDataSize());
12121 
12122       QualType To = getDerived().TransformType(TLB, PatternTL);
12123       if (To.isNull())
12124         return ExprError();
12125 
12126       To = getDerived().RebuildPackExpansionType(To,
12127                                                  PatternTL.getSourceRange(),
12128                                                  ExpansionTL.getEllipsisLoc(),
12129                                                  NumExpansions);
12130       if (To.isNull())
12131         return ExprError();
12132 
12133       PackExpansionTypeLoc ToExpansionTL
12134         = TLB.push<PackExpansionTypeLoc>(To);
12135       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12136       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12137       continue;
12138     }
12139 
12140     // Expand the pack expansion by substituting for each argument in the
12141     // pack(s).
12142     for (unsigned I = 0; I != *NumExpansions; ++I) {
12143       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12144       TypeLocBuilder TLB;
12145       TLB.reserve(PatternTL.getFullDataSize());
12146       QualType To = getDerived().TransformType(TLB, PatternTL);
12147       if (To.isNull())
12148         return ExprError();
12149 
12150       if (To->containsUnexpandedParameterPack()) {
12151         To = getDerived().RebuildPackExpansionType(To,
12152                                                    PatternTL.getSourceRange(),
12153                                                    ExpansionTL.getEllipsisLoc(),
12154                                                    NumExpansions);
12155         if (To.isNull())
12156           return ExprError();
12157 
12158         PackExpansionTypeLoc ToExpansionTL
12159           = TLB.push<PackExpansionTypeLoc>(To);
12160         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12161       }
12162 
12163       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12164     }
12165 
12166     if (!RetainExpansion)
12167       continue;
12168 
12169     // If we're supposed to retain a pack expansion, do so by temporarily
12170     // forgetting the partially-substituted parameter pack.
12171     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12172 
12173     TypeLocBuilder TLB;
12174     TLB.reserve(From->getTypeLoc().getFullDataSize());
12175 
12176     QualType To = getDerived().TransformType(TLB, PatternTL);
12177     if (To.isNull())
12178       return ExprError();
12179 
12180     To = getDerived().RebuildPackExpansionType(To,
12181                                                PatternTL.getSourceRange(),
12182                                                ExpansionTL.getEllipsisLoc(),
12183                                                NumExpansions);
12184     if (To.isNull())
12185       return ExprError();
12186 
12187     PackExpansionTypeLoc ToExpansionTL
12188       = TLB.push<PackExpansionTypeLoc>(To);
12189     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12190     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12191   }
12192 
12193   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12194     return E;
12195 
12196   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12197                                        E->getEndLoc());
12198 }
12199 
12200 template<typename Derived>
12201 ExprResult
12202 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12203                                                  ConceptSpecializationExpr *E) {
12204   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12205   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12206   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12207                                               Old->NumTemplateArgs, TransArgs))
12208     return ExprError();
12209 
12210   return getDerived().RebuildConceptSpecializationExpr(
12211       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12212       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12213       &TransArgs);
12214 }
12215 
12216 template<typename Derived>
12217 ExprResult
12218 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12219   SmallVector<ParmVarDecl*, 4> TransParams;
12220   SmallVector<QualType, 4> TransParamTypes;
12221   Sema::ExtParameterInfoBuilder ExtParamInfos;
12222 
12223   // C++2a [expr.prim.req]p2
12224   // Expressions appearing within a requirement-body are unevaluated operands.
12225   EnterExpressionEvaluationContext Ctx(
12226       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12227 
12228   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12229       getSema().Context, getSema().CurContext,
12230       E->getBody()->getBeginLoc());
12231 
12232   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12233 
12234   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12235                                                E->getLocalParameters(),
12236                                                /*ParamTypes=*/nullptr,
12237                                                /*ParamInfos=*/nullptr,
12238                                                TransParamTypes, &TransParams,
12239                                                ExtParamInfos))
12240     return ExprError();
12241 
12242   for (ParmVarDecl *Param : TransParams)
12243     Param->setDeclContext(Body);
12244 
12245   SmallVector<concepts::Requirement *, 4> TransReqs;
12246   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12247                                                      TransReqs))
12248     return ExprError();
12249 
12250   for (concepts::Requirement *Req : TransReqs) {
12251     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12252       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12253         ER->getReturnTypeRequirement()
12254                 .getTypeConstraintTemplateParameterList()->getParam(0)
12255                 ->setDeclContext(Body);
12256       }
12257     }
12258   }
12259 
12260   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12261                                           TransParams, TransReqs,
12262                                           E->getRBraceLoc());
12263 }
12264 
12265 template<typename Derived>
12266 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12267     ArrayRef<concepts::Requirement *> Reqs,
12268     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12269   for (concepts::Requirement *Req : Reqs) {
12270     concepts::Requirement *TransReq = nullptr;
12271     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12272       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12273     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12274       TransReq = getDerived().TransformExprRequirement(ExprReq);
12275     else
12276       TransReq = getDerived().TransformNestedRequirement(
12277                      cast<concepts::NestedRequirement>(Req));
12278     if (!TransReq)
12279       return true;
12280     Transformed.push_back(TransReq);
12281   }
12282   return false;
12283 }
12284 
12285 template<typename Derived>
12286 concepts::TypeRequirement *
12287 TreeTransform<Derived>::TransformTypeRequirement(
12288     concepts::TypeRequirement *Req) {
12289   if (Req->isSubstitutionFailure()) {
12290     if (getDerived().AlwaysRebuild())
12291       return getDerived().RebuildTypeRequirement(
12292               Req->getSubstitutionDiagnostic());
12293     return Req;
12294   }
12295   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12296   if (!TransType)
12297     return nullptr;
12298   return getDerived().RebuildTypeRequirement(TransType);
12299 }
12300 
12301 template<typename Derived>
12302 concepts::ExprRequirement *
12303 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12304   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12305   if (Req->isExprSubstitutionFailure())
12306     TransExpr = Req->getExprSubstitutionDiagnostic();
12307   else {
12308     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12309     if (TransExprRes.isInvalid())
12310       return nullptr;
12311     TransExpr = TransExprRes.get();
12312   }
12313 
12314   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12315   const auto &RetReq = Req->getReturnTypeRequirement();
12316   if (RetReq.isEmpty())
12317     TransRetReq.emplace();
12318   else if (RetReq.isSubstitutionFailure())
12319     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12320   else if (RetReq.isTypeConstraint()) {
12321     TemplateParameterList *OrigTPL =
12322         RetReq.getTypeConstraintTemplateParameterList();
12323     TemplateParameterList *TPL =
12324         getDerived().TransformTemplateParameterList(OrigTPL);
12325     if (!TPL)
12326       return nullptr;
12327     TransRetReq.emplace(TPL);
12328   }
12329   assert(TransRetReq.hasValue() &&
12330          "All code paths leading here must set TransRetReq");
12331   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12332     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12333                                                Req->getNoexceptLoc(),
12334                                                std::move(*TransRetReq));
12335   return getDerived().RebuildExprRequirement(
12336       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12337       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12338 }
12339 
12340 template<typename Derived>
12341 concepts::NestedRequirement *
12342 TreeTransform<Derived>::TransformNestedRequirement(
12343     concepts::NestedRequirement *Req) {
12344   if (Req->isSubstitutionFailure()) {
12345     if (getDerived().AlwaysRebuild())
12346       return getDerived().RebuildNestedRequirement(
12347           Req->getSubstitutionDiagnostic());
12348     return Req;
12349   }
12350   ExprResult TransConstraint =
12351       getDerived().TransformExpr(Req->getConstraintExpr());
12352   if (TransConstraint.isInvalid())
12353     return nullptr;
12354   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12355 }
12356 
12357 template<typename Derived>
12358 ExprResult
12359 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12360   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12361   if (!T)
12362     return ExprError();
12363 
12364   if (!getDerived().AlwaysRebuild() &&
12365       T == E->getQueriedTypeSourceInfo())
12366     return E;
12367 
12368   ExprResult SubExpr;
12369   {
12370     EnterExpressionEvaluationContext Unevaluated(
12371         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12372     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12373     if (SubExpr.isInvalid())
12374       return ExprError();
12375 
12376     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12377       return E;
12378   }
12379 
12380   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12381                                             SubExpr.get(), E->getEndLoc());
12382 }
12383 
12384 template<typename Derived>
12385 ExprResult
12386 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12387   ExprResult SubExpr;
12388   {
12389     EnterExpressionEvaluationContext Unevaluated(
12390         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12391     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12392     if (SubExpr.isInvalid())
12393       return ExprError();
12394 
12395     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12396       return E;
12397   }
12398 
12399   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12400                                              SubExpr.get(), E->getEndLoc());
12401 }
12402 
12403 template <typename Derived>
12404 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12405     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12406     TypeSourceInfo **RecoveryTSI) {
12407   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12408       DRE, AddrTaken, RecoveryTSI);
12409 
12410   // Propagate both errors and recovered types, which return ExprEmpty.
12411   if (!NewDRE.isUsable())
12412     return NewDRE;
12413 
12414   // We got an expr, wrap it up in parens.
12415   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12416     return PE;
12417   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12418                                        PE->getRParen());
12419 }
12420 
12421 template <typename Derived>
12422 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12423     DependentScopeDeclRefExpr *E) {
12424   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12425                                             nullptr);
12426 }
12427 
12428 template<typename Derived>
12429 ExprResult
12430 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12431                                                DependentScopeDeclRefExpr *E,
12432                                                bool IsAddressOfOperand,
12433                                                TypeSourceInfo **RecoveryTSI) {
12434   assert(E->getQualifierLoc());
12435   NestedNameSpecifierLoc QualifierLoc
12436   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12437   if (!QualifierLoc)
12438     return ExprError();
12439   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12440 
12441   // TODO: If this is a conversion-function-id, verify that the
12442   // destination type name (if present) resolves the same way after
12443   // instantiation as it did in the local scope.
12444 
12445   DeclarationNameInfo NameInfo
12446     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12447   if (!NameInfo.getName())
12448     return ExprError();
12449 
12450   if (!E->hasExplicitTemplateArgs()) {
12451     if (!getDerived().AlwaysRebuild() &&
12452         QualifierLoc == E->getQualifierLoc() &&
12453         // Note: it is sufficient to compare the Name component of NameInfo:
12454         // if name has not changed, DNLoc has not changed either.
12455         NameInfo.getName() == E->getDeclName())
12456       return E;
12457 
12458     return getDerived().RebuildDependentScopeDeclRefExpr(
12459         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12460         IsAddressOfOperand, RecoveryTSI);
12461   }
12462 
12463   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12464   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12465                                               E->getNumTemplateArgs(),
12466                                               TransArgs))
12467     return ExprError();
12468 
12469   return getDerived().RebuildDependentScopeDeclRefExpr(
12470       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12471       RecoveryTSI);
12472 }
12473 
12474 template<typename Derived>
12475 ExprResult
12476 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12477   // CXXConstructExprs other than for list-initialization and
12478   // CXXTemporaryObjectExpr are always implicit, so when we have
12479   // a 1-argument construction we just transform that argument.
12480   if (getDerived().AllowSkippingCXXConstructExpr() &&
12481       ((E->getNumArgs() == 1 ||
12482         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12483        (!getDerived().DropCallArgument(E->getArg(0))) &&
12484        !E->isListInitialization()))
12485     return getDerived().TransformInitializer(E->getArg(0),
12486                                              /*DirectInit*/ false);
12487 
12488   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12489 
12490   QualType T = getDerived().TransformType(E->getType());
12491   if (T.isNull())
12492     return ExprError();
12493 
12494   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12495       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12496   if (!Constructor)
12497     return ExprError();
12498 
12499   bool ArgumentChanged = false;
12500   SmallVector<Expr*, 8> Args;
12501   {
12502     EnterExpressionEvaluationContext Context(
12503         getSema(), EnterExpressionEvaluationContext::InitList,
12504         E->isListInitialization());
12505     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12506                                     &ArgumentChanged))
12507       return ExprError();
12508   }
12509 
12510   if (!getDerived().AlwaysRebuild() &&
12511       T == E->getType() &&
12512       Constructor == E->getConstructor() &&
12513       !ArgumentChanged) {
12514     // Mark the constructor as referenced.
12515     // FIXME: Instantiation-specific
12516     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12517     return E;
12518   }
12519 
12520   return getDerived().RebuildCXXConstructExpr(
12521       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12522       E->hadMultipleCandidates(), E->isListInitialization(),
12523       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12524       E->getConstructionKind(), E->getParenOrBraceRange());
12525 }
12526 
12527 template<typename Derived>
12528 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12529     CXXInheritedCtorInitExpr *E) {
12530   QualType T = getDerived().TransformType(E->getType());
12531   if (T.isNull())
12532     return ExprError();
12533 
12534   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12535       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12536   if (!Constructor)
12537     return ExprError();
12538 
12539   if (!getDerived().AlwaysRebuild() &&
12540       T == E->getType() &&
12541       Constructor == E->getConstructor()) {
12542     // Mark the constructor as referenced.
12543     // FIXME: Instantiation-specific
12544     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12545     return E;
12546   }
12547 
12548   return getDerived().RebuildCXXInheritedCtorInitExpr(
12549       T, E->getLocation(), Constructor,
12550       E->constructsVBase(), E->inheritedFromVBase());
12551 }
12552 
12553 /// Transform a C++ temporary-binding expression.
12554 ///
12555 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12556 /// transform the subexpression and return that.
12557 template<typename Derived>
12558 ExprResult
12559 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12560   return getDerived().TransformExpr(E->getSubExpr());
12561 }
12562 
12563 /// Transform a C++ expression that contains cleanups that should
12564 /// be run after the expression is evaluated.
12565 ///
12566 /// Since ExprWithCleanups nodes are implicitly generated, we
12567 /// just transform the subexpression and return that.
12568 template<typename Derived>
12569 ExprResult
12570 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12571   return getDerived().TransformExpr(E->getSubExpr());
12572 }
12573 
12574 template<typename Derived>
12575 ExprResult
12576 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12577                                                     CXXTemporaryObjectExpr *E) {
12578   TypeSourceInfo *T =
12579       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12580   if (!T)
12581     return ExprError();
12582 
12583   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12584       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12585   if (!Constructor)
12586     return ExprError();
12587 
12588   bool ArgumentChanged = false;
12589   SmallVector<Expr*, 8> Args;
12590   Args.reserve(E->getNumArgs());
12591   {
12592     EnterExpressionEvaluationContext Context(
12593         getSema(), EnterExpressionEvaluationContext::InitList,
12594         E->isListInitialization());
12595     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12596                        &ArgumentChanged))
12597       return ExprError();
12598   }
12599 
12600   if (!getDerived().AlwaysRebuild() &&
12601       T == E->getTypeSourceInfo() &&
12602       Constructor == E->getConstructor() &&
12603       !ArgumentChanged) {
12604     // FIXME: Instantiation-specific
12605     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12606     return SemaRef.MaybeBindToTemporary(E);
12607   }
12608 
12609   // FIXME: We should just pass E->isListInitialization(), but we're not
12610   // prepared to handle list-initialization without a child InitListExpr.
12611   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12612   return getDerived().RebuildCXXTemporaryObjectExpr(
12613       T, LParenLoc, Args, E->getEndLoc(),
12614       /*ListInitialization=*/LParenLoc.isInvalid());
12615 }
12616 
12617 template<typename Derived>
12618 ExprResult
12619 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12620   // Transform any init-capture expressions before entering the scope of the
12621   // lambda body, because they are not semantically within that scope.
12622   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12623   struct TransformedInitCapture {
12624     // The location of the ... if the result is retaining a pack expansion.
12625     SourceLocation EllipsisLoc;
12626     // Zero or more expansions of the init-capture.
12627     SmallVector<InitCaptureInfoTy, 4> Expansions;
12628   };
12629   SmallVector<TransformedInitCapture, 4> InitCaptures;
12630   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12631   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12632                                     CEnd = E->capture_end();
12633        C != CEnd; ++C) {
12634     if (!E->isInitCapture(C))
12635       continue;
12636 
12637     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12638     VarDecl *OldVD = C->getCapturedVar();
12639 
12640     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12641                                 Optional<unsigned> NumExpansions) {
12642       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12643           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12644 
12645       if (NewExprInitResult.isInvalid()) {
12646         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12647         return;
12648       }
12649       Expr *NewExprInit = NewExprInitResult.get();
12650 
12651       QualType NewInitCaptureType =
12652           getSema().buildLambdaInitCaptureInitialization(
12653               C->getLocation(), OldVD->getType()->isReferenceType(),
12654               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12655               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12656               NewExprInit);
12657       Result.Expansions.push_back(
12658           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12659     };
12660 
12661     // If this is an init-capture pack, consider expanding the pack now.
12662     if (OldVD->isParameterPack()) {
12663       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12664                                              ->getTypeLoc()
12665                                              .castAs<PackExpansionTypeLoc>();
12666       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12667       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12668 
12669       // Determine whether the set of unexpanded parameter packs can and should
12670       // be expanded.
12671       bool Expand = true;
12672       bool RetainExpansion = false;
12673       Optional<unsigned> OrigNumExpansions =
12674           ExpansionTL.getTypePtr()->getNumExpansions();
12675       Optional<unsigned> NumExpansions = OrigNumExpansions;
12676       if (getDerived().TryExpandParameterPacks(
12677               ExpansionTL.getEllipsisLoc(),
12678               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12679               RetainExpansion, NumExpansions))
12680         return ExprError();
12681       if (Expand) {
12682         for (unsigned I = 0; I != *NumExpansions; ++I) {
12683           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12684           SubstInitCapture(SourceLocation(), None);
12685         }
12686       }
12687       if (!Expand || RetainExpansion) {
12688         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12689         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12690         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12691       }
12692     } else {
12693       SubstInitCapture(SourceLocation(), None);
12694     }
12695   }
12696 
12697   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12698   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12699 
12700   // Transform the template parameters, and add them to the current
12701   // instantiation scope. The null case is handled correctly.
12702   auto TPL = getDerived().TransformTemplateParameterList(
12703       E->getTemplateParameterList());
12704   LSI->GLTemplateParameterList = TPL;
12705 
12706   // Transform the type of the original lambda's call operator.
12707   // The transformation MUST be done in the CurrentInstantiationScope since
12708   // it introduces a mapping of the original to the newly created
12709   // transformed parameters.
12710   TypeSourceInfo *NewCallOpTSI = nullptr;
12711   {
12712     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12713     FunctionProtoTypeLoc OldCallOpFPTL =
12714         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12715 
12716     TypeLocBuilder NewCallOpTLBuilder;
12717     SmallVector<QualType, 4> ExceptionStorage;
12718     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12719     QualType NewCallOpType = TransformFunctionProtoType(
12720         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12721         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12722           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12723                                               ExceptionStorage, Changed);
12724         });
12725     if (NewCallOpType.isNull())
12726       return ExprError();
12727     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12728                                                         NewCallOpType);
12729   }
12730 
12731   // Transform the trailing requires clause
12732   ExprResult NewTrailingRequiresClause;
12733   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12734     // FIXME: Concepts: Substitution into requires clause should only happen
12735     //                  when checking satisfaction.
12736     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12737 
12738   // Create the local class that will describe the lambda.
12739   // FIXME: KnownDependent below is wrong when substituting inside a templated
12740   // context that isn't a DeclContext (such as a variable template).
12741   CXXRecordDecl *OldClass = E->getLambdaClass();
12742   CXXRecordDecl *Class
12743     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12744                                         NewCallOpTSI,
12745                                         /*KnownDependent=*/false,
12746                                         E->getCaptureDefault());
12747   getDerived().transformedLocalDecl(OldClass, {Class});
12748 
12749   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12750   if (getDerived().ReplacingOriginal())
12751     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12752                                OldClass->getLambdaManglingNumber(),
12753                                OldClass->getDeviceLambdaManglingNumber(),
12754                                OldClass->getLambdaContextDecl());
12755 
12756   // Build the call operator.
12757   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12758       Class, E->getIntroducerRange(), NewCallOpTSI,
12759       E->getCallOperator()->getEndLoc(),
12760       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12761       E->getCallOperator()->getConstexprKind(),
12762       NewTrailingRequiresClause.get());
12763 
12764   LSI->CallOperator = NewCallOperator;
12765 
12766   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12767   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12768 
12769   // Number the lambda for linkage purposes if necessary.
12770   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12771 
12772   // Introduce the context of the call operator.
12773   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12774                                  /*NewThisContext*/false);
12775 
12776   // Enter the scope of the lambda.
12777   getSema().buildLambdaScope(LSI, NewCallOperator,
12778                              E->getIntroducerRange(),
12779                              E->getCaptureDefault(),
12780                              E->getCaptureDefaultLoc(),
12781                              E->hasExplicitParameters(),
12782                              E->hasExplicitResultType(),
12783                              E->isMutable());
12784 
12785   bool Invalid = false;
12786 
12787   // Transform captures.
12788   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12789                                  CEnd = E->capture_end();
12790        C != CEnd; ++C) {
12791     // When we hit the first implicit capture, tell Sema that we've finished
12792     // the list of explicit captures.
12793     if (C->isImplicit())
12794       break;
12795 
12796     // Capturing 'this' is trivial.
12797     if (C->capturesThis()) {
12798       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12799                                     /*BuildAndDiagnose*/ true, nullptr,
12800                                     C->getCaptureKind() == LCK_StarThis);
12801       continue;
12802     }
12803     // Captured expression will be recaptured during captured variables
12804     // rebuilding.
12805     if (C->capturesVLAType())
12806       continue;
12807 
12808     // Rebuild init-captures, including the implied field declaration.
12809     if (E->isInitCapture(C)) {
12810       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12811 
12812       VarDecl *OldVD = C->getCapturedVar();
12813       llvm::SmallVector<Decl*, 4> NewVDs;
12814 
12815       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12816         ExprResult Init = Info.first;
12817         QualType InitQualType = Info.second;
12818         if (Init.isInvalid() || InitQualType.isNull()) {
12819           Invalid = true;
12820           break;
12821         }
12822         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12823             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12824             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12825         if (!NewVD) {
12826           Invalid = true;
12827           break;
12828         }
12829         NewVDs.push_back(NewVD);
12830         getSema().addInitCapture(LSI, NewVD);
12831       }
12832 
12833       if (Invalid)
12834         break;
12835 
12836       getDerived().transformedLocalDecl(OldVD, NewVDs);
12837       continue;
12838     }
12839 
12840     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12841 
12842     // Determine the capture kind for Sema.
12843     Sema::TryCaptureKind Kind
12844       = C->isImplicit()? Sema::TryCapture_Implicit
12845                        : C->getCaptureKind() == LCK_ByCopy
12846                            ? Sema::TryCapture_ExplicitByVal
12847                            : Sema::TryCapture_ExplicitByRef;
12848     SourceLocation EllipsisLoc;
12849     if (C->isPackExpansion()) {
12850       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12851       bool ShouldExpand = false;
12852       bool RetainExpansion = false;
12853       Optional<unsigned> NumExpansions;
12854       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12855                                                C->getLocation(),
12856                                                Unexpanded,
12857                                                ShouldExpand, RetainExpansion,
12858                                                NumExpansions)) {
12859         Invalid = true;
12860         continue;
12861       }
12862 
12863       if (ShouldExpand) {
12864         // The transform has determined that we should perform an expansion;
12865         // transform and capture each of the arguments.
12866         // expansion of the pattern. Do so.
12867         VarDecl *Pack = C->getCapturedVar();
12868         for (unsigned I = 0; I != *NumExpansions; ++I) {
12869           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12870           VarDecl *CapturedVar
12871             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12872                                                                Pack));
12873           if (!CapturedVar) {
12874             Invalid = true;
12875             continue;
12876           }
12877 
12878           // Capture the transformed variable.
12879           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12880         }
12881 
12882         // FIXME: Retain a pack expansion if RetainExpansion is true.
12883 
12884         continue;
12885       }
12886 
12887       EllipsisLoc = C->getEllipsisLoc();
12888     }
12889 
12890     // Transform the captured variable.
12891     VarDecl *CapturedVar
12892       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12893                                                          C->getCapturedVar()));
12894     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12895       Invalid = true;
12896       continue;
12897     }
12898 
12899     // Capture the transformed variable.
12900     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12901                                  EllipsisLoc);
12902   }
12903   getSema().finishLambdaExplicitCaptures(LSI);
12904 
12905   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12906   // evaluation context even if we're not transforming the function body.
12907   getSema().PushExpressionEvaluationContext(
12908       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12909 
12910   // Instantiate the body of the lambda expression.
12911   StmtResult Body =
12912       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12913 
12914   // ActOnLambda* will pop the function scope for us.
12915   FuncScopeCleanup.disable();
12916 
12917   if (Body.isInvalid()) {
12918     SavedContext.pop();
12919     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12920                                /*IsInstantiation=*/true);
12921     return ExprError();
12922   }
12923 
12924   // Copy the LSI before ActOnFinishFunctionBody removes it.
12925   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12926   // the call operator.
12927   auto LSICopy = *LSI;
12928   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12929                                     /*IsInstantiation*/ true);
12930   SavedContext.pop();
12931 
12932   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12933                                    &LSICopy);
12934 }
12935 
12936 template<typename Derived>
12937 StmtResult
12938 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12939   return TransformStmt(S);
12940 }
12941 
12942 template<typename Derived>
12943 StmtResult
12944 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12945   // Transform captures.
12946   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12947                                  CEnd = E->capture_end();
12948        C != CEnd; ++C) {
12949     // When we hit the first implicit capture, tell Sema that we've finished
12950     // the list of explicit captures.
12951     if (!C->isImplicit())
12952       continue;
12953 
12954     // Capturing 'this' is trivial.
12955     if (C->capturesThis()) {
12956       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12957                                     /*BuildAndDiagnose*/ true, nullptr,
12958                                     C->getCaptureKind() == LCK_StarThis);
12959       continue;
12960     }
12961     // Captured expression will be recaptured during captured variables
12962     // rebuilding.
12963     if (C->capturesVLAType())
12964       continue;
12965 
12966     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12967     assert(!E->isInitCapture(C) && "implicit init-capture?");
12968 
12969     // Transform the captured variable.
12970     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12971         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12972     if (!CapturedVar || CapturedVar->isInvalidDecl())
12973       return StmtError();
12974 
12975     // Capture the transformed variable.
12976     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12977   }
12978 
12979   return S;
12980 }
12981 
12982 template<typename Derived>
12983 ExprResult
12984 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12985                                                   CXXUnresolvedConstructExpr *E) {
12986   TypeSourceInfo *T =
12987       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12988   if (!T)
12989     return ExprError();
12990 
12991   bool ArgumentChanged = false;
12992   SmallVector<Expr*, 8> Args;
12993   Args.reserve(E->getNumArgs());
12994   {
12995     EnterExpressionEvaluationContext Context(
12996         getSema(), EnterExpressionEvaluationContext::InitList,
12997         E->isListInitialization());
12998     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
12999                                     &ArgumentChanged))
13000       return ExprError();
13001   }
13002 
13003   if (!getDerived().AlwaysRebuild() &&
13004       T == E->getTypeSourceInfo() &&
13005       !ArgumentChanged)
13006     return E;
13007 
13008   // FIXME: we're faking the locations of the commas
13009   return getDerived().RebuildCXXUnresolvedConstructExpr(
13010       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13011 }
13012 
13013 template<typename Derived>
13014 ExprResult
13015 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13016                                              CXXDependentScopeMemberExpr *E) {
13017   // Transform the base of the expression.
13018   ExprResult Base((Expr*) nullptr);
13019   Expr *OldBase;
13020   QualType BaseType;
13021   QualType ObjectType;
13022   if (!E->isImplicitAccess()) {
13023     OldBase = E->getBase();
13024     Base = getDerived().TransformExpr(OldBase);
13025     if (Base.isInvalid())
13026       return ExprError();
13027 
13028     // Start the member reference and compute the object's type.
13029     ParsedType ObjectTy;
13030     bool MayBePseudoDestructor = false;
13031     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13032                                                 E->getOperatorLoc(),
13033                                       E->isArrow()? tok::arrow : tok::period,
13034                                                 ObjectTy,
13035                                                 MayBePseudoDestructor);
13036     if (Base.isInvalid())
13037       return ExprError();
13038 
13039     ObjectType = ObjectTy.get();
13040     BaseType = ((Expr*) Base.get())->getType();
13041   } else {
13042     OldBase = nullptr;
13043     BaseType = getDerived().TransformType(E->getBaseType());
13044     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13045   }
13046 
13047   // Transform the first part of the nested-name-specifier that qualifies
13048   // the member name.
13049   NamedDecl *FirstQualifierInScope
13050     = getDerived().TransformFirstQualifierInScope(
13051                                             E->getFirstQualifierFoundInScope(),
13052                                             E->getQualifierLoc().getBeginLoc());
13053 
13054   NestedNameSpecifierLoc QualifierLoc;
13055   if (E->getQualifier()) {
13056     QualifierLoc
13057       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13058                                                      ObjectType,
13059                                                      FirstQualifierInScope);
13060     if (!QualifierLoc)
13061       return ExprError();
13062   }
13063 
13064   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13065 
13066   // TODO: If this is a conversion-function-id, verify that the
13067   // destination type name (if present) resolves the same way after
13068   // instantiation as it did in the local scope.
13069 
13070   DeclarationNameInfo NameInfo
13071     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13072   if (!NameInfo.getName())
13073     return ExprError();
13074 
13075   if (!E->hasExplicitTemplateArgs()) {
13076     // This is a reference to a member without an explicitly-specified
13077     // template argument list. Optimize for this common case.
13078     if (!getDerived().AlwaysRebuild() &&
13079         Base.get() == OldBase &&
13080         BaseType == E->getBaseType() &&
13081         QualifierLoc == E->getQualifierLoc() &&
13082         NameInfo.getName() == E->getMember() &&
13083         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13084       return E;
13085 
13086     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13087                                                        BaseType,
13088                                                        E->isArrow(),
13089                                                        E->getOperatorLoc(),
13090                                                        QualifierLoc,
13091                                                        TemplateKWLoc,
13092                                                        FirstQualifierInScope,
13093                                                        NameInfo,
13094                                                        /*TemplateArgs*/nullptr);
13095   }
13096 
13097   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13098   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13099                                               E->getNumTemplateArgs(),
13100                                               TransArgs))
13101     return ExprError();
13102 
13103   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13104                                                      BaseType,
13105                                                      E->isArrow(),
13106                                                      E->getOperatorLoc(),
13107                                                      QualifierLoc,
13108                                                      TemplateKWLoc,
13109                                                      FirstQualifierInScope,
13110                                                      NameInfo,
13111                                                      &TransArgs);
13112 }
13113 
13114 template<typename Derived>
13115 ExprResult
13116 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
13117   // Transform the base of the expression.
13118   ExprResult Base((Expr*) nullptr);
13119   QualType BaseType;
13120   if (!Old->isImplicitAccess()) {
13121     Base = getDerived().TransformExpr(Old->getBase());
13122     if (Base.isInvalid())
13123       return ExprError();
13124     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
13125                                                      Old->isArrow());
13126     if (Base.isInvalid())
13127       return ExprError();
13128     BaseType = Base.get()->getType();
13129   } else {
13130     BaseType = getDerived().TransformType(Old->getBaseType());
13131   }
13132 
13133   NestedNameSpecifierLoc QualifierLoc;
13134   if (Old->getQualifierLoc()) {
13135     QualifierLoc
13136     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13137     if (!QualifierLoc)
13138       return ExprError();
13139   }
13140 
13141   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13142 
13143   LookupResult R(SemaRef, Old->getMemberNameInfo(),
13144                  Sema::LookupOrdinaryName);
13145 
13146   // Transform the declaration set.
13147   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
13148     return ExprError();
13149 
13150   // Determine the naming class.
13151   if (Old->getNamingClass()) {
13152     CXXRecordDecl *NamingClass
13153       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
13154                                                           Old->getMemberLoc(),
13155                                                         Old->getNamingClass()));
13156     if (!NamingClass)
13157       return ExprError();
13158 
13159     R.setNamingClass(NamingClass);
13160   }
13161 
13162   TemplateArgumentListInfo TransArgs;
13163   if (Old->hasExplicitTemplateArgs()) {
13164     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13165     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13166     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
13167                                                 Old->getNumTemplateArgs(),
13168                                                 TransArgs))
13169       return ExprError();
13170   }
13171 
13172   // FIXME: to do this check properly, we will need to preserve the
13173   // first-qualifier-in-scope here, just in case we had a dependent
13174   // base (and therefore couldn't do the check) and a
13175   // nested-name-qualifier (and therefore could do the lookup).
13176   NamedDecl *FirstQualifierInScope = nullptr;
13177 
13178   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
13179                                                   BaseType,
13180                                                   Old->getOperatorLoc(),
13181                                                   Old->isArrow(),
13182                                                   QualifierLoc,
13183                                                   TemplateKWLoc,
13184                                                   FirstQualifierInScope,
13185                                                   R,
13186                                               (Old->hasExplicitTemplateArgs()
13187                                                   ? &TransArgs : nullptr));
13188 }
13189 
13190 template<typename Derived>
13191 ExprResult
13192 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13193   EnterExpressionEvaluationContext Unevaluated(
13194       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13195   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13196   if (SubExpr.isInvalid())
13197     return ExprError();
13198 
13199   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13200     return E;
13201 
13202   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13203 }
13204 
13205 template<typename Derived>
13206 ExprResult
13207 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13208   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13209   if (Pattern.isInvalid())
13210     return ExprError();
13211 
13212   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13213     return E;
13214 
13215   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13216                                            E->getNumExpansions());
13217 }
13218 
13219 template<typename Derived>
13220 ExprResult
13221 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13222   // If E is not value-dependent, then nothing will change when we transform it.
13223   // Note: This is an instantiation-centric view.
13224   if (!E->isValueDependent())
13225     return E;
13226 
13227   EnterExpressionEvaluationContext Unevaluated(
13228       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13229 
13230   ArrayRef<TemplateArgument> PackArgs;
13231   TemplateArgument ArgStorage;
13232 
13233   // Find the argument list to transform.
13234   if (E->isPartiallySubstituted()) {
13235     PackArgs = E->getPartialArguments();
13236   } else if (E->isValueDependent()) {
13237     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13238     bool ShouldExpand = false;
13239     bool RetainExpansion = false;
13240     Optional<unsigned> NumExpansions;
13241     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13242                                              Unexpanded,
13243                                              ShouldExpand, RetainExpansion,
13244                                              NumExpansions))
13245       return ExprError();
13246 
13247     // If we need to expand the pack, build a template argument from it and
13248     // expand that.
13249     if (ShouldExpand) {
13250       auto *Pack = E->getPack();
13251       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13252         ArgStorage = getSema().Context.getPackExpansionType(
13253             getSema().Context.getTypeDeclType(TTPD), None);
13254       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13255         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13256       } else {
13257         auto *VD = cast<ValueDecl>(Pack);
13258         ExprResult DRE = getSema().BuildDeclRefExpr(
13259             VD, VD->getType().getNonLValueExprType(getSema().Context),
13260             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
13261             E->getPackLoc());
13262         if (DRE.isInvalid())
13263           return ExprError();
13264         ArgStorage = new (getSema().Context) PackExpansionExpr(
13265             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13266       }
13267       PackArgs = ArgStorage;
13268     }
13269   }
13270 
13271   // If we're not expanding the pack, just transform the decl.
13272   if (!PackArgs.size()) {
13273     auto *Pack = cast_or_null<NamedDecl>(
13274         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13275     if (!Pack)
13276       return ExprError();
13277     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13278                                               E->getPackLoc(),
13279                                               E->getRParenLoc(), None, None);
13280   }
13281 
13282   // Try to compute the result without performing a partial substitution.
13283   Optional<unsigned> Result = 0;
13284   for (const TemplateArgument &Arg : PackArgs) {
13285     if (!Arg.isPackExpansion()) {
13286       Result = *Result + 1;
13287       continue;
13288     }
13289 
13290     TemplateArgumentLoc ArgLoc;
13291     InventTemplateArgumentLoc(Arg, ArgLoc);
13292 
13293     // Find the pattern of the pack expansion.
13294     SourceLocation Ellipsis;
13295     Optional<unsigned> OrigNumExpansions;
13296     TemplateArgumentLoc Pattern =
13297         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13298                                                           OrigNumExpansions);
13299 
13300     // Substitute under the pack expansion. Do not expand the pack (yet).
13301     TemplateArgumentLoc OutPattern;
13302     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13303     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13304                                                /*Uneval*/ true))
13305       return true;
13306 
13307     // See if we can determine the number of arguments from the result.
13308     Optional<unsigned> NumExpansions =
13309         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13310     if (!NumExpansions) {
13311       // No: we must be in an alias template expansion, and we're going to need
13312       // to actually expand the packs.
13313       Result = None;
13314       break;
13315     }
13316 
13317     Result = *Result + *NumExpansions;
13318   }
13319 
13320   // Common case: we could determine the number of expansions without
13321   // substituting.
13322   if (Result)
13323     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13324                                               E->getPackLoc(),
13325                                               E->getRParenLoc(), *Result, None);
13326 
13327   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13328                                                E->getPackLoc());
13329   {
13330     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13331     typedef TemplateArgumentLocInventIterator<
13332         Derived, const TemplateArgument*> PackLocIterator;
13333     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13334                                    PackLocIterator(*this, PackArgs.end()),
13335                                    TransformedPackArgs, /*Uneval*/true))
13336       return ExprError();
13337   }
13338 
13339   // Check whether we managed to fully-expand the pack.
13340   // FIXME: Is it possible for us to do so and not hit the early exit path?
13341   SmallVector<TemplateArgument, 8> Args;
13342   bool PartialSubstitution = false;
13343   for (auto &Loc : TransformedPackArgs.arguments()) {
13344     Args.push_back(Loc.getArgument());
13345     if (Loc.getArgument().isPackExpansion())
13346       PartialSubstitution = true;
13347   }
13348 
13349   if (PartialSubstitution)
13350     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13351                                               E->getPackLoc(),
13352                                               E->getRParenLoc(), None, Args);
13353 
13354   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13355                                             E->getPackLoc(), E->getRParenLoc(),
13356                                             Args.size(), None);
13357 }
13358 
13359 template<typename Derived>
13360 ExprResult
13361 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13362                                           SubstNonTypeTemplateParmPackExpr *E) {
13363   // Default behavior is to do nothing with this transformation.
13364   return E;
13365 }
13366 
13367 template<typename Derived>
13368 ExprResult
13369 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13370                                           SubstNonTypeTemplateParmExpr *E) {
13371   // Default behavior is to do nothing with this transformation.
13372   return E;
13373 }
13374 
13375 template<typename Derived>
13376 ExprResult
13377 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13378   // Default behavior is to do nothing with this transformation.
13379   return E;
13380 }
13381 
13382 template<typename Derived>
13383 ExprResult
13384 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13385                                                   MaterializeTemporaryExpr *E) {
13386   return getDerived().TransformExpr(E->getSubExpr());
13387 }
13388 
13389 template<typename Derived>
13390 ExprResult
13391 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13392   UnresolvedLookupExpr *Callee = nullptr;
13393   if (Expr *OldCallee = E->getCallee()) {
13394     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13395     if (CalleeResult.isInvalid())
13396       return ExprError();
13397     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13398   }
13399 
13400   Expr *Pattern = E->getPattern();
13401 
13402   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13403   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13404   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13405 
13406   // Determine whether the set of unexpanded parameter packs can and should
13407   // be expanded.
13408   bool Expand = true;
13409   bool RetainExpansion = false;
13410   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13411                      NumExpansions = OrigNumExpansions;
13412   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13413                                            Pattern->getSourceRange(),
13414                                            Unexpanded,
13415                                            Expand, RetainExpansion,
13416                                            NumExpansions))
13417     return true;
13418 
13419   if (!Expand) {
13420     // Do not expand any packs here, just transform and rebuild a fold
13421     // expression.
13422     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13423 
13424     ExprResult LHS =
13425         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13426     if (LHS.isInvalid())
13427       return true;
13428 
13429     ExprResult RHS =
13430         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13431     if (RHS.isInvalid())
13432       return true;
13433 
13434     if (!getDerived().AlwaysRebuild() &&
13435         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13436       return E;
13437 
13438     return getDerived().RebuildCXXFoldExpr(
13439         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13440         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13441   }
13442 
13443   // Formally a fold expression expands to nested parenthesized expressions.
13444   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13445   // them.
13446   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13447     SemaRef.Diag(E->getEllipsisLoc(),
13448                  clang::diag::err_fold_expression_limit_exceeded)
13449         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13450         << E->getSourceRange();
13451     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13452     return ExprError();
13453   }
13454 
13455   // The transform has determined that we should perform an elementwise
13456   // expansion of the pattern. Do so.
13457   ExprResult Result = getDerived().TransformExpr(E->getInit());
13458   if (Result.isInvalid())
13459     return true;
13460   bool LeftFold = E->isLeftFold();
13461 
13462   // If we're retaining an expansion for a right fold, it is the innermost
13463   // component and takes the init (if any).
13464   if (!LeftFold && RetainExpansion) {
13465     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13466 
13467     ExprResult Out = getDerived().TransformExpr(Pattern);
13468     if (Out.isInvalid())
13469       return true;
13470 
13471     Result = getDerived().RebuildCXXFoldExpr(
13472         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13473         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13474     if (Result.isInvalid())
13475       return true;
13476   }
13477 
13478   for (unsigned I = 0; I != *NumExpansions; ++I) {
13479     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13480         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13481     ExprResult Out = getDerived().TransformExpr(Pattern);
13482     if (Out.isInvalid())
13483       return true;
13484 
13485     if (Out.get()->containsUnexpandedParameterPack()) {
13486       // We still have a pack; retain a pack expansion for this slice.
13487       Result = getDerived().RebuildCXXFoldExpr(
13488           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13489           E->getOperator(), E->getEllipsisLoc(),
13490           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13491           OrigNumExpansions);
13492     } else if (Result.isUsable()) {
13493       // We've got down to a single element; build a binary operator.
13494       Expr *LHS = LeftFold ? Result.get() : Out.get();
13495       Expr *RHS = LeftFold ? Out.get() : Result.get();
13496       if (Callee)
13497         Result = getDerived().RebuildCXXOperatorCallExpr(
13498             BinaryOperator::getOverloadedOperator(E->getOperator()),
13499             E->getEllipsisLoc(), Callee, LHS, RHS);
13500       else
13501         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13502                                                     E->getOperator(), LHS, RHS);
13503     } else
13504       Result = Out;
13505 
13506     if (Result.isInvalid())
13507       return true;
13508   }
13509 
13510   // If we're retaining an expansion for a left fold, it is the outermost
13511   // component and takes the complete expansion so far as its init (if any).
13512   if (LeftFold && RetainExpansion) {
13513     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13514 
13515     ExprResult Out = getDerived().TransformExpr(Pattern);
13516     if (Out.isInvalid())
13517       return true;
13518 
13519     Result = getDerived().RebuildCXXFoldExpr(
13520         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13521         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13522     if (Result.isInvalid())
13523       return true;
13524   }
13525 
13526   // If we had no init and an empty pack, and we're not retaining an expansion,
13527   // then produce a fallback value or error.
13528   if (Result.isUnset())
13529     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13530                                                 E->getOperator());
13531 
13532   return Result;
13533 }
13534 
13535 template<typename Derived>
13536 ExprResult
13537 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13538     CXXStdInitializerListExpr *E) {
13539   return getDerived().TransformExpr(E->getSubExpr());
13540 }
13541 
13542 template<typename Derived>
13543 ExprResult
13544 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13545   return SemaRef.MaybeBindToTemporary(E);
13546 }
13547 
13548 template<typename Derived>
13549 ExprResult
13550 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13551   return E;
13552 }
13553 
13554 template<typename Derived>
13555 ExprResult
13556 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13557   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13558   if (SubExpr.isInvalid())
13559     return ExprError();
13560 
13561   if (!getDerived().AlwaysRebuild() &&
13562       SubExpr.get() == E->getSubExpr())
13563     return E;
13564 
13565   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13566 }
13567 
13568 template<typename Derived>
13569 ExprResult
13570 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13571   // Transform each of the elements.
13572   SmallVector<Expr *, 8> Elements;
13573   bool ArgChanged = false;
13574   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13575                                   /*IsCall=*/false, Elements, &ArgChanged))
13576     return ExprError();
13577 
13578   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13579     return SemaRef.MaybeBindToTemporary(E);
13580 
13581   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13582                                               Elements.data(),
13583                                               Elements.size());
13584 }
13585 
13586 template<typename Derived>
13587 ExprResult
13588 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13589                                                     ObjCDictionaryLiteral *E) {
13590   // Transform each of the elements.
13591   SmallVector<ObjCDictionaryElement, 8> Elements;
13592   bool ArgChanged = false;
13593   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13594     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13595 
13596     if (OrigElement.isPackExpansion()) {
13597       // This key/value element is a pack expansion.
13598       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13599       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13600       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13601       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13602 
13603       // Determine whether the set of unexpanded parameter packs can
13604       // and should be expanded.
13605       bool Expand = true;
13606       bool RetainExpansion = false;
13607       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13608       Optional<unsigned> NumExpansions = OrigNumExpansions;
13609       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13610                                OrigElement.Value->getEndLoc());
13611       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13612                                                PatternRange, Unexpanded, Expand,
13613                                                RetainExpansion, NumExpansions))
13614         return ExprError();
13615 
13616       if (!Expand) {
13617         // The transform has determined that we should perform a simple
13618         // transformation on the pack expansion, producing another pack
13619         // expansion.
13620         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13621         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13622         if (Key.isInvalid())
13623           return ExprError();
13624 
13625         if (Key.get() != OrigElement.Key)
13626           ArgChanged = true;
13627 
13628         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13629         if (Value.isInvalid())
13630           return ExprError();
13631 
13632         if (Value.get() != OrigElement.Value)
13633           ArgChanged = true;
13634 
13635         ObjCDictionaryElement Expansion = {
13636           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13637         };
13638         Elements.push_back(Expansion);
13639         continue;
13640       }
13641 
13642       // Record right away that the argument was changed.  This needs
13643       // to happen even if the array expands to nothing.
13644       ArgChanged = true;
13645 
13646       // The transform has determined that we should perform an elementwise
13647       // expansion of the pattern. Do so.
13648       for (unsigned I = 0; I != *NumExpansions; ++I) {
13649         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13650         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13651         if (Key.isInvalid())
13652           return ExprError();
13653 
13654         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13655         if (Value.isInvalid())
13656           return ExprError();
13657 
13658         ObjCDictionaryElement Element = {
13659           Key.get(), Value.get(), SourceLocation(), NumExpansions
13660         };
13661 
13662         // If any unexpanded parameter packs remain, we still have a
13663         // pack expansion.
13664         // FIXME: Can this really happen?
13665         if (Key.get()->containsUnexpandedParameterPack() ||
13666             Value.get()->containsUnexpandedParameterPack())
13667           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13668 
13669         Elements.push_back(Element);
13670       }
13671 
13672       // FIXME: Retain a pack expansion if RetainExpansion is true.
13673 
13674       // We've finished with this pack expansion.
13675       continue;
13676     }
13677 
13678     // Transform and check key.
13679     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13680     if (Key.isInvalid())
13681       return ExprError();
13682 
13683     if (Key.get() != OrigElement.Key)
13684       ArgChanged = true;
13685 
13686     // Transform and check value.
13687     ExprResult Value
13688       = getDerived().TransformExpr(OrigElement.Value);
13689     if (Value.isInvalid())
13690       return ExprError();
13691 
13692     if (Value.get() != OrigElement.Value)
13693       ArgChanged = true;
13694 
13695     ObjCDictionaryElement Element = {
13696       Key.get(), Value.get(), SourceLocation(), None
13697     };
13698     Elements.push_back(Element);
13699   }
13700 
13701   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13702     return SemaRef.MaybeBindToTemporary(E);
13703 
13704   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13705                                                    Elements);
13706 }
13707 
13708 template<typename Derived>
13709 ExprResult
13710 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13711   TypeSourceInfo *EncodedTypeInfo
13712     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13713   if (!EncodedTypeInfo)
13714     return ExprError();
13715 
13716   if (!getDerived().AlwaysRebuild() &&
13717       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13718     return E;
13719 
13720   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13721                                             EncodedTypeInfo,
13722                                             E->getRParenLoc());
13723 }
13724 
13725 template<typename Derived>
13726 ExprResult TreeTransform<Derived>::
13727 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13728   // This is a kind of implicit conversion, and it needs to get dropped
13729   // and recomputed for the same general reasons that ImplicitCastExprs
13730   // do, as well a more specific one: this expression is only valid when
13731   // it appears *immediately* as an argument expression.
13732   return getDerived().TransformExpr(E->getSubExpr());
13733 }
13734 
13735 template<typename Derived>
13736 ExprResult TreeTransform<Derived>::
13737 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13738   TypeSourceInfo *TSInfo
13739     = getDerived().TransformType(E->getTypeInfoAsWritten());
13740   if (!TSInfo)
13741     return ExprError();
13742 
13743   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13744   if (Result.isInvalid())
13745     return ExprError();
13746 
13747   if (!getDerived().AlwaysRebuild() &&
13748       TSInfo == E->getTypeInfoAsWritten() &&
13749       Result.get() == E->getSubExpr())
13750     return E;
13751 
13752   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13753                                       E->getBridgeKeywordLoc(), TSInfo,
13754                                       Result.get());
13755 }
13756 
13757 template <typename Derived>
13758 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13759     ObjCAvailabilityCheckExpr *E) {
13760   return E;
13761 }
13762 
13763 template<typename Derived>
13764 ExprResult
13765 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13766   // Transform arguments.
13767   bool ArgChanged = false;
13768   SmallVector<Expr*, 8> Args;
13769   Args.reserve(E->getNumArgs());
13770   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13771                                   &ArgChanged))
13772     return ExprError();
13773 
13774   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13775     // Class message: transform the receiver type.
13776     TypeSourceInfo *ReceiverTypeInfo
13777       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13778     if (!ReceiverTypeInfo)
13779       return ExprError();
13780 
13781     // If nothing changed, just retain the existing message send.
13782     if (!getDerived().AlwaysRebuild() &&
13783         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13784       return SemaRef.MaybeBindToTemporary(E);
13785 
13786     // Build a new class message send.
13787     SmallVector<SourceLocation, 16> SelLocs;
13788     E->getSelectorLocs(SelLocs);
13789     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13790                                                E->getSelector(),
13791                                                SelLocs,
13792                                                E->getMethodDecl(),
13793                                                E->getLeftLoc(),
13794                                                Args,
13795                                                E->getRightLoc());
13796   }
13797   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13798            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13799     if (!E->getMethodDecl())
13800       return ExprError();
13801 
13802     // Build a new class message send to 'super'.
13803     SmallVector<SourceLocation, 16> SelLocs;
13804     E->getSelectorLocs(SelLocs);
13805     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13806                                                E->getSelector(),
13807                                                SelLocs,
13808                                                E->getReceiverType(),
13809                                                E->getMethodDecl(),
13810                                                E->getLeftLoc(),
13811                                                Args,
13812                                                E->getRightLoc());
13813   }
13814 
13815   // Instance message: transform the receiver
13816   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13817          "Only class and instance messages may be instantiated");
13818   ExprResult Receiver
13819     = getDerived().TransformExpr(E->getInstanceReceiver());
13820   if (Receiver.isInvalid())
13821     return ExprError();
13822 
13823   // If nothing changed, just retain the existing message send.
13824   if (!getDerived().AlwaysRebuild() &&
13825       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13826     return SemaRef.MaybeBindToTemporary(E);
13827 
13828   // Build a new instance message send.
13829   SmallVector<SourceLocation, 16> SelLocs;
13830   E->getSelectorLocs(SelLocs);
13831   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13832                                              E->getSelector(),
13833                                              SelLocs,
13834                                              E->getMethodDecl(),
13835                                              E->getLeftLoc(),
13836                                              Args,
13837                                              E->getRightLoc());
13838 }
13839 
13840 template<typename Derived>
13841 ExprResult
13842 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13843   return E;
13844 }
13845 
13846 template<typename Derived>
13847 ExprResult
13848 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13849   return E;
13850 }
13851 
13852 template<typename Derived>
13853 ExprResult
13854 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13855   // Transform the base expression.
13856   ExprResult Base = getDerived().TransformExpr(E->getBase());
13857   if (Base.isInvalid())
13858     return ExprError();
13859 
13860   // We don't need to transform the ivar; it will never change.
13861 
13862   // If nothing changed, just retain the existing expression.
13863   if (!getDerived().AlwaysRebuild() &&
13864       Base.get() == E->getBase())
13865     return E;
13866 
13867   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13868                                              E->getLocation(),
13869                                              E->isArrow(), E->isFreeIvar());
13870 }
13871 
13872 template<typename Derived>
13873 ExprResult
13874 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13875   // 'super' and types never change. Property never changes. Just
13876   // retain the existing expression.
13877   if (!E->isObjectReceiver())
13878     return E;
13879 
13880   // Transform the base expression.
13881   ExprResult Base = getDerived().TransformExpr(E->getBase());
13882   if (Base.isInvalid())
13883     return ExprError();
13884 
13885   // We don't need to transform the property; it will never change.
13886 
13887   // If nothing changed, just retain the existing expression.
13888   if (!getDerived().AlwaysRebuild() &&
13889       Base.get() == E->getBase())
13890     return E;
13891 
13892   if (E->isExplicitProperty())
13893     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13894                                                    E->getExplicitProperty(),
13895                                                    E->getLocation());
13896 
13897   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13898                                                  SemaRef.Context.PseudoObjectTy,
13899                                                  E->getImplicitPropertyGetter(),
13900                                                  E->getImplicitPropertySetter(),
13901                                                  E->getLocation());
13902 }
13903 
13904 template<typename Derived>
13905 ExprResult
13906 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13907   // Transform the base expression.
13908   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13909   if (Base.isInvalid())
13910     return ExprError();
13911 
13912   // Transform the key expression.
13913   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13914   if (Key.isInvalid())
13915     return ExprError();
13916 
13917   // If nothing changed, just retain the existing expression.
13918   if (!getDerived().AlwaysRebuild() &&
13919       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13920     return E;
13921 
13922   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13923                                                   Base.get(), Key.get(),
13924                                                   E->getAtIndexMethodDecl(),
13925                                                   E->setAtIndexMethodDecl());
13926 }
13927 
13928 template<typename Derived>
13929 ExprResult
13930 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13931   // Transform the base expression.
13932   ExprResult Base = getDerived().TransformExpr(E->getBase());
13933   if (Base.isInvalid())
13934     return ExprError();
13935 
13936   // If nothing changed, just retain the existing expression.
13937   if (!getDerived().AlwaysRebuild() &&
13938       Base.get() == E->getBase())
13939     return E;
13940 
13941   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13942                                          E->getOpLoc(),
13943                                          E->isArrow());
13944 }
13945 
13946 template<typename Derived>
13947 ExprResult
13948 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13949   bool ArgumentChanged = false;
13950   SmallVector<Expr*, 8> SubExprs;
13951   SubExprs.reserve(E->getNumSubExprs());
13952   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13953                                   SubExprs, &ArgumentChanged))
13954     return ExprError();
13955 
13956   if (!getDerived().AlwaysRebuild() &&
13957       !ArgumentChanged)
13958     return E;
13959 
13960   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13961                                                SubExprs,
13962                                                E->getRParenLoc());
13963 }
13964 
13965 template<typename Derived>
13966 ExprResult
13967 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13968   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13969   if (SrcExpr.isInvalid())
13970     return ExprError();
13971 
13972   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13973   if (!Type)
13974     return ExprError();
13975 
13976   if (!getDerived().AlwaysRebuild() &&
13977       Type == E->getTypeSourceInfo() &&
13978       SrcExpr.get() == E->getSrcExpr())
13979     return E;
13980 
13981   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13982                                                SrcExpr.get(), Type,
13983                                                E->getRParenLoc());
13984 }
13985 
13986 template<typename Derived>
13987 ExprResult
13988 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13989   BlockDecl *oldBlock = E->getBlockDecl();
13990 
13991   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13992   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13993 
13994   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13995   blockScope->TheDecl->setBlockMissingReturnType(
13996                          oldBlock->blockMissingReturnType());
13997 
13998   SmallVector<ParmVarDecl*, 4> params;
13999   SmallVector<QualType, 4> paramTypes;
14000 
14001   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14002 
14003   // Parameter substitution.
14004   Sema::ExtParameterInfoBuilder extParamInfos;
14005   if (getDerived().TransformFunctionTypeParams(
14006           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14007           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14008           extParamInfos)) {
14009     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14010     return ExprError();
14011   }
14012 
14013   QualType exprResultType =
14014       getDerived().TransformType(exprFunctionType->getReturnType());
14015 
14016   auto epi = exprFunctionType->getExtProtoInfo();
14017   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14018 
14019   QualType functionType =
14020     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14021   blockScope->FunctionType = functionType;
14022 
14023   // Set the parameters on the block decl.
14024   if (!params.empty())
14025     blockScope->TheDecl->setParams(params);
14026 
14027   if (!oldBlock->blockMissingReturnType()) {
14028     blockScope->HasImplicitReturnType = false;
14029     blockScope->ReturnType = exprResultType;
14030   }
14031 
14032   // Transform the body
14033   StmtResult body = getDerived().TransformStmt(E->getBody());
14034   if (body.isInvalid()) {
14035     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14036     return ExprError();
14037   }
14038 
14039 #ifndef NDEBUG
14040   // In builds with assertions, make sure that we captured everything we
14041   // captured before.
14042   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14043     for (const auto &I : oldBlock->captures()) {
14044       VarDecl *oldCapture = I.getVariable();
14045 
14046       // Ignore parameter packs.
14047       if (oldCapture->isParameterPack())
14048         continue;
14049 
14050       VarDecl *newCapture =
14051         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14052                                                  oldCapture));
14053       assert(blockScope->CaptureMap.count(newCapture));
14054     }
14055     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14056   }
14057 #endif
14058 
14059   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14060                                     /*Scope=*/nullptr);
14061 }
14062 
14063 template<typename Derived>
14064 ExprResult
14065 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14066   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14067   if (SrcExpr.isInvalid())
14068     return ExprError();
14069 
14070   QualType Type = getDerived().TransformType(E->getType());
14071 
14072   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14073                                  E->getRParenLoc());
14074 }
14075 
14076 template<typename Derived>
14077 ExprResult
14078 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14079   bool ArgumentChanged = false;
14080   SmallVector<Expr*, 8> SubExprs;
14081   SubExprs.reserve(E->getNumSubExprs());
14082   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14083                                   SubExprs, &ArgumentChanged))
14084     return ExprError();
14085 
14086   if (!getDerived().AlwaysRebuild() &&
14087       !ArgumentChanged)
14088     return E;
14089 
14090   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14091                                         E->getOp(), E->getRParenLoc());
14092 }
14093 
14094 //===----------------------------------------------------------------------===//
14095 // Type reconstruction
14096 //===----------------------------------------------------------------------===//
14097 
14098 template<typename Derived>
14099 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14100                                                     SourceLocation Star) {
14101   return SemaRef.BuildPointerType(PointeeType, Star,
14102                                   getDerived().getBaseEntity());
14103 }
14104 
14105 template<typename Derived>
14106 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14107                                                          SourceLocation Star) {
14108   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14109                                        getDerived().getBaseEntity());
14110 }
14111 
14112 template<typename Derived>
14113 QualType
14114 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14115                                              bool WrittenAsLValue,
14116                                              SourceLocation Sigil) {
14117   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14118                                     Sigil, getDerived().getBaseEntity());
14119 }
14120 
14121 template<typename Derived>
14122 QualType
14123 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14124                                                  QualType ClassType,
14125                                                  SourceLocation Sigil) {
14126   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14127                                         getDerived().getBaseEntity());
14128 }
14129 
14130 template<typename Derived>
14131 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14132            const ObjCTypeParamDecl *Decl,
14133            SourceLocation ProtocolLAngleLoc,
14134            ArrayRef<ObjCProtocolDecl *> Protocols,
14135            ArrayRef<SourceLocation> ProtocolLocs,
14136            SourceLocation ProtocolRAngleLoc) {
14137   return SemaRef.BuildObjCTypeParamType(Decl,
14138                                         ProtocolLAngleLoc, Protocols,
14139                                         ProtocolLocs, ProtocolRAngleLoc,
14140                                         /*FailOnError=*/true);
14141 }
14142 
14143 template<typename Derived>
14144 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14145            QualType BaseType,
14146            SourceLocation Loc,
14147            SourceLocation TypeArgsLAngleLoc,
14148            ArrayRef<TypeSourceInfo *> TypeArgs,
14149            SourceLocation TypeArgsRAngleLoc,
14150            SourceLocation ProtocolLAngleLoc,
14151            ArrayRef<ObjCProtocolDecl *> Protocols,
14152            ArrayRef<SourceLocation> ProtocolLocs,
14153            SourceLocation ProtocolRAngleLoc) {
14154   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14155                                      TypeArgs, TypeArgsRAngleLoc,
14156                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14157                                      ProtocolRAngleLoc,
14158                                      /*FailOnError=*/true);
14159 }
14160 
14161 template<typename Derived>
14162 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14163            QualType PointeeType,
14164            SourceLocation Star) {
14165   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14166 }
14167 
14168 template<typename Derived>
14169 QualType
14170 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14171                                          ArrayType::ArraySizeModifier SizeMod,
14172                                          const llvm::APInt *Size,
14173                                          Expr *SizeExpr,
14174                                          unsigned IndexTypeQuals,
14175                                          SourceRange BracketsRange) {
14176   if (SizeExpr || !Size)
14177     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14178                                   IndexTypeQuals, BracketsRange,
14179                                   getDerived().getBaseEntity());
14180 
14181   QualType Types[] = {
14182     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14183     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14184     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14185   };
14186   const unsigned NumTypes = llvm::array_lengthof(Types);
14187   QualType SizeType;
14188   for (unsigned I = 0; I != NumTypes; ++I)
14189     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14190       SizeType = Types[I];
14191       break;
14192     }
14193 
14194   // Note that we can return a VariableArrayType here in the case where
14195   // the element type was a dependent VariableArrayType.
14196   IntegerLiteral *ArraySize
14197       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14198                                /*FIXME*/BracketsRange.getBegin());
14199   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14200                                 IndexTypeQuals, BracketsRange,
14201                                 getDerived().getBaseEntity());
14202 }
14203 
14204 template<typename Derived>
14205 QualType
14206 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14207                                                  ArrayType::ArraySizeModifier SizeMod,
14208                                                  const llvm::APInt &Size,
14209                                                  Expr *SizeExpr,
14210                                                  unsigned IndexTypeQuals,
14211                                                  SourceRange BracketsRange) {
14212   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14213                                         IndexTypeQuals, BracketsRange);
14214 }
14215 
14216 template<typename Derived>
14217 QualType
14218 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14219                                           ArrayType::ArraySizeModifier SizeMod,
14220                                                  unsigned IndexTypeQuals,
14221                                                    SourceRange BracketsRange) {
14222   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14223                                        IndexTypeQuals, BracketsRange);
14224 }
14225 
14226 template<typename Derived>
14227 QualType
14228 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14229                                           ArrayType::ArraySizeModifier SizeMod,
14230                                                  Expr *SizeExpr,
14231                                                  unsigned IndexTypeQuals,
14232                                                  SourceRange BracketsRange) {
14233   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14234                                        SizeExpr,
14235                                        IndexTypeQuals, BracketsRange);
14236 }
14237 
14238 template<typename Derived>
14239 QualType
14240 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14241                                           ArrayType::ArraySizeModifier SizeMod,
14242                                                        Expr *SizeExpr,
14243                                                        unsigned IndexTypeQuals,
14244                                                    SourceRange BracketsRange) {
14245   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14246                                        SizeExpr,
14247                                        IndexTypeQuals, BracketsRange);
14248 }
14249 
14250 template <typename Derived>
14251 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14252     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14253   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14254                                           AttributeLoc);
14255 }
14256 
14257 template <typename Derived>
14258 QualType
14259 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14260                                           unsigned NumElements,
14261                                           VectorType::VectorKind VecKind) {
14262   // FIXME: semantic checking!
14263   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14264 }
14265 
14266 template <typename Derived>
14267 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14268     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14269     VectorType::VectorKind VecKind) {
14270   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14271 }
14272 
14273 template<typename Derived>
14274 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14275                                                       unsigned NumElements,
14276                                                  SourceLocation AttributeLoc) {
14277   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14278                           NumElements, true);
14279   IntegerLiteral *VectorSize
14280     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14281                              AttributeLoc);
14282   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14283 }
14284 
14285 template<typename Derived>
14286 QualType
14287 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14288                                                            Expr *SizeExpr,
14289                                                   SourceLocation AttributeLoc) {
14290   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14291 }
14292 
14293 template <typename Derived>
14294 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14295     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14296   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14297                                                NumColumns);
14298 }
14299 
14300 template <typename Derived>
14301 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14302     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14303     SourceLocation AttributeLoc) {
14304   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14305                                  AttributeLoc);
14306 }
14307 
14308 template<typename Derived>
14309 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14310     QualType T,
14311     MutableArrayRef<QualType> ParamTypes,
14312     const FunctionProtoType::ExtProtoInfo &EPI) {
14313   return SemaRef.BuildFunctionType(T, ParamTypes,
14314                                    getDerived().getBaseLocation(),
14315                                    getDerived().getBaseEntity(),
14316                                    EPI);
14317 }
14318 
14319 template<typename Derived>
14320 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14321   return SemaRef.Context.getFunctionNoProtoType(T);
14322 }
14323 
14324 template<typename Derived>
14325 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14326                                                             Decl *D) {
14327   assert(D && "no decl found");
14328   if (D->isInvalidDecl()) return QualType();
14329 
14330   // FIXME: Doesn't account for ObjCInterfaceDecl!
14331   TypeDecl *Ty;
14332   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14333     // A valid resolved using typename pack expansion decl can have multiple
14334     // UsingDecls, but they must each have exactly one type, and it must be
14335     // the same type in every case. But we must have at least one expansion!
14336     if (UPD->expansions().empty()) {
14337       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14338           << UPD->isCXXClassMember() << UPD;
14339       return QualType();
14340     }
14341 
14342     // We might still have some unresolved types. Try to pick a resolved type
14343     // if we can. The final instantiation will check that the remaining
14344     // unresolved types instantiate to the type we pick.
14345     QualType FallbackT;
14346     QualType T;
14347     for (auto *E : UPD->expansions()) {
14348       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14349       if (ThisT.isNull())
14350         continue;
14351       else if (ThisT->getAs<UnresolvedUsingType>())
14352         FallbackT = ThisT;
14353       else if (T.isNull())
14354         T = ThisT;
14355       else
14356         assert(getSema().Context.hasSameType(ThisT, T) &&
14357                "mismatched resolved types in using pack expansion");
14358     }
14359     return T.isNull() ? FallbackT : T;
14360   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14361     assert(Using->hasTypename() &&
14362            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14363 
14364     // A valid resolved using typename decl points to exactly one type decl.
14365     assert(++Using->shadow_begin() == Using->shadow_end());
14366     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
14367   } else {
14368     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14369            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14370     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14371   }
14372 
14373   return SemaRef.Context.getTypeDeclType(Ty);
14374 }
14375 
14376 template<typename Derived>
14377 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14378                                                        SourceLocation Loc) {
14379   return SemaRef.BuildTypeofExprType(E, Loc);
14380 }
14381 
14382 template<typename Derived>
14383 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14384   return SemaRef.Context.getTypeOfType(Underlying);
14385 }
14386 
14387 template<typename Derived>
14388 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14389                                                      SourceLocation Loc) {
14390   return SemaRef.BuildDecltypeType(E, Loc);
14391 }
14392 
14393 template<typename Derived>
14394 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14395                                             UnaryTransformType::UTTKind UKind,
14396                                             SourceLocation Loc) {
14397   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14398 }
14399 
14400 template<typename Derived>
14401 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14402                                                       TemplateName Template,
14403                                              SourceLocation TemplateNameLoc,
14404                                      TemplateArgumentListInfo &TemplateArgs) {
14405   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14406 }
14407 
14408 template<typename Derived>
14409 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14410                                                    SourceLocation KWLoc) {
14411   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14412 }
14413 
14414 template<typename Derived>
14415 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14416                                                  SourceLocation KWLoc,
14417                                                  bool isReadPipe) {
14418   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14419                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14420 }
14421 
14422 template <typename Derived>
14423 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14424                                                    unsigned NumBits,
14425                                                    SourceLocation Loc) {
14426   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14427                         NumBits, true);
14428   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14429                                                 SemaRef.Context.IntTy, Loc);
14430   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14431 }
14432 
14433 template <typename Derived>
14434 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14435     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14436   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14437 }
14438 
14439 template<typename Derived>
14440 TemplateName
14441 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14442                                             bool TemplateKW,
14443                                             TemplateDecl *Template) {
14444   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14445                                                   Template);
14446 }
14447 
14448 template<typename Derived>
14449 TemplateName
14450 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14451                                             SourceLocation TemplateKWLoc,
14452                                             const IdentifierInfo &Name,
14453                                             SourceLocation NameLoc,
14454                                             QualType ObjectType,
14455                                             NamedDecl *FirstQualifierInScope,
14456                                             bool AllowInjectedClassName) {
14457   UnqualifiedId TemplateName;
14458   TemplateName.setIdentifier(&Name, NameLoc);
14459   Sema::TemplateTy Template;
14460   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14461                               TemplateName, ParsedType::make(ObjectType),
14462                               /*EnteringContext=*/false, Template,
14463                               AllowInjectedClassName);
14464   return Template.get();
14465 }
14466 
14467 template<typename Derived>
14468 TemplateName
14469 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14470                                             SourceLocation TemplateKWLoc,
14471                                             OverloadedOperatorKind Operator,
14472                                             SourceLocation NameLoc,
14473                                             QualType ObjectType,
14474                                             bool AllowInjectedClassName) {
14475   UnqualifiedId Name;
14476   // FIXME: Bogus location information.
14477   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14478   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14479   Sema::TemplateTy Template;
14480   getSema().ActOnTemplateName(
14481       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14482       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14483   return Template.get();
14484 }
14485 
14486 template<typename Derived>
14487 ExprResult
14488 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14489                                                    SourceLocation OpLoc,
14490                                                    Expr *OrigCallee,
14491                                                    Expr *First,
14492                                                    Expr *Second) {
14493   Expr *Callee = OrigCallee->IgnoreParenCasts();
14494   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14495 
14496   if (First->getObjectKind() == OK_ObjCProperty) {
14497     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14498     if (BinaryOperator::isAssignmentOp(Opc))
14499       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14500                                                  First, Second);
14501     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14502     if (Result.isInvalid())
14503       return ExprError();
14504     First = Result.get();
14505   }
14506 
14507   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14508     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14509     if (Result.isInvalid())
14510       return ExprError();
14511     Second = Result.get();
14512   }
14513 
14514   // Determine whether this should be a builtin operation.
14515   if (Op == OO_Subscript) {
14516     if (!First->getType()->isOverloadableType() &&
14517         !Second->getType()->isOverloadableType())
14518       return getSema().CreateBuiltinArraySubscriptExpr(
14519           First, Callee->getBeginLoc(), Second, OpLoc);
14520   } else if (Op == OO_Arrow) {
14521     // -> is never a builtin operation.
14522     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14523   } else if (Second == nullptr || isPostIncDec) {
14524     if (!First->getType()->isOverloadableType() ||
14525         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14526       // The argument is not of overloadable type, or this is an expression
14527       // of the form &Class::member, so try to create a built-in unary
14528       // operation.
14529       UnaryOperatorKind Opc
14530         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14531 
14532       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14533     }
14534   } else {
14535     if (!First->getType()->isOverloadableType() &&
14536         !Second->getType()->isOverloadableType()) {
14537       // Neither of the arguments is an overloadable type, so try to
14538       // create a built-in binary operation.
14539       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14540       ExprResult Result
14541         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14542       if (Result.isInvalid())
14543         return ExprError();
14544 
14545       return Result;
14546     }
14547   }
14548 
14549   // Compute the transformed set of functions (and function templates) to be
14550   // used during overload resolution.
14551   UnresolvedSet<16> Functions;
14552   bool RequiresADL;
14553 
14554   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14555     Functions.append(ULE->decls_begin(), ULE->decls_end());
14556     // If the overload could not be resolved in the template definition
14557     // (because we had a dependent argument), ADL is performed as part of
14558     // template instantiation.
14559     RequiresADL = ULE->requiresADL();
14560   } else {
14561     // If we've resolved this to a particular non-member function, just call
14562     // that function. If we resolved it to a member function,
14563     // CreateOverloaded* will find that function for us.
14564     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14565     if (!isa<CXXMethodDecl>(ND))
14566       Functions.addDecl(ND);
14567     RequiresADL = false;
14568   }
14569 
14570   // Add any functions found via argument-dependent lookup.
14571   Expr *Args[2] = { First, Second };
14572   unsigned NumArgs = 1 + (Second != nullptr);
14573 
14574   // Create the overloaded operator invocation for unary operators.
14575   if (NumArgs == 1 || isPostIncDec) {
14576     UnaryOperatorKind Opc
14577       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14578     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14579                                            RequiresADL);
14580   }
14581 
14582   if (Op == OO_Subscript) {
14583     SourceLocation LBrace;
14584     SourceLocation RBrace;
14585 
14586     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14587       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14588       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14589       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14590     } else {
14591       LBrace = Callee->getBeginLoc();
14592       RBrace = OpLoc;
14593     }
14594 
14595     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14596                                                       First, Second);
14597   }
14598 
14599   // Create the overloaded operator invocation for binary operators.
14600   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14601   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14602       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14603   if (Result.isInvalid())
14604     return ExprError();
14605 
14606   return Result;
14607 }
14608 
14609 template<typename Derived>
14610 ExprResult
14611 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14612                                                      SourceLocation OperatorLoc,
14613                                                        bool isArrow,
14614                                                        CXXScopeSpec &SS,
14615                                                      TypeSourceInfo *ScopeType,
14616                                                        SourceLocation CCLoc,
14617                                                        SourceLocation TildeLoc,
14618                                         PseudoDestructorTypeStorage Destroyed) {
14619   QualType BaseType = Base->getType();
14620   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14621       (!isArrow && !BaseType->getAs<RecordType>()) ||
14622       (isArrow && BaseType->getAs<PointerType>() &&
14623        !BaseType->castAs<PointerType>()->getPointeeType()
14624                                               ->template getAs<RecordType>())){
14625     // This pseudo-destructor expression is still a pseudo-destructor.
14626     return SemaRef.BuildPseudoDestructorExpr(
14627         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14628         CCLoc, TildeLoc, Destroyed);
14629   }
14630 
14631   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14632   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14633                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14634   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14635   NameInfo.setNamedTypeInfo(DestroyedType);
14636 
14637   // The scope type is now known to be a valid nested name specifier
14638   // component. Tack it on to the end of the nested name specifier.
14639   if (ScopeType) {
14640     if (!ScopeType->getType()->getAs<TagType>()) {
14641       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14642                      diag::err_expected_class_or_namespace)
14643           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14644       return ExprError();
14645     }
14646     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14647               CCLoc);
14648   }
14649 
14650   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14651   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14652                                             OperatorLoc, isArrow,
14653                                             SS, TemplateKWLoc,
14654                                             /*FIXME: FirstQualifier*/ nullptr,
14655                                             NameInfo,
14656                                             /*TemplateArgs*/ nullptr,
14657                                             /*S*/nullptr);
14658 }
14659 
14660 template<typename Derived>
14661 StmtResult
14662 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14663   SourceLocation Loc = S->getBeginLoc();
14664   CapturedDecl *CD = S->getCapturedDecl();
14665   unsigned NumParams = CD->getNumParams();
14666   unsigned ContextParamPos = CD->getContextParamPosition();
14667   SmallVector<Sema::CapturedParamNameType, 4> Params;
14668   for (unsigned I = 0; I < NumParams; ++I) {
14669     if (I != ContextParamPos) {
14670       Params.push_back(
14671              std::make_pair(
14672                   CD->getParam(I)->getName(),
14673                   getDerived().TransformType(CD->getParam(I)->getType())));
14674     } else {
14675       Params.push_back(std::make_pair(StringRef(), QualType()));
14676     }
14677   }
14678   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14679                                      S->getCapturedRegionKind(), Params);
14680   StmtResult Body;
14681   {
14682     Sema::CompoundScopeRAII CompoundScope(getSema());
14683     Body = getDerived().TransformStmt(S->getCapturedStmt());
14684   }
14685 
14686   if (Body.isInvalid()) {
14687     getSema().ActOnCapturedRegionError();
14688     return StmtError();
14689   }
14690 
14691   return getSema().ActOnCapturedRegionEnd(Body.get());
14692 }
14693 
14694 } // end namespace clang
14695 
14696 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14697