xref: /netbsd-src/external/apache2/llvm/dist/clang/lib/Sema/TreeTransform.h (revision 53b02e147d4ed531c0d2a5ca9b3e8026ba3e99b5)
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 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4036     NestedNameSpecifierLoc NNS, QualType ObjectType,
4037     NamedDecl *FirstQualifierInScope) {
4038   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4039   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4040        Qualifier = Qualifier.getPrefix())
4041     Qualifiers.push_back(Qualifier);
4042 
4043   CXXScopeSpec SS;
4044   while (!Qualifiers.empty()) {
4045     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4046     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4047 
4048     switch (QNNS->getKind()) {
4049     case NestedNameSpecifier::Identifier: {
4050       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4051                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4052                                       ObjectType);
4053       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4054                                               SS, FirstQualifierInScope, false))
4055         return NestedNameSpecifierLoc();
4056       break;
4057     }
4058 
4059     case NestedNameSpecifier::Namespace: {
4060       NamespaceDecl *NS =
4061           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4062               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4063       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4064       break;
4065     }
4066 
4067     case NestedNameSpecifier::NamespaceAlias: {
4068       NamespaceAliasDecl *Alias =
4069           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4070               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4071       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4072                 Q.getLocalEndLoc());
4073       break;
4074     }
4075 
4076     case NestedNameSpecifier::Global:
4077       // There is no meaningful transformation that one could perform on the
4078       // global scope.
4079       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4080       break;
4081 
4082     case NestedNameSpecifier::Super: {
4083       CXXRecordDecl *RD =
4084           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4085               SourceLocation(), QNNS->getAsRecordDecl()));
4086       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4087       break;
4088     }
4089 
4090     case NestedNameSpecifier::TypeSpecWithTemplate:
4091     case NestedNameSpecifier::TypeSpec: {
4092       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4093                                               FirstQualifierInScope, SS);
4094 
4095       if (!TL)
4096         return NestedNameSpecifierLoc();
4097 
4098       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4099           (SemaRef.getLangOpts().CPlusPlus11 &&
4100            TL.getType()->isEnumeralType())) {
4101         assert(!TL.getType().hasLocalQualifiers() &&
4102                "Can't get cv-qualifiers here");
4103         if (TL.getType()->isEnumeralType())
4104           SemaRef.Diag(TL.getBeginLoc(),
4105                        diag::warn_cxx98_compat_enum_nested_name_spec);
4106         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4107                   Q.getLocalEndLoc());
4108         break;
4109       }
4110       // If the nested-name-specifier is an invalid type def, don't emit an
4111       // error because a previous error should have already been emitted.
4112       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4113       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4114         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4115             << TL.getType() << SS.getRange();
4116       }
4117       return NestedNameSpecifierLoc();
4118     }
4119     }
4120 
4121     // The qualifier-in-scope and object type only apply to the leftmost entity.
4122     FirstQualifierInScope = nullptr;
4123     ObjectType = QualType();
4124   }
4125 
4126   // Don't rebuild the nested-name-specifier if we don't have to.
4127   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4128       !getDerived().AlwaysRebuild())
4129     return NNS;
4130 
4131   // If we can re-use the source-location data from the original
4132   // nested-name-specifier, do so.
4133   if (SS.location_size() == NNS.getDataLength() &&
4134       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4135     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4136 
4137   // Allocate new nested-name-specifier location information.
4138   return SS.getWithLocInContext(SemaRef.Context);
4139 }
4140 
4141 template<typename Derived>
4142 DeclarationNameInfo
4143 TreeTransform<Derived>
4144 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4145   DeclarationName Name = NameInfo.getName();
4146   if (!Name)
4147     return DeclarationNameInfo();
4148 
4149   switch (Name.getNameKind()) {
4150   case DeclarationName::Identifier:
4151   case DeclarationName::ObjCZeroArgSelector:
4152   case DeclarationName::ObjCOneArgSelector:
4153   case DeclarationName::ObjCMultiArgSelector:
4154   case DeclarationName::CXXOperatorName:
4155   case DeclarationName::CXXLiteralOperatorName:
4156   case DeclarationName::CXXUsingDirective:
4157     return NameInfo;
4158 
4159   case DeclarationName::CXXDeductionGuideName: {
4160     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4161     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4162         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4163     if (!NewTemplate)
4164       return DeclarationNameInfo();
4165 
4166     DeclarationNameInfo NewNameInfo(NameInfo);
4167     NewNameInfo.setName(
4168         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4169     return NewNameInfo;
4170   }
4171 
4172   case DeclarationName::CXXConstructorName:
4173   case DeclarationName::CXXDestructorName:
4174   case DeclarationName::CXXConversionFunctionName: {
4175     TypeSourceInfo *NewTInfo;
4176     CanQualType NewCanTy;
4177     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4178       NewTInfo = getDerived().TransformType(OldTInfo);
4179       if (!NewTInfo)
4180         return DeclarationNameInfo();
4181       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4182     }
4183     else {
4184       NewTInfo = nullptr;
4185       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4186       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4187       if (NewT.isNull())
4188         return DeclarationNameInfo();
4189       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4190     }
4191 
4192     DeclarationName NewName
4193       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4194                                                            NewCanTy);
4195     DeclarationNameInfo NewNameInfo(NameInfo);
4196     NewNameInfo.setName(NewName);
4197     NewNameInfo.setNamedTypeInfo(NewTInfo);
4198     return NewNameInfo;
4199   }
4200   }
4201 
4202   llvm_unreachable("Unknown name kind.");
4203 }
4204 
4205 template<typename Derived>
4206 TemplateName
4207 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4208                                               TemplateName Name,
4209                                               SourceLocation NameLoc,
4210                                               QualType ObjectType,
4211                                               NamedDecl *FirstQualifierInScope,
4212                                               bool AllowInjectedClassName) {
4213   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4214     TemplateDecl *Template = QTN->getTemplateDecl();
4215     assert(Template && "qualified template name must refer to a template");
4216 
4217     TemplateDecl *TransTemplate
4218       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4219                                                               Template));
4220     if (!TransTemplate)
4221       return TemplateName();
4222 
4223     if (!getDerived().AlwaysRebuild() &&
4224         SS.getScopeRep() == QTN->getQualifier() &&
4225         TransTemplate == Template)
4226       return Name;
4227 
4228     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4229                                             TransTemplate);
4230   }
4231 
4232   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4233     if (SS.getScopeRep()) {
4234       // These apply to the scope specifier, not the template.
4235       ObjectType = QualType();
4236       FirstQualifierInScope = nullptr;
4237     }
4238 
4239     if (!getDerived().AlwaysRebuild() &&
4240         SS.getScopeRep() == DTN->getQualifier() &&
4241         ObjectType.isNull())
4242       return Name;
4243 
4244     // FIXME: Preserve the location of the "template" keyword.
4245     SourceLocation TemplateKWLoc = NameLoc;
4246 
4247     if (DTN->isIdentifier()) {
4248       return getDerived().RebuildTemplateName(SS,
4249                                               TemplateKWLoc,
4250                                               *DTN->getIdentifier(),
4251                                               NameLoc,
4252                                               ObjectType,
4253                                               FirstQualifierInScope,
4254                                               AllowInjectedClassName);
4255     }
4256 
4257     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4258                                             DTN->getOperator(), NameLoc,
4259                                             ObjectType, AllowInjectedClassName);
4260   }
4261 
4262   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4263     TemplateDecl *TransTemplate
4264       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4265                                                               Template));
4266     if (!TransTemplate)
4267       return TemplateName();
4268 
4269     if (!getDerived().AlwaysRebuild() &&
4270         TransTemplate == Template)
4271       return Name;
4272 
4273     return TemplateName(TransTemplate);
4274   }
4275 
4276   if (SubstTemplateTemplateParmPackStorage *SubstPack
4277       = Name.getAsSubstTemplateTemplateParmPack()) {
4278     TemplateTemplateParmDecl *TransParam
4279     = cast_or_null<TemplateTemplateParmDecl>(
4280             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4281     if (!TransParam)
4282       return TemplateName();
4283 
4284     if (!getDerived().AlwaysRebuild() &&
4285         TransParam == SubstPack->getParameterPack())
4286       return Name;
4287 
4288     return getDerived().RebuildTemplateName(TransParam,
4289                                             SubstPack->getArgumentPack());
4290   }
4291 
4292   // These should be getting filtered out before they reach the AST.
4293   llvm_unreachable("overloaded function decl survived to here");
4294 }
4295 
4296 template<typename Derived>
4297 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4298                                          const TemplateArgument &Arg,
4299                                          TemplateArgumentLoc &Output) {
4300   Output = getSema().getTrivialTemplateArgumentLoc(
4301       Arg, QualType(), getDerived().getBaseLocation());
4302 }
4303 
4304 template<typename Derived>
4305 bool TreeTransform<Derived>::TransformTemplateArgument(
4306                                          const TemplateArgumentLoc &Input,
4307                                          TemplateArgumentLoc &Output, bool Uneval) {
4308   const TemplateArgument &Arg = Input.getArgument();
4309   switch (Arg.getKind()) {
4310   case TemplateArgument::Null:
4311   case TemplateArgument::Pack:
4312     llvm_unreachable("Unexpected TemplateArgument");
4313 
4314   case TemplateArgument::Integral:
4315   case TemplateArgument::NullPtr:
4316   case TemplateArgument::Declaration: {
4317     // Transform a resolved template argument straight to a resolved template
4318     // argument. We get here when substituting into an already-substituted
4319     // template type argument during concept satisfaction checking.
4320     QualType T = Arg.getNonTypeTemplateArgumentType();
4321     QualType NewT = getDerived().TransformType(T);
4322     if (NewT.isNull())
4323       return true;
4324 
4325     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4326                        ? Arg.getAsDecl()
4327                        : nullptr;
4328     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4329                               getDerived().getBaseLocation(), D))
4330                         : nullptr;
4331     if (D && !NewD)
4332       return true;
4333 
4334     if (NewT == T && D == NewD)
4335       Output = Input;
4336     else if (Arg.getKind() == TemplateArgument::Integral)
4337       Output = TemplateArgumentLoc(
4338           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4339           TemplateArgumentLocInfo());
4340     else if (Arg.getKind() == TemplateArgument::NullPtr)
4341       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4342                                    TemplateArgumentLocInfo());
4343     else
4344       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4345                                    TemplateArgumentLocInfo());
4346 
4347     return false;
4348   }
4349 
4350   case TemplateArgument::Type: {
4351     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4352     if (!DI)
4353       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4354 
4355     DI = getDerived().TransformType(DI);
4356     if (!DI) return true;
4357 
4358     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4359     return false;
4360   }
4361 
4362   case TemplateArgument::Template: {
4363     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4364     if (QualifierLoc) {
4365       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4366       if (!QualifierLoc)
4367         return true;
4368     }
4369 
4370     CXXScopeSpec SS;
4371     SS.Adopt(QualifierLoc);
4372     TemplateName Template
4373       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4374                                            Input.getTemplateNameLoc());
4375     if (Template.isNull())
4376       return true;
4377 
4378     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4379                                  QualifierLoc, Input.getTemplateNameLoc());
4380     return false;
4381   }
4382 
4383   case TemplateArgument::TemplateExpansion:
4384     llvm_unreachable("Caller should expand pack expansions");
4385 
4386   case TemplateArgument::Expression: {
4387     // Template argument expressions are constant expressions.
4388     EnterExpressionEvaluationContext Unevaluated(
4389         getSema(),
4390         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4391                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4392         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4393         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4394 
4395     Expr *InputExpr = Input.getSourceExpression();
4396     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4397 
4398     ExprResult E = getDerived().TransformExpr(InputExpr);
4399     E = SemaRef.ActOnConstantExpression(E);
4400     if (E.isInvalid()) return true;
4401     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4402     return false;
4403   }
4404   }
4405 
4406   // Work around bogus GCC warning
4407   return true;
4408 }
4409 
4410 /// Iterator adaptor that invents template argument location information
4411 /// for each of the template arguments in its underlying iterator.
4412 template<typename Derived, typename InputIterator>
4413 class TemplateArgumentLocInventIterator {
4414   TreeTransform<Derived> &Self;
4415   InputIterator Iter;
4416 
4417 public:
4418   typedef TemplateArgumentLoc value_type;
4419   typedef TemplateArgumentLoc reference;
4420   typedef typename std::iterator_traits<InputIterator>::difference_type
4421     difference_type;
4422   typedef std::input_iterator_tag iterator_category;
4423 
4424   class pointer {
4425     TemplateArgumentLoc Arg;
4426 
4427   public:
4428     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4429 
4430     const TemplateArgumentLoc *operator->() const { return &Arg; }
4431   };
4432 
4433   TemplateArgumentLocInventIterator() { }
4434 
4435   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4436                                              InputIterator Iter)
4437     : Self(Self), Iter(Iter) { }
4438 
4439   TemplateArgumentLocInventIterator &operator++() {
4440     ++Iter;
4441     return *this;
4442   }
4443 
4444   TemplateArgumentLocInventIterator operator++(int) {
4445     TemplateArgumentLocInventIterator Old(*this);
4446     ++(*this);
4447     return Old;
4448   }
4449 
4450   reference operator*() const {
4451     TemplateArgumentLoc Result;
4452     Self.InventTemplateArgumentLoc(*Iter, Result);
4453     return Result;
4454   }
4455 
4456   pointer operator->() const { return pointer(**this); }
4457 
4458   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4459                          const TemplateArgumentLocInventIterator &Y) {
4460     return X.Iter == Y.Iter;
4461   }
4462 
4463   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4464                          const TemplateArgumentLocInventIterator &Y) {
4465     return X.Iter != Y.Iter;
4466   }
4467 };
4468 
4469 template<typename Derived>
4470 template<typename InputIterator>
4471 bool TreeTransform<Derived>::TransformTemplateArguments(
4472     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4473     bool Uneval) {
4474   for (; First != Last; ++First) {
4475     TemplateArgumentLoc Out;
4476     TemplateArgumentLoc In = *First;
4477 
4478     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4479       // Unpack argument packs, which we translate them into separate
4480       // arguments.
4481       // FIXME: We could do much better if we could guarantee that the
4482       // TemplateArgumentLocInfo for the pack expansion would be usable for
4483       // all of the template arguments in the argument pack.
4484       typedef TemplateArgumentLocInventIterator<Derived,
4485                                                 TemplateArgument::pack_iterator>
4486         PackLocIterator;
4487       if (TransformTemplateArguments(PackLocIterator(*this,
4488                                                  In.getArgument().pack_begin()),
4489                                      PackLocIterator(*this,
4490                                                    In.getArgument().pack_end()),
4491                                      Outputs, Uneval))
4492         return true;
4493 
4494       continue;
4495     }
4496 
4497     if (In.getArgument().isPackExpansion()) {
4498       // We have a pack expansion, for which we will be substituting into
4499       // the pattern.
4500       SourceLocation Ellipsis;
4501       Optional<unsigned> OrigNumExpansions;
4502       TemplateArgumentLoc Pattern
4503         = getSema().getTemplateArgumentPackExpansionPattern(
4504               In, Ellipsis, OrigNumExpansions);
4505 
4506       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4507       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4508       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4509 
4510       // Determine whether the set of unexpanded parameter packs can and should
4511       // be expanded.
4512       bool Expand = true;
4513       bool RetainExpansion = false;
4514       Optional<unsigned> NumExpansions = OrigNumExpansions;
4515       if (getDerived().TryExpandParameterPacks(Ellipsis,
4516                                                Pattern.getSourceRange(),
4517                                                Unexpanded,
4518                                                Expand,
4519                                                RetainExpansion,
4520                                                NumExpansions))
4521         return true;
4522 
4523       if (!Expand) {
4524         // The transform has determined that we should perform a simple
4525         // transformation on the pack expansion, producing another pack
4526         // expansion.
4527         TemplateArgumentLoc OutPattern;
4528         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4529         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4530           return true;
4531 
4532         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4533                                                 NumExpansions);
4534         if (Out.getArgument().isNull())
4535           return true;
4536 
4537         Outputs.addArgument(Out);
4538         continue;
4539       }
4540 
4541       // The transform has determined that we should perform an elementwise
4542       // expansion of the pattern. Do so.
4543       for (unsigned I = 0; I != *NumExpansions; ++I) {
4544         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4545 
4546         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4547           return true;
4548 
4549         if (Out.getArgument().containsUnexpandedParameterPack()) {
4550           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4551                                                   OrigNumExpansions);
4552           if (Out.getArgument().isNull())
4553             return true;
4554         }
4555 
4556         Outputs.addArgument(Out);
4557       }
4558 
4559       // If we're supposed to retain a pack expansion, do so by temporarily
4560       // forgetting the partially-substituted parameter pack.
4561       if (RetainExpansion) {
4562         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4563 
4564         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4565           return true;
4566 
4567         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4568                                                 OrigNumExpansions);
4569         if (Out.getArgument().isNull())
4570           return true;
4571 
4572         Outputs.addArgument(Out);
4573       }
4574 
4575       continue;
4576     }
4577 
4578     // The simple case:
4579     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4580       return true;
4581 
4582     Outputs.addArgument(Out);
4583   }
4584 
4585   return false;
4586 
4587 }
4588 
4589 //===----------------------------------------------------------------------===//
4590 // Type transformation
4591 //===----------------------------------------------------------------------===//
4592 
4593 template<typename Derived>
4594 QualType TreeTransform<Derived>::TransformType(QualType T) {
4595   if (getDerived().AlreadyTransformed(T))
4596     return T;
4597 
4598   // Temporary workaround.  All of these transformations should
4599   // eventually turn into transformations on TypeLocs.
4600   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4601                                                 getDerived().getBaseLocation());
4602 
4603   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4604 
4605   if (!NewDI)
4606     return QualType();
4607 
4608   return NewDI->getType();
4609 }
4610 
4611 template<typename Derived>
4612 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4613   // Refine the base location to the type's location.
4614   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4615                        getDerived().getBaseEntity());
4616   if (getDerived().AlreadyTransformed(DI->getType()))
4617     return DI;
4618 
4619   TypeLocBuilder TLB;
4620 
4621   TypeLoc TL = DI->getTypeLoc();
4622   TLB.reserve(TL.getFullDataSize());
4623 
4624   QualType Result = getDerived().TransformType(TLB, TL);
4625   if (Result.isNull())
4626     return nullptr;
4627 
4628   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4629 }
4630 
4631 template<typename Derived>
4632 QualType
4633 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4634   switch (T.getTypeLocClass()) {
4635 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4636 #define TYPELOC(CLASS, PARENT)                                                 \
4637   case TypeLoc::CLASS:                                                         \
4638     return getDerived().Transform##CLASS##Type(TLB,                            \
4639                                                T.castAs<CLASS##TypeLoc>());
4640 #include "clang/AST/TypeLocNodes.def"
4641   }
4642 
4643   llvm_unreachable("unhandled type loc!");
4644 }
4645 
4646 template<typename Derived>
4647 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4648   if (!isa<DependentNameType>(T))
4649     return TransformType(T);
4650 
4651   if (getDerived().AlreadyTransformed(T))
4652     return T;
4653   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4654                                                 getDerived().getBaseLocation());
4655   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4656   return NewDI ? NewDI->getType() : QualType();
4657 }
4658 
4659 template<typename Derived>
4660 TypeSourceInfo *
4661 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4662   if (!isa<DependentNameType>(DI->getType()))
4663     return TransformType(DI);
4664 
4665   // Refine the base location to the type's location.
4666   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4667                        getDerived().getBaseEntity());
4668   if (getDerived().AlreadyTransformed(DI->getType()))
4669     return DI;
4670 
4671   TypeLocBuilder TLB;
4672 
4673   TypeLoc TL = DI->getTypeLoc();
4674   TLB.reserve(TL.getFullDataSize());
4675 
4676   auto QTL = TL.getAs<QualifiedTypeLoc>();
4677   if (QTL)
4678     TL = QTL.getUnqualifiedLoc();
4679 
4680   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4681 
4682   QualType Result = getDerived().TransformDependentNameType(
4683       TLB, DNTL, /*DeducedTSTContext*/true);
4684   if (Result.isNull())
4685     return nullptr;
4686 
4687   if (QTL) {
4688     Result = getDerived().RebuildQualifiedType(Result, QTL);
4689     if (Result.isNull())
4690       return nullptr;
4691     TLB.TypeWasModifiedSafely(Result);
4692   }
4693 
4694   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4695 }
4696 
4697 template<typename Derived>
4698 QualType
4699 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4700                                                QualifiedTypeLoc T) {
4701   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4702   if (Result.isNull())
4703     return QualType();
4704 
4705   Result = getDerived().RebuildQualifiedType(Result, T);
4706 
4707   if (Result.isNull())
4708     return QualType();
4709 
4710   // RebuildQualifiedType might have updated the type, but not in a way
4711   // that invalidates the TypeLoc. (There's no location information for
4712   // qualifiers.)
4713   TLB.TypeWasModifiedSafely(Result);
4714 
4715   return Result;
4716 }
4717 
4718 template <typename Derived>
4719 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4720                                                       QualifiedTypeLoc TL) {
4721 
4722   SourceLocation Loc = TL.getBeginLoc();
4723   Qualifiers Quals = TL.getType().getLocalQualifiers();
4724 
4725   if (((T.getAddressSpace() != LangAS::Default &&
4726         Quals.getAddressSpace() != LangAS::Default)) &&
4727       T.getAddressSpace() != Quals.getAddressSpace()) {
4728     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4729         << TL.getType() << T;
4730     return QualType();
4731   }
4732 
4733   // C++ [dcl.fct]p7:
4734   //   [When] adding cv-qualifications on top of the function type [...] the
4735   //   cv-qualifiers are ignored.
4736   if (T->isFunctionType()) {
4737     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4738                                                      Quals.getAddressSpace());
4739     return T;
4740   }
4741 
4742   // C++ [dcl.ref]p1:
4743   //   when the cv-qualifiers are introduced through the use of a typedef-name
4744   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4745   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4746   // applied to a reference type.
4747   if (T->isReferenceType()) {
4748     // The only qualifier that applies to a reference type is restrict.
4749     if (!Quals.hasRestrict())
4750       return T;
4751     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4752   }
4753 
4754   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4755   // resulting type.
4756   if (Quals.hasObjCLifetime()) {
4757     if (!T->isObjCLifetimeType() && !T->isDependentType())
4758       Quals.removeObjCLifetime();
4759     else if (T.getObjCLifetime()) {
4760       // Objective-C ARC:
4761       //   A lifetime qualifier applied to a substituted template parameter
4762       //   overrides the lifetime qualifier from the template argument.
4763       const AutoType *AutoTy;
4764       if (const SubstTemplateTypeParmType *SubstTypeParam
4765                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4766         QualType Replacement = SubstTypeParam->getReplacementType();
4767         Qualifiers Qs = Replacement.getQualifiers();
4768         Qs.removeObjCLifetime();
4769         Replacement = SemaRef.Context.getQualifiedType(
4770             Replacement.getUnqualifiedType(), Qs);
4771         T = SemaRef.Context.getSubstTemplateTypeParmType(
4772             SubstTypeParam->getReplacedParameter(), Replacement);
4773       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4774         // 'auto' types behave the same way as template parameters.
4775         QualType Deduced = AutoTy->getDeducedType();
4776         Qualifiers Qs = Deduced.getQualifiers();
4777         Qs.removeObjCLifetime();
4778         Deduced =
4779             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4780         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4781                                         AutoTy->isDependentType(),
4782                                         /*isPack=*/false,
4783                                         AutoTy->getTypeConstraintConcept(),
4784                                         AutoTy->getTypeConstraintArguments());
4785       } else {
4786         // Otherwise, complain about the addition of a qualifier to an
4787         // already-qualified type.
4788         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4789         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4790         Quals.removeObjCLifetime();
4791       }
4792     }
4793   }
4794 
4795   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4796 }
4797 
4798 template<typename Derived>
4799 TypeLoc
4800 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4801                                                    QualType ObjectType,
4802                                                    NamedDecl *UnqualLookup,
4803                                                    CXXScopeSpec &SS) {
4804   if (getDerived().AlreadyTransformed(TL.getType()))
4805     return TL;
4806 
4807   TypeSourceInfo *TSI =
4808       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4809   if (TSI)
4810     return TSI->getTypeLoc();
4811   return TypeLoc();
4812 }
4813 
4814 template<typename Derived>
4815 TypeSourceInfo *
4816 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4817                                                    QualType ObjectType,
4818                                                    NamedDecl *UnqualLookup,
4819                                                    CXXScopeSpec &SS) {
4820   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4821     return TSInfo;
4822 
4823   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4824                                    UnqualLookup, SS);
4825 }
4826 
4827 template <typename Derived>
4828 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4829     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4830     CXXScopeSpec &SS) {
4831   QualType T = TL.getType();
4832   assert(!getDerived().AlreadyTransformed(T));
4833 
4834   TypeLocBuilder TLB;
4835   QualType Result;
4836 
4837   if (isa<TemplateSpecializationType>(T)) {
4838     TemplateSpecializationTypeLoc SpecTL =
4839         TL.castAs<TemplateSpecializationTypeLoc>();
4840 
4841     TemplateName Template = getDerived().TransformTemplateName(
4842         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4843         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4844     if (Template.isNull())
4845       return nullptr;
4846 
4847     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4848                                                               Template);
4849   } else if (isa<DependentTemplateSpecializationType>(T)) {
4850     DependentTemplateSpecializationTypeLoc SpecTL =
4851         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4852 
4853     TemplateName Template
4854       = getDerived().RebuildTemplateName(SS,
4855                                          SpecTL.getTemplateKeywordLoc(),
4856                                          *SpecTL.getTypePtr()->getIdentifier(),
4857                                          SpecTL.getTemplateNameLoc(),
4858                                          ObjectType, UnqualLookup,
4859                                          /*AllowInjectedClassName*/true);
4860     if (Template.isNull())
4861       return nullptr;
4862 
4863     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4864                                                                        SpecTL,
4865                                                                        Template,
4866                                                                        SS);
4867   } else {
4868     // Nothing special needs to be done for these.
4869     Result = getDerived().TransformType(TLB, TL);
4870   }
4871 
4872   if (Result.isNull())
4873     return nullptr;
4874 
4875   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4876 }
4877 
4878 template <class TyLoc> static inline
4879 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4880   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4881   NewT.setNameLoc(T.getNameLoc());
4882   return T.getType();
4883 }
4884 
4885 template<typename Derived>
4886 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4887                                                       BuiltinTypeLoc T) {
4888   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4889   NewT.setBuiltinLoc(T.getBuiltinLoc());
4890   if (T.needsExtraLocalData())
4891     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4892   return T.getType();
4893 }
4894 
4895 template<typename Derived>
4896 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4897                                                       ComplexTypeLoc T) {
4898   // FIXME: recurse?
4899   return TransformTypeSpecType(TLB, T);
4900 }
4901 
4902 template <typename Derived>
4903 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4904                                                        AdjustedTypeLoc TL) {
4905   // Adjustments applied during transformation are handled elsewhere.
4906   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4907 }
4908 
4909 template<typename Derived>
4910 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4911                                                       DecayedTypeLoc TL) {
4912   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4913   if (OriginalType.isNull())
4914     return QualType();
4915 
4916   QualType Result = TL.getType();
4917   if (getDerived().AlwaysRebuild() ||
4918       OriginalType != TL.getOriginalLoc().getType())
4919     Result = SemaRef.Context.getDecayedType(OriginalType);
4920   TLB.push<DecayedTypeLoc>(Result);
4921   // Nothing to set for DecayedTypeLoc.
4922   return Result;
4923 }
4924 
4925 template<typename Derived>
4926 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4927                                                       PointerTypeLoc TL) {
4928   QualType PointeeType
4929     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4930   if (PointeeType.isNull())
4931     return QualType();
4932 
4933   QualType Result = TL.getType();
4934   if (PointeeType->getAs<ObjCObjectType>()) {
4935     // A dependent pointer type 'T *' has is being transformed such
4936     // that an Objective-C class type is being replaced for 'T'. The
4937     // resulting pointer type is an ObjCObjectPointerType, not a
4938     // PointerType.
4939     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4940 
4941     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4942     NewT.setStarLoc(TL.getStarLoc());
4943     return Result;
4944   }
4945 
4946   if (getDerived().AlwaysRebuild() ||
4947       PointeeType != TL.getPointeeLoc().getType()) {
4948     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4949     if (Result.isNull())
4950       return QualType();
4951   }
4952 
4953   // Objective-C ARC can add lifetime qualifiers to the type that we're
4954   // pointing to.
4955   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4956 
4957   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4958   NewT.setSigilLoc(TL.getSigilLoc());
4959   return Result;
4960 }
4961 
4962 template<typename Derived>
4963 QualType
4964 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4965                                                   BlockPointerTypeLoc TL) {
4966   QualType PointeeType
4967     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4968   if (PointeeType.isNull())
4969     return QualType();
4970 
4971   QualType Result = TL.getType();
4972   if (getDerived().AlwaysRebuild() ||
4973       PointeeType != TL.getPointeeLoc().getType()) {
4974     Result = getDerived().RebuildBlockPointerType(PointeeType,
4975                                                   TL.getSigilLoc());
4976     if (Result.isNull())
4977       return QualType();
4978   }
4979 
4980   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4981   NewT.setSigilLoc(TL.getSigilLoc());
4982   return Result;
4983 }
4984 
4985 /// Transforms a reference type.  Note that somewhat paradoxically we
4986 /// don't care whether the type itself is an l-value type or an r-value
4987 /// type;  we only care if the type was *written* as an l-value type
4988 /// or an r-value type.
4989 template<typename Derived>
4990 QualType
4991 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4992                                                ReferenceTypeLoc TL) {
4993   const ReferenceType *T = TL.getTypePtr();
4994 
4995   // Note that this works with the pointee-as-written.
4996   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4997   if (PointeeType.isNull())
4998     return QualType();
4999 
5000   QualType Result = TL.getType();
5001   if (getDerived().AlwaysRebuild() ||
5002       PointeeType != T->getPointeeTypeAsWritten()) {
5003     Result = getDerived().RebuildReferenceType(PointeeType,
5004                                                T->isSpelledAsLValue(),
5005                                                TL.getSigilLoc());
5006     if (Result.isNull())
5007       return QualType();
5008   }
5009 
5010   // Objective-C ARC can add lifetime qualifiers to the type that we're
5011   // referring to.
5012   TLB.TypeWasModifiedSafely(
5013       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5014 
5015   // r-value references can be rebuilt as l-value references.
5016   ReferenceTypeLoc NewTL;
5017   if (isa<LValueReferenceType>(Result))
5018     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5019   else
5020     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5021   NewTL.setSigilLoc(TL.getSigilLoc());
5022 
5023   return Result;
5024 }
5025 
5026 template<typename Derived>
5027 QualType
5028 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5029                                                  LValueReferenceTypeLoc TL) {
5030   return TransformReferenceType(TLB, TL);
5031 }
5032 
5033 template<typename Derived>
5034 QualType
5035 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5036                                                  RValueReferenceTypeLoc TL) {
5037   return TransformReferenceType(TLB, TL);
5038 }
5039 
5040 template<typename Derived>
5041 QualType
5042 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5043                                                    MemberPointerTypeLoc TL) {
5044   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5045   if (PointeeType.isNull())
5046     return QualType();
5047 
5048   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5049   TypeSourceInfo *NewClsTInfo = nullptr;
5050   if (OldClsTInfo) {
5051     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5052     if (!NewClsTInfo)
5053       return QualType();
5054   }
5055 
5056   const MemberPointerType *T = TL.getTypePtr();
5057   QualType OldClsType = QualType(T->getClass(), 0);
5058   QualType NewClsType;
5059   if (NewClsTInfo)
5060     NewClsType = NewClsTInfo->getType();
5061   else {
5062     NewClsType = getDerived().TransformType(OldClsType);
5063     if (NewClsType.isNull())
5064       return QualType();
5065   }
5066 
5067   QualType Result = TL.getType();
5068   if (getDerived().AlwaysRebuild() ||
5069       PointeeType != T->getPointeeType() ||
5070       NewClsType != OldClsType) {
5071     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5072                                                    TL.getStarLoc());
5073     if (Result.isNull())
5074       return QualType();
5075   }
5076 
5077   // If we had to adjust the pointee type when building a member pointer, make
5078   // sure to push TypeLoc info for it.
5079   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5080   if (MPT && PointeeType != MPT->getPointeeType()) {
5081     assert(isa<AdjustedType>(MPT->getPointeeType()));
5082     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5083   }
5084 
5085   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5086   NewTL.setSigilLoc(TL.getSigilLoc());
5087   NewTL.setClassTInfo(NewClsTInfo);
5088 
5089   return Result;
5090 }
5091 
5092 template<typename Derived>
5093 QualType
5094 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5095                                                    ConstantArrayTypeLoc TL) {
5096   const ConstantArrayType *T = TL.getTypePtr();
5097   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5098   if (ElementType.isNull())
5099     return QualType();
5100 
5101   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5102   Expr *OldSize = TL.getSizeExpr();
5103   if (!OldSize)
5104     OldSize = const_cast<Expr*>(T->getSizeExpr());
5105   Expr *NewSize = nullptr;
5106   if (OldSize) {
5107     EnterExpressionEvaluationContext Unevaluated(
5108         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5109     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5110     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5111   }
5112 
5113   QualType Result = TL.getType();
5114   if (getDerived().AlwaysRebuild() ||
5115       ElementType != T->getElementType() ||
5116       (T->getSizeExpr() && NewSize != OldSize)) {
5117     Result = getDerived().RebuildConstantArrayType(ElementType,
5118                                                    T->getSizeModifier(),
5119                                                    T->getSize(), NewSize,
5120                                              T->getIndexTypeCVRQualifiers(),
5121                                                    TL.getBracketsRange());
5122     if (Result.isNull())
5123       return QualType();
5124   }
5125 
5126   // We might have either a ConstantArrayType or a VariableArrayType now:
5127   // a ConstantArrayType is allowed to have an element type which is a
5128   // VariableArrayType if the type is dependent.  Fortunately, all array
5129   // types have the same location layout.
5130   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5131   NewTL.setLBracketLoc(TL.getLBracketLoc());
5132   NewTL.setRBracketLoc(TL.getRBracketLoc());
5133   NewTL.setSizeExpr(NewSize);
5134 
5135   return Result;
5136 }
5137 
5138 template<typename Derived>
5139 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5140                                               TypeLocBuilder &TLB,
5141                                               IncompleteArrayTypeLoc TL) {
5142   const IncompleteArrayType *T = TL.getTypePtr();
5143   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5144   if (ElementType.isNull())
5145     return QualType();
5146 
5147   QualType Result = TL.getType();
5148   if (getDerived().AlwaysRebuild() ||
5149       ElementType != T->getElementType()) {
5150     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5151                                                      T->getSizeModifier(),
5152                                            T->getIndexTypeCVRQualifiers(),
5153                                                      TL.getBracketsRange());
5154     if (Result.isNull())
5155       return QualType();
5156   }
5157 
5158   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5159   NewTL.setLBracketLoc(TL.getLBracketLoc());
5160   NewTL.setRBracketLoc(TL.getRBracketLoc());
5161   NewTL.setSizeExpr(nullptr);
5162 
5163   return Result;
5164 }
5165 
5166 template<typename Derived>
5167 QualType
5168 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5169                                                    VariableArrayTypeLoc TL) {
5170   const VariableArrayType *T = TL.getTypePtr();
5171   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5172   if (ElementType.isNull())
5173     return QualType();
5174 
5175   ExprResult SizeResult;
5176   {
5177     EnterExpressionEvaluationContext Context(
5178         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5179     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5180   }
5181   if (SizeResult.isInvalid())
5182     return QualType();
5183   SizeResult =
5184       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5185   if (SizeResult.isInvalid())
5186     return QualType();
5187 
5188   Expr *Size = SizeResult.get();
5189 
5190   QualType Result = TL.getType();
5191   if (getDerived().AlwaysRebuild() ||
5192       ElementType != T->getElementType() ||
5193       Size != T->getSizeExpr()) {
5194     Result = getDerived().RebuildVariableArrayType(ElementType,
5195                                                    T->getSizeModifier(),
5196                                                    Size,
5197                                              T->getIndexTypeCVRQualifiers(),
5198                                                    TL.getBracketsRange());
5199     if (Result.isNull())
5200       return QualType();
5201   }
5202 
5203   // We might have constant size array now, but fortunately it has the same
5204   // location layout.
5205   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5206   NewTL.setLBracketLoc(TL.getLBracketLoc());
5207   NewTL.setRBracketLoc(TL.getRBracketLoc());
5208   NewTL.setSizeExpr(Size);
5209 
5210   return Result;
5211 }
5212 
5213 template<typename Derived>
5214 QualType
5215 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5216                                              DependentSizedArrayTypeLoc TL) {
5217   const DependentSizedArrayType *T = TL.getTypePtr();
5218   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5219   if (ElementType.isNull())
5220     return QualType();
5221 
5222   // Array bounds are constant expressions.
5223   EnterExpressionEvaluationContext Unevaluated(
5224       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5225 
5226   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5227   Expr *origSize = TL.getSizeExpr();
5228   if (!origSize) origSize = T->getSizeExpr();
5229 
5230   ExprResult sizeResult
5231     = getDerived().TransformExpr(origSize);
5232   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5233   if (sizeResult.isInvalid())
5234     return QualType();
5235 
5236   Expr *size = sizeResult.get();
5237 
5238   QualType Result = TL.getType();
5239   if (getDerived().AlwaysRebuild() ||
5240       ElementType != T->getElementType() ||
5241       size != origSize) {
5242     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5243                                                          T->getSizeModifier(),
5244                                                          size,
5245                                                 T->getIndexTypeCVRQualifiers(),
5246                                                         TL.getBracketsRange());
5247     if (Result.isNull())
5248       return QualType();
5249   }
5250 
5251   // We might have any sort of array type now, but fortunately they
5252   // all have the same location layout.
5253   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5254   NewTL.setLBracketLoc(TL.getLBracketLoc());
5255   NewTL.setRBracketLoc(TL.getRBracketLoc());
5256   NewTL.setSizeExpr(size);
5257 
5258   return Result;
5259 }
5260 
5261 template <typename Derived>
5262 QualType TreeTransform<Derived>::TransformDependentVectorType(
5263     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5264   const DependentVectorType *T = TL.getTypePtr();
5265   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5266   if (ElementType.isNull())
5267     return QualType();
5268 
5269   EnterExpressionEvaluationContext Unevaluated(
5270       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5271 
5272   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5273   Size = SemaRef.ActOnConstantExpression(Size);
5274   if (Size.isInvalid())
5275     return QualType();
5276 
5277   QualType Result = TL.getType();
5278   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5279       Size.get() != T->getSizeExpr()) {
5280     Result = getDerived().RebuildDependentVectorType(
5281         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5282     if (Result.isNull())
5283       return QualType();
5284   }
5285 
5286   // Result might be dependent or not.
5287   if (isa<DependentVectorType>(Result)) {
5288     DependentVectorTypeLoc NewTL =
5289         TLB.push<DependentVectorTypeLoc>(Result);
5290     NewTL.setNameLoc(TL.getNameLoc());
5291   } else {
5292     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5293     NewTL.setNameLoc(TL.getNameLoc());
5294   }
5295 
5296   return Result;
5297 }
5298 
5299 template<typename Derived>
5300 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5301                                       TypeLocBuilder &TLB,
5302                                       DependentSizedExtVectorTypeLoc TL) {
5303   const DependentSizedExtVectorType *T = TL.getTypePtr();
5304 
5305   // FIXME: ext vector locs should be nested
5306   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5307   if (ElementType.isNull())
5308     return QualType();
5309 
5310   // Vector sizes are constant expressions.
5311   EnterExpressionEvaluationContext Unevaluated(
5312       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5313 
5314   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5315   Size = SemaRef.ActOnConstantExpression(Size);
5316   if (Size.isInvalid())
5317     return QualType();
5318 
5319   QualType Result = TL.getType();
5320   if (getDerived().AlwaysRebuild() ||
5321       ElementType != T->getElementType() ||
5322       Size.get() != T->getSizeExpr()) {
5323     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5324                                                              Size.get(),
5325                                                          T->getAttributeLoc());
5326     if (Result.isNull())
5327       return QualType();
5328   }
5329 
5330   // Result might be dependent or not.
5331   if (isa<DependentSizedExtVectorType>(Result)) {
5332     DependentSizedExtVectorTypeLoc NewTL
5333       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5334     NewTL.setNameLoc(TL.getNameLoc());
5335   } else {
5336     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5337     NewTL.setNameLoc(TL.getNameLoc());
5338   }
5339 
5340   return Result;
5341 }
5342 
5343 template <typename Derived>
5344 QualType
5345 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5346                                                     ConstantMatrixTypeLoc TL) {
5347   const ConstantMatrixType *T = TL.getTypePtr();
5348   QualType ElementType = getDerived().TransformType(T->getElementType());
5349   if (ElementType.isNull())
5350     return QualType();
5351 
5352   QualType Result = TL.getType();
5353   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5354     Result = getDerived().RebuildConstantMatrixType(
5355         ElementType, T->getNumRows(), T->getNumColumns());
5356     if (Result.isNull())
5357       return QualType();
5358   }
5359 
5360   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5361   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5362   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5363   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5364   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5365 
5366   return Result;
5367 }
5368 
5369 template <typename Derived>
5370 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5371     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5372   const DependentSizedMatrixType *T = TL.getTypePtr();
5373 
5374   QualType ElementType = getDerived().TransformType(T->getElementType());
5375   if (ElementType.isNull()) {
5376     return QualType();
5377   }
5378 
5379   // Matrix dimensions are constant expressions.
5380   EnterExpressionEvaluationContext Unevaluated(
5381       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5382 
5383   Expr *origRows = TL.getAttrRowOperand();
5384   if (!origRows)
5385     origRows = T->getRowExpr();
5386   Expr *origColumns = TL.getAttrColumnOperand();
5387   if (!origColumns)
5388     origColumns = T->getColumnExpr();
5389 
5390   ExprResult rowResult = getDerived().TransformExpr(origRows);
5391   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5392   if (rowResult.isInvalid())
5393     return QualType();
5394 
5395   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5396   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5397   if (columnResult.isInvalid())
5398     return QualType();
5399 
5400   Expr *rows = rowResult.get();
5401   Expr *columns = columnResult.get();
5402 
5403   QualType Result = TL.getType();
5404   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5405       rows != origRows || columns != origColumns) {
5406     Result = getDerived().RebuildDependentSizedMatrixType(
5407         ElementType, rows, columns, T->getAttributeLoc());
5408 
5409     if (Result.isNull())
5410       return QualType();
5411   }
5412 
5413   // We might have any sort of matrix type now, but fortunately they
5414   // all have the same location layout.
5415   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5416   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5417   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5418   NewTL.setAttrRowOperand(rows);
5419   NewTL.setAttrColumnOperand(columns);
5420   return Result;
5421 }
5422 
5423 template <typename Derived>
5424 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5425     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5426   const DependentAddressSpaceType *T = TL.getTypePtr();
5427 
5428   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5429 
5430   if (pointeeType.isNull())
5431     return QualType();
5432 
5433   // Address spaces are constant expressions.
5434   EnterExpressionEvaluationContext Unevaluated(
5435       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5436 
5437   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5438   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5439   if (AddrSpace.isInvalid())
5440     return QualType();
5441 
5442   QualType Result = TL.getType();
5443   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5444       AddrSpace.get() != T->getAddrSpaceExpr()) {
5445     Result = getDerived().RebuildDependentAddressSpaceType(
5446         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5447     if (Result.isNull())
5448       return QualType();
5449   }
5450 
5451   // Result might be dependent or not.
5452   if (isa<DependentAddressSpaceType>(Result)) {
5453     DependentAddressSpaceTypeLoc NewTL =
5454         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5455 
5456     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5457     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5458     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5459 
5460   } else {
5461     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5462         Result, getDerived().getBaseLocation());
5463     TransformType(TLB, DI->getTypeLoc());
5464   }
5465 
5466   return Result;
5467 }
5468 
5469 template <typename Derived>
5470 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5471                                                      VectorTypeLoc TL) {
5472   const VectorType *T = TL.getTypePtr();
5473   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5474   if (ElementType.isNull())
5475     return QualType();
5476 
5477   QualType Result = TL.getType();
5478   if (getDerived().AlwaysRebuild() ||
5479       ElementType != T->getElementType()) {
5480     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5481                                             T->getVectorKind());
5482     if (Result.isNull())
5483       return QualType();
5484   }
5485 
5486   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5487   NewTL.setNameLoc(TL.getNameLoc());
5488 
5489   return Result;
5490 }
5491 
5492 template<typename Derived>
5493 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5494                                                         ExtVectorTypeLoc TL) {
5495   const VectorType *T = TL.getTypePtr();
5496   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5497   if (ElementType.isNull())
5498     return QualType();
5499 
5500   QualType Result = TL.getType();
5501   if (getDerived().AlwaysRebuild() ||
5502       ElementType != T->getElementType()) {
5503     Result = getDerived().RebuildExtVectorType(ElementType,
5504                                                T->getNumElements(),
5505                                                /*FIXME*/ SourceLocation());
5506     if (Result.isNull())
5507       return QualType();
5508   }
5509 
5510   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5511   NewTL.setNameLoc(TL.getNameLoc());
5512 
5513   return Result;
5514 }
5515 
5516 template <typename Derived>
5517 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5518     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5519     bool ExpectParameterPack) {
5520   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5521   TypeSourceInfo *NewDI = nullptr;
5522 
5523   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5524     // If we're substituting into a pack expansion type and we know the
5525     // length we want to expand to, just substitute for the pattern.
5526     TypeLoc OldTL = OldDI->getTypeLoc();
5527     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5528 
5529     TypeLocBuilder TLB;
5530     TypeLoc NewTL = OldDI->getTypeLoc();
5531     TLB.reserve(NewTL.getFullDataSize());
5532 
5533     QualType Result = getDerived().TransformType(TLB,
5534                                                OldExpansionTL.getPatternLoc());
5535     if (Result.isNull())
5536       return nullptr;
5537 
5538     Result = RebuildPackExpansionType(Result,
5539                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5540                                       OldExpansionTL.getEllipsisLoc(),
5541                                       NumExpansions);
5542     if (Result.isNull())
5543       return nullptr;
5544 
5545     PackExpansionTypeLoc NewExpansionTL
5546       = TLB.push<PackExpansionTypeLoc>(Result);
5547     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5548     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5549   } else
5550     NewDI = getDerived().TransformType(OldDI);
5551   if (!NewDI)
5552     return nullptr;
5553 
5554   if (NewDI == OldDI && indexAdjustment == 0)
5555     return OldParm;
5556 
5557   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5558                                              OldParm->getDeclContext(),
5559                                              OldParm->getInnerLocStart(),
5560                                              OldParm->getLocation(),
5561                                              OldParm->getIdentifier(),
5562                                              NewDI->getType(),
5563                                              NewDI,
5564                                              OldParm->getStorageClass(),
5565                                              /* DefArg */ nullptr);
5566   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5567                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5568   transformedLocalDecl(OldParm, {newParm});
5569   return newParm;
5570 }
5571 
5572 template <typename Derived>
5573 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5574     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5575     const QualType *ParamTypes,
5576     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5577     SmallVectorImpl<QualType> &OutParamTypes,
5578     SmallVectorImpl<ParmVarDecl *> *PVars,
5579     Sema::ExtParameterInfoBuilder &PInfos) {
5580   int indexAdjustment = 0;
5581 
5582   unsigned NumParams = Params.size();
5583   for (unsigned i = 0; i != NumParams; ++i) {
5584     if (ParmVarDecl *OldParm = Params[i]) {
5585       assert(OldParm->getFunctionScopeIndex() == i);
5586 
5587       Optional<unsigned> NumExpansions;
5588       ParmVarDecl *NewParm = nullptr;
5589       if (OldParm->isParameterPack()) {
5590         // We have a function parameter pack that may need to be expanded.
5591         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5592 
5593         // Find the parameter packs that could be expanded.
5594         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5595         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5596         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5597         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5598 
5599         // Determine whether we should expand the parameter packs.
5600         bool ShouldExpand = false;
5601         bool RetainExpansion = false;
5602         Optional<unsigned> OrigNumExpansions;
5603         if (Unexpanded.size() > 0) {
5604           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5605           NumExpansions = OrigNumExpansions;
5606           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5607                                                    Pattern.getSourceRange(),
5608                                                    Unexpanded,
5609                                                    ShouldExpand,
5610                                                    RetainExpansion,
5611                                                    NumExpansions)) {
5612             return true;
5613           }
5614         } else {
5615 #ifndef NDEBUG
5616           const AutoType *AT =
5617               Pattern.getType().getTypePtr()->getContainedAutoType();
5618           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5619                  "Could not find parameter packs or undeduced auto type!");
5620 #endif
5621         }
5622 
5623         if (ShouldExpand) {
5624           // Expand the function parameter pack into multiple, separate
5625           // parameters.
5626           getDerived().ExpandingFunctionParameterPack(OldParm);
5627           for (unsigned I = 0; I != *NumExpansions; ++I) {
5628             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5629             ParmVarDecl *NewParm
5630               = getDerived().TransformFunctionTypeParam(OldParm,
5631                                                         indexAdjustment++,
5632                                                         OrigNumExpansions,
5633                                                 /*ExpectParameterPack=*/false);
5634             if (!NewParm)
5635               return true;
5636 
5637             if (ParamInfos)
5638               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5639             OutParamTypes.push_back(NewParm->getType());
5640             if (PVars)
5641               PVars->push_back(NewParm);
5642           }
5643 
5644           // If we're supposed to retain a pack expansion, do so by temporarily
5645           // forgetting the partially-substituted parameter pack.
5646           if (RetainExpansion) {
5647             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5648             ParmVarDecl *NewParm
5649               = getDerived().TransformFunctionTypeParam(OldParm,
5650                                                         indexAdjustment++,
5651                                                         OrigNumExpansions,
5652                                                 /*ExpectParameterPack=*/false);
5653             if (!NewParm)
5654               return true;
5655 
5656             if (ParamInfos)
5657               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5658             OutParamTypes.push_back(NewParm->getType());
5659             if (PVars)
5660               PVars->push_back(NewParm);
5661           }
5662 
5663           // The next parameter should have the same adjustment as the
5664           // last thing we pushed, but we post-incremented indexAdjustment
5665           // on every push.  Also, if we push nothing, the adjustment should
5666           // go down by one.
5667           indexAdjustment--;
5668 
5669           // We're done with the pack expansion.
5670           continue;
5671         }
5672 
5673         // We'll substitute the parameter now without expanding the pack
5674         // expansion.
5675         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5676         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5677                                                           indexAdjustment,
5678                                                           NumExpansions,
5679                                                   /*ExpectParameterPack=*/true);
5680         assert(NewParm->isParameterPack() &&
5681                "Parameter pack no longer a parameter pack after "
5682                "transformation.");
5683       } else {
5684         NewParm = getDerived().TransformFunctionTypeParam(
5685             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5686       }
5687 
5688       if (!NewParm)
5689         return true;
5690 
5691       if (ParamInfos)
5692         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5693       OutParamTypes.push_back(NewParm->getType());
5694       if (PVars)
5695         PVars->push_back(NewParm);
5696       continue;
5697     }
5698 
5699     // Deal with the possibility that we don't have a parameter
5700     // declaration for this parameter.
5701     QualType OldType = ParamTypes[i];
5702     bool IsPackExpansion = false;
5703     Optional<unsigned> NumExpansions;
5704     QualType NewType;
5705     if (const PackExpansionType *Expansion
5706                                        = dyn_cast<PackExpansionType>(OldType)) {
5707       // We have a function parameter pack that may need to be expanded.
5708       QualType Pattern = Expansion->getPattern();
5709       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5710       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5711 
5712       // Determine whether we should expand the parameter packs.
5713       bool ShouldExpand = false;
5714       bool RetainExpansion = false;
5715       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5716                                                Unexpanded,
5717                                                ShouldExpand,
5718                                                RetainExpansion,
5719                                                NumExpansions)) {
5720         return true;
5721       }
5722 
5723       if (ShouldExpand) {
5724         // Expand the function parameter pack into multiple, separate
5725         // parameters.
5726         for (unsigned I = 0; I != *NumExpansions; ++I) {
5727           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5728           QualType NewType = getDerived().TransformType(Pattern);
5729           if (NewType.isNull())
5730             return true;
5731 
5732           if (NewType->containsUnexpandedParameterPack()) {
5733             NewType =
5734                 getSema().getASTContext().getPackExpansionType(NewType, None);
5735 
5736             if (NewType.isNull())
5737               return true;
5738           }
5739 
5740           if (ParamInfos)
5741             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5742           OutParamTypes.push_back(NewType);
5743           if (PVars)
5744             PVars->push_back(nullptr);
5745         }
5746 
5747         // We're done with the pack expansion.
5748         continue;
5749       }
5750 
5751       // If we're supposed to retain a pack expansion, do so by temporarily
5752       // forgetting the partially-substituted parameter pack.
5753       if (RetainExpansion) {
5754         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5755         QualType NewType = getDerived().TransformType(Pattern);
5756         if (NewType.isNull())
5757           return true;
5758 
5759         if (ParamInfos)
5760           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5761         OutParamTypes.push_back(NewType);
5762         if (PVars)
5763           PVars->push_back(nullptr);
5764       }
5765 
5766       // We'll substitute the parameter now without expanding the pack
5767       // expansion.
5768       OldType = Expansion->getPattern();
5769       IsPackExpansion = true;
5770       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5771       NewType = getDerived().TransformType(OldType);
5772     } else {
5773       NewType = getDerived().TransformType(OldType);
5774     }
5775 
5776     if (NewType.isNull())
5777       return true;
5778 
5779     if (IsPackExpansion)
5780       NewType = getSema().Context.getPackExpansionType(NewType,
5781                                                        NumExpansions);
5782 
5783     if (ParamInfos)
5784       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5785     OutParamTypes.push_back(NewType);
5786     if (PVars)
5787       PVars->push_back(nullptr);
5788   }
5789 
5790 #ifndef NDEBUG
5791   if (PVars) {
5792     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5793       if (ParmVarDecl *parm = (*PVars)[i])
5794         assert(parm->getFunctionScopeIndex() == i);
5795   }
5796 #endif
5797 
5798   return false;
5799 }
5800 
5801 template<typename Derived>
5802 QualType
5803 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5804                                                    FunctionProtoTypeLoc TL) {
5805   SmallVector<QualType, 4> ExceptionStorage;
5806   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5807   return getDerived().TransformFunctionProtoType(
5808       TLB, TL, nullptr, Qualifiers(),
5809       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5810         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5811                                             ExceptionStorage, Changed);
5812       });
5813 }
5814 
5815 template<typename Derived> template<typename Fn>
5816 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5817     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5818     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5819 
5820   // Transform the parameters and return type.
5821   //
5822   // We are required to instantiate the params and return type in source order.
5823   // When the function has a trailing return type, we instantiate the
5824   // parameters before the return type,  since the return type can then refer
5825   // to the parameters themselves (via decltype, sizeof, etc.).
5826   //
5827   SmallVector<QualType, 4> ParamTypes;
5828   SmallVector<ParmVarDecl*, 4> ParamDecls;
5829   Sema::ExtParameterInfoBuilder ExtParamInfos;
5830   const FunctionProtoType *T = TL.getTypePtr();
5831 
5832   QualType ResultType;
5833 
5834   if (T->hasTrailingReturn()) {
5835     if (getDerived().TransformFunctionTypeParams(
5836             TL.getBeginLoc(), TL.getParams(),
5837             TL.getTypePtr()->param_type_begin(),
5838             T->getExtParameterInfosOrNull(),
5839             ParamTypes, &ParamDecls, ExtParamInfos))
5840       return QualType();
5841 
5842     {
5843       // C++11 [expr.prim.general]p3:
5844       //   If a declaration declares a member function or member function
5845       //   template of a class X, the expression this is a prvalue of type
5846       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5847       //   and the end of the function-definition, member-declarator, or
5848       //   declarator.
5849       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5850 
5851       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5852       if (ResultType.isNull())
5853         return QualType();
5854     }
5855   }
5856   else {
5857     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5858     if (ResultType.isNull())
5859       return QualType();
5860 
5861     if (getDerived().TransformFunctionTypeParams(
5862             TL.getBeginLoc(), TL.getParams(),
5863             TL.getTypePtr()->param_type_begin(),
5864             T->getExtParameterInfosOrNull(),
5865             ParamTypes, &ParamDecls, ExtParamInfos))
5866       return QualType();
5867   }
5868 
5869   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5870 
5871   bool EPIChanged = false;
5872   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5873     return QualType();
5874 
5875   // Handle extended parameter information.
5876   if (auto NewExtParamInfos =
5877         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5878     if (!EPI.ExtParameterInfos ||
5879         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5880           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5881       EPIChanged = true;
5882     }
5883     EPI.ExtParameterInfos = NewExtParamInfos;
5884   } else if (EPI.ExtParameterInfos) {
5885     EPIChanged = true;
5886     EPI.ExtParameterInfos = nullptr;
5887   }
5888 
5889   QualType Result = TL.getType();
5890   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5891       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5892     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5893     if (Result.isNull())
5894       return QualType();
5895   }
5896 
5897   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5898   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5899   NewTL.setLParenLoc(TL.getLParenLoc());
5900   NewTL.setRParenLoc(TL.getRParenLoc());
5901   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5902   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5903   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5904     NewTL.setParam(i, ParamDecls[i]);
5905 
5906   return Result;
5907 }
5908 
5909 template<typename Derived>
5910 bool TreeTransform<Derived>::TransformExceptionSpec(
5911     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5912     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5913   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5914 
5915   // Instantiate a dynamic noexcept expression, if any.
5916   if (isComputedNoexcept(ESI.Type)) {
5917     EnterExpressionEvaluationContext Unevaluated(
5918         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5919     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5920     if (NoexceptExpr.isInvalid())
5921       return true;
5922 
5923     ExceptionSpecificationType EST = ESI.Type;
5924     NoexceptExpr =
5925         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5926     if (NoexceptExpr.isInvalid())
5927       return true;
5928 
5929     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5930       Changed = true;
5931     ESI.NoexceptExpr = NoexceptExpr.get();
5932     ESI.Type = EST;
5933   }
5934 
5935   if (ESI.Type != EST_Dynamic)
5936     return false;
5937 
5938   // Instantiate a dynamic exception specification's type.
5939   for (QualType T : ESI.Exceptions) {
5940     if (const PackExpansionType *PackExpansion =
5941             T->getAs<PackExpansionType>()) {
5942       Changed = true;
5943 
5944       // We have a pack expansion. Instantiate it.
5945       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5946       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5947                                               Unexpanded);
5948       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5949 
5950       // Determine whether the set of unexpanded parameter packs can and
5951       // should
5952       // be expanded.
5953       bool Expand = false;
5954       bool RetainExpansion = false;
5955       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5956       // FIXME: Track the location of the ellipsis (and track source location
5957       // information for the types in the exception specification in general).
5958       if (getDerived().TryExpandParameterPacks(
5959               Loc, SourceRange(), Unexpanded, Expand,
5960               RetainExpansion, NumExpansions))
5961         return true;
5962 
5963       if (!Expand) {
5964         // We can't expand this pack expansion into separate arguments yet;
5965         // just substitute into the pattern and create a new pack expansion
5966         // type.
5967         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5968         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5969         if (U.isNull())
5970           return true;
5971 
5972         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5973         Exceptions.push_back(U);
5974         continue;
5975       }
5976 
5977       // Substitute into the pack expansion pattern for each slice of the
5978       // pack.
5979       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5980         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5981 
5982         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5983         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5984           return true;
5985 
5986         Exceptions.push_back(U);
5987       }
5988     } else {
5989       QualType U = getDerived().TransformType(T);
5990       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5991         return true;
5992       if (T != U)
5993         Changed = true;
5994 
5995       Exceptions.push_back(U);
5996     }
5997   }
5998 
5999   ESI.Exceptions = Exceptions;
6000   if (ESI.Exceptions.empty())
6001     ESI.Type = EST_DynamicNone;
6002   return false;
6003 }
6004 
6005 template<typename Derived>
6006 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6007                                                  TypeLocBuilder &TLB,
6008                                                  FunctionNoProtoTypeLoc TL) {
6009   const FunctionNoProtoType *T = TL.getTypePtr();
6010   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6011   if (ResultType.isNull())
6012     return QualType();
6013 
6014   QualType Result = TL.getType();
6015   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6016     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6017 
6018   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6019   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6020   NewTL.setLParenLoc(TL.getLParenLoc());
6021   NewTL.setRParenLoc(TL.getRParenLoc());
6022   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6023 
6024   return Result;
6025 }
6026 
6027 template<typename Derived> QualType
6028 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
6029                                                  UnresolvedUsingTypeLoc TL) {
6030   const UnresolvedUsingType *T = TL.getTypePtr();
6031   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6032   if (!D)
6033     return QualType();
6034 
6035   QualType Result = TL.getType();
6036   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6037     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6038     if (Result.isNull())
6039       return QualType();
6040   }
6041 
6042   // We might get an arbitrary type spec type back.  We should at
6043   // least always get a type spec type, though.
6044   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6045   NewTL.setNameLoc(TL.getNameLoc());
6046 
6047   return Result;
6048 }
6049 
6050 template<typename Derived>
6051 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6052                                                       TypedefTypeLoc TL) {
6053   const TypedefType *T = TL.getTypePtr();
6054   TypedefNameDecl *Typedef
6055     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6056                                                                T->getDecl()));
6057   if (!Typedef)
6058     return QualType();
6059 
6060   QualType Result = TL.getType();
6061   if (getDerived().AlwaysRebuild() ||
6062       Typedef != T->getDecl()) {
6063     Result = getDerived().RebuildTypedefType(Typedef);
6064     if (Result.isNull())
6065       return QualType();
6066   }
6067 
6068   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6069   NewTL.setNameLoc(TL.getNameLoc());
6070 
6071   return Result;
6072 }
6073 
6074 template<typename Derived>
6075 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6076                                                       TypeOfExprTypeLoc TL) {
6077   // typeof expressions are not potentially evaluated contexts
6078   EnterExpressionEvaluationContext Unevaluated(
6079       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6080       Sema::ReuseLambdaContextDecl);
6081 
6082   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6083   if (E.isInvalid())
6084     return QualType();
6085 
6086   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6087   if (E.isInvalid())
6088     return QualType();
6089 
6090   QualType Result = TL.getType();
6091   if (getDerived().AlwaysRebuild() ||
6092       E.get() != TL.getUnderlyingExpr()) {
6093     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6094     if (Result.isNull())
6095       return QualType();
6096   }
6097   else E.get();
6098 
6099   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6100   NewTL.setTypeofLoc(TL.getTypeofLoc());
6101   NewTL.setLParenLoc(TL.getLParenLoc());
6102   NewTL.setRParenLoc(TL.getRParenLoc());
6103 
6104   return Result;
6105 }
6106 
6107 template<typename Derived>
6108 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6109                                                      TypeOfTypeLoc TL) {
6110   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6111   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6112   if (!New_Under_TI)
6113     return QualType();
6114 
6115   QualType Result = TL.getType();
6116   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6117     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6118     if (Result.isNull())
6119       return QualType();
6120   }
6121 
6122   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6123   NewTL.setTypeofLoc(TL.getTypeofLoc());
6124   NewTL.setLParenLoc(TL.getLParenLoc());
6125   NewTL.setRParenLoc(TL.getRParenLoc());
6126   NewTL.setUnderlyingTInfo(New_Under_TI);
6127 
6128   return Result;
6129 }
6130 
6131 template<typename Derived>
6132 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6133                                                        DecltypeTypeLoc TL) {
6134   const DecltypeType *T = TL.getTypePtr();
6135 
6136   // decltype expressions are not potentially evaluated contexts
6137   EnterExpressionEvaluationContext Unevaluated(
6138       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6139       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6140 
6141   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6142   if (E.isInvalid())
6143     return QualType();
6144 
6145   E = getSema().ActOnDecltypeExpression(E.get());
6146   if (E.isInvalid())
6147     return QualType();
6148 
6149   QualType Result = TL.getType();
6150   if (getDerived().AlwaysRebuild() ||
6151       E.get() != T->getUnderlyingExpr()) {
6152     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6153     if (Result.isNull())
6154       return QualType();
6155   }
6156   else E.get();
6157 
6158   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6159   NewTL.setNameLoc(TL.getNameLoc());
6160 
6161   return Result;
6162 }
6163 
6164 template<typename Derived>
6165 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6166                                                             TypeLocBuilder &TLB,
6167                                                      UnaryTransformTypeLoc TL) {
6168   QualType Result = TL.getType();
6169   if (Result->isDependentType()) {
6170     const UnaryTransformType *T = TL.getTypePtr();
6171     QualType NewBase =
6172       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6173     Result = getDerived().RebuildUnaryTransformType(NewBase,
6174                                                     T->getUTTKind(),
6175                                                     TL.getKWLoc());
6176     if (Result.isNull())
6177       return QualType();
6178   }
6179 
6180   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6181   NewTL.setKWLoc(TL.getKWLoc());
6182   NewTL.setParensRange(TL.getParensRange());
6183   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6184   return Result;
6185 }
6186 
6187 template<typename Derived>
6188 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6189     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6190   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6191 
6192   CXXScopeSpec SS;
6193   TemplateName TemplateName = getDerived().TransformTemplateName(
6194       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6195   if (TemplateName.isNull())
6196     return QualType();
6197 
6198   QualType OldDeduced = T->getDeducedType();
6199   QualType NewDeduced;
6200   if (!OldDeduced.isNull()) {
6201     NewDeduced = getDerived().TransformType(OldDeduced);
6202     if (NewDeduced.isNull())
6203       return QualType();
6204   }
6205 
6206   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6207       TemplateName, NewDeduced);
6208   if (Result.isNull())
6209     return QualType();
6210 
6211   DeducedTemplateSpecializationTypeLoc NewTL =
6212       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6213   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6214 
6215   return Result;
6216 }
6217 
6218 template<typename Derived>
6219 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6220                                                      RecordTypeLoc TL) {
6221   const RecordType *T = TL.getTypePtr();
6222   RecordDecl *Record
6223     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6224                                                           T->getDecl()));
6225   if (!Record)
6226     return QualType();
6227 
6228   QualType Result = TL.getType();
6229   if (getDerived().AlwaysRebuild() ||
6230       Record != T->getDecl()) {
6231     Result = getDerived().RebuildRecordType(Record);
6232     if (Result.isNull())
6233       return QualType();
6234   }
6235 
6236   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6237   NewTL.setNameLoc(TL.getNameLoc());
6238 
6239   return Result;
6240 }
6241 
6242 template<typename Derived>
6243 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6244                                                    EnumTypeLoc TL) {
6245   const EnumType *T = TL.getTypePtr();
6246   EnumDecl *Enum
6247     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6248                                                         T->getDecl()));
6249   if (!Enum)
6250     return QualType();
6251 
6252   QualType Result = TL.getType();
6253   if (getDerived().AlwaysRebuild() ||
6254       Enum != T->getDecl()) {
6255     Result = getDerived().RebuildEnumType(Enum);
6256     if (Result.isNull())
6257       return QualType();
6258   }
6259 
6260   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6261   NewTL.setNameLoc(TL.getNameLoc());
6262 
6263   return Result;
6264 }
6265 
6266 template<typename Derived>
6267 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6268                                          TypeLocBuilder &TLB,
6269                                          InjectedClassNameTypeLoc TL) {
6270   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6271                                        TL.getTypePtr()->getDecl());
6272   if (!D) return QualType();
6273 
6274   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6275   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6276   return T;
6277 }
6278 
6279 template<typename Derived>
6280 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6281                                                 TypeLocBuilder &TLB,
6282                                                 TemplateTypeParmTypeLoc TL) {
6283   return TransformTypeSpecType(TLB, TL);
6284 }
6285 
6286 template<typename Derived>
6287 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6288                                          TypeLocBuilder &TLB,
6289                                          SubstTemplateTypeParmTypeLoc TL) {
6290   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6291 
6292   // Substitute into the replacement type, which itself might involve something
6293   // that needs to be transformed. This only tends to occur with default
6294   // template arguments of template template parameters.
6295   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6296   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6297   if (Replacement.isNull())
6298     return QualType();
6299 
6300   // Always canonicalize the replacement type.
6301   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6302   QualType Result
6303     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6304                                                    Replacement);
6305 
6306   // Propagate type-source information.
6307   SubstTemplateTypeParmTypeLoc NewTL
6308     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6309   NewTL.setNameLoc(TL.getNameLoc());
6310   return Result;
6311 
6312 }
6313 
6314 template<typename Derived>
6315 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6316                                           TypeLocBuilder &TLB,
6317                                           SubstTemplateTypeParmPackTypeLoc TL) {
6318   return TransformTypeSpecType(TLB, TL);
6319 }
6320 
6321 template<typename Derived>
6322 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6323                                                         TypeLocBuilder &TLB,
6324                                            TemplateSpecializationTypeLoc TL) {
6325   const TemplateSpecializationType *T = TL.getTypePtr();
6326 
6327   // The nested-name-specifier never matters in a TemplateSpecializationType,
6328   // because we can't have a dependent nested-name-specifier anyway.
6329   CXXScopeSpec SS;
6330   TemplateName Template
6331     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6332                                          TL.getTemplateNameLoc());
6333   if (Template.isNull())
6334     return QualType();
6335 
6336   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6337 }
6338 
6339 template<typename Derived>
6340 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6341                                                      AtomicTypeLoc TL) {
6342   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6343   if (ValueType.isNull())
6344     return QualType();
6345 
6346   QualType Result = TL.getType();
6347   if (getDerived().AlwaysRebuild() ||
6348       ValueType != TL.getValueLoc().getType()) {
6349     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6350     if (Result.isNull())
6351       return QualType();
6352   }
6353 
6354   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6355   NewTL.setKWLoc(TL.getKWLoc());
6356   NewTL.setLParenLoc(TL.getLParenLoc());
6357   NewTL.setRParenLoc(TL.getRParenLoc());
6358 
6359   return Result;
6360 }
6361 
6362 template <typename Derived>
6363 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6364                                                    PipeTypeLoc TL) {
6365   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6366   if (ValueType.isNull())
6367     return QualType();
6368 
6369   QualType Result = TL.getType();
6370   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6371     const PipeType *PT = Result->castAs<PipeType>();
6372     bool isReadPipe = PT->isReadOnly();
6373     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6374     if (Result.isNull())
6375       return QualType();
6376   }
6377 
6378   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6379   NewTL.setKWLoc(TL.getKWLoc());
6380 
6381   return Result;
6382 }
6383 
6384 template <typename Derived>
6385 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6386                                                      ExtIntTypeLoc TL) {
6387   const ExtIntType *EIT = TL.getTypePtr();
6388   QualType Result = TL.getType();
6389 
6390   if (getDerived().AlwaysRebuild()) {
6391     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6392                                             EIT->getNumBits(), TL.getNameLoc());
6393     if (Result.isNull())
6394       return QualType();
6395   }
6396 
6397   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6398   NewTL.setNameLoc(TL.getNameLoc());
6399   return Result;
6400 }
6401 
6402 template <typename Derived>
6403 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6404     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6405   const DependentExtIntType *EIT = TL.getTypePtr();
6406 
6407   EnterExpressionEvaluationContext Unevaluated(
6408       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6409   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6410   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6411 
6412   if (BitsExpr.isInvalid())
6413     return QualType();
6414 
6415   QualType Result = TL.getType();
6416 
6417   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6418     Result = getDerived().RebuildDependentExtIntType(
6419         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6420 
6421     if (Result.isNull())
6422       return QualType();
6423   }
6424 
6425   if (isa<DependentExtIntType>(Result)) {
6426     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6427     NewTL.setNameLoc(TL.getNameLoc());
6428   } else {
6429     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6430     NewTL.setNameLoc(TL.getNameLoc());
6431   }
6432   return Result;
6433 }
6434 
6435   /// Simple iterator that traverses the template arguments in a
6436   /// container that provides a \c getArgLoc() member function.
6437   ///
6438   /// This iterator is intended to be used with the iterator form of
6439   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6440   template<typename ArgLocContainer>
6441   class TemplateArgumentLocContainerIterator {
6442     ArgLocContainer *Container;
6443     unsigned Index;
6444 
6445   public:
6446     typedef TemplateArgumentLoc value_type;
6447     typedef TemplateArgumentLoc reference;
6448     typedef int difference_type;
6449     typedef std::input_iterator_tag iterator_category;
6450 
6451     class pointer {
6452       TemplateArgumentLoc Arg;
6453 
6454     public:
6455       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6456 
6457       const TemplateArgumentLoc *operator->() const {
6458         return &Arg;
6459       }
6460     };
6461 
6462 
6463     TemplateArgumentLocContainerIterator() {}
6464 
6465     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6466                                  unsigned Index)
6467       : Container(&Container), Index(Index) { }
6468 
6469     TemplateArgumentLocContainerIterator &operator++() {
6470       ++Index;
6471       return *this;
6472     }
6473 
6474     TemplateArgumentLocContainerIterator operator++(int) {
6475       TemplateArgumentLocContainerIterator Old(*this);
6476       ++(*this);
6477       return Old;
6478     }
6479 
6480     TemplateArgumentLoc operator*() const {
6481       return Container->getArgLoc(Index);
6482     }
6483 
6484     pointer operator->() const {
6485       return pointer(Container->getArgLoc(Index));
6486     }
6487 
6488     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6489                            const TemplateArgumentLocContainerIterator &Y) {
6490       return X.Container == Y.Container && X.Index == Y.Index;
6491     }
6492 
6493     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6494                            const TemplateArgumentLocContainerIterator &Y) {
6495       return !(X == Y);
6496     }
6497   };
6498 
6499 template<typename Derived>
6500 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6501                                                    AutoTypeLoc TL) {
6502   const AutoType *T = TL.getTypePtr();
6503   QualType OldDeduced = T->getDeducedType();
6504   QualType NewDeduced;
6505   if (!OldDeduced.isNull()) {
6506     NewDeduced = getDerived().TransformType(OldDeduced);
6507     if (NewDeduced.isNull())
6508       return QualType();
6509   }
6510 
6511   ConceptDecl *NewCD = nullptr;
6512   TemplateArgumentListInfo NewTemplateArgs;
6513   NestedNameSpecifierLoc NewNestedNameSpec;
6514   if (T->isConstrained()) {
6515     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6516         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6517 
6518     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6519     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6520     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6521     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6522                                                 ArgIterator(TL,
6523                                                             TL.getNumArgs()),
6524                                                 NewTemplateArgs))
6525       return QualType();
6526 
6527     if (TL.getNestedNameSpecifierLoc()) {
6528       NewNestedNameSpec
6529         = getDerived().TransformNestedNameSpecifierLoc(
6530             TL.getNestedNameSpecifierLoc());
6531       if (!NewNestedNameSpec)
6532         return QualType();
6533     }
6534   }
6535 
6536   QualType Result = TL.getType();
6537   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6538       T->isDependentType() || T->isConstrained()) {
6539     // FIXME: Maybe don't rebuild if all template arguments are the same.
6540     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6541     NewArgList.reserve(NewArgList.size());
6542     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6543       NewArgList.push_back(ArgLoc.getArgument());
6544     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6545                                           NewArgList);
6546     if (Result.isNull())
6547       return QualType();
6548   }
6549 
6550   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6551   NewTL.setNameLoc(TL.getNameLoc());
6552   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6553   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6554   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6555   NewTL.setFoundDecl(TL.getFoundDecl());
6556   NewTL.setLAngleLoc(TL.getLAngleLoc());
6557   NewTL.setRAngleLoc(TL.getRAngleLoc());
6558   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6559     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6560 
6561   return Result;
6562 }
6563 
6564 template <typename Derived>
6565 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6566                                                         TypeLocBuilder &TLB,
6567                                            TemplateSpecializationTypeLoc TL,
6568                                                       TemplateName Template) {
6569   TemplateArgumentListInfo NewTemplateArgs;
6570   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6571   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6572   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6573     ArgIterator;
6574   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6575                                               ArgIterator(TL, TL.getNumArgs()),
6576                                               NewTemplateArgs))
6577     return QualType();
6578 
6579   // FIXME: maybe don't rebuild if all the template arguments are the same.
6580 
6581   QualType Result =
6582     getDerived().RebuildTemplateSpecializationType(Template,
6583                                                    TL.getTemplateNameLoc(),
6584                                                    NewTemplateArgs);
6585 
6586   if (!Result.isNull()) {
6587     // Specializations of template template parameters are represented as
6588     // TemplateSpecializationTypes, and substitution of type alias templates
6589     // within a dependent context can transform them into
6590     // DependentTemplateSpecializationTypes.
6591     if (isa<DependentTemplateSpecializationType>(Result)) {
6592       DependentTemplateSpecializationTypeLoc NewTL
6593         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6594       NewTL.setElaboratedKeywordLoc(SourceLocation());
6595       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6596       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6597       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6598       NewTL.setLAngleLoc(TL.getLAngleLoc());
6599       NewTL.setRAngleLoc(TL.getRAngleLoc());
6600       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6601         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6602       return Result;
6603     }
6604 
6605     TemplateSpecializationTypeLoc NewTL
6606       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6607     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6608     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6609     NewTL.setLAngleLoc(TL.getLAngleLoc());
6610     NewTL.setRAngleLoc(TL.getRAngleLoc());
6611     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6612       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6613   }
6614 
6615   return Result;
6616 }
6617 
6618 template <typename Derived>
6619 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6620                                      TypeLocBuilder &TLB,
6621                                      DependentTemplateSpecializationTypeLoc TL,
6622                                      TemplateName Template,
6623                                      CXXScopeSpec &SS) {
6624   TemplateArgumentListInfo NewTemplateArgs;
6625   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6626   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6627   typedef TemplateArgumentLocContainerIterator<
6628             DependentTemplateSpecializationTypeLoc> ArgIterator;
6629   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6630                                               ArgIterator(TL, TL.getNumArgs()),
6631                                               NewTemplateArgs))
6632     return QualType();
6633 
6634   // FIXME: maybe don't rebuild if all the template arguments are the same.
6635 
6636   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6637     QualType Result
6638       = getSema().Context.getDependentTemplateSpecializationType(
6639                                                 TL.getTypePtr()->getKeyword(),
6640                                                          DTN->getQualifier(),
6641                                                          DTN->getIdentifier(),
6642                                                                NewTemplateArgs);
6643 
6644     DependentTemplateSpecializationTypeLoc NewTL
6645       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6646     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6647     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6648     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6649     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6650     NewTL.setLAngleLoc(TL.getLAngleLoc());
6651     NewTL.setRAngleLoc(TL.getRAngleLoc());
6652     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6653       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6654     return Result;
6655   }
6656 
6657   QualType Result
6658     = getDerived().RebuildTemplateSpecializationType(Template,
6659                                                      TL.getTemplateNameLoc(),
6660                                                      NewTemplateArgs);
6661 
6662   if (!Result.isNull()) {
6663     /// FIXME: Wrap this in an elaborated-type-specifier?
6664     TemplateSpecializationTypeLoc NewTL
6665       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6666     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6667     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6668     NewTL.setLAngleLoc(TL.getLAngleLoc());
6669     NewTL.setRAngleLoc(TL.getRAngleLoc());
6670     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6671       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6672   }
6673 
6674   return Result;
6675 }
6676 
6677 template<typename Derived>
6678 QualType
6679 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6680                                                 ElaboratedTypeLoc TL) {
6681   const ElaboratedType *T = TL.getTypePtr();
6682 
6683   NestedNameSpecifierLoc QualifierLoc;
6684   // NOTE: the qualifier in an ElaboratedType is optional.
6685   if (TL.getQualifierLoc()) {
6686     QualifierLoc
6687       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6688     if (!QualifierLoc)
6689       return QualType();
6690   }
6691 
6692   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6693   if (NamedT.isNull())
6694     return QualType();
6695 
6696   // C++0x [dcl.type.elab]p2:
6697   //   If the identifier resolves to a typedef-name or the simple-template-id
6698   //   resolves to an alias template specialization, the
6699   //   elaborated-type-specifier is ill-formed.
6700   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6701     if (const TemplateSpecializationType *TST =
6702           NamedT->getAs<TemplateSpecializationType>()) {
6703       TemplateName Template = TST->getTemplateName();
6704       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6705               Template.getAsTemplateDecl())) {
6706         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6707                      diag::err_tag_reference_non_tag)
6708             << TAT << Sema::NTK_TypeAliasTemplate
6709             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6710         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6711       }
6712     }
6713   }
6714 
6715   QualType Result = TL.getType();
6716   if (getDerived().AlwaysRebuild() ||
6717       QualifierLoc != TL.getQualifierLoc() ||
6718       NamedT != T->getNamedType()) {
6719     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6720                                                 T->getKeyword(),
6721                                                 QualifierLoc, NamedT);
6722     if (Result.isNull())
6723       return QualType();
6724   }
6725 
6726   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6727   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6728   NewTL.setQualifierLoc(QualifierLoc);
6729   return Result;
6730 }
6731 
6732 template<typename Derived>
6733 QualType TreeTransform<Derived>::TransformAttributedType(
6734                                                 TypeLocBuilder &TLB,
6735                                                 AttributedTypeLoc TL) {
6736   const AttributedType *oldType = TL.getTypePtr();
6737   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6738   if (modifiedType.isNull())
6739     return QualType();
6740 
6741   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6742   const Attr *oldAttr = TL.getAttr();
6743   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6744   if (oldAttr && !newAttr)
6745     return QualType();
6746 
6747   QualType result = TL.getType();
6748 
6749   // FIXME: dependent operand expressions?
6750   if (getDerived().AlwaysRebuild() ||
6751       modifiedType != oldType->getModifiedType()) {
6752     // TODO: this is really lame; we should really be rebuilding the
6753     // equivalent type from first principles.
6754     QualType equivalentType
6755       = getDerived().TransformType(oldType->getEquivalentType());
6756     if (equivalentType.isNull())
6757       return QualType();
6758 
6759     // Check whether we can add nullability; it is only represented as
6760     // type sugar, and therefore cannot be diagnosed in any other way.
6761     if (auto nullability = oldType->getImmediateNullability()) {
6762       if (!modifiedType->canHaveNullability()) {
6763         SemaRef.Diag(TL.getAttr()->getLocation(),
6764                      diag::err_nullability_nonpointer)
6765             << DiagNullabilityKind(*nullability, false) << modifiedType;
6766         return QualType();
6767       }
6768     }
6769 
6770     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6771                                                modifiedType,
6772                                                equivalentType);
6773   }
6774 
6775   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6776   newTL.setAttr(newAttr);
6777   return result;
6778 }
6779 
6780 template<typename Derived>
6781 QualType
6782 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6783                                            ParenTypeLoc TL) {
6784   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6785   if (Inner.isNull())
6786     return QualType();
6787 
6788   QualType Result = TL.getType();
6789   if (getDerived().AlwaysRebuild() ||
6790       Inner != TL.getInnerLoc().getType()) {
6791     Result = getDerived().RebuildParenType(Inner);
6792     if (Result.isNull())
6793       return QualType();
6794   }
6795 
6796   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6797   NewTL.setLParenLoc(TL.getLParenLoc());
6798   NewTL.setRParenLoc(TL.getRParenLoc());
6799   return Result;
6800 }
6801 
6802 template <typename Derived>
6803 QualType
6804 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6805                                                     MacroQualifiedTypeLoc TL) {
6806   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6807   if (Inner.isNull())
6808     return QualType();
6809 
6810   QualType Result = TL.getType();
6811   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6812     Result =
6813         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6814     if (Result.isNull())
6815       return QualType();
6816   }
6817 
6818   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6819   NewTL.setExpansionLoc(TL.getExpansionLoc());
6820   return Result;
6821 }
6822 
6823 template<typename Derived>
6824 QualType TreeTransform<Derived>::TransformDependentNameType(
6825     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6826   return TransformDependentNameType(TLB, TL, false);
6827 }
6828 
6829 template<typename Derived>
6830 QualType TreeTransform<Derived>::TransformDependentNameType(
6831     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6832   const DependentNameType *T = TL.getTypePtr();
6833 
6834   NestedNameSpecifierLoc QualifierLoc
6835     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6836   if (!QualifierLoc)
6837     return QualType();
6838 
6839   QualType Result
6840     = getDerived().RebuildDependentNameType(T->getKeyword(),
6841                                             TL.getElaboratedKeywordLoc(),
6842                                             QualifierLoc,
6843                                             T->getIdentifier(),
6844                                             TL.getNameLoc(),
6845                                             DeducedTSTContext);
6846   if (Result.isNull())
6847     return QualType();
6848 
6849   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6850     QualType NamedT = ElabT->getNamedType();
6851     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6852 
6853     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6854     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6855     NewTL.setQualifierLoc(QualifierLoc);
6856   } else {
6857     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6858     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6859     NewTL.setQualifierLoc(QualifierLoc);
6860     NewTL.setNameLoc(TL.getNameLoc());
6861   }
6862   return Result;
6863 }
6864 
6865 template<typename Derived>
6866 QualType TreeTransform<Derived>::
6867           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6868                                  DependentTemplateSpecializationTypeLoc TL) {
6869   NestedNameSpecifierLoc QualifierLoc;
6870   if (TL.getQualifierLoc()) {
6871     QualifierLoc
6872       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6873     if (!QualifierLoc)
6874       return QualType();
6875   }
6876 
6877   return getDerived()
6878            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6879 }
6880 
6881 template<typename Derived>
6882 QualType TreeTransform<Derived>::
6883 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6884                                    DependentTemplateSpecializationTypeLoc TL,
6885                                        NestedNameSpecifierLoc QualifierLoc) {
6886   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6887 
6888   TemplateArgumentListInfo NewTemplateArgs;
6889   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6890   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6891 
6892   typedef TemplateArgumentLocContainerIterator<
6893   DependentTemplateSpecializationTypeLoc> ArgIterator;
6894   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6895                                               ArgIterator(TL, TL.getNumArgs()),
6896                                               NewTemplateArgs))
6897     return QualType();
6898 
6899   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6900       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6901       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6902       /*AllowInjectedClassName*/ false);
6903   if (Result.isNull())
6904     return QualType();
6905 
6906   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6907     QualType NamedT = ElabT->getNamedType();
6908 
6909     // Copy information relevant to the template specialization.
6910     TemplateSpecializationTypeLoc NamedTL
6911       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6912     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6913     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6914     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6915     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6916     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6917       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6918 
6919     // Copy information relevant to the elaborated type.
6920     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6921     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6922     NewTL.setQualifierLoc(QualifierLoc);
6923   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6924     DependentTemplateSpecializationTypeLoc SpecTL
6925       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6926     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6927     SpecTL.setQualifierLoc(QualifierLoc);
6928     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6929     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6930     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6931     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6932     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6933       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6934   } else {
6935     TemplateSpecializationTypeLoc SpecTL
6936       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6937     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6938     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6939     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6940     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6941     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6942       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6943   }
6944   return Result;
6945 }
6946 
6947 template<typename Derived>
6948 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6949                                                       PackExpansionTypeLoc TL) {
6950   QualType Pattern
6951     = getDerived().TransformType(TLB, TL.getPatternLoc());
6952   if (Pattern.isNull())
6953     return QualType();
6954 
6955   QualType Result = TL.getType();
6956   if (getDerived().AlwaysRebuild() ||
6957       Pattern != TL.getPatternLoc().getType()) {
6958     Result = getDerived().RebuildPackExpansionType(Pattern,
6959                                            TL.getPatternLoc().getSourceRange(),
6960                                                    TL.getEllipsisLoc(),
6961                                            TL.getTypePtr()->getNumExpansions());
6962     if (Result.isNull())
6963       return QualType();
6964   }
6965 
6966   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6967   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6968   return Result;
6969 }
6970 
6971 template<typename Derived>
6972 QualType
6973 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6974                                                    ObjCInterfaceTypeLoc TL) {
6975   // ObjCInterfaceType is never dependent.
6976   TLB.pushFullCopy(TL);
6977   return TL.getType();
6978 }
6979 
6980 template<typename Derived>
6981 QualType
6982 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6983                                                    ObjCTypeParamTypeLoc TL) {
6984   const ObjCTypeParamType *T = TL.getTypePtr();
6985   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6986       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6987   if (!OTP)
6988     return QualType();
6989 
6990   QualType Result = TL.getType();
6991   if (getDerived().AlwaysRebuild() ||
6992       OTP != T->getDecl()) {
6993     Result = getDerived().RebuildObjCTypeParamType(OTP,
6994                  TL.getProtocolLAngleLoc(),
6995                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6996                                     TL.getNumProtocols()),
6997                  TL.getProtocolLocs(),
6998                  TL.getProtocolRAngleLoc());
6999     if (Result.isNull())
7000       return QualType();
7001   }
7002 
7003   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7004   if (TL.getNumProtocols()) {
7005     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7006     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7007       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7008     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7009   }
7010   return Result;
7011 }
7012 
7013 template<typename Derived>
7014 QualType
7015 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7016                                                 ObjCObjectTypeLoc TL) {
7017   // Transform base type.
7018   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7019   if (BaseType.isNull())
7020     return QualType();
7021 
7022   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7023 
7024   // Transform type arguments.
7025   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7026   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7027     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7028     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7029     QualType TypeArg = TypeArgInfo->getType();
7030     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7031       AnyChanged = true;
7032 
7033       // We have a pack expansion. Instantiate it.
7034       const auto *PackExpansion = PackExpansionLoc.getType()
7035                                     ->castAs<PackExpansionType>();
7036       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7037       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7038                                               Unexpanded);
7039       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7040 
7041       // Determine whether the set of unexpanded parameter packs can
7042       // and should be expanded.
7043       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7044       bool Expand = false;
7045       bool RetainExpansion = false;
7046       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7047       if (getDerived().TryExpandParameterPacks(
7048             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7049             Unexpanded, Expand, RetainExpansion, NumExpansions))
7050         return QualType();
7051 
7052       if (!Expand) {
7053         // We can't expand this pack expansion into separate arguments yet;
7054         // just substitute into the pattern and create a new pack expansion
7055         // type.
7056         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7057 
7058         TypeLocBuilder TypeArgBuilder;
7059         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7060         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7061                                                              PatternLoc);
7062         if (NewPatternType.isNull())
7063           return QualType();
7064 
7065         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7066                                       NewPatternType, NumExpansions);
7067         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7068         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7069         NewTypeArgInfos.push_back(
7070           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7071         continue;
7072       }
7073 
7074       // Substitute into the pack expansion pattern for each slice of the
7075       // pack.
7076       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7077         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7078 
7079         TypeLocBuilder TypeArgBuilder;
7080         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7081 
7082         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7083                                                          PatternLoc);
7084         if (NewTypeArg.isNull())
7085           return QualType();
7086 
7087         NewTypeArgInfos.push_back(
7088           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7089       }
7090 
7091       continue;
7092     }
7093 
7094     TypeLocBuilder TypeArgBuilder;
7095     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7096     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7097     if (NewTypeArg.isNull())
7098       return QualType();
7099 
7100     // If nothing changed, just keep the old TypeSourceInfo.
7101     if (NewTypeArg == TypeArg) {
7102       NewTypeArgInfos.push_back(TypeArgInfo);
7103       continue;
7104     }
7105 
7106     NewTypeArgInfos.push_back(
7107       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7108     AnyChanged = true;
7109   }
7110 
7111   QualType Result = TL.getType();
7112   if (getDerived().AlwaysRebuild() || AnyChanged) {
7113     // Rebuild the type.
7114     Result = getDerived().RebuildObjCObjectType(
7115         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7116         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7117         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7118         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7119 
7120     if (Result.isNull())
7121       return QualType();
7122   }
7123 
7124   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7125   NewT.setHasBaseTypeAsWritten(true);
7126   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7127   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7128     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7129   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7130   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7131   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7132     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7133   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7134   return Result;
7135 }
7136 
7137 template<typename Derived>
7138 QualType
7139 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7140                                                ObjCObjectPointerTypeLoc TL) {
7141   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7142   if (PointeeType.isNull())
7143     return QualType();
7144 
7145   QualType Result = TL.getType();
7146   if (getDerived().AlwaysRebuild() ||
7147       PointeeType != TL.getPointeeLoc().getType()) {
7148     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7149                                                        TL.getStarLoc());
7150     if (Result.isNull())
7151       return QualType();
7152   }
7153 
7154   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7155   NewT.setStarLoc(TL.getStarLoc());
7156   return Result;
7157 }
7158 
7159 //===----------------------------------------------------------------------===//
7160 // Statement transformation
7161 //===----------------------------------------------------------------------===//
7162 template<typename Derived>
7163 StmtResult
7164 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7165   return S;
7166 }
7167 
7168 template<typename Derived>
7169 StmtResult
7170 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7171   return getDerived().TransformCompoundStmt(S, false);
7172 }
7173 
7174 template<typename Derived>
7175 StmtResult
7176 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7177                                               bool IsStmtExpr) {
7178   Sema::CompoundScopeRAII CompoundScope(getSema());
7179 
7180   const Stmt *ExprResult = S->getStmtExprResult();
7181   bool SubStmtInvalid = false;
7182   bool SubStmtChanged = false;
7183   SmallVector<Stmt*, 8> Statements;
7184   for (auto *B : S->body()) {
7185     StmtResult Result = getDerived().TransformStmt(
7186         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7187 
7188     if (Result.isInvalid()) {
7189       // Immediately fail if this was a DeclStmt, since it's very
7190       // likely that this will cause problems for future statements.
7191       if (isa<DeclStmt>(B))
7192         return StmtError();
7193 
7194       // Otherwise, just keep processing substatements and fail later.
7195       SubStmtInvalid = true;
7196       continue;
7197     }
7198 
7199     SubStmtChanged = SubStmtChanged || Result.get() != B;
7200     Statements.push_back(Result.getAs<Stmt>());
7201   }
7202 
7203   if (SubStmtInvalid)
7204     return StmtError();
7205 
7206   if (!getDerived().AlwaysRebuild() &&
7207       !SubStmtChanged)
7208     return S;
7209 
7210   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7211                                           Statements,
7212                                           S->getRBracLoc(),
7213                                           IsStmtExpr);
7214 }
7215 
7216 template<typename Derived>
7217 StmtResult
7218 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7219   ExprResult LHS, RHS;
7220   {
7221     EnterExpressionEvaluationContext Unevaluated(
7222         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7223 
7224     // Transform the left-hand case value.
7225     LHS = getDerived().TransformExpr(S->getLHS());
7226     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7227     if (LHS.isInvalid())
7228       return StmtError();
7229 
7230     // Transform the right-hand case value (for the GNU case-range extension).
7231     RHS = getDerived().TransformExpr(S->getRHS());
7232     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7233     if (RHS.isInvalid())
7234       return StmtError();
7235   }
7236 
7237   // Build the case statement.
7238   // Case statements are always rebuilt so that they will attached to their
7239   // transformed switch statement.
7240   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7241                                                        LHS.get(),
7242                                                        S->getEllipsisLoc(),
7243                                                        RHS.get(),
7244                                                        S->getColonLoc());
7245   if (Case.isInvalid())
7246     return StmtError();
7247 
7248   // Transform the statement following the case
7249   StmtResult SubStmt =
7250       getDerived().TransformStmt(S->getSubStmt());
7251   if (SubStmt.isInvalid())
7252     return StmtError();
7253 
7254   // Attach the body to the case statement
7255   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7256 }
7257 
7258 template <typename Derived>
7259 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7260   // Transform the statement following the default case
7261   StmtResult SubStmt =
7262       getDerived().TransformStmt(S->getSubStmt());
7263   if (SubStmt.isInvalid())
7264     return StmtError();
7265 
7266   // Default statements are always rebuilt
7267   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7268                                          SubStmt.get());
7269 }
7270 
7271 template<typename Derived>
7272 StmtResult
7273 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7274   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7275   if (SubStmt.isInvalid())
7276     return StmtError();
7277 
7278   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7279                                         S->getDecl());
7280   if (!LD)
7281     return StmtError();
7282 
7283   // If we're transforming "in-place" (we're not creating new local
7284   // declarations), assume we're replacing the old label statement
7285   // and clear out the reference to it.
7286   if (LD == S->getDecl())
7287     S->getDecl()->setStmt(nullptr);
7288 
7289   // FIXME: Pass the real colon location in.
7290   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7291                                        cast<LabelDecl>(LD), SourceLocation(),
7292                                        SubStmt.get());
7293 }
7294 
7295 template <typename Derived>
7296 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7297   if (!R)
7298     return R;
7299 
7300   switch (R->getKind()) {
7301 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7302 #define ATTR(X)
7303 #define PRAGMA_SPELLING_ATTR(X)                                                \
7304   case attr::X:                                                                \
7305     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7306 #include "clang/Basic/AttrList.inc"
7307   default:
7308     return R;
7309   }
7310 }
7311 
7312 template <typename Derived>
7313 StmtResult
7314 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7315                                                 StmtDiscardKind SDK) {
7316   bool AttrsChanged = false;
7317   SmallVector<const Attr *, 1> Attrs;
7318 
7319   // Visit attributes and keep track if any are transformed.
7320   for (const auto *I : S->getAttrs()) {
7321     const Attr *R = getDerived().TransformAttr(I);
7322     AttrsChanged |= (I != R);
7323     if (R)
7324       Attrs.push_back(R);
7325   }
7326 
7327   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7328   if (SubStmt.isInvalid())
7329     return StmtError();
7330 
7331   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7332     return S;
7333 
7334   // If transforming the attributes failed for all of the attributes in the
7335   // statement, don't make an AttributedStmt without attributes.
7336   if (Attrs.empty())
7337     return SubStmt;
7338 
7339   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7340                                             SubStmt.get());
7341 }
7342 
7343 template<typename Derived>
7344 StmtResult
7345 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7346   // Transform the initialization statement
7347   StmtResult Init = getDerived().TransformStmt(S->getInit());
7348   if (Init.isInvalid())
7349     return StmtError();
7350 
7351   // Transform the condition
7352   Sema::ConditionResult Cond = getDerived().TransformCondition(
7353       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7354       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7355                        : Sema::ConditionKind::Boolean);
7356   if (Cond.isInvalid())
7357     return StmtError();
7358 
7359   // If this is a constexpr if, determine which arm we should instantiate.
7360   llvm::Optional<bool> ConstexprConditionValue;
7361   if (S->isConstexpr())
7362     ConstexprConditionValue = Cond.getKnownValue();
7363 
7364   // Transform the "then" branch.
7365   StmtResult Then;
7366   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7367     Then = getDerived().TransformStmt(S->getThen());
7368     if (Then.isInvalid())
7369       return StmtError();
7370   } else {
7371     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7372   }
7373 
7374   // Transform the "else" branch.
7375   StmtResult Else;
7376   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7377     Else = getDerived().TransformStmt(S->getElse());
7378     if (Else.isInvalid())
7379       return StmtError();
7380   }
7381 
7382   if (!getDerived().AlwaysRebuild() &&
7383       Init.get() == S->getInit() &&
7384       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7385       Then.get() == S->getThen() &&
7386       Else.get() == S->getElse())
7387     return S;
7388 
7389   return getDerived().RebuildIfStmt(
7390       S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond,
7391       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7392 }
7393 
7394 template<typename Derived>
7395 StmtResult
7396 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7397   // Transform the initialization statement
7398   StmtResult Init = getDerived().TransformStmt(S->getInit());
7399   if (Init.isInvalid())
7400     return StmtError();
7401 
7402   // Transform the condition.
7403   Sema::ConditionResult Cond = getDerived().TransformCondition(
7404       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7405       Sema::ConditionKind::Switch);
7406   if (Cond.isInvalid())
7407     return StmtError();
7408 
7409   // Rebuild the switch statement.
7410   StmtResult Switch =
7411       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7412                                           Init.get(), Cond, S->getRParenLoc());
7413   if (Switch.isInvalid())
7414     return StmtError();
7415 
7416   // Transform the body of the switch statement.
7417   StmtResult Body = getDerived().TransformStmt(S->getBody());
7418   if (Body.isInvalid())
7419     return StmtError();
7420 
7421   // Complete the switch statement.
7422   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7423                                             Body.get());
7424 }
7425 
7426 template<typename Derived>
7427 StmtResult
7428 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7429   // Transform the condition
7430   Sema::ConditionResult Cond = getDerived().TransformCondition(
7431       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7432       Sema::ConditionKind::Boolean);
7433   if (Cond.isInvalid())
7434     return StmtError();
7435 
7436   // Transform the body
7437   StmtResult Body = getDerived().TransformStmt(S->getBody());
7438   if (Body.isInvalid())
7439     return StmtError();
7440 
7441   if (!getDerived().AlwaysRebuild() &&
7442       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7443       Body.get() == S->getBody())
7444     return Owned(S);
7445 
7446   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7447                                        Cond, S->getRParenLoc(), Body.get());
7448 }
7449 
7450 template<typename Derived>
7451 StmtResult
7452 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7453   // Transform the body
7454   StmtResult Body = getDerived().TransformStmt(S->getBody());
7455   if (Body.isInvalid())
7456     return StmtError();
7457 
7458   // Transform the condition
7459   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7460   if (Cond.isInvalid())
7461     return StmtError();
7462 
7463   if (!getDerived().AlwaysRebuild() &&
7464       Cond.get() == S->getCond() &&
7465       Body.get() == S->getBody())
7466     return S;
7467 
7468   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7469                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7470                                     S->getRParenLoc());
7471 }
7472 
7473 template<typename Derived>
7474 StmtResult
7475 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7476   if (getSema().getLangOpts().OpenMP)
7477     getSema().startOpenMPLoop();
7478 
7479   // Transform the initialization statement
7480   StmtResult Init = getDerived().TransformStmt(S->getInit());
7481   if (Init.isInvalid())
7482     return StmtError();
7483 
7484   // In OpenMP loop region loop control variable must be captured and be
7485   // private. Perform analysis of first part (if any).
7486   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7487     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7488 
7489   // Transform the condition
7490   Sema::ConditionResult Cond = getDerived().TransformCondition(
7491       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7492       Sema::ConditionKind::Boolean);
7493   if (Cond.isInvalid())
7494     return StmtError();
7495 
7496   // Transform the increment
7497   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7498   if (Inc.isInvalid())
7499     return StmtError();
7500 
7501   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7502   if (S->getInc() && !FullInc.get())
7503     return StmtError();
7504 
7505   // Transform the body
7506   StmtResult Body = getDerived().TransformStmt(S->getBody());
7507   if (Body.isInvalid())
7508     return StmtError();
7509 
7510   if (!getDerived().AlwaysRebuild() &&
7511       Init.get() == S->getInit() &&
7512       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7513       Inc.get() == S->getInc() &&
7514       Body.get() == S->getBody())
7515     return S;
7516 
7517   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7518                                      Init.get(), Cond, FullInc,
7519                                      S->getRParenLoc(), Body.get());
7520 }
7521 
7522 template<typename Derived>
7523 StmtResult
7524 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7525   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7526                                         S->getLabel());
7527   if (!LD)
7528     return StmtError();
7529 
7530   // Goto statements must always be rebuilt, to resolve the label.
7531   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7532                                       cast<LabelDecl>(LD));
7533 }
7534 
7535 template<typename Derived>
7536 StmtResult
7537 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7538   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7539   if (Target.isInvalid())
7540     return StmtError();
7541   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7542 
7543   if (!getDerived().AlwaysRebuild() &&
7544       Target.get() == S->getTarget())
7545     return S;
7546 
7547   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7548                                               Target.get());
7549 }
7550 
7551 template<typename Derived>
7552 StmtResult
7553 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7554   return S;
7555 }
7556 
7557 template<typename Derived>
7558 StmtResult
7559 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7560   return S;
7561 }
7562 
7563 template<typename Derived>
7564 StmtResult
7565 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7566   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7567                                                         /*NotCopyInit*/false);
7568   if (Result.isInvalid())
7569     return StmtError();
7570 
7571   // FIXME: We always rebuild the return statement because there is no way
7572   // to tell whether the return type of the function has changed.
7573   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7574 }
7575 
7576 template<typename Derived>
7577 StmtResult
7578 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7579   bool DeclChanged = false;
7580   SmallVector<Decl *, 4> Decls;
7581   for (auto *D : S->decls()) {
7582     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7583     if (!Transformed)
7584       return StmtError();
7585 
7586     if (Transformed != D)
7587       DeclChanged = true;
7588 
7589     Decls.push_back(Transformed);
7590   }
7591 
7592   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7593     return S;
7594 
7595   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7596 }
7597 
7598 template<typename Derived>
7599 StmtResult
7600 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7601 
7602   SmallVector<Expr*, 8> Constraints;
7603   SmallVector<Expr*, 8> Exprs;
7604   SmallVector<IdentifierInfo *, 4> Names;
7605 
7606   ExprResult AsmString;
7607   SmallVector<Expr*, 8> Clobbers;
7608 
7609   bool ExprsChanged = false;
7610 
7611   // Go through the outputs.
7612   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7613     Names.push_back(S->getOutputIdentifier(I));
7614 
7615     // No need to transform the constraint literal.
7616     Constraints.push_back(S->getOutputConstraintLiteral(I));
7617 
7618     // Transform the output expr.
7619     Expr *OutputExpr = S->getOutputExpr(I);
7620     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7621     if (Result.isInvalid())
7622       return StmtError();
7623 
7624     ExprsChanged |= Result.get() != OutputExpr;
7625 
7626     Exprs.push_back(Result.get());
7627   }
7628 
7629   // Go through the inputs.
7630   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7631     Names.push_back(S->getInputIdentifier(I));
7632 
7633     // No need to transform the constraint literal.
7634     Constraints.push_back(S->getInputConstraintLiteral(I));
7635 
7636     // Transform the input expr.
7637     Expr *InputExpr = S->getInputExpr(I);
7638     ExprResult Result = getDerived().TransformExpr(InputExpr);
7639     if (Result.isInvalid())
7640       return StmtError();
7641 
7642     ExprsChanged |= Result.get() != InputExpr;
7643 
7644     Exprs.push_back(Result.get());
7645   }
7646 
7647   // Go through the Labels.
7648   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7649     Names.push_back(S->getLabelIdentifier(I));
7650 
7651     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7652     if (Result.isInvalid())
7653       return StmtError();
7654     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7655     Exprs.push_back(Result.get());
7656   }
7657   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7658     return S;
7659 
7660   // Go through the clobbers.
7661   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7662     Clobbers.push_back(S->getClobberStringLiteral(I));
7663 
7664   // No need to transform the asm string literal.
7665   AsmString = S->getAsmString();
7666   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7667                                         S->isVolatile(), S->getNumOutputs(),
7668                                         S->getNumInputs(), Names.data(),
7669                                         Constraints, Exprs, AsmString.get(),
7670                                         Clobbers, S->getNumLabels(),
7671                                         S->getRParenLoc());
7672 }
7673 
7674 template<typename Derived>
7675 StmtResult
7676 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7677   ArrayRef<Token> AsmToks =
7678     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7679 
7680   bool HadError = false, HadChange = false;
7681 
7682   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7683   SmallVector<Expr*, 8> TransformedExprs;
7684   TransformedExprs.reserve(SrcExprs.size());
7685   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7686     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7687     if (!Result.isUsable()) {
7688       HadError = true;
7689     } else {
7690       HadChange |= (Result.get() != SrcExprs[i]);
7691       TransformedExprs.push_back(Result.get());
7692     }
7693   }
7694 
7695   if (HadError) return StmtError();
7696   if (!HadChange && !getDerived().AlwaysRebuild())
7697     return Owned(S);
7698 
7699   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7700                                        AsmToks, S->getAsmString(),
7701                                        S->getNumOutputs(), S->getNumInputs(),
7702                                        S->getAllConstraints(), S->getClobbers(),
7703                                        TransformedExprs, S->getEndLoc());
7704 }
7705 
7706 // C++ Coroutines TS
7707 
7708 template<typename Derived>
7709 StmtResult
7710 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7711   auto *ScopeInfo = SemaRef.getCurFunction();
7712   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7713   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7714          ScopeInfo->NeedsCoroutineSuspends &&
7715          ScopeInfo->CoroutineSuspends.first == nullptr &&
7716          ScopeInfo->CoroutineSuspends.second == nullptr &&
7717          "expected clean scope info");
7718 
7719   // Set that we have (possibly-invalid) suspend points before we do anything
7720   // that may fail.
7721   ScopeInfo->setNeedsCoroutineSuspends(false);
7722 
7723   // We re-build the coroutine promise object (and the coroutine parameters its
7724   // type and constructor depend on) based on the types used in our current
7725   // function. We must do so, and set it on the current FunctionScopeInfo,
7726   // before attempting to transform the other parts of the coroutine body
7727   // statement, such as the implicit suspend statements (because those
7728   // statements reference the FunctionScopeInfo::CoroutinePromise).
7729   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7730     return StmtError();
7731   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7732   if (!Promise)
7733     return StmtError();
7734   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7735   ScopeInfo->CoroutinePromise = Promise;
7736 
7737   // Transform the implicit coroutine statements constructed using dependent
7738   // types during the previous parse: initial and final suspensions, the return
7739   // object, and others. We also transform the coroutine function's body.
7740   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7741   if (InitSuspend.isInvalid())
7742     return StmtError();
7743   StmtResult FinalSuspend =
7744       getDerived().TransformStmt(S->getFinalSuspendStmt());
7745   if (FinalSuspend.isInvalid() ||
7746       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7747     return StmtError();
7748   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7749   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7750 
7751   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7752   if (BodyRes.isInvalid())
7753     return StmtError();
7754 
7755   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7756   if (Builder.isInvalid())
7757     return StmtError();
7758 
7759   Expr *ReturnObject = S->getReturnValueInit();
7760   assert(ReturnObject && "the return object is expected to be valid");
7761   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7762                                                      /*NoCopyInit*/ false);
7763   if (Res.isInvalid())
7764     return StmtError();
7765   Builder.ReturnValue = Res.get();
7766 
7767   // If during the previous parse the coroutine still had a dependent promise
7768   // statement, we may need to build some implicit coroutine statements
7769   // (such as exception and fallthrough handlers) for the first time.
7770   if (S->hasDependentPromiseType()) {
7771     // We can only build these statements, however, if the current promise type
7772     // is not dependent.
7773     if (!Promise->getType()->isDependentType()) {
7774       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7775              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7776              "these nodes should not have been built yet");
7777       if (!Builder.buildDependentStatements())
7778         return StmtError();
7779     }
7780   } else {
7781     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7782       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7783       if (Res.isInvalid())
7784         return StmtError();
7785       Builder.OnFallthrough = Res.get();
7786     }
7787 
7788     if (auto *OnException = S->getExceptionHandler()) {
7789       StmtResult Res = getDerived().TransformStmt(OnException);
7790       if (Res.isInvalid())
7791         return StmtError();
7792       Builder.OnException = Res.get();
7793     }
7794 
7795     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7796       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7797       if (Res.isInvalid())
7798         return StmtError();
7799       Builder.ReturnStmtOnAllocFailure = Res.get();
7800     }
7801 
7802     // Transform any additional statements we may have already built
7803     assert(S->getAllocate() && S->getDeallocate() &&
7804            "allocation and deallocation calls must already be built");
7805     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7806     if (AllocRes.isInvalid())
7807       return StmtError();
7808     Builder.Allocate = AllocRes.get();
7809 
7810     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7811     if (DeallocRes.isInvalid())
7812       return StmtError();
7813     Builder.Deallocate = DeallocRes.get();
7814 
7815     assert(S->getResultDecl() && "ResultDecl must already be built");
7816     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7817     if (ResultDecl.isInvalid())
7818       return StmtError();
7819     Builder.ResultDecl = ResultDecl.get();
7820 
7821     if (auto *ReturnStmt = S->getReturnStmt()) {
7822       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7823       if (Res.isInvalid())
7824         return StmtError();
7825       Builder.ReturnStmt = Res.get();
7826     }
7827   }
7828 
7829   return getDerived().RebuildCoroutineBodyStmt(Builder);
7830 }
7831 
7832 template<typename Derived>
7833 StmtResult
7834 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7835   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7836                                                         /*NotCopyInit*/false);
7837   if (Result.isInvalid())
7838     return StmtError();
7839 
7840   // Always rebuild; we don't know if this needs to be injected into a new
7841   // context or if the promise type has changed.
7842   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7843                                           S->isImplicit());
7844 }
7845 
7846 template<typename Derived>
7847 ExprResult
7848 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7849   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7850                                                         /*NotCopyInit*/false);
7851   if (Result.isInvalid())
7852     return ExprError();
7853 
7854   // Always rebuild; we don't know if this needs to be injected into a new
7855   // context or if the promise type has changed.
7856   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7857                                          E->isImplicit());
7858 }
7859 
7860 template <typename Derived>
7861 ExprResult
7862 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7863   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7864                                                         /*NotCopyInit*/ false);
7865   if (OperandResult.isInvalid())
7866     return ExprError();
7867 
7868   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7869           E->getOperatorCoawaitLookup());
7870 
7871   if (LookupResult.isInvalid())
7872     return ExprError();
7873 
7874   // Always rebuild; we don't know if this needs to be injected into a new
7875   // context or if the promise type has changed.
7876   return getDerived().RebuildDependentCoawaitExpr(
7877       E->getKeywordLoc(), OperandResult.get(),
7878       cast<UnresolvedLookupExpr>(LookupResult.get()));
7879 }
7880 
7881 template<typename Derived>
7882 ExprResult
7883 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7884   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7885                                                         /*NotCopyInit*/false);
7886   if (Result.isInvalid())
7887     return ExprError();
7888 
7889   // Always rebuild; we don't know if this needs to be injected into a new
7890   // context or if the promise type has changed.
7891   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7892 }
7893 
7894 // Objective-C Statements.
7895 
7896 template<typename Derived>
7897 StmtResult
7898 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7899   // Transform the body of the @try.
7900   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7901   if (TryBody.isInvalid())
7902     return StmtError();
7903 
7904   // Transform the @catch statements (if present).
7905   bool AnyCatchChanged = false;
7906   SmallVector<Stmt*, 8> CatchStmts;
7907   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7908     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7909     if (Catch.isInvalid())
7910       return StmtError();
7911     if (Catch.get() != S->getCatchStmt(I))
7912       AnyCatchChanged = true;
7913     CatchStmts.push_back(Catch.get());
7914   }
7915 
7916   // Transform the @finally statement (if present).
7917   StmtResult Finally;
7918   if (S->getFinallyStmt()) {
7919     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7920     if (Finally.isInvalid())
7921       return StmtError();
7922   }
7923 
7924   // If nothing changed, just retain this statement.
7925   if (!getDerived().AlwaysRebuild() &&
7926       TryBody.get() == S->getTryBody() &&
7927       !AnyCatchChanged &&
7928       Finally.get() == S->getFinallyStmt())
7929     return S;
7930 
7931   // Build a new statement.
7932   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7933                                            CatchStmts, Finally.get());
7934 }
7935 
7936 template<typename Derived>
7937 StmtResult
7938 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7939   // Transform the @catch parameter, if there is one.
7940   VarDecl *Var = nullptr;
7941   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7942     TypeSourceInfo *TSInfo = nullptr;
7943     if (FromVar->getTypeSourceInfo()) {
7944       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7945       if (!TSInfo)
7946         return StmtError();
7947     }
7948 
7949     QualType T;
7950     if (TSInfo)
7951       T = TSInfo->getType();
7952     else {
7953       T = getDerived().TransformType(FromVar->getType());
7954       if (T.isNull())
7955         return StmtError();
7956     }
7957 
7958     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7959     if (!Var)
7960       return StmtError();
7961   }
7962 
7963   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7964   if (Body.isInvalid())
7965     return StmtError();
7966 
7967   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7968                                              S->getRParenLoc(),
7969                                              Var, Body.get());
7970 }
7971 
7972 template<typename Derived>
7973 StmtResult
7974 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7975   // Transform the body.
7976   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7977   if (Body.isInvalid())
7978     return StmtError();
7979 
7980   // If nothing changed, just retain this statement.
7981   if (!getDerived().AlwaysRebuild() &&
7982       Body.get() == S->getFinallyBody())
7983     return S;
7984 
7985   // Build a new statement.
7986   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7987                                                Body.get());
7988 }
7989 
7990 template<typename Derived>
7991 StmtResult
7992 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7993   ExprResult Operand;
7994   if (S->getThrowExpr()) {
7995     Operand = getDerived().TransformExpr(S->getThrowExpr());
7996     if (Operand.isInvalid())
7997       return StmtError();
7998   }
7999 
8000   if (!getDerived().AlwaysRebuild() &&
8001       Operand.get() == S->getThrowExpr())
8002     return S;
8003 
8004   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8005 }
8006 
8007 template<typename Derived>
8008 StmtResult
8009 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8010                                                   ObjCAtSynchronizedStmt *S) {
8011   // Transform the object we are locking.
8012   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8013   if (Object.isInvalid())
8014     return StmtError();
8015   Object =
8016     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8017                                                   Object.get());
8018   if (Object.isInvalid())
8019     return StmtError();
8020 
8021   // Transform the body.
8022   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8023   if (Body.isInvalid())
8024     return StmtError();
8025 
8026   // If nothing change, just retain the current statement.
8027   if (!getDerived().AlwaysRebuild() &&
8028       Object.get() == S->getSynchExpr() &&
8029       Body.get() == S->getSynchBody())
8030     return S;
8031 
8032   // Build a new statement.
8033   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8034                                                     Object.get(), Body.get());
8035 }
8036 
8037 template<typename Derived>
8038 StmtResult
8039 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8040                                               ObjCAutoreleasePoolStmt *S) {
8041   // Transform the body.
8042   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8043   if (Body.isInvalid())
8044     return StmtError();
8045 
8046   // If nothing changed, just retain this statement.
8047   if (!getDerived().AlwaysRebuild() &&
8048       Body.get() == S->getSubStmt())
8049     return S;
8050 
8051   // Build a new statement.
8052   return getDerived().RebuildObjCAutoreleasePoolStmt(
8053                         S->getAtLoc(), Body.get());
8054 }
8055 
8056 template<typename Derived>
8057 StmtResult
8058 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8059                                                   ObjCForCollectionStmt *S) {
8060   // Transform the element statement.
8061   StmtResult Element =
8062       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8063   if (Element.isInvalid())
8064     return StmtError();
8065 
8066   // Transform the collection expression.
8067   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8068   if (Collection.isInvalid())
8069     return StmtError();
8070 
8071   // Transform the body.
8072   StmtResult Body = getDerived().TransformStmt(S->getBody());
8073   if (Body.isInvalid())
8074     return StmtError();
8075 
8076   // If nothing changed, just retain this statement.
8077   if (!getDerived().AlwaysRebuild() &&
8078       Element.get() == S->getElement() &&
8079       Collection.get() == S->getCollection() &&
8080       Body.get() == S->getBody())
8081     return S;
8082 
8083   // Build a new statement.
8084   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8085                                                    Element.get(),
8086                                                    Collection.get(),
8087                                                    S->getRParenLoc(),
8088                                                    Body.get());
8089 }
8090 
8091 template <typename Derived>
8092 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8093   // Transform the exception declaration, if any.
8094   VarDecl *Var = nullptr;
8095   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8096     TypeSourceInfo *T =
8097         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8098     if (!T)
8099       return StmtError();
8100 
8101     Var = getDerived().RebuildExceptionDecl(
8102         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8103         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8104     if (!Var || Var->isInvalidDecl())
8105       return StmtError();
8106   }
8107 
8108   // Transform the actual exception handler.
8109   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8110   if (Handler.isInvalid())
8111     return StmtError();
8112 
8113   if (!getDerived().AlwaysRebuild() && !Var &&
8114       Handler.get() == S->getHandlerBlock())
8115     return S;
8116 
8117   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8118 }
8119 
8120 template <typename Derived>
8121 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8122   // Transform the try block itself.
8123   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8124   if (TryBlock.isInvalid())
8125     return StmtError();
8126 
8127   // Transform the handlers.
8128   bool HandlerChanged = false;
8129   SmallVector<Stmt *, 8> Handlers;
8130   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8131     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8132     if (Handler.isInvalid())
8133       return StmtError();
8134 
8135     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8136     Handlers.push_back(Handler.getAs<Stmt>());
8137   }
8138 
8139   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8140       !HandlerChanged)
8141     return S;
8142 
8143   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8144                                         Handlers);
8145 }
8146 
8147 template<typename Derived>
8148 StmtResult
8149 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8150   StmtResult Init =
8151       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8152   if (Init.isInvalid())
8153     return StmtError();
8154 
8155   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8156   if (Range.isInvalid())
8157     return StmtError();
8158 
8159   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8160   if (Begin.isInvalid())
8161     return StmtError();
8162   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8163   if (End.isInvalid())
8164     return StmtError();
8165 
8166   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8167   if (Cond.isInvalid())
8168     return StmtError();
8169   if (Cond.get())
8170     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8171   if (Cond.isInvalid())
8172     return StmtError();
8173   if (Cond.get())
8174     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8175 
8176   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8177   if (Inc.isInvalid())
8178     return StmtError();
8179   if (Inc.get())
8180     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8181 
8182   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8183   if (LoopVar.isInvalid())
8184     return StmtError();
8185 
8186   StmtResult NewStmt = S;
8187   if (getDerived().AlwaysRebuild() ||
8188       Init.get() != S->getInit() ||
8189       Range.get() != S->getRangeStmt() ||
8190       Begin.get() != S->getBeginStmt() ||
8191       End.get() != S->getEndStmt() ||
8192       Cond.get() != S->getCond() ||
8193       Inc.get() != S->getInc() ||
8194       LoopVar.get() != S->getLoopVarStmt()) {
8195     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8196                                                   S->getCoawaitLoc(), Init.get(),
8197                                                   S->getColonLoc(), Range.get(),
8198                                                   Begin.get(), End.get(),
8199                                                   Cond.get(),
8200                                                   Inc.get(), LoopVar.get(),
8201                                                   S->getRParenLoc());
8202     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8203       // Might not have attached any initializer to the loop variable.
8204       getSema().ActOnInitializerError(
8205           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8206       return StmtError();
8207     }
8208   }
8209 
8210   StmtResult Body = getDerived().TransformStmt(S->getBody());
8211   if (Body.isInvalid())
8212     return StmtError();
8213 
8214   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8215   // it now so we have a new statement to attach the body to.
8216   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8217     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8218                                                   S->getCoawaitLoc(), Init.get(),
8219                                                   S->getColonLoc(), Range.get(),
8220                                                   Begin.get(), End.get(),
8221                                                   Cond.get(),
8222                                                   Inc.get(), LoopVar.get(),
8223                                                   S->getRParenLoc());
8224     if (NewStmt.isInvalid())
8225       return StmtError();
8226   }
8227 
8228   if (NewStmt.get() == S)
8229     return S;
8230 
8231   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8232 }
8233 
8234 template<typename Derived>
8235 StmtResult
8236 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8237                                                     MSDependentExistsStmt *S) {
8238   // Transform the nested-name-specifier, if any.
8239   NestedNameSpecifierLoc QualifierLoc;
8240   if (S->getQualifierLoc()) {
8241     QualifierLoc
8242       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8243     if (!QualifierLoc)
8244       return StmtError();
8245   }
8246 
8247   // Transform the declaration name.
8248   DeclarationNameInfo NameInfo = S->getNameInfo();
8249   if (NameInfo.getName()) {
8250     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8251     if (!NameInfo.getName())
8252       return StmtError();
8253   }
8254 
8255   // Check whether anything changed.
8256   if (!getDerived().AlwaysRebuild() &&
8257       QualifierLoc == S->getQualifierLoc() &&
8258       NameInfo.getName() == S->getNameInfo().getName())
8259     return S;
8260 
8261   // Determine whether this name exists, if we can.
8262   CXXScopeSpec SS;
8263   SS.Adopt(QualifierLoc);
8264   bool Dependent = false;
8265   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8266   case Sema::IER_Exists:
8267     if (S->isIfExists())
8268       break;
8269 
8270     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8271 
8272   case Sema::IER_DoesNotExist:
8273     if (S->isIfNotExists())
8274       break;
8275 
8276     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8277 
8278   case Sema::IER_Dependent:
8279     Dependent = true;
8280     break;
8281 
8282   case Sema::IER_Error:
8283     return StmtError();
8284   }
8285 
8286   // We need to continue with the instantiation, so do so now.
8287   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8288   if (SubStmt.isInvalid())
8289     return StmtError();
8290 
8291   // If we have resolved the name, just transform to the substatement.
8292   if (!Dependent)
8293     return SubStmt;
8294 
8295   // The name is still dependent, so build a dependent expression again.
8296   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8297                                                    S->isIfExists(),
8298                                                    QualifierLoc,
8299                                                    NameInfo,
8300                                                    SubStmt.get());
8301 }
8302 
8303 template<typename Derived>
8304 ExprResult
8305 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8306   NestedNameSpecifierLoc QualifierLoc;
8307   if (E->getQualifierLoc()) {
8308     QualifierLoc
8309     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8310     if (!QualifierLoc)
8311       return ExprError();
8312   }
8313 
8314   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8315     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8316   if (!PD)
8317     return ExprError();
8318 
8319   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8320   if (Base.isInvalid())
8321     return ExprError();
8322 
8323   return new (SemaRef.getASTContext())
8324       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8325                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8326                         QualifierLoc, E->getMemberLoc());
8327 }
8328 
8329 template <typename Derived>
8330 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8331     MSPropertySubscriptExpr *E) {
8332   auto BaseRes = getDerived().TransformExpr(E->getBase());
8333   if (BaseRes.isInvalid())
8334     return ExprError();
8335   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8336   if (IdxRes.isInvalid())
8337     return ExprError();
8338 
8339   if (!getDerived().AlwaysRebuild() &&
8340       BaseRes.get() == E->getBase() &&
8341       IdxRes.get() == E->getIdx())
8342     return E;
8343 
8344   return getDerived().RebuildArraySubscriptExpr(
8345       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8346 }
8347 
8348 template <typename Derived>
8349 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8350   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8351   if (TryBlock.isInvalid())
8352     return StmtError();
8353 
8354   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8355   if (Handler.isInvalid())
8356     return StmtError();
8357 
8358   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8359       Handler.get() == S->getHandler())
8360     return S;
8361 
8362   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8363                                         TryBlock.get(), Handler.get());
8364 }
8365 
8366 template <typename Derived>
8367 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8368   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8369   if (Block.isInvalid())
8370     return StmtError();
8371 
8372   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8373 }
8374 
8375 template <typename Derived>
8376 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8377   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8378   if (FilterExpr.isInvalid())
8379     return StmtError();
8380 
8381   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8382   if (Block.isInvalid())
8383     return StmtError();
8384 
8385   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8386                                            Block.get());
8387 }
8388 
8389 template <typename Derived>
8390 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8391   if (isa<SEHFinallyStmt>(Handler))
8392     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8393   else
8394     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8395 }
8396 
8397 template<typename Derived>
8398 StmtResult
8399 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8400   return S;
8401 }
8402 
8403 //===----------------------------------------------------------------------===//
8404 // OpenMP directive transformation
8405 //===----------------------------------------------------------------------===//
8406 
8407 template <typename Derived>
8408 StmtResult
8409 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8410   // OMPCanonicalLoops are eliminated during transformation, since they will be
8411   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8412   // after transformation.
8413   return getDerived().TransformStmt(L->getLoopStmt());
8414 }
8415 
8416 template <typename Derived>
8417 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8418     OMPExecutableDirective *D) {
8419 
8420   // Transform the clauses
8421   llvm::SmallVector<OMPClause *, 16> TClauses;
8422   ArrayRef<OMPClause *> Clauses = D->clauses();
8423   TClauses.reserve(Clauses.size());
8424   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8425        I != E; ++I) {
8426     if (*I) {
8427       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8428       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8429       getDerived().getSema().EndOpenMPClause();
8430       if (Clause)
8431         TClauses.push_back(Clause);
8432     } else {
8433       TClauses.push_back(nullptr);
8434     }
8435   }
8436   StmtResult AssociatedStmt;
8437   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8438     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8439                                                   /*CurScope=*/nullptr);
8440     StmtResult Body;
8441     {
8442       Sema::CompoundScopeRAII CompoundScope(getSema());
8443       Stmt *CS;
8444       if (D->getDirectiveKind() == OMPD_atomic ||
8445           D->getDirectiveKind() == OMPD_critical ||
8446           D->getDirectiveKind() == OMPD_section ||
8447           D->getDirectiveKind() == OMPD_master)
8448         CS = D->getAssociatedStmt();
8449       else
8450         CS = D->getRawStmt();
8451       Body = getDerived().TransformStmt(CS);
8452       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8453           getSema().getLangOpts().OpenMPIRBuilder)
8454         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8455     }
8456     AssociatedStmt =
8457         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8458     if (AssociatedStmt.isInvalid()) {
8459       return StmtError();
8460     }
8461   }
8462   if (TClauses.size() != Clauses.size()) {
8463     return StmtError();
8464   }
8465 
8466   // Transform directive name for 'omp critical' directive.
8467   DeclarationNameInfo DirName;
8468   if (D->getDirectiveKind() == OMPD_critical) {
8469     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8470     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8471   }
8472   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8473   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8474     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8475   } else if (D->getDirectiveKind() == OMPD_cancel) {
8476     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8477   }
8478 
8479   return getDerived().RebuildOMPExecutableDirective(
8480       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8481       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8482 }
8483 
8484 template <typename Derived>
8485 StmtResult
8486 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8487   DeclarationNameInfo DirName;
8488   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8489                                              D->getBeginLoc());
8490   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8491   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8492   return Res;
8493 }
8494 
8495 template <typename Derived>
8496 StmtResult
8497 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8498   DeclarationNameInfo DirName;
8499   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8500                                              D->getBeginLoc());
8501   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8502   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8503   return Res;
8504 }
8505 
8506 template <typename Derived>
8507 StmtResult
8508 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8509   DeclarationNameInfo DirName;
8510   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8511                                              nullptr, D->getBeginLoc());
8512   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8513   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8514   return Res;
8515 }
8516 
8517 template <typename Derived>
8518 StmtResult
8519 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8520   DeclarationNameInfo DirName;
8521   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8522                                              D->getBeginLoc());
8523   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8524   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8525   return Res;
8526 }
8527 
8528 template <typename Derived>
8529 StmtResult
8530 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8531   DeclarationNameInfo DirName;
8532   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8533                                              D->getBeginLoc());
8534   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8535   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8536   return Res;
8537 }
8538 
8539 template <typename Derived>
8540 StmtResult
8541 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8542   DeclarationNameInfo DirName;
8543   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8544                                              D->getBeginLoc());
8545   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8546   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8547   return Res;
8548 }
8549 
8550 template <typename Derived>
8551 StmtResult
8552 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8553   DeclarationNameInfo DirName;
8554   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8555                                              D->getBeginLoc());
8556   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8557   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8558   return Res;
8559 }
8560 
8561 template <typename Derived>
8562 StmtResult
8563 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8564   DeclarationNameInfo DirName;
8565   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8566                                              D->getBeginLoc());
8567   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8568   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8569   return Res;
8570 }
8571 
8572 template <typename Derived>
8573 StmtResult
8574 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8575   DeclarationNameInfo DirName;
8576   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8577                                              D->getBeginLoc());
8578   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8579   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8580   return Res;
8581 }
8582 
8583 template <typename Derived>
8584 StmtResult
8585 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8586   getDerived().getSema().StartOpenMPDSABlock(
8587       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8588   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8589   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8590   return Res;
8591 }
8592 
8593 template <typename Derived>
8594 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8595     OMPParallelForDirective *D) {
8596   DeclarationNameInfo DirName;
8597   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8598                                              nullptr, D->getBeginLoc());
8599   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8600   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8601   return Res;
8602 }
8603 
8604 template <typename Derived>
8605 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8606     OMPParallelForSimdDirective *D) {
8607   DeclarationNameInfo DirName;
8608   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8609                                              nullptr, D->getBeginLoc());
8610   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8611   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8612   return Res;
8613 }
8614 
8615 template <typename Derived>
8616 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8617     OMPParallelMasterDirective *D) {
8618   DeclarationNameInfo DirName;
8619   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8620                                              nullptr, D->getBeginLoc());
8621   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8622   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8623   return Res;
8624 }
8625 
8626 template <typename Derived>
8627 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8628     OMPParallelSectionsDirective *D) {
8629   DeclarationNameInfo DirName;
8630   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8631                                              nullptr, D->getBeginLoc());
8632   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8633   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8634   return Res;
8635 }
8636 
8637 template <typename Derived>
8638 StmtResult
8639 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8640   DeclarationNameInfo DirName;
8641   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8642                                              D->getBeginLoc());
8643   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8644   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8645   return Res;
8646 }
8647 
8648 template <typename Derived>
8649 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8650     OMPTaskyieldDirective *D) {
8651   DeclarationNameInfo DirName;
8652   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8653                                              D->getBeginLoc());
8654   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8655   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8656   return Res;
8657 }
8658 
8659 template <typename Derived>
8660 StmtResult
8661 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8662   DeclarationNameInfo DirName;
8663   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8664                                              D->getBeginLoc());
8665   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8666   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8667   return Res;
8668 }
8669 
8670 template <typename Derived>
8671 StmtResult
8672 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8673   DeclarationNameInfo DirName;
8674   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8675                                              D->getBeginLoc());
8676   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8677   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8678   return Res;
8679 }
8680 
8681 template <typename Derived>
8682 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8683     OMPTaskgroupDirective *D) {
8684   DeclarationNameInfo DirName;
8685   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8686                                              D->getBeginLoc());
8687   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8688   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8689   return Res;
8690 }
8691 
8692 template <typename Derived>
8693 StmtResult
8694 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8695   DeclarationNameInfo DirName;
8696   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8697                                              D->getBeginLoc());
8698   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8699   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8700   return Res;
8701 }
8702 
8703 template <typename Derived>
8704 StmtResult
8705 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8706   DeclarationNameInfo DirName;
8707   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8708                                              D->getBeginLoc());
8709   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8710   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8711   return Res;
8712 }
8713 
8714 template <typename Derived>
8715 StmtResult
8716 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8717   DeclarationNameInfo DirName;
8718   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8719                                              D->getBeginLoc());
8720   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8721   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8722   return Res;
8723 }
8724 
8725 template <typename Derived>
8726 StmtResult
8727 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8728   DeclarationNameInfo DirName;
8729   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8730                                              D->getBeginLoc());
8731   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8732   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8733   return Res;
8734 }
8735 
8736 template <typename Derived>
8737 StmtResult
8738 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8739   DeclarationNameInfo DirName;
8740   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8741                                              D->getBeginLoc());
8742   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8743   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8744   return Res;
8745 }
8746 
8747 template <typename Derived>
8748 StmtResult
8749 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8750   DeclarationNameInfo DirName;
8751   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8752                                              D->getBeginLoc());
8753   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8754   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8755   return Res;
8756 }
8757 
8758 template <typename Derived>
8759 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8760     OMPTargetDataDirective *D) {
8761   DeclarationNameInfo DirName;
8762   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8763                                              D->getBeginLoc());
8764   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8765   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8766   return Res;
8767 }
8768 
8769 template <typename Derived>
8770 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8771     OMPTargetEnterDataDirective *D) {
8772   DeclarationNameInfo DirName;
8773   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8774                                              nullptr, D->getBeginLoc());
8775   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8776   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8777   return Res;
8778 }
8779 
8780 template <typename Derived>
8781 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8782     OMPTargetExitDataDirective *D) {
8783   DeclarationNameInfo DirName;
8784   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8785                                              nullptr, D->getBeginLoc());
8786   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8787   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8788   return Res;
8789 }
8790 
8791 template <typename Derived>
8792 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8793     OMPTargetParallelDirective *D) {
8794   DeclarationNameInfo DirName;
8795   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8796                                              nullptr, D->getBeginLoc());
8797   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8798   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8799   return Res;
8800 }
8801 
8802 template <typename Derived>
8803 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8804     OMPTargetParallelForDirective *D) {
8805   DeclarationNameInfo DirName;
8806   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8807                                              nullptr, D->getBeginLoc());
8808   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8809   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8810   return Res;
8811 }
8812 
8813 template <typename Derived>
8814 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8815     OMPTargetUpdateDirective *D) {
8816   DeclarationNameInfo DirName;
8817   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8818                                              nullptr, D->getBeginLoc());
8819   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8820   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8821   return Res;
8822 }
8823 
8824 template <typename Derived>
8825 StmtResult
8826 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8827   DeclarationNameInfo DirName;
8828   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8829                                              D->getBeginLoc());
8830   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8831   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8832   return Res;
8833 }
8834 
8835 template <typename Derived>
8836 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8837     OMPCancellationPointDirective *D) {
8838   DeclarationNameInfo DirName;
8839   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8840                                              nullptr, D->getBeginLoc());
8841   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8842   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8843   return Res;
8844 }
8845 
8846 template <typename Derived>
8847 StmtResult
8848 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8849   DeclarationNameInfo DirName;
8850   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8851                                              D->getBeginLoc());
8852   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8853   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8854   return Res;
8855 }
8856 
8857 template <typename Derived>
8858 StmtResult
8859 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8860   DeclarationNameInfo DirName;
8861   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8862                                              D->getBeginLoc());
8863   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8864   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8865   return Res;
8866 }
8867 
8868 template <typename Derived>
8869 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8870     OMPTaskLoopSimdDirective *D) {
8871   DeclarationNameInfo DirName;
8872   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8873                                              nullptr, D->getBeginLoc());
8874   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8875   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8876   return Res;
8877 }
8878 
8879 template <typename Derived>
8880 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8881     OMPMasterTaskLoopDirective *D) {
8882   DeclarationNameInfo DirName;
8883   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8884                                              nullptr, D->getBeginLoc());
8885   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8886   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8887   return Res;
8888 }
8889 
8890 template <typename Derived>
8891 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8892     OMPMasterTaskLoopSimdDirective *D) {
8893   DeclarationNameInfo DirName;
8894   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8895                                              nullptr, D->getBeginLoc());
8896   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8897   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8898   return Res;
8899 }
8900 
8901 template <typename Derived>
8902 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8903     OMPParallelMasterTaskLoopDirective *D) {
8904   DeclarationNameInfo DirName;
8905   getDerived().getSema().StartOpenMPDSABlock(
8906       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8907   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8908   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8909   return Res;
8910 }
8911 
8912 template <typename Derived>
8913 StmtResult
8914 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8915     OMPParallelMasterTaskLoopSimdDirective *D) {
8916   DeclarationNameInfo DirName;
8917   getDerived().getSema().StartOpenMPDSABlock(
8918       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8919   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8920   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8921   return Res;
8922 }
8923 
8924 template <typename Derived>
8925 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8926     OMPDistributeDirective *D) {
8927   DeclarationNameInfo DirName;
8928   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8929                                              D->getBeginLoc());
8930   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8931   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8932   return Res;
8933 }
8934 
8935 template <typename Derived>
8936 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8937     OMPDistributeParallelForDirective *D) {
8938   DeclarationNameInfo DirName;
8939   getDerived().getSema().StartOpenMPDSABlock(
8940       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8941   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8942   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8943   return Res;
8944 }
8945 
8946 template <typename Derived>
8947 StmtResult
8948 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8949     OMPDistributeParallelForSimdDirective *D) {
8950   DeclarationNameInfo DirName;
8951   getDerived().getSema().StartOpenMPDSABlock(
8952       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8953   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8954   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8955   return Res;
8956 }
8957 
8958 template <typename Derived>
8959 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8960     OMPDistributeSimdDirective *D) {
8961   DeclarationNameInfo DirName;
8962   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8963                                              nullptr, D->getBeginLoc());
8964   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8965   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8966   return Res;
8967 }
8968 
8969 template <typename Derived>
8970 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8971     OMPTargetParallelForSimdDirective *D) {
8972   DeclarationNameInfo DirName;
8973   getDerived().getSema().StartOpenMPDSABlock(
8974       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8975   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8976   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8977   return Res;
8978 }
8979 
8980 template <typename Derived>
8981 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8982     OMPTargetSimdDirective *D) {
8983   DeclarationNameInfo DirName;
8984   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8985                                              D->getBeginLoc());
8986   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8987   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8988   return Res;
8989 }
8990 
8991 template <typename Derived>
8992 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8993     OMPTeamsDistributeDirective *D) {
8994   DeclarationNameInfo DirName;
8995   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8996                                              nullptr, D->getBeginLoc());
8997   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8998   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8999   return Res;
9000 }
9001 
9002 template <typename Derived>
9003 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9004     OMPTeamsDistributeSimdDirective *D) {
9005   DeclarationNameInfo DirName;
9006   getDerived().getSema().StartOpenMPDSABlock(
9007       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9008   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9009   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9010   return Res;
9011 }
9012 
9013 template <typename Derived>
9014 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9015     OMPTeamsDistributeParallelForSimdDirective *D) {
9016   DeclarationNameInfo DirName;
9017   getDerived().getSema().StartOpenMPDSABlock(
9018       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9019       D->getBeginLoc());
9020   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9021   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9022   return Res;
9023 }
9024 
9025 template <typename Derived>
9026 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9027     OMPTeamsDistributeParallelForDirective *D) {
9028   DeclarationNameInfo DirName;
9029   getDerived().getSema().StartOpenMPDSABlock(
9030       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9031   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9032   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9033   return Res;
9034 }
9035 
9036 template <typename Derived>
9037 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9038     OMPTargetTeamsDirective *D) {
9039   DeclarationNameInfo DirName;
9040   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9041                                              nullptr, D->getBeginLoc());
9042   auto Res = getDerived().TransformOMPExecutableDirective(D);
9043   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9044   return Res;
9045 }
9046 
9047 template <typename Derived>
9048 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9049     OMPTargetTeamsDistributeDirective *D) {
9050   DeclarationNameInfo DirName;
9051   getDerived().getSema().StartOpenMPDSABlock(
9052       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9053   auto Res = getDerived().TransformOMPExecutableDirective(D);
9054   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9055   return Res;
9056 }
9057 
9058 template <typename Derived>
9059 StmtResult
9060 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9061     OMPTargetTeamsDistributeParallelForDirective *D) {
9062   DeclarationNameInfo DirName;
9063   getDerived().getSema().StartOpenMPDSABlock(
9064       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9065       D->getBeginLoc());
9066   auto Res = getDerived().TransformOMPExecutableDirective(D);
9067   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9068   return Res;
9069 }
9070 
9071 template <typename Derived>
9072 StmtResult TreeTransform<Derived>::
9073     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9074         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9075   DeclarationNameInfo DirName;
9076   getDerived().getSema().StartOpenMPDSABlock(
9077       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9078       D->getBeginLoc());
9079   auto Res = getDerived().TransformOMPExecutableDirective(D);
9080   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9081   return Res;
9082 }
9083 
9084 template <typename Derived>
9085 StmtResult
9086 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9087     OMPTargetTeamsDistributeSimdDirective *D) {
9088   DeclarationNameInfo DirName;
9089   getDerived().getSema().StartOpenMPDSABlock(
9090       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9091   auto Res = getDerived().TransformOMPExecutableDirective(D);
9092   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9093   return Res;
9094 }
9095 
9096 template <typename Derived>
9097 StmtResult
9098 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9099   DeclarationNameInfo DirName;
9100   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9101                                              D->getBeginLoc());
9102   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9103   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9104   return Res;
9105 }
9106 
9107 template <typename Derived>
9108 StmtResult
9109 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9110   DeclarationNameInfo DirName;
9111   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9112                                              D->getBeginLoc());
9113   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9114   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9115   return Res;
9116 }
9117 
9118 template <typename Derived>
9119 StmtResult
9120 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9121   DeclarationNameInfo DirName;
9122   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9123                                              D->getBeginLoc());
9124   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9125   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9126   return Res;
9127 }
9128 
9129 //===----------------------------------------------------------------------===//
9130 // OpenMP clause transformation
9131 //===----------------------------------------------------------------------===//
9132 template <typename Derived>
9133 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9134   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9135   if (Cond.isInvalid())
9136     return nullptr;
9137   return getDerived().RebuildOMPIfClause(
9138       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9139       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9140 }
9141 
9142 template <typename Derived>
9143 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9144   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9145   if (Cond.isInvalid())
9146     return nullptr;
9147   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9148                                             C->getLParenLoc(), C->getEndLoc());
9149 }
9150 
9151 template <typename Derived>
9152 OMPClause *
9153 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9154   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9155   if (NumThreads.isInvalid())
9156     return nullptr;
9157   return getDerived().RebuildOMPNumThreadsClause(
9158       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9159 }
9160 
9161 template <typename Derived>
9162 OMPClause *
9163 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9164   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9165   if (E.isInvalid())
9166     return nullptr;
9167   return getDerived().RebuildOMPSafelenClause(
9168       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9169 }
9170 
9171 template <typename Derived>
9172 OMPClause *
9173 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9174   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9175   if (E.isInvalid())
9176     return nullptr;
9177   return getDerived().RebuildOMPAllocatorClause(
9178       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9179 }
9180 
9181 template <typename Derived>
9182 OMPClause *
9183 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9184   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9185   if (E.isInvalid())
9186     return nullptr;
9187   return getDerived().RebuildOMPSimdlenClause(
9188       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9189 }
9190 
9191 template <typename Derived>
9192 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9193   SmallVector<Expr *, 4> TransformedSizes;
9194   TransformedSizes.reserve(C->getNumSizes());
9195   bool Changed = false;
9196   for (Expr *E : C->getSizesRefs()) {
9197     if (!E) {
9198       TransformedSizes.push_back(nullptr);
9199       continue;
9200     }
9201 
9202     ExprResult T = getDerived().TransformExpr(E);
9203     if (T.isInvalid())
9204       return nullptr;
9205     if (E != T.get())
9206       Changed = true;
9207     TransformedSizes.push_back(T.get());
9208   }
9209 
9210   if (!Changed && !getDerived().AlwaysRebuild())
9211     return C;
9212   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9213                                C->getLParenLoc(), C->getEndLoc());
9214 }
9215 
9216 template <typename Derived>
9217 OMPClause *
9218 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9219   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9220   if (E.isInvalid())
9221     return nullptr;
9222   return getDerived().RebuildOMPCollapseClause(
9223       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9224 }
9225 
9226 template <typename Derived>
9227 OMPClause *
9228 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9229   return getDerived().RebuildOMPDefaultClause(
9230       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9231       C->getLParenLoc(), C->getEndLoc());
9232 }
9233 
9234 template <typename Derived>
9235 OMPClause *
9236 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9237   return getDerived().RebuildOMPProcBindClause(
9238       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9239       C->getLParenLoc(), C->getEndLoc());
9240 }
9241 
9242 template <typename Derived>
9243 OMPClause *
9244 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9245   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9246   if (E.isInvalid())
9247     return nullptr;
9248   return getDerived().RebuildOMPScheduleClause(
9249       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9250       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9251       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9252       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9253 }
9254 
9255 template <typename Derived>
9256 OMPClause *
9257 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9258   ExprResult E;
9259   if (auto *Num = C->getNumForLoops()) {
9260     E = getDerived().TransformExpr(Num);
9261     if (E.isInvalid())
9262       return nullptr;
9263   }
9264   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9265                                               C->getLParenLoc(), E.get());
9266 }
9267 
9268 template <typename Derived>
9269 OMPClause *
9270 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9271   ExprResult E;
9272   if (Expr *Evt = C->getEventHandler()) {
9273     E = getDerived().TransformExpr(Evt);
9274     if (E.isInvalid())
9275       return nullptr;
9276   }
9277   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9278                                              C->getLParenLoc(), C->getEndLoc());
9279 }
9280 
9281 template <typename Derived>
9282 OMPClause *
9283 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9284   // No need to rebuild this clause, no template-dependent parameters.
9285   return C;
9286 }
9287 
9288 template <typename Derived>
9289 OMPClause *
9290 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9291   // No need to rebuild this clause, no template-dependent parameters.
9292   return C;
9293 }
9294 
9295 template <typename Derived>
9296 OMPClause *
9297 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9298   // No need to rebuild this clause, no template-dependent parameters.
9299   return C;
9300 }
9301 
9302 template <typename Derived>
9303 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9304   // No need to rebuild this clause, no template-dependent parameters.
9305   return C;
9306 }
9307 
9308 template <typename Derived>
9309 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9310   // No need to rebuild this clause, no template-dependent parameters.
9311   return C;
9312 }
9313 
9314 template <typename Derived>
9315 OMPClause *
9316 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9317   // No need to rebuild this clause, no template-dependent parameters.
9318   return C;
9319 }
9320 
9321 template <typename Derived>
9322 OMPClause *
9323 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9324   // No need to rebuild this clause, no template-dependent parameters.
9325   return C;
9326 }
9327 
9328 template <typename Derived>
9329 OMPClause *
9330 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9331   // No need to rebuild this clause, no template-dependent parameters.
9332   return C;
9333 }
9334 
9335 template <typename Derived>
9336 OMPClause *
9337 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9338   // No need to rebuild this clause, no template-dependent parameters.
9339   return C;
9340 }
9341 
9342 template <typename Derived>
9343 OMPClause *
9344 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9345   // No need to rebuild this clause, no template-dependent parameters.
9346   return C;
9347 }
9348 
9349 template <typename Derived>
9350 OMPClause *
9351 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9352   // No need to rebuild this clause, no template-dependent parameters.
9353   return C;
9354 }
9355 
9356 template <typename Derived>
9357 OMPClause *
9358 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9359   // No need to rebuild this clause, no template-dependent parameters.
9360   return C;
9361 }
9362 
9363 template <typename Derived>
9364 OMPClause *
9365 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9366   // No need to rebuild this clause, no template-dependent parameters.
9367   return C;
9368 }
9369 
9370 template <typename Derived>
9371 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9372   // No need to rebuild this clause, no template-dependent parameters.
9373   return C;
9374 }
9375 
9376 template <typename Derived>
9377 OMPClause *
9378 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9379   // No need to rebuild this clause, no template-dependent parameters.
9380   return C;
9381 }
9382 
9383 template <typename Derived>
9384 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9385   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9386   if (IVR.isInvalid())
9387     return nullptr;
9388 
9389   llvm::SmallVector<Expr *, 8> PrefExprs;
9390   PrefExprs.reserve(C->varlist_size() - 1);
9391   for (Expr *E : llvm::drop_begin(C->varlists())) {
9392     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9393     if (ER.isInvalid())
9394       return nullptr;
9395     PrefExprs.push_back(ER.get());
9396   }
9397   return getDerived().RebuildOMPInitClause(
9398       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9399       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9400 }
9401 
9402 template <typename Derived>
9403 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9404   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9405   if (ER.isInvalid())
9406     return nullptr;
9407   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9408                                           C->getLParenLoc(), C->getVarLoc(),
9409                                           C->getEndLoc());
9410 }
9411 
9412 template <typename Derived>
9413 OMPClause *
9414 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9415   ExprResult ER;
9416   if (Expr *IV = C->getInteropVar()) {
9417     ER = getDerived().TransformExpr(IV);
9418     if (ER.isInvalid())
9419       return nullptr;
9420   }
9421   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9422                                               C->getLParenLoc(), C->getVarLoc(),
9423                                               C->getEndLoc());
9424 }
9425 
9426 template <typename Derived>
9427 OMPClause *
9428 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9429   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9430   if (Cond.isInvalid())
9431     return nullptr;
9432   return getDerived().RebuildOMPNovariantsClause(
9433       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9434 }
9435 
9436 template <typename Derived>
9437 OMPClause *
9438 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9439   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9440   if (Cond.isInvalid())
9441     return nullptr;
9442   return getDerived().RebuildOMPNocontextClause(
9443       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9444 }
9445 
9446 template <typename Derived>
9447 OMPClause *
9448 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9449   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9450   if (ThreadID.isInvalid())
9451     return nullptr;
9452   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9453                                              C->getLParenLoc(), C->getEndLoc());
9454 }
9455 
9456 template <typename Derived>
9457 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9458     OMPUnifiedAddressClause *C) {
9459   llvm_unreachable("unified_address clause cannot appear in dependent context");
9460 }
9461 
9462 template <typename Derived>
9463 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9464     OMPUnifiedSharedMemoryClause *C) {
9465   llvm_unreachable(
9466       "unified_shared_memory clause cannot appear in dependent context");
9467 }
9468 
9469 template <typename Derived>
9470 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9471     OMPReverseOffloadClause *C) {
9472   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9473 }
9474 
9475 template <typename Derived>
9476 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9477     OMPDynamicAllocatorsClause *C) {
9478   llvm_unreachable(
9479       "dynamic_allocators clause cannot appear in dependent context");
9480 }
9481 
9482 template <typename Derived>
9483 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9484     OMPAtomicDefaultMemOrderClause *C) {
9485   llvm_unreachable(
9486       "atomic_default_mem_order clause cannot appear in dependent context");
9487 }
9488 
9489 template <typename Derived>
9490 OMPClause *
9491 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9492   llvm::SmallVector<Expr *, 16> Vars;
9493   Vars.reserve(C->varlist_size());
9494   for (auto *VE : C->varlists()) {
9495     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9496     if (EVar.isInvalid())
9497       return nullptr;
9498     Vars.push_back(EVar.get());
9499   }
9500   return getDerived().RebuildOMPPrivateClause(
9501       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9502 }
9503 
9504 template <typename Derived>
9505 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9506     OMPFirstprivateClause *C) {
9507   llvm::SmallVector<Expr *, 16> Vars;
9508   Vars.reserve(C->varlist_size());
9509   for (auto *VE : C->varlists()) {
9510     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9511     if (EVar.isInvalid())
9512       return nullptr;
9513     Vars.push_back(EVar.get());
9514   }
9515   return getDerived().RebuildOMPFirstprivateClause(
9516       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9517 }
9518 
9519 template <typename Derived>
9520 OMPClause *
9521 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9522   llvm::SmallVector<Expr *, 16> Vars;
9523   Vars.reserve(C->varlist_size());
9524   for (auto *VE : C->varlists()) {
9525     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9526     if (EVar.isInvalid())
9527       return nullptr;
9528     Vars.push_back(EVar.get());
9529   }
9530   return getDerived().RebuildOMPLastprivateClause(
9531       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9532       C->getLParenLoc(), C->getEndLoc());
9533 }
9534 
9535 template <typename Derived>
9536 OMPClause *
9537 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9538   llvm::SmallVector<Expr *, 16> Vars;
9539   Vars.reserve(C->varlist_size());
9540   for (auto *VE : C->varlists()) {
9541     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9542     if (EVar.isInvalid())
9543       return nullptr;
9544     Vars.push_back(EVar.get());
9545   }
9546   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9547                                              C->getLParenLoc(), C->getEndLoc());
9548 }
9549 
9550 template <typename Derived>
9551 OMPClause *
9552 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9553   llvm::SmallVector<Expr *, 16> Vars;
9554   Vars.reserve(C->varlist_size());
9555   for (auto *VE : C->varlists()) {
9556     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9557     if (EVar.isInvalid())
9558       return nullptr;
9559     Vars.push_back(EVar.get());
9560   }
9561   CXXScopeSpec ReductionIdScopeSpec;
9562   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9563 
9564   DeclarationNameInfo NameInfo = C->getNameInfo();
9565   if (NameInfo.getName()) {
9566     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9567     if (!NameInfo.getName())
9568       return nullptr;
9569   }
9570   // Build a list of all UDR decls with the same names ranged by the Scopes.
9571   // The Scope boundary is a duplication of the previous decl.
9572   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9573   for (auto *E : C->reduction_ops()) {
9574     // Transform all the decls.
9575     if (E) {
9576       auto *ULE = cast<UnresolvedLookupExpr>(E);
9577       UnresolvedSet<8> Decls;
9578       for (auto *D : ULE->decls()) {
9579         NamedDecl *InstD =
9580             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9581         Decls.addDecl(InstD, InstD->getAccess());
9582       }
9583       UnresolvedReductions.push_back(
9584        UnresolvedLookupExpr::Create(
9585           SemaRef.Context, /*NamingClass=*/nullptr,
9586           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9587           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9588           Decls.begin(), Decls.end()));
9589     } else
9590       UnresolvedReductions.push_back(nullptr);
9591   }
9592   return getDerived().RebuildOMPReductionClause(
9593       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9594       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9595       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9596 }
9597 
9598 template <typename Derived>
9599 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9600     OMPTaskReductionClause *C) {
9601   llvm::SmallVector<Expr *, 16> Vars;
9602   Vars.reserve(C->varlist_size());
9603   for (auto *VE : C->varlists()) {
9604     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9605     if (EVar.isInvalid())
9606       return nullptr;
9607     Vars.push_back(EVar.get());
9608   }
9609   CXXScopeSpec ReductionIdScopeSpec;
9610   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9611 
9612   DeclarationNameInfo NameInfo = C->getNameInfo();
9613   if (NameInfo.getName()) {
9614     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9615     if (!NameInfo.getName())
9616       return nullptr;
9617   }
9618   // Build a list of all UDR decls with the same names ranged by the Scopes.
9619   // The Scope boundary is a duplication of the previous decl.
9620   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9621   for (auto *E : C->reduction_ops()) {
9622     // Transform all the decls.
9623     if (E) {
9624       auto *ULE = cast<UnresolvedLookupExpr>(E);
9625       UnresolvedSet<8> Decls;
9626       for (auto *D : ULE->decls()) {
9627         NamedDecl *InstD =
9628             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9629         Decls.addDecl(InstD, InstD->getAccess());
9630       }
9631       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9632           SemaRef.Context, /*NamingClass=*/nullptr,
9633           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9634           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9635     } else
9636       UnresolvedReductions.push_back(nullptr);
9637   }
9638   return getDerived().RebuildOMPTaskReductionClause(
9639       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9640       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9641 }
9642 
9643 template <typename Derived>
9644 OMPClause *
9645 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9646   llvm::SmallVector<Expr *, 16> Vars;
9647   Vars.reserve(C->varlist_size());
9648   for (auto *VE : C->varlists()) {
9649     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9650     if (EVar.isInvalid())
9651       return nullptr;
9652     Vars.push_back(EVar.get());
9653   }
9654   CXXScopeSpec ReductionIdScopeSpec;
9655   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9656 
9657   DeclarationNameInfo NameInfo = C->getNameInfo();
9658   if (NameInfo.getName()) {
9659     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9660     if (!NameInfo.getName())
9661       return nullptr;
9662   }
9663   // Build a list of all UDR decls with the same names ranged by the Scopes.
9664   // The Scope boundary is a duplication of the previous decl.
9665   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9666   for (auto *E : C->reduction_ops()) {
9667     // Transform all the decls.
9668     if (E) {
9669       auto *ULE = cast<UnresolvedLookupExpr>(E);
9670       UnresolvedSet<8> Decls;
9671       for (auto *D : ULE->decls()) {
9672         NamedDecl *InstD =
9673             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9674         Decls.addDecl(InstD, InstD->getAccess());
9675       }
9676       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9677           SemaRef.Context, /*NamingClass=*/nullptr,
9678           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9679           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9680     } else
9681       UnresolvedReductions.push_back(nullptr);
9682   }
9683   return getDerived().RebuildOMPInReductionClause(
9684       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9685       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9686 }
9687 
9688 template <typename Derived>
9689 OMPClause *
9690 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9691   llvm::SmallVector<Expr *, 16> Vars;
9692   Vars.reserve(C->varlist_size());
9693   for (auto *VE : C->varlists()) {
9694     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9695     if (EVar.isInvalid())
9696       return nullptr;
9697     Vars.push_back(EVar.get());
9698   }
9699   ExprResult Step = getDerived().TransformExpr(C->getStep());
9700   if (Step.isInvalid())
9701     return nullptr;
9702   return getDerived().RebuildOMPLinearClause(
9703       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9704       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9705 }
9706 
9707 template <typename Derived>
9708 OMPClause *
9709 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9710   llvm::SmallVector<Expr *, 16> Vars;
9711   Vars.reserve(C->varlist_size());
9712   for (auto *VE : C->varlists()) {
9713     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9714     if (EVar.isInvalid())
9715       return nullptr;
9716     Vars.push_back(EVar.get());
9717   }
9718   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9719   if (Alignment.isInvalid())
9720     return nullptr;
9721   return getDerived().RebuildOMPAlignedClause(
9722       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9723       C->getColonLoc(), C->getEndLoc());
9724 }
9725 
9726 template <typename Derived>
9727 OMPClause *
9728 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9729   llvm::SmallVector<Expr *, 16> Vars;
9730   Vars.reserve(C->varlist_size());
9731   for (auto *VE : C->varlists()) {
9732     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9733     if (EVar.isInvalid())
9734       return nullptr;
9735     Vars.push_back(EVar.get());
9736   }
9737   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9738                                              C->getLParenLoc(), C->getEndLoc());
9739 }
9740 
9741 template <typename Derived>
9742 OMPClause *
9743 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9744   llvm::SmallVector<Expr *, 16> Vars;
9745   Vars.reserve(C->varlist_size());
9746   for (auto *VE : C->varlists()) {
9747     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9748     if (EVar.isInvalid())
9749       return nullptr;
9750     Vars.push_back(EVar.get());
9751   }
9752   return getDerived().RebuildOMPCopyprivateClause(
9753       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9754 }
9755 
9756 template <typename Derived>
9757 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9758   llvm::SmallVector<Expr *, 16> Vars;
9759   Vars.reserve(C->varlist_size());
9760   for (auto *VE : C->varlists()) {
9761     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9762     if (EVar.isInvalid())
9763       return nullptr;
9764     Vars.push_back(EVar.get());
9765   }
9766   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9767                                             C->getLParenLoc(), C->getEndLoc());
9768 }
9769 
9770 template <typename Derived>
9771 OMPClause *
9772 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9773   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9774   if (E.isInvalid())
9775     return nullptr;
9776   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9777                                              C->getLParenLoc(), C->getEndLoc());
9778 }
9779 
9780 template <typename Derived>
9781 OMPClause *
9782 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9783   llvm::SmallVector<Expr *, 16> Vars;
9784   Expr *DepModifier = C->getModifier();
9785   if (DepModifier) {
9786     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9787     if (DepModRes.isInvalid())
9788       return nullptr;
9789     DepModifier = DepModRes.get();
9790   }
9791   Vars.reserve(C->varlist_size());
9792   for (auto *VE : C->varlists()) {
9793     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9794     if (EVar.isInvalid())
9795       return nullptr;
9796     Vars.push_back(EVar.get());
9797   }
9798   return getDerived().RebuildOMPDependClause(
9799       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9800       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9801       C->getEndLoc());
9802 }
9803 
9804 template <typename Derived>
9805 OMPClause *
9806 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9807   ExprResult E = getDerived().TransformExpr(C->getDevice());
9808   if (E.isInvalid())
9809     return nullptr;
9810   return getDerived().RebuildOMPDeviceClause(
9811       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9812       C->getModifierLoc(), C->getEndLoc());
9813 }
9814 
9815 template <typename Derived, class T>
9816 bool transformOMPMappableExprListClause(
9817     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9818     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9819     DeclarationNameInfo &MapperIdInfo,
9820     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9821   // Transform expressions in the list.
9822   Vars.reserve(C->varlist_size());
9823   for (auto *VE : C->varlists()) {
9824     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9825     if (EVar.isInvalid())
9826       return true;
9827     Vars.push_back(EVar.get());
9828   }
9829   // Transform mapper scope specifier and identifier.
9830   NestedNameSpecifierLoc QualifierLoc;
9831   if (C->getMapperQualifierLoc()) {
9832     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9833         C->getMapperQualifierLoc());
9834     if (!QualifierLoc)
9835       return true;
9836   }
9837   MapperIdScopeSpec.Adopt(QualifierLoc);
9838   MapperIdInfo = C->getMapperIdInfo();
9839   if (MapperIdInfo.getName()) {
9840     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9841     if (!MapperIdInfo.getName())
9842       return true;
9843   }
9844   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9845   // the previous user-defined mapper lookup in dependent environment.
9846   for (auto *E : C->mapperlists()) {
9847     // Transform all the decls.
9848     if (E) {
9849       auto *ULE = cast<UnresolvedLookupExpr>(E);
9850       UnresolvedSet<8> Decls;
9851       for (auto *D : ULE->decls()) {
9852         NamedDecl *InstD =
9853             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9854         Decls.addDecl(InstD, InstD->getAccess());
9855       }
9856       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9857           TT.getSema().Context, /*NamingClass=*/nullptr,
9858           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9859           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9860           Decls.end()));
9861     } else {
9862       UnresolvedMappers.push_back(nullptr);
9863     }
9864   }
9865   return false;
9866 }
9867 
9868 template <typename Derived>
9869 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9870   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9871   llvm::SmallVector<Expr *, 16> Vars;
9872   CXXScopeSpec MapperIdScopeSpec;
9873   DeclarationNameInfo MapperIdInfo;
9874   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9875   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9876           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9877     return nullptr;
9878   return getDerived().RebuildOMPMapClause(
9879       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9880       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9881       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9882 }
9883 
9884 template <typename Derived>
9885 OMPClause *
9886 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9887   Expr *Allocator = C->getAllocator();
9888   if (Allocator) {
9889     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9890     if (AllocatorRes.isInvalid())
9891       return nullptr;
9892     Allocator = AllocatorRes.get();
9893   }
9894   llvm::SmallVector<Expr *, 16> Vars;
9895   Vars.reserve(C->varlist_size());
9896   for (auto *VE : C->varlists()) {
9897     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9898     if (EVar.isInvalid())
9899       return nullptr;
9900     Vars.push_back(EVar.get());
9901   }
9902   return getDerived().RebuildOMPAllocateClause(
9903       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9904       C->getEndLoc());
9905 }
9906 
9907 template <typename Derived>
9908 OMPClause *
9909 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9910   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9911   if (E.isInvalid())
9912     return nullptr;
9913   return getDerived().RebuildOMPNumTeamsClause(
9914       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9915 }
9916 
9917 template <typename Derived>
9918 OMPClause *
9919 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9920   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9921   if (E.isInvalid())
9922     return nullptr;
9923   return getDerived().RebuildOMPThreadLimitClause(
9924       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9925 }
9926 
9927 template <typename Derived>
9928 OMPClause *
9929 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9930   ExprResult E = getDerived().TransformExpr(C->getPriority());
9931   if (E.isInvalid())
9932     return nullptr;
9933   return getDerived().RebuildOMPPriorityClause(
9934       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9935 }
9936 
9937 template <typename Derived>
9938 OMPClause *
9939 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9940   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9941   if (E.isInvalid())
9942     return nullptr;
9943   return getDerived().RebuildOMPGrainsizeClause(
9944       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9945 }
9946 
9947 template <typename Derived>
9948 OMPClause *
9949 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9950   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9951   if (E.isInvalid())
9952     return nullptr;
9953   return getDerived().RebuildOMPNumTasksClause(
9954       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9955 }
9956 
9957 template <typename Derived>
9958 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9959   ExprResult E = getDerived().TransformExpr(C->getHint());
9960   if (E.isInvalid())
9961     return nullptr;
9962   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9963                                            C->getLParenLoc(), C->getEndLoc());
9964 }
9965 
9966 template <typename Derived>
9967 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9968     OMPDistScheduleClause *C) {
9969   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9970   if (E.isInvalid())
9971     return nullptr;
9972   return getDerived().RebuildOMPDistScheduleClause(
9973       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9974       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9975 }
9976 
9977 template <typename Derived>
9978 OMPClause *
9979 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9980   // Rebuild Defaultmap Clause since we need to invoke the checking of
9981   // defaultmap(none:variable-category) after template initialization.
9982   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9983                                                  C->getDefaultmapKind(),
9984                                                  C->getBeginLoc(),
9985                                                  C->getLParenLoc(),
9986                                                  C->getDefaultmapModifierLoc(),
9987                                                  C->getDefaultmapKindLoc(),
9988                                                  C->getEndLoc());
9989 }
9990 
9991 template <typename Derived>
9992 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9993   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9994   llvm::SmallVector<Expr *, 16> Vars;
9995   CXXScopeSpec MapperIdScopeSpec;
9996   DeclarationNameInfo MapperIdInfo;
9997   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9998   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9999           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10000     return nullptr;
10001   return getDerived().RebuildOMPToClause(
10002       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10003       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10004 }
10005 
10006 template <typename Derived>
10007 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10008   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10009   llvm::SmallVector<Expr *, 16> Vars;
10010   CXXScopeSpec MapperIdScopeSpec;
10011   DeclarationNameInfo MapperIdInfo;
10012   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10013   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10014           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10015     return nullptr;
10016   return getDerived().RebuildOMPFromClause(
10017       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10018       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10019 }
10020 
10021 template <typename Derived>
10022 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10023     OMPUseDevicePtrClause *C) {
10024   llvm::SmallVector<Expr *, 16> Vars;
10025   Vars.reserve(C->varlist_size());
10026   for (auto *VE : C->varlists()) {
10027     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10028     if (EVar.isInvalid())
10029       return nullptr;
10030     Vars.push_back(EVar.get());
10031   }
10032   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10033   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10034 }
10035 
10036 template <typename Derived>
10037 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10038     OMPUseDeviceAddrClause *C) {
10039   llvm::SmallVector<Expr *, 16> Vars;
10040   Vars.reserve(C->varlist_size());
10041   for (auto *VE : C->varlists()) {
10042     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10043     if (EVar.isInvalid())
10044       return nullptr;
10045     Vars.push_back(EVar.get());
10046   }
10047   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10048   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10049 }
10050 
10051 template <typename Derived>
10052 OMPClause *
10053 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10054   llvm::SmallVector<Expr *, 16> Vars;
10055   Vars.reserve(C->varlist_size());
10056   for (auto *VE : C->varlists()) {
10057     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10058     if (EVar.isInvalid())
10059       return nullptr;
10060     Vars.push_back(EVar.get());
10061   }
10062   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10063   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10064 }
10065 
10066 template <typename Derived>
10067 OMPClause *
10068 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10069   llvm::SmallVector<Expr *, 16> Vars;
10070   Vars.reserve(C->varlist_size());
10071   for (auto *VE : C->varlists()) {
10072     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10073     if (EVar.isInvalid())
10074       return nullptr;
10075     Vars.push_back(EVar.get());
10076   }
10077   return getDerived().RebuildOMPNontemporalClause(
10078       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10079 }
10080 
10081 template <typename Derived>
10082 OMPClause *
10083 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10084   llvm::SmallVector<Expr *, 16> Vars;
10085   Vars.reserve(C->varlist_size());
10086   for (auto *VE : C->varlists()) {
10087     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10088     if (EVar.isInvalid())
10089       return nullptr;
10090     Vars.push_back(EVar.get());
10091   }
10092   return getDerived().RebuildOMPInclusiveClause(
10093       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10094 }
10095 
10096 template <typename Derived>
10097 OMPClause *
10098 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10099   llvm::SmallVector<Expr *, 16> Vars;
10100   Vars.reserve(C->varlist_size());
10101   for (auto *VE : C->varlists()) {
10102     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10103     if (EVar.isInvalid())
10104       return nullptr;
10105     Vars.push_back(EVar.get());
10106   }
10107   return getDerived().RebuildOMPExclusiveClause(
10108       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10109 }
10110 
10111 template <typename Derived>
10112 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10113     OMPUsesAllocatorsClause *C) {
10114   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10115   Data.reserve(C->getNumberOfAllocators());
10116   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10117     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10118     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10119     if (Allocator.isInvalid())
10120       continue;
10121     ExprResult AllocatorTraits;
10122     if (Expr *AT = D.AllocatorTraits) {
10123       AllocatorTraits = getDerived().TransformExpr(AT);
10124       if (AllocatorTraits.isInvalid())
10125         continue;
10126     }
10127     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10128     NewD.Allocator = Allocator.get();
10129     NewD.AllocatorTraits = AllocatorTraits.get();
10130     NewD.LParenLoc = D.LParenLoc;
10131     NewD.RParenLoc = D.RParenLoc;
10132   }
10133   return getDerived().RebuildOMPUsesAllocatorsClause(
10134       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10135 }
10136 
10137 template <typename Derived>
10138 OMPClause *
10139 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10140   SmallVector<Expr *, 4> Locators;
10141   Locators.reserve(C->varlist_size());
10142   ExprResult ModifierRes;
10143   if (Expr *Modifier = C->getModifier()) {
10144     ModifierRes = getDerived().TransformExpr(Modifier);
10145     if (ModifierRes.isInvalid())
10146       return nullptr;
10147   }
10148   for (Expr *E : C->varlists()) {
10149     ExprResult Locator = getDerived().TransformExpr(E);
10150     if (Locator.isInvalid())
10151       continue;
10152     Locators.push_back(Locator.get());
10153   }
10154   return getDerived().RebuildOMPAffinityClause(
10155       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10156       ModifierRes.get(), Locators);
10157 }
10158 
10159 template <typename Derived>
10160 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10161   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10162                                             C->getBeginLoc(), C->getLParenLoc(),
10163                                             C->getEndLoc());
10164 }
10165 
10166 //===----------------------------------------------------------------------===//
10167 // Expression transformation
10168 //===----------------------------------------------------------------------===//
10169 template<typename Derived>
10170 ExprResult
10171 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10172   return TransformExpr(E->getSubExpr());
10173 }
10174 
10175 template<typename Derived>
10176 ExprResult
10177 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10178   if (!E->isTypeDependent())
10179     return E;
10180 
10181   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10182                                             E->getIdentKind());
10183 }
10184 
10185 template<typename Derived>
10186 ExprResult
10187 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10188   NestedNameSpecifierLoc QualifierLoc;
10189   if (E->getQualifierLoc()) {
10190     QualifierLoc
10191       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10192     if (!QualifierLoc)
10193       return ExprError();
10194   }
10195 
10196   ValueDecl *ND
10197     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10198                                                          E->getDecl()));
10199   if (!ND)
10200     return ExprError();
10201 
10202   NamedDecl *Found = ND;
10203   if (E->getFoundDecl() != E->getDecl()) {
10204     Found = cast_or_null<NamedDecl>(
10205         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10206     if (!Found)
10207       return ExprError();
10208   }
10209 
10210   DeclarationNameInfo NameInfo = E->getNameInfo();
10211   if (NameInfo.getName()) {
10212     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10213     if (!NameInfo.getName())
10214       return ExprError();
10215   }
10216 
10217   if (!getDerived().AlwaysRebuild() &&
10218       QualifierLoc == E->getQualifierLoc() &&
10219       ND == E->getDecl() &&
10220       Found == E->getFoundDecl() &&
10221       NameInfo.getName() == E->getDecl()->getDeclName() &&
10222       !E->hasExplicitTemplateArgs()) {
10223 
10224     // Mark it referenced in the new context regardless.
10225     // FIXME: this is a bit instantiation-specific.
10226     SemaRef.MarkDeclRefReferenced(E);
10227 
10228     return E;
10229   }
10230 
10231   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10232   if (E->hasExplicitTemplateArgs()) {
10233     TemplateArgs = &TransArgs;
10234     TransArgs.setLAngleLoc(E->getLAngleLoc());
10235     TransArgs.setRAngleLoc(E->getRAngleLoc());
10236     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10237                                                 E->getNumTemplateArgs(),
10238                                                 TransArgs))
10239       return ExprError();
10240   }
10241 
10242   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10243                                          Found, TemplateArgs);
10244 }
10245 
10246 template<typename Derived>
10247 ExprResult
10248 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10249   return E;
10250 }
10251 
10252 template <typename Derived>
10253 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10254     FixedPointLiteral *E) {
10255   return E;
10256 }
10257 
10258 template<typename Derived>
10259 ExprResult
10260 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10261   return E;
10262 }
10263 
10264 template<typename Derived>
10265 ExprResult
10266 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10267   return E;
10268 }
10269 
10270 template<typename Derived>
10271 ExprResult
10272 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10273   return E;
10274 }
10275 
10276 template<typename Derived>
10277 ExprResult
10278 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10279   return E;
10280 }
10281 
10282 template<typename Derived>
10283 ExprResult
10284 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10285   if (FunctionDecl *FD = E->getDirectCallee())
10286     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10287   return SemaRef.MaybeBindToTemporary(E);
10288 }
10289 
10290 template<typename Derived>
10291 ExprResult
10292 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10293   ExprResult ControllingExpr =
10294     getDerived().TransformExpr(E->getControllingExpr());
10295   if (ControllingExpr.isInvalid())
10296     return ExprError();
10297 
10298   SmallVector<Expr *, 4> AssocExprs;
10299   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10300   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10301     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10302     if (TSI) {
10303       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10304       if (!AssocType)
10305         return ExprError();
10306       AssocTypes.push_back(AssocType);
10307     } else {
10308       AssocTypes.push_back(nullptr);
10309     }
10310 
10311     ExprResult AssocExpr =
10312         getDerived().TransformExpr(Assoc.getAssociationExpr());
10313     if (AssocExpr.isInvalid())
10314       return ExprError();
10315     AssocExprs.push_back(AssocExpr.get());
10316   }
10317 
10318   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10319                                                   E->getDefaultLoc(),
10320                                                   E->getRParenLoc(),
10321                                                   ControllingExpr.get(),
10322                                                   AssocTypes,
10323                                                   AssocExprs);
10324 }
10325 
10326 template<typename Derived>
10327 ExprResult
10328 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10329   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10330   if (SubExpr.isInvalid())
10331     return ExprError();
10332 
10333   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10334     return E;
10335 
10336   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10337                                        E->getRParen());
10338 }
10339 
10340 /// The operand of a unary address-of operator has special rules: it's
10341 /// allowed to refer to a non-static member of a class even if there's no 'this'
10342 /// object available.
10343 template<typename Derived>
10344 ExprResult
10345 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10346   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10347     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10348   else
10349     return getDerived().TransformExpr(E);
10350 }
10351 
10352 template<typename Derived>
10353 ExprResult
10354 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10355   ExprResult SubExpr;
10356   if (E->getOpcode() == UO_AddrOf)
10357     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10358   else
10359     SubExpr = TransformExpr(E->getSubExpr());
10360   if (SubExpr.isInvalid())
10361     return ExprError();
10362 
10363   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10364     return E;
10365 
10366   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10367                                            E->getOpcode(),
10368                                            SubExpr.get());
10369 }
10370 
10371 template<typename Derived>
10372 ExprResult
10373 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10374   // Transform the type.
10375   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10376   if (!Type)
10377     return ExprError();
10378 
10379   // Transform all of the components into components similar to what the
10380   // parser uses.
10381   // FIXME: It would be slightly more efficient in the non-dependent case to
10382   // just map FieldDecls, rather than requiring the rebuilder to look for
10383   // the fields again. However, __builtin_offsetof is rare enough in
10384   // template code that we don't care.
10385   bool ExprChanged = false;
10386   typedef Sema::OffsetOfComponent Component;
10387   SmallVector<Component, 4> Components;
10388   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10389     const OffsetOfNode &ON = E->getComponent(I);
10390     Component Comp;
10391     Comp.isBrackets = true;
10392     Comp.LocStart = ON.getSourceRange().getBegin();
10393     Comp.LocEnd = ON.getSourceRange().getEnd();
10394     switch (ON.getKind()) {
10395     case OffsetOfNode::Array: {
10396       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10397       ExprResult Index = getDerived().TransformExpr(FromIndex);
10398       if (Index.isInvalid())
10399         return ExprError();
10400 
10401       ExprChanged = ExprChanged || Index.get() != FromIndex;
10402       Comp.isBrackets = true;
10403       Comp.U.E = Index.get();
10404       break;
10405     }
10406 
10407     case OffsetOfNode::Field:
10408     case OffsetOfNode::Identifier:
10409       Comp.isBrackets = false;
10410       Comp.U.IdentInfo = ON.getFieldName();
10411       if (!Comp.U.IdentInfo)
10412         continue;
10413 
10414       break;
10415 
10416     case OffsetOfNode::Base:
10417       // Will be recomputed during the rebuild.
10418       continue;
10419     }
10420 
10421     Components.push_back(Comp);
10422   }
10423 
10424   // If nothing changed, retain the existing expression.
10425   if (!getDerived().AlwaysRebuild() &&
10426       Type == E->getTypeSourceInfo() &&
10427       !ExprChanged)
10428     return E;
10429 
10430   // Build a new offsetof expression.
10431   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10432                                           Components, E->getRParenLoc());
10433 }
10434 
10435 template<typename Derived>
10436 ExprResult
10437 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10438   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10439          "opaque value expression requires transformation");
10440   return E;
10441 }
10442 
10443 template<typename Derived>
10444 ExprResult
10445 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10446   return E;
10447 }
10448 
10449 template <typename Derived>
10450 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10451   llvm::SmallVector<Expr *, 8> Children;
10452   bool Changed = false;
10453   for (Expr *C : E->subExpressions()) {
10454     ExprResult NewC = getDerived().TransformExpr(C);
10455     if (NewC.isInvalid())
10456       return ExprError();
10457     Children.push_back(NewC.get());
10458 
10459     Changed |= NewC.get() != C;
10460   }
10461   if (!getDerived().AlwaysRebuild() && !Changed)
10462     return E;
10463   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10464                                           Children, E->getType());
10465 }
10466 
10467 template<typename Derived>
10468 ExprResult
10469 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10470   // Rebuild the syntactic form.  The original syntactic form has
10471   // opaque-value expressions in it, so strip those away and rebuild
10472   // the result.  This is a really awful way of doing this, but the
10473   // better solution (rebuilding the semantic expressions and
10474   // rebinding OVEs as necessary) doesn't work; we'd need
10475   // TreeTransform to not strip away implicit conversions.
10476   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10477   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10478   if (result.isInvalid()) return ExprError();
10479 
10480   // If that gives us a pseudo-object result back, the pseudo-object
10481   // expression must have been an lvalue-to-rvalue conversion which we
10482   // should reapply.
10483   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10484     result = SemaRef.checkPseudoObjectRValue(result.get());
10485 
10486   return result;
10487 }
10488 
10489 template<typename Derived>
10490 ExprResult
10491 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10492                                                 UnaryExprOrTypeTraitExpr *E) {
10493   if (E->isArgumentType()) {
10494     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10495 
10496     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10497     if (!NewT)
10498       return ExprError();
10499 
10500     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10501       return E;
10502 
10503     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10504                                                     E->getKind(),
10505                                                     E->getSourceRange());
10506   }
10507 
10508   // C++0x [expr.sizeof]p1:
10509   //   The operand is either an expression, which is an unevaluated operand
10510   //   [...]
10511   EnterExpressionEvaluationContext Unevaluated(
10512       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10513       Sema::ReuseLambdaContextDecl);
10514 
10515   // Try to recover if we have something like sizeof(T::X) where X is a type.
10516   // Notably, there must be *exactly* one set of parens if X is a type.
10517   TypeSourceInfo *RecoveryTSI = nullptr;
10518   ExprResult SubExpr;
10519   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10520   if (auto *DRE =
10521           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10522     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10523         PE, DRE, false, &RecoveryTSI);
10524   else
10525     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10526 
10527   if (RecoveryTSI) {
10528     return getDerived().RebuildUnaryExprOrTypeTrait(
10529         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10530   } else if (SubExpr.isInvalid())
10531     return ExprError();
10532 
10533   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10534     return E;
10535 
10536   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10537                                                   E->getOperatorLoc(),
10538                                                   E->getKind(),
10539                                                   E->getSourceRange());
10540 }
10541 
10542 template<typename Derived>
10543 ExprResult
10544 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10545   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10546   if (LHS.isInvalid())
10547     return ExprError();
10548 
10549   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10550   if (RHS.isInvalid())
10551     return ExprError();
10552 
10553 
10554   if (!getDerived().AlwaysRebuild() &&
10555       LHS.get() == E->getLHS() &&
10556       RHS.get() == E->getRHS())
10557     return E;
10558 
10559   return getDerived().RebuildArraySubscriptExpr(
10560       LHS.get(),
10561       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10562 }
10563 
10564 template <typename Derived>
10565 ExprResult
10566 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10567   ExprResult Base = getDerived().TransformExpr(E->getBase());
10568   if (Base.isInvalid())
10569     return ExprError();
10570 
10571   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10572   if (RowIdx.isInvalid())
10573     return ExprError();
10574 
10575   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10576   if (ColumnIdx.isInvalid())
10577     return ExprError();
10578 
10579   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10580       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10581     return E;
10582 
10583   return getDerived().RebuildMatrixSubscriptExpr(
10584       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10585 }
10586 
10587 template <typename Derived>
10588 ExprResult
10589 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10590   ExprResult Base = getDerived().TransformExpr(E->getBase());
10591   if (Base.isInvalid())
10592     return ExprError();
10593 
10594   ExprResult LowerBound;
10595   if (E->getLowerBound()) {
10596     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10597     if (LowerBound.isInvalid())
10598       return ExprError();
10599   }
10600 
10601   ExprResult Length;
10602   if (E->getLength()) {
10603     Length = getDerived().TransformExpr(E->getLength());
10604     if (Length.isInvalid())
10605       return ExprError();
10606   }
10607 
10608   ExprResult Stride;
10609   if (Expr *Str = E->getStride()) {
10610     Stride = getDerived().TransformExpr(Str);
10611     if (Stride.isInvalid())
10612       return ExprError();
10613   }
10614 
10615   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10616       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10617     return E;
10618 
10619   return getDerived().RebuildOMPArraySectionExpr(
10620       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10621       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10622       E->getRBracketLoc());
10623 }
10624 
10625 template <typename Derived>
10626 ExprResult
10627 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10628   ExprResult Base = getDerived().TransformExpr(E->getBase());
10629   if (Base.isInvalid())
10630     return ExprError();
10631 
10632   SmallVector<Expr *, 4> Dims;
10633   bool ErrorFound = false;
10634   for (Expr *Dim : E->getDimensions()) {
10635     ExprResult DimRes = getDerived().TransformExpr(Dim);
10636     if (DimRes.isInvalid()) {
10637       ErrorFound = true;
10638       continue;
10639     }
10640     Dims.push_back(DimRes.get());
10641   }
10642 
10643   if (ErrorFound)
10644     return ExprError();
10645   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10646                                                  E->getRParenLoc(), Dims,
10647                                                  E->getBracketsRanges());
10648 }
10649 
10650 template <typename Derived>
10651 ExprResult
10652 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10653   unsigned NumIterators = E->numOfIterators();
10654   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10655 
10656   bool ErrorFound = false;
10657   bool NeedToRebuild = getDerived().AlwaysRebuild();
10658   for (unsigned I = 0; I < NumIterators; ++I) {
10659     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10660     Data[I].DeclIdent = D->getIdentifier();
10661     Data[I].DeclIdentLoc = D->getLocation();
10662     if (D->getLocation() == D->getBeginLoc()) {
10663       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10664              "Implicit type must be int.");
10665     } else {
10666       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10667       QualType DeclTy = getDerived().TransformType(D->getType());
10668       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10669     }
10670     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10671     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10672     ExprResult End = getDerived().TransformExpr(Range.End);
10673     ExprResult Step = getDerived().TransformExpr(Range.Step);
10674     ErrorFound = ErrorFound ||
10675                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10676                                                !Data[I].Type.get().isNull())) ||
10677                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10678     if (ErrorFound)
10679       continue;
10680     Data[I].Range.Begin = Begin.get();
10681     Data[I].Range.End = End.get();
10682     Data[I].Range.Step = Step.get();
10683     Data[I].AssignLoc = E->getAssignLoc(I);
10684     Data[I].ColonLoc = E->getColonLoc(I);
10685     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10686     NeedToRebuild =
10687         NeedToRebuild ||
10688         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10689                                        D->getType().getTypePtrOrNull()) ||
10690         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10691         Range.Step != Data[I].Range.Step;
10692   }
10693   if (ErrorFound)
10694     return ExprError();
10695   if (!NeedToRebuild)
10696     return E;
10697 
10698   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10699       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10700   if (!Res.isUsable())
10701     return Res;
10702   auto *IE = cast<OMPIteratorExpr>(Res.get());
10703   for (unsigned I = 0; I < NumIterators; ++I)
10704     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10705                                       IE->getIteratorDecl(I));
10706   return Res;
10707 }
10708 
10709 template<typename Derived>
10710 ExprResult
10711 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10712   // Transform the callee.
10713   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10714   if (Callee.isInvalid())
10715     return ExprError();
10716 
10717   // Transform arguments.
10718   bool ArgChanged = false;
10719   SmallVector<Expr*, 8> Args;
10720   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10721                                   &ArgChanged))
10722     return ExprError();
10723 
10724   if (!getDerived().AlwaysRebuild() &&
10725       Callee.get() == E->getCallee() &&
10726       !ArgChanged)
10727     return SemaRef.MaybeBindToTemporary(E);
10728 
10729   // FIXME: Wrong source location information for the '('.
10730   SourceLocation FakeLParenLoc
10731     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10732 
10733   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10734   if (E->hasStoredFPFeatures()) {
10735     FPOptionsOverride NewOverrides = E->getFPFeatures();
10736     getSema().CurFPFeatures =
10737         NewOverrides.applyOverrides(getSema().getLangOpts());
10738     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10739   }
10740 
10741   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10742                                       Args,
10743                                       E->getRParenLoc());
10744 }
10745 
10746 template<typename Derived>
10747 ExprResult
10748 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10749   ExprResult Base = getDerived().TransformExpr(E->getBase());
10750   if (Base.isInvalid())
10751     return ExprError();
10752 
10753   NestedNameSpecifierLoc QualifierLoc;
10754   if (E->hasQualifier()) {
10755     QualifierLoc
10756       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10757 
10758     if (!QualifierLoc)
10759       return ExprError();
10760   }
10761   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10762 
10763   ValueDecl *Member
10764     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10765                                                          E->getMemberDecl()));
10766   if (!Member)
10767     return ExprError();
10768 
10769   NamedDecl *FoundDecl = E->getFoundDecl();
10770   if (FoundDecl == E->getMemberDecl()) {
10771     FoundDecl = Member;
10772   } else {
10773     FoundDecl = cast_or_null<NamedDecl>(
10774                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10775     if (!FoundDecl)
10776       return ExprError();
10777   }
10778 
10779   if (!getDerived().AlwaysRebuild() &&
10780       Base.get() == E->getBase() &&
10781       QualifierLoc == E->getQualifierLoc() &&
10782       Member == E->getMemberDecl() &&
10783       FoundDecl == E->getFoundDecl() &&
10784       !E->hasExplicitTemplateArgs()) {
10785 
10786     // Mark it referenced in the new context regardless.
10787     // FIXME: this is a bit instantiation-specific.
10788     SemaRef.MarkMemberReferenced(E);
10789 
10790     return E;
10791   }
10792 
10793   TemplateArgumentListInfo TransArgs;
10794   if (E->hasExplicitTemplateArgs()) {
10795     TransArgs.setLAngleLoc(E->getLAngleLoc());
10796     TransArgs.setRAngleLoc(E->getRAngleLoc());
10797     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10798                                                 E->getNumTemplateArgs(),
10799                                                 TransArgs))
10800       return ExprError();
10801   }
10802 
10803   // FIXME: Bogus source location for the operator
10804   SourceLocation FakeOperatorLoc =
10805       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10806 
10807   // FIXME: to do this check properly, we will need to preserve the
10808   // first-qualifier-in-scope here, just in case we had a dependent
10809   // base (and therefore couldn't do the check) and a
10810   // nested-name-qualifier (and therefore could do the lookup).
10811   NamedDecl *FirstQualifierInScope = nullptr;
10812   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10813   if (MemberNameInfo.getName()) {
10814     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10815     if (!MemberNameInfo.getName())
10816       return ExprError();
10817   }
10818 
10819   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10820                                         E->isArrow(),
10821                                         QualifierLoc,
10822                                         TemplateKWLoc,
10823                                         MemberNameInfo,
10824                                         Member,
10825                                         FoundDecl,
10826                                         (E->hasExplicitTemplateArgs()
10827                                            ? &TransArgs : nullptr),
10828                                         FirstQualifierInScope);
10829 }
10830 
10831 template<typename Derived>
10832 ExprResult
10833 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10834   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10835   if (LHS.isInvalid())
10836     return ExprError();
10837 
10838   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10839   if (RHS.isInvalid())
10840     return ExprError();
10841 
10842   if (!getDerived().AlwaysRebuild() &&
10843       LHS.get() == E->getLHS() &&
10844       RHS.get() == E->getRHS())
10845     return E;
10846 
10847   if (E->isCompoundAssignmentOp())
10848     // FPFeatures has already been established from trailing storage
10849     return getDerived().RebuildBinaryOperator(
10850         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10851   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10852   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10853   getSema().CurFPFeatures =
10854       NewOverrides.applyOverrides(getSema().getLangOpts());
10855   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10856   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10857                                             LHS.get(), RHS.get());
10858 }
10859 
10860 template <typename Derived>
10861 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10862     CXXRewrittenBinaryOperator *E) {
10863   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10864 
10865   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10866   if (LHS.isInvalid())
10867     return ExprError();
10868 
10869   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10870   if (RHS.isInvalid())
10871     return ExprError();
10872 
10873   if (!getDerived().AlwaysRebuild() &&
10874       LHS.get() == Decomp.LHS &&
10875       RHS.get() == Decomp.RHS)
10876     return E;
10877 
10878   // Extract the already-resolved callee declarations so that we can restrict
10879   // ourselves to using them as the unqualified lookup results when rebuilding.
10880   UnresolvedSet<2> UnqualLookups;
10881   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10882                             const_cast<Expr *>(Decomp.InnerBinOp)};
10883   for (Expr *PossibleBinOp : PossibleBinOps) {
10884     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10885     if (!Op)
10886       continue;
10887     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10888     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10889       continue;
10890 
10891     // Transform the callee in case we built a call to a local extern
10892     // declaration.
10893     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10894         E->getOperatorLoc(), Callee->getFoundDecl()));
10895     if (!Found)
10896       return ExprError();
10897     UnqualLookups.addDecl(Found);
10898   }
10899 
10900   return getDerived().RebuildCXXRewrittenBinaryOperator(
10901       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10902 }
10903 
10904 template<typename Derived>
10905 ExprResult
10906 TreeTransform<Derived>::TransformCompoundAssignOperator(
10907                                                       CompoundAssignOperator *E) {
10908   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10909   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10910   getSema().CurFPFeatures =
10911       NewOverrides.applyOverrides(getSema().getLangOpts());
10912   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10913   return getDerived().TransformBinaryOperator(E);
10914 }
10915 
10916 template<typename Derived>
10917 ExprResult TreeTransform<Derived>::
10918 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10919   // Just rebuild the common and RHS expressions and see whether we
10920   // get any changes.
10921 
10922   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10923   if (commonExpr.isInvalid())
10924     return ExprError();
10925 
10926   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10927   if (rhs.isInvalid())
10928     return ExprError();
10929 
10930   if (!getDerived().AlwaysRebuild() &&
10931       commonExpr.get() == e->getCommon() &&
10932       rhs.get() == e->getFalseExpr())
10933     return e;
10934 
10935   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10936                                                  e->getQuestionLoc(),
10937                                                  nullptr,
10938                                                  e->getColonLoc(),
10939                                                  rhs.get());
10940 }
10941 
10942 template<typename Derived>
10943 ExprResult
10944 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10945   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10946   if (Cond.isInvalid())
10947     return ExprError();
10948 
10949   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10950   if (LHS.isInvalid())
10951     return ExprError();
10952 
10953   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10954   if (RHS.isInvalid())
10955     return ExprError();
10956 
10957   if (!getDerived().AlwaysRebuild() &&
10958       Cond.get() == E->getCond() &&
10959       LHS.get() == E->getLHS() &&
10960       RHS.get() == E->getRHS())
10961     return E;
10962 
10963   return getDerived().RebuildConditionalOperator(Cond.get(),
10964                                                  E->getQuestionLoc(),
10965                                                  LHS.get(),
10966                                                  E->getColonLoc(),
10967                                                  RHS.get());
10968 }
10969 
10970 template<typename Derived>
10971 ExprResult
10972 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10973   // Implicit casts are eliminated during transformation, since they
10974   // will be recomputed by semantic analysis after transformation.
10975   return getDerived().TransformExpr(E->getSubExprAsWritten());
10976 }
10977 
10978 template<typename Derived>
10979 ExprResult
10980 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10981   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10982   if (!Type)
10983     return ExprError();
10984 
10985   ExprResult SubExpr
10986     = getDerived().TransformExpr(E->getSubExprAsWritten());
10987   if (SubExpr.isInvalid())
10988     return ExprError();
10989 
10990   if (!getDerived().AlwaysRebuild() &&
10991       Type == E->getTypeInfoAsWritten() &&
10992       SubExpr.get() == E->getSubExpr())
10993     return E;
10994 
10995   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10996                                             Type,
10997                                             E->getRParenLoc(),
10998                                             SubExpr.get());
10999 }
11000 
11001 template<typename Derived>
11002 ExprResult
11003 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11004   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11005   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11006   if (!NewT)
11007     return ExprError();
11008 
11009   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11010   if (Init.isInvalid())
11011     return ExprError();
11012 
11013   if (!getDerived().AlwaysRebuild() &&
11014       OldT == NewT &&
11015       Init.get() == E->getInitializer())
11016     return SemaRef.MaybeBindToTemporary(E);
11017 
11018   // Note: the expression type doesn't necessarily match the
11019   // type-as-written, but that's okay, because it should always be
11020   // derivable from the initializer.
11021 
11022   return getDerived().RebuildCompoundLiteralExpr(
11023       E->getLParenLoc(), NewT,
11024       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11025 }
11026 
11027 template<typename Derived>
11028 ExprResult
11029 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11030   ExprResult Base = getDerived().TransformExpr(E->getBase());
11031   if (Base.isInvalid())
11032     return ExprError();
11033 
11034   if (!getDerived().AlwaysRebuild() &&
11035       Base.get() == E->getBase())
11036     return E;
11037 
11038   // FIXME: Bad source location
11039   SourceLocation FakeOperatorLoc =
11040       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11041   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11042                                                   E->getAccessorLoc(),
11043                                                   E->getAccessor());
11044 }
11045 
11046 template<typename Derived>
11047 ExprResult
11048 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11049   if (InitListExpr *Syntactic = E->getSyntacticForm())
11050     E = Syntactic;
11051 
11052   bool InitChanged = false;
11053 
11054   EnterExpressionEvaluationContext Context(
11055       getSema(), EnterExpressionEvaluationContext::InitList);
11056 
11057   SmallVector<Expr*, 4> Inits;
11058   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11059                                   Inits, &InitChanged))
11060     return ExprError();
11061 
11062   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11063     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11064     // in some cases. We can't reuse it in general, because the syntactic and
11065     // semantic forms are linked, and we can't know that semantic form will
11066     // match even if the syntactic form does.
11067   }
11068 
11069   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11070                                       E->getRBraceLoc());
11071 }
11072 
11073 template<typename Derived>
11074 ExprResult
11075 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11076   Designation Desig;
11077 
11078   // transform the initializer value
11079   ExprResult Init = getDerived().TransformExpr(E->getInit());
11080   if (Init.isInvalid())
11081     return ExprError();
11082 
11083   // transform the designators.
11084   SmallVector<Expr*, 4> ArrayExprs;
11085   bool ExprChanged = false;
11086   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11087     if (D.isFieldDesignator()) {
11088       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11089                                                D.getDotLoc(),
11090                                                D.getFieldLoc()));
11091       if (D.getField()) {
11092         FieldDecl *Field = cast_or_null<FieldDecl>(
11093             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11094         if (Field != D.getField())
11095           // Rebuild the expression when the transformed FieldDecl is
11096           // different to the already assigned FieldDecl.
11097           ExprChanged = true;
11098       } else {
11099         // Ensure that the designator expression is rebuilt when there isn't
11100         // a resolved FieldDecl in the designator as we don't want to assign
11101         // a FieldDecl to a pattern designator that will be instantiated again.
11102         ExprChanged = true;
11103       }
11104       continue;
11105     }
11106 
11107     if (D.isArrayDesignator()) {
11108       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11109       if (Index.isInvalid())
11110         return ExprError();
11111 
11112       Desig.AddDesignator(
11113           Designator::getArray(Index.get(), D.getLBracketLoc()));
11114 
11115       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11116       ArrayExprs.push_back(Index.get());
11117       continue;
11118     }
11119 
11120     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11121     ExprResult Start
11122       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11123     if (Start.isInvalid())
11124       return ExprError();
11125 
11126     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11127     if (End.isInvalid())
11128       return ExprError();
11129 
11130     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11131                                                   End.get(),
11132                                                   D.getLBracketLoc(),
11133                                                   D.getEllipsisLoc()));
11134 
11135     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11136                   End.get() != E->getArrayRangeEnd(D);
11137 
11138     ArrayExprs.push_back(Start.get());
11139     ArrayExprs.push_back(End.get());
11140   }
11141 
11142   if (!getDerived().AlwaysRebuild() &&
11143       Init.get() == E->getInit() &&
11144       !ExprChanged)
11145     return E;
11146 
11147   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11148                                                 E->getEqualOrColonLoc(),
11149                                                 E->usesGNUSyntax(), Init.get());
11150 }
11151 
11152 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11153 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11154 template<typename Derived>
11155 ExprResult
11156 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11157     DesignatedInitUpdateExpr *E) {
11158   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11159                    "initializer");
11160   return ExprError();
11161 }
11162 
11163 template<typename Derived>
11164 ExprResult
11165 TreeTransform<Derived>::TransformNoInitExpr(
11166     NoInitExpr *E) {
11167   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11168   return ExprError();
11169 }
11170 
11171 template<typename Derived>
11172 ExprResult
11173 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11174   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11175   return ExprError();
11176 }
11177 
11178 template<typename Derived>
11179 ExprResult
11180 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11181   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11182   return ExprError();
11183 }
11184 
11185 template<typename Derived>
11186 ExprResult
11187 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11188                                                      ImplicitValueInitExpr *E) {
11189   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11190 
11191   // FIXME: Will we ever have proper type location here? Will we actually
11192   // need to transform the type?
11193   QualType T = getDerived().TransformType(E->getType());
11194   if (T.isNull())
11195     return ExprError();
11196 
11197   if (!getDerived().AlwaysRebuild() &&
11198       T == E->getType())
11199     return E;
11200 
11201   return getDerived().RebuildImplicitValueInitExpr(T);
11202 }
11203 
11204 template<typename Derived>
11205 ExprResult
11206 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11207   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11208   if (!TInfo)
11209     return ExprError();
11210 
11211   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11212   if (SubExpr.isInvalid())
11213     return ExprError();
11214 
11215   if (!getDerived().AlwaysRebuild() &&
11216       TInfo == E->getWrittenTypeInfo() &&
11217       SubExpr.get() == E->getSubExpr())
11218     return E;
11219 
11220   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11221                                        TInfo, E->getRParenLoc());
11222 }
11223 
11224 template<typename Derived>
11225 ExprResult
11226 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11227   bool ArgumentChanged = false;
11228   SmallVector<Expr*, 4> Inits;
11229   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11230                      &ArgumentChanged))
11231     return ExprError();
11232 
11233   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11234                                            Inits,
11235                                            E->getRParenLoc());
11236 }
11237 
11238 /// Transform an address-of-label expression.
11239 ///
11240 /// By default, the transformation of an address-of-label expression always
11241 /// rebuilds the expression, so that the label identifier can be resolved to
11242 /// the corresponding label statement by semantic analysis.
11243 template<typename Derived>
11244 ExprResult
11245 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11246   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11247                                         E->getLabel());
11248   if (!LD)
11249     return ExprError();
11250 
11251   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11252                                            cast<LabelDecl>(LD));
11253 }
11254 
11255 template<typename Derived>
11256 ExprResult
11257 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11258   SemaRef.ActOnStartStmtExpr();
11259   StmtResult SubStmt
11260     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11261   if (SubStmt.isInvalid()) {
11262     SemaRef.ActOnStmtExprError();
11263     return ExprError();
11264   }
11265 
11266   unsigned OldDepth = E->getTemplateDepth();
11267   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11268 
11269   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11270       SubStmt.get() == E->getSubStmt()) {
11271     // Calling this an 'error' is unintuitive, but it does the right thing.
11272     SemaRef.ActOnStmtExprError();
11273     return SemaRef.MaybeBindToTemporary(E);
11274   }
11275 
11276   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11277                                       E->getRParenLoc(), NewDepth);
11278 }
11279 
11280 template<typename Derived>
11281 ExprResult
11282 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11283   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11284   if (Cond.isInvalid())
11285     return ExprError();
11286 
11287   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11288   if (LHS.isInvalid())
11289     return ExprError();
11290 
11291   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11292   if (RHS.isInvalid())
11293     return ExprError();
11294 
11295   if (!getDerived().AlwaysRebuild() &&
11296       Cond.get() == E->getCond() &&
11297       LHS.get() == E->getLHS() &&
11298       RHS.get() == E->getRHS())
11299     return E;
11300 
11301   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11302                                         Cond.get(), LHS.get(), RHS.get(),
11303                                         E->getRParenLoc());
11304 }
11305 
11306 template<typename Derived>
11307 ExprResult
11308 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11309   return E;
11310 }
11311 
11312 template<typename Derived>
11313 ExprResult
11314 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11315   switch (E->getOperator()) {
11316   case OO_New:
11317   case OO_Delete:
11318   case OO_Array_New:
11319   case OO_Array_Delete:
11320     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11321 
11322   case OO_Call: {
11323     // This is a call to an object's operator().
11324     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11325 
11326     // Transform the object itself.
11327     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11328     if (Object.isInvalid())
11329       return ExprError();
11330 
11331     // FIXME: Poor location information
11332     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11333         static_cast<Expr *>(Object.get())->getEndLoc());
11334 
11335     // Transform the call arguments.
11336     SmallVector<Expr*, 8> Args;
11337     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11338                                     Args))
11339       return ExprError();
11340 
11341     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11342                                         E->getEndLoc());
11343   }
11344 
11345 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11346   case OO_##Name:
11347 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11348 #include "clang/Basic/OperatorKinds.def"
11349   case OO_Subscript:
11350     // Handled below.
11351     break;
11352 
11353   case OO_Conditional:
11354     llvm_unreachable("conditional operator is not actually overloadable");
11355 
11356   case OO_None:
11357   case NUM_OVERLOADED_OPERATORS:
11358     llvm_unreachable("not an overloaded operator?");
11359   }
11360 
11361   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11362   if (Callee.isInvalid())
11363     return ExprError();
11364 
11365   ExprResult First;
11366   if (E->getOperator() == OO_Amp)
11367     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11368   else
11369     First = getDerived().TransformExpr(E->getArg(0));
11370   if (First.isInvalid())
11371     return ExprError();
11372 
11373   ExprResult Second;
11374   if (E->getNumArgs() == 2) {
11375     Second = getDerived().TransformExpr(E->getArg(1));
11376     if (Second.isInvalid())
11377       return ExprError();
11378   }
11379 
11380   if (!getDerived().AlwaysRebuild() &&
11381       Callee.get() == E->getCallee() &&
11382       First.get() == E->getArg(0) &&
11383       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11384     return SemaRef.MaybeBindToTemporary(E);
11385 
11386   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11387   FPOptionsOverride NewOverrides(E->getFPFeatures());
11388   getSema().CurFPFeatures =
11389       NewOverrides.applyOverrides(getSema().getLangOpts());
11390   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11391 
11392   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11393                                                  E->getOperatorLoc(),
11394                                                  Callee.get(),
11395                                                  First.get(),
11396                                                  Second.get());
11397 }
11398 
11399 template<typename Derived>
11400 ExprResult
11401 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11402   return getDerived().TransformCallExpr(E);
11403 }
11404 
11405 template <typename Derived>
11406 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11407   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11408                          getSema().CurContext != E->getParentContext();
11409 
11410   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11411     return E;
11412 
11413   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11414                                            E->getEndLoc(),
11415                                            getSema().CurContext);
11416 }
11417 
11418 template<typename Derived>
11419 ExprResult
11420 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11421   // Transform the callee.
11422   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11423   if (Callee.isInvalid())
11424     return ExprError();
11425 
11426   // Transform exec config.
11427   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11428   if (EC.isInvalid())
11429     return ExprError();
11430 
11431   // Transform arguments.
11432   bool ArgChanged = false;
11433   SmallVector<Expr*, 8> Args;
11434   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11435                                   &ArgChanged))
11436     return ExprError();
11437 
11438   if (!getDerived().AlwaysRebuild() &&
11439       Callee.get() == E->getCallee() &&
11440       !ArgChanged)
11441     return SemaRef.MaybeBindToTemporary(E);
11442 
11443   // FIXME: Wrong source location information for the '('.
11444   SourceLocation FakeLParenLoc
11445     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11446   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11447                                       Args,
11448                                       E->getRParenLoc(), EC.get());
11449 }
11450 
11451 template<typename Derived>
11452 ExprResult
11453 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11454   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11455   if (!Type)
11456     return ExprError();
11457 
11458   ExprResult SubExpr
11459     = getDerived().TransformExpr(E->getSubExprAsWritten());
11460   if (SubExpr.isInvalid())
11461     return ExprError();
11462 
11463   if (!getDerived().AlwaysRebuild() &&
11464       Type == E->getTypeInfoAsWritten() &&
11465       SubExpr.get() == E->getSubExpr())
11466     return E;
11467   return getDerived().RebuildCXXNamedCastExpr(
11468       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11469       Type, E->getAngleBrackets().getEnd(),
11470       // FIXME. this should be '(' location
11471       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11472 }
11473 
11474 template<typename Derived>
11475 ExprResult
11476 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11477   TypeSourceInfo *TSI =
11478       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11479   if (!TSI)
11480     return ExprError();
11481 
11482   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11483   if (Sub.isInvalid())
11484     return ExprError();
11485 
11486   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11487                                                 Sub.get(), BCE->getEndLoc());
11488 }
11489 
11490 template<typename Derived>
11491 ExprResult
11492 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11493   return getDerived().TransformCXXNamedCastExpr(E);
11494 }
11495 
11496 template<typename Derived>
11497 ExprResult
11498 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11499   return getDerived().TransformCXXNamedCastExpr(E);
11500 }
11501 
11502 template<typename Derived>
11503 ExprResult
11504 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11505                                                       CXXReinterpretCastExpr *E) {
11506   return getDerived().TransformCXXNamedCastExpr(E);
11507 }
11508 
11509 template<typename Derived>
11510 ExprResult
11511 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11512   return getDerived().TransformCXXNamedCastExpr(E);
11513 }
11514 
11515 template<typename Derived>
11516 ExprResult
11517 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11518   return getDerived().TransformCXXNamedCastExpr(E);
11519 }
11520 
11521 template<typename Derived>
11522 ExprResult
11523 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11524                                                      CXXFunctionalCastExpr *E) {
11525   TypeSourceInfo *Type =
11526       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11527   if (!Type)
11528     return ExprError();
11529 
11530   ExprResult SubExpr
11531     = getDerived().TransformExpr(E->getSubExprAsWritten());
11532   if (SubExpr.isInvalid())
11533     return ExprError();
11534 
11535   if (!getDerived().AlwaysRebuild() &&
11536       Type == E->getTypeInfoAsWritten() &&
11537       SubExpr.get() == E->getSubExpr())
11538     return E;
11539 
11540   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11541                                                    E->getLParenLoc(),
11542                                                    SubExpr.get(),
11543                                                    E->getRParenLoc(),
11544                                                    E->isListInitialization());
11545 }
11546 
11547 template<typename Derived>
11548 ExprResult
11549 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11550   if (E->isTypeOperand()) {
11551     TypeSourceInfo *TInfo
11552       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11553     if (!TInfo)
11554       return ExprError();
11555 
11556     if (!getDerived().AlwaysRebuild() &&
11557         TInfo == E->getTypeOperandSourceInfo())
11558       return E;
11559 
11560     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11561                                              TInfo, E->getEndLoc());
11562   }
11563 
11564   // We don't know whether the subexpression is potentially evaluated until
11565   // after we perform semantic analysis.  We speculatively assume it is
11566   // unevaluated; it will get fixed later if the subexpression is in fact
11567   // potentially evaluated.
11568   EnterExpressionEvaluationContext Unevaluated(
11569       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11570       Sema::ReuseLambdaContextDecl);
11571 
11572   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11573   if (SubExpr.isInvalid())
11574     return ExprError();
11575 
11576   if (!getDerived().AlwaysRebuild() &&
11577       SubExpr.get() == E->getExprOperand())
11578     return E;
11579 
11580   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11581                                            SubExpr.get(), E->getEndLoc());
11582 }
11583 
11584 template<typename Derived>
11585 ExprResult
11586 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11587   if (E->isTypeOperand()) {
11588     TypeSourceInfo *TInfo
11589       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11590     if (!TInfo)
11591       return ExprError();
11592 
11593     if (!getDerived().AlwaysRebuild() &&
11594         TInfo == E->getTypeOperandSourceInfo())
11595       return E;
11596 
11597     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11598                                              TInfo, E->getEndLoc());
11599   }
11600 
11601   EnterExpressionEvaluationContext Unevaluated(
11602       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11603 
11604   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11605   if (SubExpr.isInvalid())
11606     return ExprError();
11607 
11608   if (!getDerived().AlwaysRebuild() &&
11609       SubExpr.get() == E->getExprOperand())
11610     return E;
11611 
11612   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11613                                            SubExpr.get(), E->getEndLoc());
11614 }
11615 
11616 template<typename Derived>
11617 ExprResult
11618 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11619   return E;
11620 }
11621 
11622 template<typename Derived>
11623 ExprResult
11624 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11625                                                      CXXNullPtrLiteralExpr *E) {
11626   return E;
11627 }
11628 
11629 template<typename Derived>
11630 ExprResult
11631 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11632   QualType T = getSema().getCurrentThisType();
11633 
11634   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11635     // Mark it referenced in the new context regardless.
11636     // FIXME: this is a bit instantiation-specific.
11637     getSema().MarkThisReferenced(E);
11638     return E;
11639   }
11640 
11641   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11642 }
11643 
11644 template<typename Derived>
11645 ExprResult
11646 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11647   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11648   if (SubExpr.isInvalid())
11649     return ExprError();
11650 
11651   if (!getDerived().AlwaysRebuild() &&
11652       SubExpr.get() == E->getSubExpr())
11653     return E;
11654 
11655   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11656                                           E->isThrownVariableInScope());
11657 }
11658 
11659 template<typename Derived>
11660 ExprResult
11661 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11662   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11663       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11664   if (!Param)
11665     return ExprError();
11666 
11667   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11668       E->getUsedContext() == SemaRef.CurContext)
11669     return E;
11670 
11671   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11672 }
11673 
11674 template<typename Derived>
11675 ExprResult
11676 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11677   FieldDecl *Field = cast_or_null<FieldDecl>(
11678       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11679   if (!Field)
11680     return ExprError();
11681 
11682   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11683       E->getUsedContext() == SemaRef.CurContext)
11684     return E;
11685 
11686   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11687 }
11688 
11689 template<typename Derived>
11690 ExprResult
11691 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11692                                                     CXXScalarValueInitExpr *E) {
11693   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11694   if (!T)
11695     return ExprError();
11696 
11697   if (!getDerived().AlwaysRebuild() &&
11698       T == E->getTypeSourceInfo())
11699     return E;
11700 
11701   return getDerived().RebuildCXXScalarValueInitExpr(T,
11702                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11703                                                     E->getRParenLoc());
11704 }
11705 
11706 template<typename Derived>
11707 ExprResult
11708 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11709   // Transform the type that we're allocating
11710   TypeSourceInfo *AllocTypeInfo =
11711       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11712   if (!AllocTypeInfo)
11713     return ExprError();
11714 
11715   // Transform the size of the array we're allocating (if any).
11716   Optional<Expr *> ArraySize;
11717   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11718     ExprResult NewArraySize;
11719     if (*OldArraySize) {
11720       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11721       if (NewArraySize.isInvalid())
11722         return ExprError();
11723     }
11724     ArraySize = NewArraySize.get();
11725   }
11726 
11727   // Transform the placement arguments (if any).
11728   bool ArgumentChanged = false;
11729   SmallVector<Expr*, 8> PlacementArgs;
11730   if (getDerived().TransformExprs(E->getPlacementArgs(),
11731                                   E->getNumPlacementArgs(), true,
11732                                   PlacementArgs, &ArgumentChanged))
11733     return ExprError();
11734 
11735   // Transform the initializer (if any).
11736   Expr *OldInit = E->getInitializer();
11737   ExprResult NewInit;
11738   if (OldInit)
11739     NewInit = getDerived().TransformInitializer(OldInit, true);
11740   if (NewInit.isInvalid())
11741     return ExprError();
11742 
11743   // Transform new operator and delete operator.
11744   FunctionDecl *OperatorNew = nullptr;
11745   if (E->getOperatorNew()) {
11746     OperatorNew = cast_or_null<FunctionDecl>(
11747         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11748     if (!OperatorNew)
11749       return ExprError();
11750   }
11751 
11752   FunctionDecl *OperatorDelete = nullptr;
11753   if (E->getOperatorDelete()) {
11754     OperatorDelete = cast_or_null<FunctionDecl>(
11755         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11756     if (!OperatorDelete)
11757       return ExprError();
11758   }
11759 
11760   if (!getDerived().AlwaysRebuild() &&
11761       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11762       ArraySize == E->getArraySize() &&
11763       NewInit.get() == OldInit &&
11764       OperatorNew == E->getOperatorNew() &&
11765       OperatorDelete == E->getOperatorDelete() &&
11766       !ArgumentChanged) {
11767     // Mark any declarations we need as referenced.
11768     // FIXME: instantiation-specific.
11769     if (OperatorNew)
11770       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11771     if (OperatorDelete)
11772       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11773 
11774     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11775       QualType ElementType
11776         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11777       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11778         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11779         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11780           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11781         }
11782       }
11783     }
11784 
11785     return E;
11786   }
11787 
11788   QualType AllocType = AllocTypeInfo->getType();
11789   if (!ArraySize) {
11790     // If no array size was specified, but the new expression was
11791     // instantiated with an array type (e.g., "new T" where T is
11792     // instantiated with "int[4]"), extract the outer bound from the
11793     // array type as our array size. We do this with constant and
11794     // dependently-sized array types.
11795     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11796     if (!ArrayT) {
11797       // Do nothing
11798     } else if (const ConstantArrayType *ConsArrayT
11799                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11800       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11801                                          SemaRef.Context.getSizeType(),
11802                                          /*FIXME:*/ E->getBeginLoc());
11803       AllocType = ConsArrayT->getElementType();
11804     } else if (const DependentSizedArrayType *DepArrayT
11805                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11806       if (DepArrayT->getSizeExpr()) {
11807         ArraySize = DepArrayT->getSizeExpr();
11808         AllocType = DepArrayT->getElementType();
11809       }
11810     }
11811   }
11812 
11813   return getDerived().RebuildCXXNewExpr(
11814       E->getBeginLoc(), E->isGlobalNew(),
11815       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11816       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11817       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11818 }
11819 
11820 template<typename Derived>
11821 ExprResult
11822 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11823   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11824   if (Operand.isInvalid())
11825     return ExprError();
11826 
11827   // Transform the delete operator, if known.
11828   FunctionDecl *OperatorDelete = nullptr;
11829   if (E->getOperatorDelete()) {
11830     OperatorDelete = cast_or_null<FunctionDecl>(
11831         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11832     if (!OperatorDelete)
11833       return ExprError();
11834   }
11835 
11836   if (!getDerived().AlwaysRebuild() &&
11837       Operand.get() == E->getArgument() &&
11838       OperatorDelete == E->getOperatorDelete()) {
11839     // Mark any declarations we need as referenced.
11840     // FIXME: instantiation-specific.
11841     if (OperatorDelete)
11842       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11843 
11844     if (!E->getArgument()->isTypeDependent()) {
11845       QualType Destroyed = SemaRef.Context.getBaseElementType(
11846                                                          E->getDestroyedType());
11847       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11848         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11849         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11850                                        SemaRef.LookupDestructor(Record));
11851       }
11852     }
11853 
11854     return E;
11855   }
11856 
11857   return getDerived().RebuildCXXDeleteExpr(
11858       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11859 }
11860 
11861 template<typename Derived>
11862 ExprResult
11863 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11864                                                      CXXPseudoDestructorExpr *E) {
11865   ExprResult Base = getDerived().TransformExpr(E->getBase());
11866   if (Base.isInvalid())
11867     return ExprError();
11868 
11869   ParsedType ObjectTypePtr;
11870   bool MayBePseudoDestructor = false;
11871   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11872                                               E->getOperatorLoc(),
11873                                         E->isArrow()? tok::arrow : tok::period,
11874                                               ObjectTypePtr,
11875                                               MayBePseudoDestructor);
11876   if (Base.isInvalid())
11877     return ExprError();
11878 
11879   QualType ObjectType = ObjectTypePtr.get();
11880   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11881   if (QualifierLoc) {
11882     QualifierLoc
11883       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11884     if (!QualifierLoc)
11885       return ExprError();
11886   }
11887   CXXScopeSpec SS;
11888   SS.Adopt(QualifierLoc);
11889 
11890   PseudoDestructorTypeStorage Destroyed;
11891   if (E->getDestroyedTypeInfo()) {
11892     TypeSourceInfo *DestroyedTypeInfo
11893       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11894                                                 ObjectType, nullptr, SS);
11895     if (!DestroyedTypeInfo)
11896       return ExprError();
11897     Destroyed = DestroyedTypeInfo;
11898   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11899     // We aren't likely to be able to resolve the identifier down to a type
11900     // now anyway, so just retain the identifier.
11901     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11902                                             E->getDestroyedTypeLoc());
11903   } else {
11904     // Look for a destructor known with the given name.
11905     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11906                                               *E->getDestroyedTypeIdentifier(),
11907                                                 E->getDestroyedTypeLoc(),
11908                                                 /*Scope=*/nullptr,
11909                                                 SS, ObjectTypePtr,
11910                                                 false);
11911     if (!T)
11912       return ExprError();
11913 
11914     Destroyed
11915       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11916                                                  E->getDestroyedTypeLoc());
11917   }
11918 
11919   TypeSourceInfo *ScopeTypeInfo = nullptr;
11920   if (E->getScopeTypeInfo()) {
11921     CXXScopeSpec EmptySS;
11922     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11923                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11924     if (!ScopeTypeInfo)
11925       return ExprError();
11926   }
11927 
11928   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11929                                                      E->getOperatorLoc(),
11930                                                      E->isArrow(),
11931                                                      SS,
11932                                                      ScopeTypeInfo,
11933                                                      E->getColonColonLoc(),
11934                                                      E->getTildeLoc(),
11935                                                      Destroyed);
11936 }
11937 
11938 template <typename Derived>
11939 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11940                                                         bool RequiresADL,
11941                                                         LookupResult &R) {
11942   // Transform all the decls.
11943   bool AllEmptyPacks = true;
11944   for (auto *OldD : Old->decls()) {
11945     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11946     if (!InstD) {
11947       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11948       // This can happen because of dependent hiding.
11949       if (isa<UsingShadowDecl>(OldD))
11950         continue;
11951       else {
11952         R.clear();
11953         return true;
11954       }
11955     }
11956 
11957     // Expand using pack declarations.
11958     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11959     ArrayRef<NamedDecl*> Decls = SingleDecl;
11960     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11961       Decls = UPD->expansions();
11962 
11963     // Expand using declarations.
11964     for (auto *D : Decls) {
11965       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11966         for (auto *SD : UD->shadows())
11967           R.addDecl(SD);
11968       } else {
11969         R.addDecl(D);
11970       }
11971     }
11972 
11973     AllEmptyPacks &= Decls.empty();
11974   };
11975 
11976   // C++ [temp.res]/8.4.2:
11977   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11978   //   a name in the template definition found a using-declaration, but the
11979   //   lookup in the corresponding scope in the instantiation odoes not find
11980   //   any declarations because the using-declaration was a pack expansion and
11981   //   the corresponding pack is empty
11982   if (AllEmptyPacks && !RequiresADL) {
11983     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11984         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11985     return true;
11986   }
11987 
11988   // Resolve a kind, but don't do any further analysis.  If it's
11989   // ambiguous, the callee needs to deal with it.
11990   R.resolveKind();
11991   return false;
11992 }
11993 
11994 template<typename Derived>
11995 ExprResult
11996 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11997                                                   UnresolvedLookupExpr *Old) {
11998   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11999                  Sema::LookupOrdinaryName);
12000 
12001   // Transform the declaration set.
12002   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12003     return ExprError();
12004 
12005   // Rebuild the nested-name qualifier, if present.
12006   CXXScopeSpec SS;
12007   if (Old->getQualifierLoc()) {
12008     NestedNameSpecifierLoc QualifierLoc
12009       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12010     if (!QualifierLoc)
12011       return ExprError();
12012 
12013     SS.Adopt(QualifierLoc);
12014   }
12015 
12016   if (Old->getNamingClass()) {
12017     CXXRecordDecl *NamingClass
12018       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12019                                                             Old->getNameLoc(),
12020                                                         Old->getNamingClass()));
12021     if (!NamingClass) {
12022       R.clear();
12023       return ExprError();
12024     }
12025 
12026     R.setNamingClass(NamingClass);
12027   }
12028 
12029   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12030 
12031   // If we have neither explicit template arguments, nor the template keyword,
12032   // it's a normal declaration name or member reference.
12033   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12034     NamedDecl *D = R.getAsSingle<NamedDecl>();
12035     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12036     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12037     // give a good diagnostic.
12038     if (D && D->isCXXInstanceMember()) {
12039       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12040                                                      /*TemplateArgs=*/nullptr,
12041                                                      /*Scope=*/nullptr);
12042     }
12043 
12044     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12045   }
12046 
12047   // If we have template arguments, rebuild them, then rebuild the
12048   // templateid expression.
12049   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12050   if (Old->hasExplicitTemplateArgs() &&
12051       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12052                                               Old->getNumTemplateArgs(),
12053                                               TransArgs)) {
12054     R.clear();
12055     return ExprError();
12056   }
12057 
12058   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12059                                             Old->requiresADL(), &TransArgs);
12060 }
12061 
12062 template<typename Derived>
12063 ExprResult
12064 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12065   bool ArgChanged = false;
12066   SmallVector<TypeSourceInfo *, 4> Args;
12067   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12068     TypeSourceInfo *From = E->getArg(I);
12069     TypeLoc FromTL = From->getTypeLoc();
12070     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12071       TypeLocBuilder TLB;
12072       TLB.reserve(FromTL.getFullDataSize());
12073       QualType To = getDerived().TransformType(TLB, FromTL);
12074       if (To.isNull())
12075         return ExprError();
12076 
12077       if (To == From->getType())
12078         Args.push_back(From);
12079       else {
12080         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12081         ArgChanged = true;
12082       }
12083       continue;
12084     }
12085 
12086     ArgChanged = true;
12087 
12088     // We have a pack expansion. Instantiate it.
12089     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12090     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12091     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12092     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12093 
12094     // Determine whether the set of unexpanded parameter packs can and should
12095     // be expanded.
12096     bool Expand = true;
12097     bool RetainExpansion = false;
12098     Optional<unsigned> OrigNumExpansions =
12099         ExpansionTL.getTypePtr()->getNumExpansions();
12100     Optional<unsigned> NumExpansions = OrigNumExpansions;
12101     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12102                                              PatternTL.getSourceRange(),
12103                                              Unexpanded,
12104                                              Expand, RetainExpansion,
12105                                              NumExpansions))
12106       return ExprError();
12107 
12108     if (!Expand) {
12109       // The transform has determined that we should perform a simple
12110       // transformation on the pack expansion, producing another pack
12111       // expansion.
12112       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12113 
12114       TypeLocBuilder TLB;
12115       TLB.reserve(From->getTypeLoc().getFullDataSize());
12116 
12117       QualType To = getDerived().TransformType(TLB, PatternTL);
12118       if (To.isNull())
12119         return ExprError();
12120 
12121       To = getDerived().RebuildPackExpansionType(To,
12122                                                  PatternTL.getSourceRange(),
12123                                                  ExpansionTL.getEllipsisLoc(),
12124                                                  NumExpansions);
12125       if (To.isNull())
12126         return ExprError();
12127 
12128       PackExpansionTypeLoc ToExpansionTL
12129         = TLB.push<PackExpansionTypeLoc>(To);
12130       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12131       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12132       continue;
12133     }
12134 
12135     // Expand the pack expansion by substituting for each argument in the
12136     // pack(s).
12137     for (unsigned I = 0; I != *NumExpansions; ++I) {
12138       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12139       TypeLocBuilder TLB;
12140       TLB.reserve(PatternTL.getFullDataSize());
12141       QualType To = getDerived().TransformType(TLB, PatternTL);
12142       if (To.isNull())
12143         return ExprError();
12144 
12145       if (To->containsUnexpandedParameterPack()) {
12146         To = getDerived().RebuildPackExpansionType(To,
12147                                                    PatternTL.getSourceRange(),
12148                                                    ExpansionTL.getEllipsisLoc(),
12149                                                    NumExpansions);
12150         if (To.isNull())
12151           return ExprError();
12152 
12153         PackExpansionTypeLoc ToExpansionTL
12154           = TLB.push<PackExpansionTypeLoc>(To);
12155         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12156       }
12157 
12158       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12159     }
12160 
12161     if (!RetainExpansion)
12162       continue;
12163 
12164     // If we're supposed to retain a pack expansion, do so by temporarily
12165     // forgetting the partially-substituted parameter pack.
12166     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12167 
12168     TypeLocBuilder TLB;
12169     TLB.reserve(From->getTypeLoc().getFullDataSize());
12170 
12171     QualType To = getDerived().TransformType(TLB, PatternTL);
12172     if (To.isNull())
12173       return ExprError();
12174 
12175     To = getDerived().RebuildPackExpansionType(To,
12176                                                PatternTL.getSourceRange(),
12177                                                ExpansionTL.getEllipsisLoc(),
12178                                                NumExpansions);
12179     if (To.isNull())
12180       return ExprError();
12181 
12182     PackExpansionTypeLoc ToExpansionTL
12183       = TLB.push<PackExpansionTypeLoc>(To);
12184     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12185     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12186   }
12187 
12188   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12189     return E;
12190 
12191   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12192                                        E->getEndLoc());
12193 }
12194 
12195 template<typename Derived>
12196 ExprResult
12197 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12198                                                  ConceptSpecializationExpr *E) {
12199   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12200   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12201   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12202                                               Old->NumTemplateArgs, TransArgs))
12203     return ExprError();
12204 
12205   return getDerived().RebuildConceptSpecializationExpr(
12206       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12207       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12208       &TransArgs);
12209 }
12210 
12211 template<typename Derived>
12212 ExprResult
12213 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12214   SmallVector<ParmVarDecl*, 4> TransParams;
12215   SmallVector<QualType, 4> TransParamTypes;
12216   Sema::ExtParameterInfoBuilder ExtParamInfos;
12217 
12218   // C++2a [expr.prim.req]p2
12219   // Expressions appearing within a requirement-body are unevaluated operands.
12220   EnterExpressionEvaluationContext Ctx(
12221       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12222 
12223   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12224       getSema().Context, getSema().CurContext,
12225       E->getBody()->getBeginLoc());
12226 
12227   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12228 
12229   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12230                                                E->getLocalParameters(),
12231                                                /*ParamTypes=*/nullptr,
12232                                                /*ParamInfos=*/nullptr,
12233                                                TransParamTypes, &TransParams,
12234                                                ExtParamInfos))
12235     return ExprError();
12236 
12237   for (ParmVarDecl *Param : TransParams)
12238     Param->setDeclContext(Body);
12239 
12240   SmallVector<concepts::Requirement *, 4> TransReqs;
12241   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12242                                                      TransReqs))
12243     return ExprError();
12244 
12245   for (concepts::Requirement *Req : TransReqs) {
12246     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12247       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12248         ER->getReturnTypeRequirement()
12249                 .getTypeConstraintTemplateParameterList()->getParam(0)
12250                 ->setDeclContext(Body);
12251       }
12252     }
12253   }
12254 
12255   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12256                                           TransParams, TransReqs,
12257                                           E->getRBraceLoc());
12258 }
12259 
12260 template<typename Derived>
12261 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12262     ArrayRef<concepts::Requirement *> Reqs,
12263     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12264   for (concepts::Requirement *Req : Reqs) {
12265     concepts::Requirement *TransReq = nullptr;
12266     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12267       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12268     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12269       TransReq = getDerived().TransformExprRequirement(ExprReq);
12270     else
12271       TransReq = getDerived().TransformNestedRequirement(
12272                      cast<concepts::NestedRequirement>(Req));
12273     if (!TransReq)
12274       return true;
12275     Transformed.push_back(TransReq);
12276   }
12277   return false;
12278 }
12279 
12280 template<typename Derived>
12281 concepts::TypeRequirement *
12282 TreeTransform<Derived>::TransformTypeRequirement(
12283     concepts::TypeRequirement *Req) {
12284   if (Req->isSubstitutionFailure()) {
12285     if (getDerived().AlwaysRebuild())
12286       return getDerived().RebuildTypeRequirement(
12287               Req->getSubstitutionDiagnostic());
12288     return Req;
12289   }
12290   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12291   if (!TransType)
12292     return nullptr;
12293   return getDerived().RebuildTypeRequirement(TransType);
12294 }
12295 
12296 template<typename Derived>
12297 concepts::ExprRequirement *
12298 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12299   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12300   if (Req->isExprSubstitutionFailure())
12301     TransExpr = Req->getExprSubstitutionDiagnostic();
12302   else {
12303     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12304     if (TransExprRes.isInvalid())
12305       return nullptr;
12306     TransExpr = TransExprRes.get();
12307   }
12308 
12309   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12310   const auto &RetReq = Req->getReturnTypeRequirement();
12311   if (RetReq.isEmpty())
12312     TransRetReq.emplace();
12313   else if (RetReq.isSubstitutionFailure())
12314     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12315   else if (RetReq.isTypeConstraint()) {
12316     TemplateParameterList *OrigTPL =
12317         RetReq.getTypeConstraintTemplateParameterList();
12318     TemplateParameterList *TPL =
12319         getDerived().TransformTemplateParameterList(OrigTPL);
12320     if (!TPL)
12321       return nullptr;
12322     TransRetReq.emplace(TPL);
12323   }
12324   assert(TransRetReq.hasValue() &&
12325          "All code paths leading here must set TransRetReq");
12326   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12327     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12328                                                Req->getNoexceptLoc(),
12329                                                std::move(*TransRetReq));
12330   return getDerived().RebuildExprRequirement(
12331       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12332       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12333 }
12334 
12335 template<typename Derived>
12336 concepts::NestedRequirement *
12337 TreeTransform<Derived>::TransformNestedRequirement(
12338     concepts::NestedRequirement *Req) {
12339   if (Req->isSubstitutionFailure()) {
12340     if (getDerived().AlwaysRebuild())
12341       return getDerived().RebuildNestedRequirement(
12342           Req->getSubstitutionDiagnostic());
12343     return Req;
12344   }
12345   ExprResult TransConstraint =
12346       getDerived().TransformExpr(Req->getConstraintExpr());
12347   if (TransConstraint.isInvalid())
12348     return nullptr;
12349   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12350 }
12351 
12352 template<typename Derived>
12353 ExprResult
12354 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12355   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12356   if (!T)
12357     return ExprError();
12358 
12359   if (!getDerived().AlwaysRebuild() &&
12360       T == E->getQueriedTypeSourceInfo())
12361     return E;
12362 
12363   ExprResult SubExpr;
12364   {
12365     EnterExpressionEvaluationContext Unevaluated(
12366         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12367     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12368     if (SubExpr.isInvalid())
12369       return ExprError();
12370 
12371     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12372       return E;
12373   }
12374 
12375   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12376                                             SubExpr.get(), E->getEndLoc());
12377 }
12378 
12379 template<typename Derived>
12380 ExprResult
12381 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12382   ExprResult SubExpr;
12383   {
12384     EnterExpressionEvaluationContext Unevaluated(
12385         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12386     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12387     if (SubExpr.isInvalid())
12388       return ExprError();
12389 
12390     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12391       return E;
12392   }
12393 
12394   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12395                                              SubExpr.get(), E->getEndLoc());
12396 }
12397 
12398 template <typename Derived>
12399 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12400     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12401     TypeSourceInfo **RecoveryTSI) {
12402   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12403       DRE, AddrTaken, RecoveryTSI);
12404 
12405   // Propagate both errors and recovered types, which return ExprEmpty.
12406   if (!NewDRE.isUsable())
12407     return NewDRE;
12408 
12409   // We got an expr, wrap it up in parens.
12410   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12411     return PE;
12412   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12413                                        PE->getRParen());
12414 }
12415 
12416 template <typename Derived>
12417 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12418     DependentScopeDeclRefExpr *E) {
12419   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12420                                             nullptr);
12421 }
12422 
12423 template<typename Derived>
12424 ExprResult
12425 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12426                                                DependentScopeDeclRefExpr *E,
12427                                                bool IsAddressOfOperand,
12428                                                TypeSourceInfo **RecoveryTSI) {
12429   assert(E->getQualifierLoc());
12430   NestedNameSpecifierLoc QualifierLoc
12431   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12432   if (!QualifierLoc)
12433     return ExprError();
12434   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12435 
12436   // TODO: If this is a conversion-function-id, verify that the
12437   // destination type name (if present) resolves the same way after
12438   // instantiation as it did in the local scope.
12439 
12440   DeclarationNameInfo NameInfo
12441     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12442   if (!NameInfo.getName())
12443     return ExprError();
12444 
12445   if (!E->hasExplicitTemplateArgs()) {
12446     if (!getDerived().AlwaysRebuild() &&
12447         QualifierLoc == E->getQualifierLoc() &&
12448         // Note: it is sufficient to compare the Name component of NameInfo:
12449         // if name has not changed, DNLoc has not changed either.
12450         NameInfo.getName() == E->getDeclName())
12451       return E;
12452 
12453     return getDerived().RebuildDependentScopeDeclRefExpr(
12454         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12455         IsAddressOfOperand, RecoveryTSI);
12456   }
12457 
12458   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12459   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12460                                               E->getNumTemplateArgs(),
12461                                               TransArgs))
12462     return ExprError();
12463 
12464   return getDerived().RebuildDependentScopeDeclRefExpr(
12465       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12466       RecoveryTSI);
12467 }
12468 
12469 template<typename Derived>
12470 ExprResult
12471 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12472   // CXXConstructExprs other than for list-initialization and
12473   // CXXTemporaryObjectExpr are always implicit, so when we have
12474   // a 1-argument construction we just transform that argument.
12475   if (getDerived().AllowSkippingCXXConstructExpr() &&
12476       ((E->getNumArgs() == 1 ||
12477         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12478        (!getDerived().DropCallArgument(E->getArg(0))) &&
12479        !E->isListInitialization()))
12480     return getDerived().TransformInitializer(E->getArg(0),
12481                                              /*DirectInit*/ false);
12482 
12483   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12484 
12485   QualType T = getDerived().TransformType(E->getType());
12486   if (T.isNull())
12487     return ExprError();
12488 
12489   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12490       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12491   if (!Constructor)
12492     return ExprError();
12493 
12494   bool ArgumentChanged = false;
12495   SmallVector<Expr*, 8> Args;
12496   {
12497     EnterExpressionEvaluationContext Context(
12498         getSema(), EnterExpressionEvaluationContext::InitList,
12499         E->isListInitialization());
12500     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12501                                     &ArgumentChanged))
12502       return ExprError();
12503   }
12504 
12505   if (!getDerived().AlwaysRebuild() &&
12506       T == E->getType() &&
12507       Constructor == E->getConstructor() &&
12508       !ArgumentChanged) {
12509     // Mark the constructor as referenced.
12510     // FIXME: Instantiation-specific
12511     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12512     return E;
12513   }
12514 
12515   return getDerived().RebuildCXXConstructExpr(
12516       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12517       E->hadMultipleCandidates(), E->isListInitialization(),
12518       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12519       E->getConstructionKind(), E->getParenOrBraceRange());
12520 }
12521 
12522 template<typename Derived>
12523 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12524     CXXInheritedCtorInitExpr *E) {
12525   QualType T = getDerived().TransformType(E->getType());
12526   if (T.isNull())
12527     return ExprError();
12528 
12529   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12530       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12531   if (!Constructor)
12532     return ExprError();
12533 
12534   if (!getDerived().AlwaysRebuild() &&
12535       T == E->getType() &&
12536       Constructor == E->getConstructor()) {
12537     // Mark the constructor as referenced.
12538     // FIXME: Instantiation-specific
12539     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12540     return E;
12541   }
12542 
12543   return getDerived().RebuildCXXInheritedCtorInitExpr(
12544       T, E->getLocation(), Constructor,
12545       E->constructsVBase(), E->inheritedFromVBase());
12546 }
12547 
12548 /// Transform a C++ temporary-binding expression.
12549 ///
12550 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12551 /// transform the subexpression and return that.
12552 template<typename Derived>
12553 ExprResult
12554 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12555   return getDerived().TransformExpr(E->getSubExpr());
12556 }
12557 
12558 /// Transform a C++ expression that contains cleanups that should
12559 /// be run after the expression is evaluated.
12560 ///
12561 /// Since ExprWithCleanups nodes are implicitly generated, we
12562 /// just transform the subexpression and return that.
12563 template<typename Derived>
12564 ExprResult
12565 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12566   return getDerived().TransformExpr(E->getSubExpr());
12567 }
12568 
12569 template<typename Derived>
12570 ExprResult
12571 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12572                                                     CXXTemporaryObjectExpr *E) {
12573   TypeSourceInfo *T =
12574       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12575   if (!T)
12576     return ExprError();
12577 
12578   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12579       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12580   if (!Constructor)
12581     return ExprError();
12582 
12583   bool ArgumentChanged = false;
12584   SmallVector<Expr*, 8> Args;
12585   Args.reserve(E->getNumArgs());
12586   {
12587     EnterExpressionEvaluationContext Context(
12588         getSema(), EnterExpressionEvaluationContext::InitList,
12589         E->isListInitialization());
12590     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12591                        &ArgumentChanged))
12592       return ExprError();
12593   }
12594 
12595   if (!getDerived().AlwaysRebuild() &&
12596       T == E->getTypeSourceInfo() &&
12597       Constructor == E->getConstructor() &&
12598       !ArgumentChanged) {
12599     // FIXME: Instantiation-specific
12600     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12601     return SemaRef.MaybeBindToTemporary(E);
12602   }
12603 
12604   // FIXME: We should just pass E->isListInitialization(), but we're not
12605   // prepared to handle list-initialization without a child InitListExpr.
12606   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12607   return getDerived().RebuildCXXTemporaryObjectExpr(
12608       T, LParenLoc, Args, E->getEndLoc(),
12609       /*ListInitialization=*/LParenLoc.isInvalid());
12610 }
12611 
12612 template<typename Derived>
12613 ExprResult
12614 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12615   // Transform any init-capture expressions before entering the scope of the
12616   // lambda body, because they are not semantically within that scope.
12617   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12618   struct TransformedInitCapture {
12619     // The location of the ... if the result is retaining a pack expansion.
12620     SourceLocation EllipsisLoc;
12621     // Zero or more expansions of the init-capture.
12622     SmallVector<InitCaptureInfoTy, 4> Expansions;
12623   };
12624   SmallVector<TransformedInitCapture, 4> InitCaptures;
12625   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12626   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12627                                     CEnd = E->capture_end();
12628        C != CEnd; ++C) {
12629     if (!E->isInitCapture(C))
12630       continue;
12631 
12632     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12633     VarDecl *OldVD = C->getCapturedVar();
12634 
12635     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12636                                 Optional<unsigned> NumExpansions) {
12637       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12638           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12639 
12640       if (NewExprInitResult.isInvalid()) {
12641         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12642         return;
12643       }
12644       Expr *NewExprInit = NewExprInitResult.get();
12645 
12646       QualType NewInitCaptureType =
12647           getSema().buildLambdaInitCaptureInitialization(
12648               C->getLocation(), OldVD->getType()->isReferenceType(),
12649               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12650               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12651               NewExprInit);
12652       Result.Expansions.push_back(
12653           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12654     };
12655 
12656     // If this is an init-capture pack, consider expanding the pack now.
12657     if (OldVD->isParameterPack()) {
12658       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12659                                              ->getTypeLoc()
12660                                              .castAs<PackExpansionTypeLoc>();
12661       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12662       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12663 
12664       // Determine whether the set of unexpanded parameter packs can and should
12665       // be expanded.
12666       bool Expand = true;
12667       bool RetainExpansion = false;
12668       Optional<unsigned> OrigNumExpansions =
12669           ExpansionTL.getTypePtr()->getNumExpansions();
12670       Optional<unsigned> NumExpansions = OrigNumExpansions;
12671       if (getDerived().TryExpandParameterPacks(
12672               ExpansionTL.getEllipsisLoc(),
12673               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12674               RetainExpansion, NumExpansions))
12675         return ExprError();
12676       if (Expand) {
12677         for (unsigned I = 0; I != *NumExpansions; ++I) {
12678           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12679           SubstInitCapture(SourceLocation(), None);
12680         }
12681       }
12682       if (!Expand || RetainExpansion) {
12683         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12684         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12685         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12686       }
12687     } else {
12688       SubstInitCapture(SourceLocation(), None);
12689     }
12690   }
12691 
12692   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12693   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12694 
12695   // Transform the template parameters, and add them to the current
12696   // instantiation scope. The null case is handled correctly.
12697   auto TPL = getDerived().TransformTemplateParameterList(
12698       E->getTemplateParameterList());
12699   LSI->GLTemplateParameterList = TPL;
12700 
12701   // Transform the type of the original lambda's call operator.
12702   // The transformation MUST be done in the CurrentInstantiationScope since
12703   // it introduces a mapping of the original to the newly created
12704   // transformed parameters.
12705   TypeSourceInfo *NewCallOpTSI = nullptr;
12706   {
12707     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12708     FunctionProtoTypeLoc OldCallOpFPTL =
12709         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12710 
12711     TypeLocBuilder NewCallOpTLBuilder;
12712     SmallVector<QualType, 4> ExceptionStorage;
12713     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12714     QualType NewCallOpType = TransformFunctionProtoType(
12715         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12716         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12717           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12718                                               ExceptionStorage, Changed);
12719         });
12720     if (NewCallOpType.isNull())
12721       return ExprError();
12722     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12723                                                         NewCallOpType);
12724   }
12725 
12726   // Transform the trailing requires clause
12727   ExprResult NewTrailingRequiresClause;
12728   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12729     // FIXME: Concepts: Substitution into requires clause should only happen
12730     //                  when checking satisfaction.
12731     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12732 
12733   // Create the local class that will describe the lambda.
12734   // FIXME: KnownDependent below is wrong when substituting inside a templated
12735   // context that isn't a DeclContext (such as a variable template).
12736   CXXRecordDecl *OldClass = E->getLambdaClass();
12737   CXXRecordDecl *Class
12738     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12739                                         NewCallOpTSI,
12740                                         /*KnownDependent=*/false,
12741                                         E->getCaptureDefault());
12742   getDerived().transformedLocalDecl(OldClass, {Class});
12743 
12744   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12745   if (getDerived().ReplacingOriginal())
12746     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12747                                OldClass->getLambdaManglingNumber(),
12748                                OldClass->getDeviceLambdaManglingNumber(),
12749                                OldClass->getLambdaContextDecl());
12750 
12751   // Build the call operator.
12752   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12753       Class, E->getIntroducerRange(), NewCallOpTSI,
12754       E->getCallOperator()->getEndLoc(),
12755       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12756       E->getCallOperator()->getConstexprKind(),
12757       NewTrailingRequiresClause.get());
12758 
12759   LSI->CallOperator = NewCallOperator;
12760 
12761   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12762   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12763 
12764   // Number the lambda for linkage purposes if necessary.
12765   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12766 
12767   // Introduce the context of the call operator.
12768   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12769                                  /*NewThisContext*/false);
12770 
12771   // Enter the scope of the lambda.
12772   getSema().buildLambdaScope(LSI, NewCallOperator,
12773                              E->getIntroducerRange(),
12774                              E->getCaptureDefault(),
12775                              E->getCaptureDefaultLoc(),
12776                              E->hasExplicitParameters(),
12777                              E->hasExplicitResultType(),
12778                              E->isMutable());
12779 
12780   bool Invalid = false;
12781 
12782   // Transform captures.
12783   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12784                                  CEnd = E->capture_end();
12785        C != CEnd; ++C) {
12786     // When we hit the first implicit capture, tell Sema that we've finished
12787     // the list of explicit captures.
12788     if (C->isImplicit())
12789       break;
12790 
12791     // Capturing 'this' is trivial.
12792     if (C->capturesThis()) {
12793       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12794                                     /*BuildAndDiagnose*/ true, nullptr,
12795                                     C->getCaptureKind() == LCK_StarThis);
12796       continue;
12797     }
12798     // Captured expression will be recaptured during captured variables
12799     // rebuilding.
12800     if (C->capturesVLAType())
12801       continue;
12802 
12803     // Rebuild init-captures, including the implied field declaration.
12804     if (E->isInitCapture(C)) {
12805       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12806 
12807       VarDecl *OldVD = C->getCapturedVar();
12808       llvm::SmallVector<Decl*, 4> NewVDs;
12809 
12810       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12811         ExprResult Init = Info.first;
12812         QualType InitQualType = Info.second;
12813         if (Init.isInvalid() || InitQualType.isNull()) {
12814           Invalid = true;
12815           break;
12816         }
12817         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12818             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12819             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12820         if (!NewVD) {
12821           Invalid = true;
12822           break;
12823         }
12824         NewVDs.push_back(NewVD);
12825         getSema().addInitCapture(LSI, NewVD);
12826       }
12827 
12828       if (Invalid)
12829         break;
12830 
12831       getDerived().transformedLocalDecl(OldVD, NewVDs);
12832       continue;
12833     }
12834 
12835     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12836 
12837     // Determine the capture kind for Sema.
12838     Sema::TryCaptureKind Kind
12839       = C->isImplicit()? Sema::TryCapture_Implicit
12840                        : C->getCaptureKind() == LCK_ByCopy
12841                            ? Sema::TryCapture_ExplicitByVal
12842                            : Sema::TryCapture_ExplicitByRef;
12843     SourceLocation EllipsisLoc;
12844     if (C->isPackExpansion()) {
12845       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12846       bool ShouldExpand = false;
12847       bool RetainExpansion = false;
12848       Optional<unsigned> NumExpansions;
12849       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12850                                                C->getLocation(),
12851                                                Unexpanded,
12852                                                ShouldExpand, RetainExpansion,
12853                                                NumExpansions)) {
12854         Invalid = true;
12855         continue;
12856       }
12857 
12858       if (ShouldExpand) {
12859         // The transform has determined that we should perform an expansion;
12860         // transform and capture each of the arguments.
12861         // expansion of the pattern. Do so.
12862         VarDecl *Pack = C->getCapturedVar();
12863         for (unsigned I = 0; I != *NumExpansions; ++I) {
12864           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12865           VarDecl *CapturedVar
12866             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12867                                                                Pack));
12868           if (!CapturedVar) {
12869             Invalid = true;
12870             continue;
12871           }
12872 
12873           // Capture the transformed variable.
12874           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12875         }
12876 
12877         // FIXME: Retain a pack expansion if RetainExpansion is true.
12878 
12879         continue;
12880       }
12881 
12882       EllipsisLoc = C->getEllipsisLoc();
12883     }
12884 
12885     // Transform the captured variable.
12886     VarDecl *CapturedVar
12887       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12888                                                          C->getCapturedVar()));
12889     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12890       Invalid = true;
12891       continue;
12892     }
12893 
12894     // Capture the transformed variable.
12895     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12896                                  EllipsisLoc);
12897   }
12898   getSema().finishLambdaExplicitCaptures(LSI);
12899 
12900   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12901   // evaluation context even if we're not transforming the function body.
12902   getSema().PushExpressionEvaluationContext(
12903       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12904 
12905   // Instantiate the body of the lambda expression.
12906   StmtResult Body =
12907       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12908 
12909   // ActOnLambda* will pop the function scope for us.
12910   FuncScopeCleanup.disable();
12911 
12912   if (Body.isInvalid()) {
12913     SavedContext.pop();
12914     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12915                                /*IsInstantiation=*/true);
12916     return ExprError();
12917   }
12918 
12919   // Copy the LSI before ActOnFinishFunctionBody removes it.
12920   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12921   // the call operator.
12922   auto LSICopy = *LSI;
12923   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12924                                     /*IsInstantiation*/ true);
12925   SavedContext.pop();
12926 
12927   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12928                                    &LSICopy);
12929 }
12930 
12931 template<typename Derived>
12932 StmtResult
12933 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12934   return TransformStmt(S);
12935 }
12936 
12937 template<typename Derived>
12938 StmtResult
12939 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12940   // Transform captures.
12941   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12942                                  CEnd = E->capture_end();
12943        C != CEnd; ++C) {
12944     // When we hit the first implicit capture, tell Sema that we've finished
12945     // the list of explicit captures.
12946     if (!C->isImplicit())
12947       continue;
12948 
12949     // Capturing 'this' is trivial.
12950     if (C->capturesThis()) {
12951       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12952                                     /*BuildAndDiagnose*/ true, nullptr,
12953                                     C->getCaptureKind() == LCK_StarThis);
12954       continue;
12955     }
12956     // Captured expression will be recaptured during captured variables
12957     // rebuilding.
12958     if (C->capturesVLAType())
12959       continue;
12960 
12961     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12962     assert(!E->isInitCapture(C) && "implicit init-capture?");
12963 
12964     // Transform the captured variable.
12965     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12966         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12967     if (!CapturedVar || CapturedVar->isInvalidDecl())
12968       return StmtError();
12969 
12970     // Capture the transformed variable.
12971     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12972   }
12973 
12974   return S;
12975 }
12976 
12977 template<typename Derived>
12978 ExprResult
12979 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12980                                                   CXXUnresolvedConstructExpr *E) {
12981   TypeSourceInfo *T =
12982       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12983   if (!T)
12984     return ExprError();
12985 
12986   bool ArgumentChanged = false;
12987   SmallVector<Expr*, 8> Args;
12988   Args.reserve(E->getNumArgs());
12989   {
12990     EnterExpressionEvaluationContext Context(
12991         getSema(), EnterExpressionEvaluationContext::InitList,
12992         E->isListInitialization());
12993     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
12994                                     &ArgumentChanged))
12995       return ExprError();
12996   }
12997 
12998   if (!getDerived().AlwaysRebuild() &&
12999       T == E->getTypeSourceInfo() &&
13000       !ArgumentChanged)
13001     return E;
13002 
13003   // FIXME: we're faking the locations of the commas
13004   return getDerived().RebuildCXXUnresolvedConstructExpr(
13005       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13006 }
13007 
13008 template<typename Derived>
13009 ExprResult
13010 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13011                                              CXXDependentScopeMemberExpr *E) {
13012   // Transform the base of the expression.
13013   ExprResult Base((Expr*) nullptr);
13014   Expr *OldBase;
13015   QualType BaseType;
13016   QualType ObjectType;
13017   if (!E->isImplicitAccess()) {
13018     OldBase = E->getBase();
13019     Base = getDerived().TransformExpr(OldBase);
13020     if (Base.isInvalid())
13021       return ExprError();
13022 
13023     // Start the member reference and compute the object's type.
13024     ParsedType ObjectTy;
13025     bool MayBePseudoDestructor = false;
13026     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13027                                                 E->getOperatorLoc(),
13028                                       E->isArrow()? tok::arrow : tok::period,
13029                                                 ObjectTy,
13030                                                 MayBePseudoDestructor);
13031     if (Base.isInvalid())
13032       return ExprError();
13033 
13034     ObjectType = ObjectTy.get();
13035     BaseType = ((Expr*) Base.get())->getType();
13036   } else {
13037     OldBase = nullptr;
13038     BaseType = getDerived().TransformType(E->getBaseType());
13039     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13040   }
13041 
13042   // Transform the first part of the nested-name-specifier that qualifies
13043   // the member name.
13044   NamedDecl *FirstQualifierInScope
13045     = getDerived().TransformFirstQualifierInScope(
13046                                             E->getFirstQualifierFoundInScope(),
13047                                             E->getQualifierLoc().getBeginLoc());
13048 
13049   NestedNameSpecifierLoc QualifierLoc;
13050   if (E->getQualifier()) {
13051     QualifierLoc
13052       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13053                                                      ObjectType,
13054                                                      FirstQualifierInScope);
13055     if (!QualifierLoc)
13056       return ExprError();
13057   }
13058 
13059   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13060 
13061   // TODO: If this is a conversion-function-id, verify that the
13062   // destination type name (if present) resolves the same way after
13063   // instantiation as it did in the local scope.
13064 
13065   DeclarationNameInfo NameInfo
13066     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13067   if (!NameInfo.getName())
13068     return ExprError();
13069 
13070   if (!E->hasExplicitTemplateArgs()) {
13071     // This is a reference to a member without an explicitly-specified
13072     // template argument list. Optimize for this common case.
13073     if (!getDerived().AlwaysRebuild() &&
13074         Base.get() == OldBase &&
13075         BaseType == E->getBaseType() &&
13076         QualifierLoc == E->getQualifierLoc() &&
13077         NameInfo.getName() == E->getMember() &&
13078         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13079       return E;
13080 
13081     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13082                                                        BaseType,
13083                                                        E->isArrow(),
13084                                                        E->getOperatorLoc(),
13085                                                        QualifierLoc,
13086                                                        TemplateKWLoc,
13087                                                        FirstQualifierInScope,
13088                                                        NameInfo,
13089                                                        /*TemplateArgs*/nullptr);
13090   }
13091 
13092   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13093   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13094                                               E->getNumTemplateArgs(),
13095                                               TransArgs))
13096     return ExprError();
13097 
13098   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13099                                                      BaseType,
13100                                                      E->isArrow(),
13101                                                      E->getOperatorLoc(),
13102                                                      QualifierLoc,
13103                                                      TemplateKWLoc,
13104                                                      FirstQualifierInScope,
13105                                                      NameInfo,
13106                                                      &TransArgs);
13107 }
13108 
13109 template<typename Derived>
13110 ExprResult
13111 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
13112   // Transform the base of the expression.
13113   ExprResult Base((Expr*) nullptr);
13114   QualType BaseType;
13115   if (!Old->isImplicitAccess()) {
13116     Base = getDerived().TransformExpr(Old->getBase());
13117     if (Base.isInvalid())
13118       return ExprError();
13119     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
13120                                                      Old->isArrow());
13121     if (Base.isInvalid())
13122       return ExprError();
13123     BaseType = Base.get()->getType();
13124   } else {
13125     BaseType = getDerived().TransformType(Old->getBaseType());
13126   }
13127 
13128   NestedNameSpecifierLoc QualifierLoc;
13129   if (Old->getQualifierLoc()) {
13130     QualifierLoc
13131     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13132     if (!QualifierLoc)
13133       return ExprError();
13134   }
13135 
13136   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13137 
13138   LookupResult R(SemaRef, Old->getMemberNameInfo(),
13139                  Sema::LookupOrdinaryName);
13140 
13141   // Transform the declaration set.
13142   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
13143     return ExprError();
13144 
13145   // Determine the naming class.
13146   if (Old->getNamingClass()) {
13147     CXXRecordDecl *NamingClass
13148       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
13149                                                           Old->getMemberLoc(),
13150                                                         Old->getNamingClass()));
13151     if (!NamingClass)
13152       return ExprError();
13153 
13154     R.setNamingClass(NamingClass);
13155   }
13156 
13157   TemplateArgumentListInfo TransArgs;
13158   if (Old->hasExplicitTemplateArgs()) {
13159     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13160     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13161     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
13162                                                 Old->getNumTemplateArgs(),
13163                                                 TransArgs))
13164       return ExprError();
13165   }
13166 
13167   // FIXME: to do this check properly, we will need to preserve the
13168   // first-qualifier-in-scope here, just in case we had a dependent
13169   // base (and therefore couldn't do the check) and a
13170   // nested-name-qualifier (and therefore could do the lookup).
13171   NamedDecl *FirstQualifierInScope = nullptr;
13172 
13173   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
13174                                                   BaseType,
13175                                                   Old->getOperatorLoc(),
13176                                                   Old->isArrow(),
13177                                                   QualifierLoc,
13178                                                   TemplateKWLoc,
13179                                                   FirstQualifierInScope,
13180                                                   R,
13181                                               (Old->hasExplicitTemplateArgs()
13182                                                   ? &TransArgs : nullptr));
13183 }
13184 
13185 template<typename Derived>
13186 ExprResult
13187 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13188   EnterExpressionEvaluationContext Unevaluated(
13189       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13190   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13191   if (SubExpr.isInvalid())
13192     return ExprError();
13193 
13194   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13195     return E;
13196 
13197   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13198 }
13199 
13200 template<typename Derived>
13201 ExprResult
13202 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13203   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13204   if (Pattern.isInvalid())
13205     return ExprError();
13206 
13207   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13208     return E;
13209 
13210   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13211                                            E->getNumExpansions());
13212 }
13213 
13214 template<typename Derived>
13215 ExprResult
13216 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13217   // If E is not value-dependent, then nothing will change when we transform it.
13218   // Note: This is an instantiation-centric view.
13219   if (!E->isValueDependent())
13220     return E;
13221 
13222   EnterExpressionEvaluationContext Unevaluated(
13223       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13224 
13225   ArrayRef<TemplateArgument> PackArgs;
13226   TemplateArgument ArgStorage;
13227 
13228   // Find the argument list to transform.
13229   if (E->isPartiallySubstituted()) {
13230     PackArgs = E->getPartialArguments();
13231   } else if (E->isValueDependent()) {
13232     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13233     bool ShouldExpand = false;
13234     bool RetainExpansion = false;
13235     Optional<unsigned> NumExpansions;
13236     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13237                                              Unexpanded,
13238                                              ShouldExpand, RetainExpansion,
13239                                              NumExpansions))
13240       return ExprError();
13241 
13242     // If we need to expand the pack, build a template argument from it and
13243     // expand that.
13244     if (ShouldExpand) {
13245       auto *Pack = E->getPack();
13246       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13247         ArgStorage = getSema().Context.getPackExpansionType(
13248             getSema().Context.getTypeDeclType(TTPD), None);
13249       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13250         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13251       } else {
13252         auto *VD = cast<ValueDecl>(Pack);
13253         ExprResult DRE = getSema().BuildDeclRefExpr(
13254             VD, VD->getType().getNonLValueExprType(getSema().Context),
13255             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
13256             E->getPackLoc());
13257         if (DRE.isInvalid())
13258           return ExprError();
13259         ArgStorage = new (getSema().Context) PackExpansionExpr(
13260             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13261       }
13262       PackArgs = ArgStorage;
13263     }
13264   }
13265 
13266   // If we're not expanding the pack, just transform the decl.
13267   if (!PackArgs.size()) {
13268     auto *Pack = cast_or_null<NamedDecl>(
13269         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13270     if (!Pack)
13271       return ExprError();
13272     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13273                                               E->getPackLoc(),
13274                                               E->getRParenLoc(), None, None);
13275   }
13276 
13277   // Try to compute the result without performing a partial substitution.
13278   Optional<unsigned> Result = 0;
13279   for (const TemplateArgument &Arg : PackArgs) {
13280     if (!Arg.isPackExpansion()) {
13281       Result = *Result + 1;
13282       continue;
13283     }
13284 
13285     TemplateArgumentLoc ArgLoc;
13286     InventTemplateArgumentLoc(Arg, ArgLoc);
13287 
13288     // Find the pattern of the pack expansion.
13289     SourceLocation Ellipsis;
13290     Optional<unsigned> OrigNumExpansions;
13291     TemplateArgumentLoc Pattern =
13292         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13293                                                           OrigNumExpansions);
13294 
13295     // Substitute under the pack expansion. Do not expand the pack (yet).
13296     TemplateArgumentLoc OutPattern;
13297     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13298     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13299                                                /*Uneval*/ true))
13300       return true;
13301 
13302     // See if we can determine the number of arguments from the result.
13303     Optional<unsigned> NumExpansions =
13304         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13305     if (!NumExpansions) {
13306       // No: we must be in an alias template expansion, and we're going to need
13307       // to actually expand the packs.
13308       Result = None;
13309       break;
13310     }
13311 
13312     Result = *Result + *NumExpansions;
13313   }
13314 
13315   // Common case: we could determine the number of expansions without
13316   // substituting.
13317   if (Result)
13318     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13319                                               E->getPackLoc(),
13320                                               E->getRParenLoc(), *Result, None);
13321 
13322   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13323                                                E->getPackLoc());
13324   {
13325     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13326     typedef TemplateArgumentLocInventIterator<
13327         Derived, const TemplateArgument*> PackLocIterator;
13328     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13329                                    PackLocIterator(*this, PackArgs.end()),
13330                                    TransformedPackArgs, /*Uneval*/true))
13331       return ExprError();
13332   }
13333 
13334   // Check whether we managed to fully-expand the pack.
13335   // FIXME: Is it possible for us to do so and not hit the early exit path?
13336   SmallVector<TemplateArgument, 8> Args;
13337   bool PartialSubstitution = false;
13338   for (auto &Loc : TransformedPackArgs.arguments()) {
13339     Args.push_back(Loc.getArgument());
13340     if (Loc.getArgument().isPackExpansion())
13341       PartialSubstitution = true;
13342   }
13343 
13344   if (PartialSubstitution)
13345     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13346                                               E->getPackLoc(),
13347                                               E->getRParenLoc(), None, Args);
13348 
13349   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13350                                             E->getPackLoc(), E->getRParenLoc(),
13351                                             Args.size(), None);
13352 }
13353 
13354 template<typename Derived>
13355 ExprResult
13356 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13357                                           SubstNonTypeTemplateParmPackExpr *E) {
13358   // Default behavior is to do nothing with this transformation.
13359   return E;
13360 }
13361 
13362 template<typename Derived>
13363 ExprResult
13364 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13365                                           SubstNonTypeTemplateParmExpr *E) {
13366   // Default behavior is to do nothing with this transformation.
13367   return E;
13368 }
13369 
13370 template<typename Derived>
13371 ExprResult
13372 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13373   // Default behavior is to do nothing with this transformation.
13374   return E;
13375 }
13376 
13377 template<typename Derived>
13378 ExprResult
13379 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13380                                                   MaterializeTemporaryExpr *E) {
13381   return getDerived().TransformExpr(E->getSubExpr());
13382 }
13383 
13384 template<typename Derived>
13385 ExprResult
13386 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13387   UnresolvedLookupExpr *Callee = nullptr;
13388   if (Expr *OldCallee = E->getCallee()) {
13389     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13390     if (CalleeResult.isInvalid())
13391       return ExprError();
13392     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13393   }
13394 
13395   Expr *Pattern = E->getPattern();
13396 
13397   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13398   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13399   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13400 
13401   // Determine whether the set of unexpanded parameter packs can and should
13402   // be expanded.
13403   bool Expand = true;
13404   bool RetainExpansion = false;
13405   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13406                      NumExpansions = OrigNumExpansions;
13407   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13408                                            Pattern->getSourceRange(),
13409                                            Unexpanded,
13410                                            Expand, RetainExpansion,
13411                                            NumExpansions))
13412     return true;
13413 
13414   if (!Expand) {
13415     // Do not expand any packs here, just transform and rebuild a fold
13416     // expression.
13417     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13418 
13419     ExprResult LHS =
13420         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13421     if (LHS.isInvalid())
13422       return true;
13423 
13424     ExprResult RHS =
13425         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13426     if (RHS.isInvalid())
13427       return true;
13428 
13429     if (!getDerived().AlwaysRebuild() &&
13430         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13431       return E;
13432 
13433     return getDerived().RebuildCXXFoldExpr(
13434         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13435         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13436   }
13437 
13438   // Formally a fold expression expands to nested parenthesized expressions.
13439   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13440   // them.
13441   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13442     SemaRef.Diag(E->getEllipsisLoc(),
13443                  clang::diag::err_fold_expression_limit_exceeded)
13444         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13445         << E->getSourceRange();
13446     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13447     return ExprError();
13448   }
13449 
13450   // The transform has determined that we should perform an elementwise
13451   // expansion of the pattern. Do so.
13452   ExprResult Result = getDerived().TransformExpr(E->getInit());
13453   if (Result.isInvalid())
13454     return true;
13455   bool LeftFold = E->isLeftFold();
13456 
13457   // If we're retaining an expansion for a right fold, it is the innermost
13458   // component and takes the init (if any).
13459   if (!LeftFold && RetainExpansion) {
13460     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13461 
13462     ExprResult Out = getDerived().TransformExpr(Pattern);
13463     if (Out.isInvalid())
13464       return true;
13465 
13466     Result = getDerived().RebuildCXXFoldExpr(
13467         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13468         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13469     if (Result.isInvalid())
13470       return true;
13471   }
13472 
13473   for (unsigned I = 0; I != *NumExpansions; ++I) {
13474     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13475         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13476     ExprResult Out = getDerived().TransformExpr(Pattern);
13477     if (Out.isInvalid())
13478       return true;
13479 
13480     if (Out.get()->containsUnexpandedParameterPack()) {
13481       // We still have a pack; retain a pack expansion for this slice.
13482       Result = getDerived().RebuildCXXFoldExpr(
13483           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13484           E->getOperator(), E->getEllipsisLoc(),
13485           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13486           OrigNumExpansions);
13487     } else if (Result.isUsable()) {
13488       // We've got down to a single element; build a binary operator.
13489       Expr *LHS = LeftFold ? Result.get() : Out.get();
13490       Expr *RHS = LeftFold ? Out.get() : Result.get();
13491       if (Callee)
13492         Result = getDerived().RebuildCXXOperatorCallExpr(
13493             BinaryOperator::getOverloadedOperator(E->getOperator()),
13494             E->getEllipsisLoc(), Callee, LHS, RHS);
13495       else
13496         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13497                                                     E->getOperator(), LHS, RHS);
13498     } else
13499       Result = Out;
13500 
13501     if (Result.isInvalid())
13502       return true;
13503   }
13504 
13505   // If we're retaining an expansion for a left fold, it is the outermost
13506   // component and takes the complete expansion so far as its init (if any).
13507   if (LeftFold && RetainExpansion) {
13508     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13509 
13510     ExprResult Out = getDerived().TransformExpr(Pattern);
13511     if (Out.isInvalid())
13512       return true;
13513 
13514     Result = getDerived().RebuildCXXFoldExpr(
13515         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13516         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13517     if (Result.isInvalid())
13518       return true;
13519   }
13520 
13521   // If we had no init and an empty pack, and we're not retaining an expansion,
13522   // then produce a fallback value or error.
13523   if (Result.isUnset())
13524     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13525                                                 E->getOperator());
13526 
13527   return Result;
13528 }
13529 
13530 template<typename Derived>
13531 ExprResult
13532 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13533     CXXStdInitializerListExpr *E) {
13534   return getDerived().TransformExpr(E->getSubExpr());
13535 }
13536 
13537 template<typename Derived>
13538 ExprResult
13539 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13540   return SemaRef.MaybeBindToTemporary(E);
13541 }
13542 
13543 template<typename Derived>
13544 ExprResult
13545 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13546   return E;
13547 }
13548 
13549 template<typename Derived>
13550 ExprResult
13551 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13552   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13553   if (SubExpr.isInvalid())
13554     return ExprError();
13555 
13556   if (!getDerived().AlwaysRebuild() &&
13557       SubExpr.get() == E->getSubExpr())
13558     return E;
13559 
13560   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13561 }
13562 
13563 template<typename Derived>
13564 ExprResult
13565 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13566   // Transform each of the elements.
13567   SmallVector<Expr *, 8> Elements;
13568   bool ArgChanged = false;
13569   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13570                                   /*IsCall=*/false, Elements, &ArgChanged))
13571     return ExprError();
13572 
13573   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13574     return SemaRef.MaybeBindToTemporary(E);
13575 
13576   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13577                                               Elements.data(),
13578                                               Elements.size());
13579 }
13580 
13581 template<typename Derived>
13582 ExprResult
13583 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13584                                                     ObjCDictionaryLiteral *E) {
13585   // Transform each of the elements.
13586   SmallVector<ObjCDictionaryElement, 8> Elements;
13587   bool ArgChanged = false;
13588   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13589     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13590 
13591     if (OrigElement.isPackExpansion()) {
13592       // This key/value element is a pack expansion.
13593       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13594       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13595       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13596       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13597 
13598       // Determine whether the set of unexpanded parameter packs can
13599       // and should be expanded.
13600       bool Expand = true;
13601       bool RetainExpansion = false;
13602       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13603       Optional<unsigned> NumExpansions = OrigNumExpansions;
13604       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13605                                OrigElement.Value->getEndLoc());
13606       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13607                                                PatternRange, Unexpanded, Expand,
13608                                                RetainExpansion, NumExpansions))
13609         return ExprError();
13610 
13611       if (!Expand) {
13612         // The transform has determined that we should perform a simple
13613         // transformation on the pack expansion, producing another pack
13614         // expansion.
13615         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13616         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13617         if (Key.isInvalid())
13618           return ExprError();
13619 
13620         if (Key.get() != OrigElement.Key)
13621           ArgChanged = true;
13622 
13623         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13624         if (Value.isInvalid())
13625           return ExprError();
13626 
13627         if (Value.get() != OrigElement.Value)
13628           ArgChanged = true;
13629 
13630         ObjCDictionaryElement Expansion = {
13631           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13632         };
13633         Elements.push_back(Expansion);
13634         continue;
13635       }
13636 
13637       // Record right away that the argument was changed.  This needs
13638       // to happen even if the array expands to nothing.
13639       ArgChanged = true;
13640 
13641       // The transform has determined that we should perform an elementwise
13642       // expansion of the pattern. Do so.
13643       for (unsigned I = 0; I != *NumExpansions; ++I) {
13644         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13645         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13646         if (Key.isInvalid())
13647           return ExprError();
13648 
13649         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13650         if (Value.isInvalid())
13651           return ExprError();
13652 
13653         ObjCDictionaryElement Element = {
13654           Key.get(), Value.get(), SourceLocation(), NumExpansions
13655         };
13656 
13657         // If any unexpanded parameter packs remain, we still have a
13658         // pack expansion.
13659         // FIXME: Can this really happen?
13660         if (Key.get()->containsUnexpandedParameterPack() ||
13661             Value.get()->containsUnexpandedParameterPack())
13662           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13663 
13664         Elements.push_back(Element);
13665       }
13666 
13667       // FIXME: Retain a pack expansion if RetainExpansion is true.
13668 
13669       // We've finished with this pack expansion.
13670       continue;
13671     }
13672 
13673     // Transform and check key.
13674     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13675     if (Key.isInvalid())
13676       return ExprError();
13677 
13678     if (Key.get() != OrigElement.Key)
13679       ArgChanged = true;
13680 
13681     // Transform and check value.
13682     ExprResult Value
13683       = getDerived().TransformExpr(OrigElement.Value);
13684     if (Value.isInvalid())
13685       return ExprError();
13686 
13687     if (Value.get() != OrigElement.Value)
13688       ArgChanged = true;
13689 
13690     ObjCDictionaryElement Element = {
13691       Key.get(), Value.get(), SourceLocation(), None
13692     };
13693     Elements.push_back(Element);
13694   }
13695 
13696   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13697     return SemaRef.MaybeBindToTemporary(E);
13698 
13699   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13700                                                    Elements);
13701 }
13702 
13703 template<typename Derived>
13704 ExprResult
13705 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13706   TypeSourceInfo *EncodedTypeInfo
13707     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13708   if (!EncodedTypeInfo)
13709     return ExprError();
13710 
13711   if (!getDerived().AlwaysRebuild() &&
13712       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13713     return E;
13714 
13715   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13716                                             EncodedTypeInfo,
13717                                             E->getRParenLoc());
13718 }
13719 
13720 template<typename Derived>
13721 ExprResult TreeTransform<Derived>::
13722 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13723   // This is a kind of implicit conversion, and it needs to get dropped
13724   // and recomputed for the same general reasons that ImplicitCastExprs
13725   // do, as well a more specific one: this expression is only valid when
13726   // it appears *immediately* as an argument expression.
13727   return getDerived().TransformExpr(E->getSubExpr());
13728 }
13729 
13730 template<typename Derived>
13731 ExprResult TreeTransform<Derived>::
13732 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13733   TypeSourceInfo *TSInfo
13734     = getDerived().TransformType(E->getTypeInfoAsWritten());
13735   if (!TSInfo)
13736     return ExprError();
13737 
13738   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13739   if (Result.isInvalid())
13740     return ExprError();
13741 
13742   if (!getDerived().AlwaysRebuild() &&
13743       TSInfo == E->getTypeInfoAsWritten() &&
13744       Result.get() == E->getSubExpr())
13745     return E;
13746 
13747   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13748                                       E->getBridgeKeywordLoc(), TSInfo,
13749                                       Result.get());
13750 }
13751 
13752 template <typename Derived>
13753 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13754     ObjCAvailabilityCheckExpr *E) {
13755   return E;
13756 }
13757 
13758 template<typename Derived>
13759 ExprResult
13760 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13761   // Transform arguments.
13762   bool ArgChanged = false;
13763   SmallVector<Expr*, 8> Args;
13764   Args.reserve(E->getNumArgs());
13765   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13766                                   &ArgChanged))
13767     return ExprError();
13768 
13769   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13770     // Class message: transform the receiver type.
13771     TypeSourceInfo *ReceiverTypeInfo
13772       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13773     if (!ReceiverTypeInfo)
13774       return ExprError();
13775 
13776     // If nothing changed, just retain the existing message send.
13777     if (!getDerived().AlwaysRebuild() &&
13778         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13779       return SemaRef.MaybeBindToTemporary(E);
13780 
13781     // Build a new class message send.
13782     SmallVector<SourceLocation, 16> SelLocs;
13783     E->getSelectorLocs(SelLocs);
13784     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13785                                                E->getSelector(),
13786                                                SelLocs,
13787                                                E->getMethodDecl(),
13788                                                E->getLeftLoc(),
13789                                                Args,
13790                                                E->getRightLoc());
13791   }
13792   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13793            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13794     if (!E->getMethodDecl())
13795       return ExprError();
13796 
13797     // Build a new class message send to 'super'.
13798     SmallVector<SourceLocation, 16> SelLocs;
13799     E->getSelectorLocs(SelLocs);
13800     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13801                                                E->getSelector(),
13802                                                SelLocs,
13803                                                E->getReceiverType(),
13804                                                E->getMethodDecl(),
13805                                                E->getLeftLoc(),
13806                                                Args,
13807                                                E->getRightLoc());
13808   }
13809 
13810   // Instance message: transform the receiver
13811   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13812          "Only class and instance messages may be instantiated");
13813   ExprResult Receiver
13814     = getDerived().TransformExpr(E->getInstanceReceiver());
13815   if (Receiver.isInvalid())
13816     return ExprError();
13817 
13818   // If nothing changed, just retain the existing message send.
13819   if (!getDerived().AlwaysRebuild() &&
13820       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13821     return SemaRef.MaybeBindToTemporary(E);
13822 
13823   // Build a new instance message send.
13824   SmallVector<SourceLocation, 16> SelLocs;
13825   E->getSelectorLocs(SelLocs);
13826   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13827                                              E->getSelector(),
13828                                              SelLocs,
13829                                              E->getMethodDecl(),
13830                                              E->getLeftLoc(),
13831                                              Args,
13832                                              E->getRightLoc());
13833 }
13834 
13835 template<typename Derived>
13836 ExprResult
13837 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13838   return E;
13839 }
13840 
13841 template<typename Derived>
13842 ExprResult
13843 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13844   return E;
13845 }
13846 
13847 template<typename Derived>
13848 ExprResult
13849 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13850   // Transform the base expression.
13851   ExprResult Base = getDerived().TransformExpr(E->getBase());
13852   if (Base.isInvalid())
13853     return ExprError();
13854 
13855   // We don't need to transform the ivar; it will never change.
13856 
13857   // If nothing changed, just retain the existing expression.
13858   if (!getDerived().AlwaysRebuild() &&
13859       Base.get() == E->getBase())
13860     return E;
13861 
13862   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13863                                              E->getLocation(),
13864                                              E->isArrow(), E->isFreeIvar());
13865 }
13866 
13867 template<typename Derived>
13868 ExprResult
13869 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13870   // 'super' and types never change. Property never changes. Just
13871   // retain the existing expression.
13872   if (!E->isObjectReceiver())
13873     return E;
13874 
13875   // Transform the base expression.
13876   ExprResult Base = getDerived().TransformExpr(E->getBase());
13877   if (Base.isInvalid())
13878     return ExprError();
13879 
13880   // We don't need to transform the property; it will never change.
13881 
13882   // If nothing changed, just retain the existing expression.
13883   if (!getDerived().AlwaysRebuild() &&
13884       Base.get() == E->getBase())
13885     return E;
13886 
13887   if (E->isExplicitProperty())
13888     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13889                                                    E->getExplicitProperty(),
13890                                                    E->getLocation());
13891 
13892   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13893                                                  SemaRef.Context.PseudoObjectTy,
13894                                                  E->getImplicitPropertyGetter(),
13895                                                  E->getImplicitPropertySetter(),
13896                                                  E->getLocation());
13897 }
13898 
13899 template<typename Derived>
13900 ExprResult
13901 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13902   // Transform the base expression.
13903   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13904   if (Base.isInvalid())
13905     return ExprError();
13906 
13907   // Transform the key expression.
13908   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13909   if (Key.isInvalid())
13910     return ExprError();
13911 
13912   // If nothing changed, just retain the existing expression.
13913   if (!getDerived().AlwaysRebuild() &&
13914       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13915     return E;
13916 
13917   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13918                                                   Base.get(), Key.get(),
13919                                                   E->getAtIndexMethodDecl(),
13920                                                   E->setAtIndexMethodDecl());
13921 }
13922 
13923 template<typename Derived>
13924 ExprResult
13925 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13926   // Transform the base expression.
13927   ExprResult Base = getDerived().TransformExpr(E->getBase());
13928   if (Base.isInvalid())
13929     return ExprError();
13930 
13931   // If nothing changed, just retain the existing expression.
13932   if (!getDerived().AlwaysRebuild() &&
13933       Base.get() == E->getBase())
13934     return E;
13935 
13936   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13937                                          E->getOpLoc(),
13938                                          E->isArrow());
13939 }
13940 
13941 template<typename Derived>
13942 ExprResult
13943 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13944   bool ArgumentChanged = false;
13945   SmallVector<Expr*, 8> SubExprs;
13946   SubExprs.reserve(E->getNumSubExprs());
13947   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13948                                   SubExprs, &ArgumentChanged))
13949     return ExprError();
13950 
13951   if (!getDerived().AlwaysRebuild() &&
13952       !ArgumentChanged)
13953     return E;
13954 
13955   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13956                                                SubExprs,
13957                                                E->getRParenLoc());
13958 }
13959 
13960 template<typename Derived>
13961 ExprResult
13962 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13963   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13964   if (SrcExpr.isInvalid())
13965     return ExprError();
13966 
13967   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13968   if (!Type)
13969     return ExprError();
13970 
13971   if (!getDerived().AlwaysRebuild() &&
13972       Type == E->getTypeSourceInfo() &&
13973       SrcExpr.get() == E->getSrcExpr())
13974     return E;
13975 
13976   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13977                                                SrcExpr.get(), Type,
13978                                                E->getRParenLoc());
13979 }
13980 
13981 template<typename Derived>
13982 ExprResult
13983 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13984   BlockDecl *oldBlock = E->getBlockDecl();
13985 
13986   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13987   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13988 
13989   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13990   blockScope->TheDecl->setBlockMissingReturnType(
13991                          oldBlock->blockMissingReturnType());
13992 
13993   SmallVector<ParmVarDecl*, 4> params;
13994   SmallVector<QualType, 4> paramTypes;
13995 
13996   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13997 
13998   // Parameter substitution.
13999   Sema::ExtParameterInfoBuilder extParamInfos;
14000   if (getDerived().TransformFunctionTypeParams(
14001           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14002           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14003           extParamInfos)) {
14004     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14005     return ExprError();
14006   }
14007 
14008   QualType exprResultType =
14009       getDerived().TransformType(exprFunctionType->getReturnType());
14010 
14011   auto epi = exprFunctionType->getExtProtoInfo();
14012   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14013 
14014   QualType functionType =
14015     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14016   blockScope->FunctionType = functionType;
14017 
14018   // Set the parameters on the block decl.
14019   if (!params.empty())
14020     blockScope->TheDecl->setParams(params);
14021 
14022   if (!oldBlock->blockMissingReturnType()) {
14023     blockScope->HasImplicitReturnType = false;
14024     blockScope->ReturnType = exprResultType;
14025   }
14026 
14027   // Transform the body
14028   StmtResult body = getDerived().TransformStmt(E->getBody());
14029   if (body.isInvalid()) {
14030     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14031     return ExprError();
14032   }
14033 
14034 #ifndef NDEBUG
14035   // In builds with assertions, make sure that we captured everything we
14036   // captured before.
14037   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14038     for (const auto &I : oldBlock->captures()) {
14039       VarDecl *oldCapture = I.getVariable();
14040 
14041       // Ignore parameter packs.
14042       if (oldCapture->isParameterPack())
14043         continue;
14044 
14045       VarDecl *newCapture =
14046         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14047                                                  oldCapture));
14048       assert(blockScope->CaptureMap.count(newCapture));
14049     }
14050     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14051   }
14052 #endif
14053 
14054   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14055                                     /*Scope=*/nullptr);
14056 }
14057 
14058 template<typename Derived>
14059 ExprResult
14060 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14061   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14062   if (SrcExpr.isInvalid())
14063     return ExprError();
14064 
14065   QualType Type = getDerived().TransformType(E->getType());
14066 
14067   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14068                                  E->getRParenLoc());
14069 }
14070 
14071 template<typename Derived>
14072 ExprResult
14073 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14074   bool ArgumentChanged = false;
14075   SmallVector<Expr*, 8> SubExprs;
14076   SubExprs.reserve(E->getNumSubExprs());
14077   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14078                                   SubExprs, &ArgumentChanged))
14079     return ExprError();
14080 
14081   if (!getDerived().AlwaysRebuild() &&
14082       !ArgumentChanged)
14083     return E;
14084 
14085   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14086                                         E->getOp(), E->getRParenLoc());
14087 }
14088 
14089 //===----------------------------------------------------------------------===//
14090 // Type reconstruction
14091 //===----------------------------------------------------------------------===//
14092 
14093 template<typename Derived>
14094 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14095                                                     SourceLocation Star) {
14096   return SemaRef.BuildPointerType(PointeeType, Star,
14097                                   getDerived().getBaseEntity());
14098 }
14099 
14100 template<typename Derived>
14101 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14102                                                          SourceLocation Star) {
14103   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14104                                        getDerived().getBaseEntity());
14105 }
14106 
14107 template<typename Derived>
14108 QualType
14109 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14110                                              bool WrittenAsLValue,
14111                                              SourceLocation Sigil) {
14112   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14113                                     Sigil, getDerived().getBaseEntity());
14114 }
14115 
14116 template<typename Derived>
14117 QualType
14118 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14119                                                  QualType ClassType,
14120                                                  SourceLocation Sigil) {
14121   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14122                                         getDerived().getBaseEntity());
14123 }
14124 
14125 template<typename Derived>
14126 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14127            const ObjCTypeParamDecl *Decl,
14128            SourceLocation ProtocolLAngleLoc,
14129            ArrayRef<ObjCProtocolDecl *> Protocols,
14130            ArrayRef<SourceLocation> ProtocolLocs,
14131            SourceLocation ProtocolRAngleLoc) {
14132   return SemaRef.BuildObjCTypeParamType(Decl,
14133                                         ProtocolLAngleLoc, Protocols,
14134                                         ProtocolLocs, ProtocolRAngleLoc,
14135                                         /*FailOnError=*/true);
14136 }
14137 
14138 template<typename Derived>
14139 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14140            QualType BaseType,
14141            SourceLocation Loc,
14142            SourceLocation TypeArgsLAngleLoc,
14143            ArrayRef<TypeSourceInfo *> TypeArgs,
14144            SourceLocation TypeArgsRAngleLoc,
14145            SourceLocation ProtocolLAngleLoc,
14146            ArrayRef<ObjCProtocolDecl *> Protocols,
14147            ArrayRef<SourceLocation> ProtocolLocs,
14148            SourceLocation ProtocolRAngleLoc) {
14149   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14150                                      TypeArgs, TypeArgsRAngleLoc,
14151                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14152                                      ProtocolRAngleLoc,
14153                                      /*FailOnError=*/true);
14154 }
14155 
14156 template<typename Derived>
14157 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14158            QualType PointeeType,
14159            SourceLocation Star) {
14160   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14161 }
14162 
14163 template<typename Derived>
14164 QualType
14165 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14166                                          ArrayType::ArraySizeModifier SizeMod,
14167                                          const llvm::APInt *Size,
14168                                          Expr *SizeExpr,
14169                                          unsigned IndexTypeQuals,
14170                                          SourceRange BracketsRange) {
14171   if (SizeExpr || !Size)
14172     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14173                                   IndexTypeQuals, BracketsRange,
14174                                   getDerived().getBaseEntity());
14175 
14176   QualType Types[] = {
14177     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14178     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14179     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14180   };
14181   const unsigned NumTypes = llvm::array_lengthof(Types);
14182   QualType SizeType;
14183   for (unsigned I = 0; I != NumTypes; ++I)
14184     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14185       SizeType = Types[I];
14186       break;
14187     }
14188 
14189   // Note that we can return a VariableArrayType here in the case where
14190   // the element type was a dependent VariableArrayType.
14191   IntegerLiteral *ArraySize
14192       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14193                                /*FIXME*/BracketsRange.getBegin());
14194   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14195                                 IndexTypeQuals, BracketsRange,
14196                                 getDerived().getBaseEntity());
14197 }
14198 
14199 template<typename Derived>
14200 QualType
14201 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14202                                                  ArrayType::ArraySizeModifier SizeMod,
14203                                                  const llvm::APInt &Size,
14204                                                  Expr *SizeExpr,
14205                                                  unsigned IndexTypeQuals,
14206                                                  SourceRange BracketsRange) {
14207   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14208                                         IndexTypeQuals, BracketsRange);
14209 }
14210 
14211 template<typename Derived>
14212 QualType
14213 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14214                                           ArrayType::ArraySizeModifier SizeMod,
14215                                                  unsigned IndexTypeQuals,
14216                                                    SourceRange BracketsRange) {
14217   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14218                                        IndexTypeQuals, BracketsRange);
14219 }
14220 
14221 template<typename Derived>
14222 QualType
14223 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14224                                           ArrayType::ArraySizeModifier SizeMod,
14225                                                  Expr *SizeExpr,
14226                                                  unsigned IndexTypeQuals,
14227                                                  SourceRange BracketsRange) {
14228   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14229                                        SizeExpr,
14230                                        IndexTypeQuals, BracketsRange);
14231 }
14232 
14233 template<typename Derived>
14234 QualType
14235 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14236                                           ArrayType::ArraySizeModifier SizeMod,
14237                                                        Expr *SizeExpr,
14238                                                        unsigned IndexTypeQuals,
14239                                                    SourceRange BracketsRange) {
14240   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14241                                        SizeExpr,
14242                                        IndexTypeQuals, BracketsRange);
14243 }
14244 
14245 template <typename Derived>
14246 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14247     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14248   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14249                                           AttributeLoc);
14250 }
14251 
14252 template <typename Derived>
14253 QualType
14254 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14255                                           unsigned NumElements,
14256                                           VectorType::VectorKind VecKind) {
14257   // FIXME: semantic checking!
14258   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14259 }
14260 
14261 template <typename Derived>
14262 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14263     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14264     VectorType::VectorKind VecKind) {
14265   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14266 }
14267 
14268 template<typename Derived>
14269 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14270                                                       unsigned NumElements,
14271                                                  SourceLocation AttributeLoc) {
14272   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14273                           NumElements, true);
14274   IntegerLiteral *VectorSize
14275     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14276                              AttributeLoc);
14277   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14278 }
14279 
14280 template<typename Derived>
14281 QualType
14282 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14283                                                            Expr *SizeExpr,
14284                                                   SourceLocation AttributeLoc) {
14285   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14286 }
14287 
14288 template <typename Derived>
14289 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14290     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14291   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14292                                                NumColumns);
14293 }
14294 
14295 template <typename Derived>
14296 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14297     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14298     SourceLocation AttributeLoc) {
14299   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14300                                  AttributeLoc);
14301 }
14302 
14303 template<typename Derived>
14304 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14305     QualType T,
14306     MutableArrayRef<QualType> ParamTypes,
14307     const FunctionProtoType::ExtProtoInfo &EPI) {
14308   return SemaRef.BuildFunctionType(T, ParamTypes,
14309                                    getDerived().getBaseLocation(),
14310                                    getDerived().getBaseEntity(),
14311                                    EPI);
14312 }
14313 
14314 template<typename Derived>
14315 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14316   return SemaRef.Context.getFunctionNoProtoType(T);
14317 }
14318 
14319 template<typename Derived>
14320 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14321                                                             Decl *D) {
14322   assert(D && "no decl found");
14323   if (D->isInvalidDecl()) return QualType();
14324 
14325   // FIXME: Doesn't account for ObjCInterfaceDecl!
14326   TypeDecl *Ty;
14327   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14328     // A valid resolved using typename pack expansion decl can have multiple
14329     // UsingDecls, but they must each have exactly one type, and it must be
14330     // the same type in every case. But we must have at least one expansion!
14331     if (UPD->expansions().empty()) {
14332       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14333           << UPD->isCXXClassMember() << UPD;
14334       return QualType();
14335     }
14336 
14337     // We might still have some unresolved types. Try to pick a resolved type
14338     // if we can. The final instantiation will check that the remaining
14339     // unresolved types instantiate to the type we pick.
14340     QualType FallbackT;
14341     QualType T;
14342     for (auto *E : UPD->expansions()) {
14343       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14344       if (ThisT.isNull())
14345         continue;
14346       else if (ThisT->getAs<UnresolvedUsingType>())
14347         FallbackT = ThisT;
14348       else if (T.isNull())
14349         T = ThisT;
14350       else
14351         assert(getSema().Context.hasSameType(ThisT, T) &&
14352                "mismatched resolved types in using pack expansion");
14353     }
14354     return T.isNull() ? FallbackT : T;
14355   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14356     assert(Using->hasTypename() &&
14357            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14358 
14359     // A valid resolved using typename decl points to exactly one type decl.
14360     assert(++Using->shadow_begin() == Using->shadow_end());
14361     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
14362   } else {
14363     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14364            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14365     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14366   }
14367 
14368   return SemaRef.Context.getTypeDeclType(Ty);
14369 }
14370 
14371 template<typename Derived>
14372 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14373                                                        SourceLocation Loc) {
14374   return SemaRef.BuildTypeofExprType(E, Loc);
14375 }
14376 
14377 template<typename Derived>
14378 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14379   return SemaRef.Context.getTypeOfType(Underlying);
14380 }
14381 
14382 template<typename Derived>
14383 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14384                                                      SourceLocation Loc) {
14385   return SemaRef.BuildDecltypeType(E, Loc);
14386 }
14387 
14388 template<typename Derived>
14389 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14390                                             UnaryTransformType::UTTKind UKind,
14391                                             SourceLocation Loc) {
14392   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14393 }
14394 
14395 template<typename Derived>
14396 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14397                                                       TemplateName Template,
14398                                              SourceLocation TemplateNameLoc,
14399                                      TemplateArgumentListInfo &TemplateArgs) {
14400   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14401 }
14402 
14403 template<typename Derived>
14404 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14405                                                    SourceLocation KWLoc) {
14406   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14407 }
14408 
14409 template<typename Derived>
14410 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14411                                                  SourceLocation KWLoc,
14412                                                  bool isReadPipe) {
14413   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14414                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14415 }
14416 
14417 template <typename Derived>
14418 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14419                                                    unsigned NumBits,
14420                                                    SourceLocation Loc) {
14421   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14422                         NumBits, true);
14423   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14424                                                 SemaRef.Context.IntTy, Loc);
14425   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14426 }
14427 
14428 template <typename Derived>
14429 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14430     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14431   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14432 }
14433 
14434 template<typename Derived>
14435 TemplateName
14436 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14437                                             bool TemplateKW,
14438                                             TemplateDecl *Template) {
14439   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14440                                                   Template);
14441 }
14442 
14443 template<typename Derived>
14444 TemplateName
14445 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14446                                             SourceLocation TemplateKWLoc,
14447                                             const IdentifierInfo &Name,
14448                                             SourceLocation NameLoc,
14449                                             QualType ObjectType,
14450                                             NamedDecl *FirstQualifierInScope,
14451                                             bool AllowInjectedClassName) {
14452   UnqualifiedId TemplateName;
14453   TemplateName.setIdentifier(&Name, NameLoc);
14454   Sema::TemplateTy Template;
14455   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14456                               TemplateName, ParsedType::make(ObjectType),
14457                               /*EnteringContext=*/false, Template,
14458                               AllowInjectedClassName);
14459   return Template.get();
14460 }
14461 
14462 template<typename Derived>
14463 TemplateName
14464 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14465                                             SourceLocation TemplateKWLoc,
14466                                             OverloadedOperatorKind Operator,
14467                                             SourceLocation NameLoc,
14468                                             QualType ObjectType,
14469                                             bool AllowInjectedClassName) {
14470   UnqualifiedId Name;
14471   // FIXME: Bogus location information.
14472   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14473   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14474   Sema::TemplateTy Template;
14475   getSema().ActOnTemplateName(
14476       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14477       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14478   return Template.get();
14479 }
14480 
14481 template<typename Derived>
14482 ExprResult
14483 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14484                                                    SourceLocation OpLoc,
14485                                                    Expr *OrigCallee,
14486                                                    Expr *First,
14487                                                    Expr *Second) {
14488   Expr *Callee = OrigCallee->IgnoreParenCasts();
14489   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14490 
14491   if (First->getObjectKind() == OK_ObjCProperty) {
14492     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14493     if (BinaryOperator::isAssignmentOp(Opc))
14494       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14495                                                  First, Second);
14496     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14497     if (Result.isInvalid())
14498       return ExprError();
14499     First = Result.get();
14500   }
14501 
14502   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14503     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14504     if (Result.isInvalid())
14505       return ExprError();
14506     Second = Result.get();
14507   }
14508 
14509   // Determine whether this should be a builtin operation.
14510   if (Op == OO_Subscript) {
14511     if (!First->getType()->isOverloadableType() &&
14512         !Second->getType()->isOverloadableType())
14513       return getSema().CreateBuiltinArraySubscriptExpr(
14514           First, Callee->getBeginLoc(), Second, OpLoc);
14515   } else if (Op == OO_Arrow) {
14516     // -> is never a builtin operation.
14517     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14518   } else if (Second == nullptr || isPostIncDec) {
14519     if (!First->getType()->isOverloadableType() ||
14520         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14521       // The argument is not of overloadable type, or this is an expression
14522       // of the form &Class::member, so try to create a built-in unary
14523       // operation.
14524       UnaryOperatorKind Opc
14525         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14526 
14527       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14528     }
14529   } else {
14530     if (!First->getType()->isOverloadableType() &&
14531         !Second->getType()->isOverloadableType()) {
14532       // Neither of the arguments is an overloadable type, so try to
14533       // create a built-in binary operation.
14534       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14535       ExprResult Result
14536         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14537       if (Result.isInvalid())
14538         return ExprError();
14539 
14540       return Result;
14541     }
14542   }
14543 
14544   // Compute the transformed set of functions (and function templates) to be
14545   // used during overload resolution.
14546   UnresolvedSet<16> Functions;
14547   bool RequiresADL;
14548 
14549   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14550     Functions.append(ULE->decls_begin(), ULE->decls_end());
14551     // If the overload could not be resolved in the template definition
14552     // (because we had a dependent argument), ADL is performed as part of
14553     // template instantiation.
14554     RequiresADL = ULE->requiresADL();
14555   } else {
14556     // If we've resolved this to a particular non-member function, just call
14557     // that function. If we resolved it to a member function,
14558     // CreateOverloaded* will find that function for us.
14559     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14560     if (!isa<CXXMethodDecl>(ND))
14561       Functions.addDecl(ND);
14562     RequiresADL = false;
14563   }
14564 
14565   // Add any functions found via argument-dependent lookup.
14566   Expr *Args[2] = { First, Second };
14567   unsigned NumArgs = 1 + (Second != nullptr);
14568 
14569   // Create the overloaded operator invocation for unary operators.
14570   if (NumArgs == 1 || isPostIncDec) {
14571     UnaryOperatorKind Opc
14572       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14573     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14574                                            RequiresADL);
14575   }
14576 
14577   if (Op == OO_Subscript) {
14578     SourceLocation LBrace;
14579     SourceLocation RBrace;
14580 
14581     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14582       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14583       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14584       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14585     } else {
14586       LBrace = Callee->getBeginLoc();
14587       RBrace = OpLoc;
14588     }
14589 
14590     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14591                                                       First, Second);
14592   }
14593 
14594   // Create the overloaded operator invocation for binary operators.
14595   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14596   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14597       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14598   if (Result.isInvalid())
14599     return ExprError();
14600 
14601   return Result;
14602 }
14603 
14604 template<typename Derived>
14605 ExprResult
14606 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14607                                                      SourceLocation OperatorLoc,
14608                                                        bool isArrow,
14609                                                        CXXScopeSpec &SS,
14610                                                      TypeSourceInfo *ScopeType,
14611                                                        SourceLocation CCLoc,
14612                                                        SourceLocation TildeLoc,
14613                                         PseudoDestructorTypeStorage Destroyed) {
14614   QualType BaseType = Base->getType();
14615   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14616       (!isArrow && !BaseType->getAs<RecordType>()) ||
14617       (isArrow && BaseType->getAs<PointerType>() &&
14618        !BaseType->castAs<PointerType>()->getPointeeType()
14619                                               ->template getAs<RecordType>())){
14620     // This pseudo-destructor expression is still a pseudo-destructor.
14621     return SemaRef.BuildPseudoDestructorExpr(
14622         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14623         CCLoc, TildeLoc, Destroyed);
14624   }
14625 
14626   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14627   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14628                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14629   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14630   NameInfo.setNamedTypeInfo(DestroyedType);
14631 
14632   // The scope type is now known to be a valid nested name specifier
14633   // component. Tack it on to the end of the nested name specifier.
14634   if (ScopeType) {
14635     if (!ScopeType->getType()->getAs<TagType>()) {
14636       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14637                      diag::err_expected_class_or_namespace)
14638           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14639       return ExprError();
14640     }
14641     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14642               CCLoc);
14643   }
14644 
14645   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14646   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14647                                             OperatorLoc, isArrow,
14648                                             SS, TemplateKWLoc,
14649                                             /*FIXME: FirstQualifier*/ nullptr,
14650                                             NameInfo,
14651                                             /*TemplateArgs*/ nullptr,
14652                                             /*S*/nullptr);
14653 }
14654 
14655 template<typename Derived>
14656 StmtResult
14657 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14658   SourceLocation Loc = S->getBeginLoc();
14659   CapturedDecl *CD = S->getCapturedDecl();
14660   unsigned NumParams = CD->getNumParams();
14661   unsigned ContextParamPos = CD->getContextParamPosition();
14662   SmallVector<Sema::CapturedParamNameType, 4> Params;
14663   for (unsigned I = 0; I < NumParams; ++I) {
14664     if (I != ContextParamPos) {
14665       Params.push_back(
14666              std::make_pair(
14667                   CD->getParam(I)->getName(),
14668                   getDerived().TransformType(CD->getParam(I)->getType())));
14669     } else {
14670       Params.push_back(std::make_pair(StringRef(), QualType()));
14671     }
14672   }
14673   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14674                                      S->getCapturedRegionKind(), Params);
14675   StmtResult Body;
14676   {
14677     Sema::CompoundScopeRAII CompoundScope(getSema());
14678     Body = getDerived().TransformStmt(S->getCapturedStmt());
14679   }
14680 
14681   if (Body.isInvalid()) {
14682     getSema().ActOnCapturedRegionError();
14683     return StmtError();
14684   }
14685 
14686   return getSema().ActOnCapturedRegionEnd(Body.get());
14687 }
14688 
14689 } // end namespace clang
14690 
14691 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14692