]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Sema/TreeTransform.h
Merge llvm, clang, lld and lldb release_40 branch r292009. Also update
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / Sema / TreeTransform.h
1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file implements a semantic tree transformation that takes a given
10 //  AST and rebuilds it, possibly transforming some nodes in the process.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
16
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/ExprCXX.h"
23 #include "clang/AST/ExprObjC.h"
24 #include "clang/AST/ExprOpenMP.h"
25 #include "clang/AST/Stmt.h"
26 #include "clang/AST/StmtCXX.h"
27 #include "clang/AST/StmtObjC.h"
28 #include "clang/AST/StmtOpenMP.h"
29 #include "clang/Sema/Designator.h"
30 #include "clang/Sema/Lookup.h"
31 #include "clang/Sema/Ownership.h"
32 #include "clang/Sema/ParsedTemplate.h"
33 #include "clang/Sema/ScopeInfo.h"
34 #include "clang/Sema/SemaDiagnostic.h"
35 #include "clang/Sema/SemaInternal.h"
36 #include "llvm/ADT/ArrayRef.h"
37 #include "llvm/Support/ErrorHandling.h"
38 #include <algorithm>
39
40 namespace clang {
41 using namespace sema;
42
43 /// \brief A semantic tree transformation that allows one to transform one
44 /// abstract syntax tree into another.
45 ///
46 /// A new tree transformation is defined by creating a new subclass \c X of
47 /// \c TreeTransform<X> and then overriding certain operations to provide
48 /// behavior specific to that transformation. For example, template
49 /// instantiation is implemented as a tree transformation where the
50 /// transformation of TemplateTypeParmType nodes involves substituting the
51 /// template arguments for their corresponding template parameters; a similar
52 /// transformation is performed for non-type template parameters and
53 /// template template parameters.
54 ///
55 /// This tree-transformation template uses static polymorphism to allow
56 /// subclasses to customize any of its operations. Thus, a subclass can
57 /// override any of the transformation or rebuild operators by providing an
58 /// operation with the same signature as the default implementation. The
59 /// overridding function should not be virtual.
60 ///
61 /// Semantic tree transformations are split into two stages, either of which
62 /// can be replaced by a subclass. The "transform" step transforms an AST node
63 /// or the parts of an AST node using the various transformation functions,
64 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
65 /// node of the appropriate kind from the pieces. The default transformation
66 /// routines recursively transform the operands to composite AST nodes (e.g.,
67 /// the pointee type of a PointerType node) and, if any of those operand nodes
68 /// were changed by the transformation, invokes the rebuild operation to create
69 /// a new AST node.
70 ///
71 /// Subclasses can customize the transformation at various levels. The
72 /// most coarse-grained transformations involve replacing TransformType(),
73 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
74 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
75 /// new implementations.
76 ///
77 /// For more fine-grained transformations, subclasses can replace any of the
78 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
79 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
80 /// replacing TransformTemplateTypeParmType() allows template instantiation
81 /// to substitute template arguments for their corresponding template
82 /// parameters. Additionally, subclasses can override the \c RebuildXXX
83 /// functions to control how AST nodes are rebuilt when their operands change.
84 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
85 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
86 /// be able to use more efficient rebuild steps.
87 ///
88 /// There are a handful of other functions that can be overridden, allowing one
89 /// to avoid traversing nodes that don't need any transformation
90 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
91 /// operands have not changed (\c AlwaysRebuild()), and customize the
92 /// default locations and entity names used for type-checking
93 /// (\c getBaseLocation(), \c getBaseEntity()).
94 template<typename Derived>
95 class TreeTransform {
96   /// \brief Private RAII object that helps us forget and then re-remember
97   /// the template argument corresponding to a partially-substituted parameter
98   /// pack.
99   class ForgetPartiallySubstitutedPackRAII {
100     Derived &Self;
101     TemplateArgument Old;
102
103   public:
104     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
105       Old = Self.ForgetPartiallySubstitutedPack();
106     }
107
108     ~ForgetPartiallySubstitutedPackRAII() {
109       Self.RememberPartiallySubstitutedPack(Old);
110     }
111   };
112
113 protected:
114   Sema &SemaRef;
115
116   /// \brief The set of local declarations that have been transformed, for
117   /// cases where we are forced to build new declarations within the transformer
118   /// rather than in the subclass (e.g., lambda closure types).
119   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
120
121 public:
122   /// \brief Initializes a new tree transformer.
123   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
124
125   /// \brief Retrieves a reference to the derived class.
126   Derived &getDerived() { return static_cast<Derived&>(*this); }
127
128   /// \brief Retrieves a reference to the derived class.
129   const Derived &getDerived() const {
130     return static_cast<const Derived&>(*this);
131   }
132
133   static inline ExprResult Owned(Expr *E) { return E; }
134   static inline StmtResult Owned(Stmt *S) { return S; }
135
136   /// \brief Retrieves a reference to the semantic analysis object used for
137   /// this tree transform.
138   Sema &getSema() const { return SemaRef; }
139
140   /// \brief Whether the transformation should always rebuild AST nodes, even
141   /// if none of the children have changed.
142   ///
143   /// Subclasses may override this function to specify when the transformation
144   /// should rebuild all AST nodes.
145   ///
146   /// We must always rebuild all AST nodes when performing variadic template
147   /// pack expansion, in order to avoid violating the AST invariant that each
148   /// statement node appears at most once in its containing declaration.
149   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
150
151   /// \brief Returns the location of the entity being transformed, if that
152   /// information was not available elsewhere in the AST.
153   ///
154   /// By default, returns no source-location information. Subclasses can
155   /// provide an alternative implementation that provides better location
156   /// information.
157   SourceLocation getBaseLocation() { return SourceLocation(); }
158
159   /// \brief Returns the name of the entity being transformed, if that
160   /// information was not available elsewhere in the AST.
161   ///
162   /// By default, returns an empty name. Subclasses can provide an alternative
163   /// implementation with a more precise name.
164   DeclarationName getBaseEntity() { return DeclarationName(); }
165
166   /// \brief Sets the "base" location and entity when that
167   /// information is known based on another transformation.
168   ///
169   /// By default, the source location and entity are ignored. Subclasses can
170   /// override this function to provide a customized implementation.
171   void setBase(SourceLocation Loc, DeclarationName Entity) { }
172
173   /// \brief RAII object that temporarily sets the base location and entity
174   /// used for reporting diagnostics in types.
175   class TemporaryBase {
176     TreeTransform &Self;
177     SourceLocation OldLocation;
178     DeclarationName OldEntity;
179
180   public:
181     TemporaryBase(TreeTransform &Self, SourceLocation Location,
182                   DeclarationName Entity) : Self(Self) {
183       OldLocation = Self.getDerived().getBaseLocation();
184       OldEntity = Self.getDerived().getBaseEntity();
185
186       if (Location.isValid())
187         Self.getDerived().setBase(Location, Entity);
188     }
189
190     ~TemporaryBase() {
191       Self.getDerived().setBase(OldLocation, OldEntity);
192     }
193   };
194
195   /// \brief Determine whether the given type \p T has already been
196   /// transformed.
197   ///
198   /// Subclasses can provide an alternative implementation of this routine
199   /// to short-circuit evaluation when it is known that a given type will
200   /// not change. For example, template instantiation need not traverse
201   /// non-dependent types.
202   bool AlreadyTransformed(QualType T) {
203     return T.isNull();
204   }
205
206   /// \brief Determine whether the given call argument should be dropped, e.g.,
207   /// because it is a default argument.
208   ///
209   /// Subclasses can provide an alternative implementation of this routine to
210   /// determine which kinds of call arguments get dropped. By default,
211   /// CXXDefaultArgument nodes are dropped (prior to transformation).
212   bool DropCallArgument(Expr *E) {
213     return E->isDefaultArgument();
214   }
215
216   /// \brief Determine whether we should expand a pack expansion with the
217   /// given set of parameter packs into separate arguments by repeatedly
218   /// transforming the pattern.
219   ///
220   /// By default, the transformer never tries to expand pack expansions.
221   /// Subclasses can override this routine to provide different behavior.
222   ///
223   /// \param EllipsisLoc The location of the ellipsis that identifies the
224   /// pack expansion.
225   ///
226   /// \param PatternRange The source range that covers the entire pattern of
227   /// the pack expansion.
228   ///
229   /// \param Unexpanded The set of unexpanded parameter packs within the
230   /// pattern.
231   ///
232   /// \param ShouldExpand Will be set to \c true if the transformer should
233   /// expand the corresponding pack expansions into separate arguments. When
234   /// set, \c NumExpansions must also be set.
235   ///
236   /// \param RetainExpansion Whether the caller should add an unexpanded
237   /// pack expansion after all of the expanded arguments. This is used
238   /// when extending explicitly-specified template argument packs per
239   /// C++0x [temp.arg.explicit]p9.
240   ///
241   /// \param NumExpansions The number of separate arguments that will be in
242   /// the expanded form of the corresponding pack expansion. This is both an
243   /// input and an output parameter, which can be set by the caller if the
244   /// number of expansions is known a priori (e.g., due to a prior substitution)
245   /// and will be set by the callee when the number of expansions is known.
246   /// The callee must set this value when \c ShouldExpand is \c true; it may
247   /// set this value in other cases.
248   ///
249   /// \returns true if an error occurred (e.g., because the parameter packs
250   /// are to be instantiated with arguments of different lengths), false
251   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
252   /// must be set.
253   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
254                                SourceRange PatternRange,
255                                ArrayRef<UnexpandedParameterPack> Unexpanded,
256                                bool &ShouldExpand,
257                                bool &RetainExpansion,
258                                Optional<unsigned> &NumExpansions) {
259     ShouldExpand = false;
260     return false;
261   }
262
263   /// \brief "Forget" about the partially-substituted pack template argument,
264   /// when performing an instantiation that must preserve the parameter pack
265   /// use.
266   ///
267   /// This routine is meant to be overridden by the template instantiator.
268   TemplateArgument ForgetPartiallySubstitutedPack() {
269     return TemplateArgument();
270   }
271
272   /// \brief "Remember" the partially-substituted pack template argument
273   /// after performing an instantiation that must preserve the parameter pack
274   /// use.
275   ///
276   /// This routine is meant to be overridden by the template instantiator.
277   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
278
279   /// \brief Note to the derived class when a function parameter pack is
280   /// being expanded.
281   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
282
283   /// \brief Transforms the given type into another type.
284   ///
285   /// By default, this routine transforms a type by creating a
286   /// TypeSourceInfo for it and delegating to the appropriate
287   /// function.  This is expensive, but we don't mind, because
288   /// this method is deprecated anyway;  all users should be
289   /// switched to storing TypeSourceInfos.
290   ///
291   /// \returns the transformed type.
292   QualType TransformType(QualType T);
293
294   /// \brief Transforms the given type-with-location into a new
295   /// type-with-location.
296   ///
297   /// By default, this routine transforms a type by delegating to the
298   /// appropriate TransformXXXType to build a new type.  Subclasses
299   /// may override this function (to take over all type
300   /// transformations) or some set of the TransformXXXType functions
301   /// to alter the transformation.
302   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
303
304   /// \brief Transform the given type-with-location into a new
305   /// type, collecting location information in the given builder
306   /// as necessary.
307   ///
308   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
309
310   /// \brief Transform the given statement.
311   ///
312   /// By default, this routine transforms a statement by delegating to the
313   /// appropriate TransformXXXStmt function to transform a specific kind of
314   /// statement or the TransformExpr() function to transform an expression.
315   /// Subclasses may override this function to transform statements using some
316   /// other mechanism.
317   ///
318   /// \returns the transformed statement.
319   StmtResult TransformStmt(Stmt *S);
320
321   /// \brief Transform the given statement.
322   ///
323   /// By default, this routine transforms a statement by delegating to the
324   /// appropriate TransformOMPXXXClause function to transform a specific kind
325   /// of clause. Subclasses may override this function to transform statements
326   /// using some other mechanism.
327   ///
328   /// \returns the transformed OpenMP clause.
329   OMPClause *TransformOMPClause(OMPClause *S);
330
331   /// \brief Transform the given attribute.
332   ///
333   /// By default, this routine transforms a statement by delegating to the
334   /// appropriate TransformXXXAttr function to transform a specific kind
335   /// of attribute. Subclasses may override this function to transform
336   /// attributed statements using some other mechanism.
337   ///
338   /// \returns the transformed attribute
339   const Attr *TransformAttr(const Attr *S);
340
341 /// \brief Transform the specified attribute.
342 ///
343 /// Subclasses should override the transformation of attributes with a pragma
344 /// spelling to transform expressions stored within the attribute.
345 ///
346 /// \returns the transformed attribute.
347 #define ATTR(X)
348 #define PRAGMA_SPELLING_ATTR(X)                                                \
349   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
350 #include "clang/Basic/AttrList.inc"
351
352   /// \brief Transform the given expression.
353   ///
354   /// By default, this routine transforms an expression by delegating to the
355   /// appropriate TransformXXXExpr function to build a new expression.
356   /// Subclasses may override this function to transform expressions using some
357   /// other mechanism.
358   ///
359   /// \returns the transformed expression.
360   ExprResult TransformExpr(Expr *E);
361
362   /// \brief Transform the given initializer.
363   ///
364   /// By default, this routine transforms an initializer by stripping off the
365   /// semantic nodes added by initialization, then passing the result to
366   /// TransformExpr or TransformExprs.
367   ///
368   /// \returns the transformed initializer.
369   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
370
371   /// \brief Transform the given list of expressions.
372   ///
373   /// This routine transforms a list of expressions by invoking
374   /// \c TransformExpr() for each subexpression. However, it also provides
375   /// support for variadic templates by expanding any pack expansions (if the
376   /// derived class permits such expansion) along the way. When pack expansions
377   /// are present, the number of outputs may not equal the number of inputs.
378   ///
379   /// \param Inputs The set of expressions to be transformed.
380   ///
381   /// \param NumInputs The number of expressions in \c Inputs.
382   ///
383   /// \param IsCall If \c true, then this transform is being performed on
384   /// function-call arguments, and any arguments that should be dropped, will
385   /// be.
386   ///
387   /// \param Outputs The transformed input expressions will be added to this
388   /// vector.
389   ///
390   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
391   /// due to transformation.
392   ///
393   /// \returns true if an error occurred, false otherwise.
394   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
395                       SmallVectorImpl<Expr *> &Outputs,
396                       bool *ArgChanged = nullptr);
397
398   /// \brief Transform the given declaration, which is referenced from a type
399   /// or expression.
400   ///
401   /// By default, acts as the identity function on declarations, unless the
402   /// transformer has had to transform the declaration itself. Subclasses
403   /// may override this function to provide alternate behavior.
404   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
405     llvm::DenseMap<Decl *, Decl *>::iterator Known
406       = TransformedLocalDecls.find(D);
407     if (Known != TransformedLocalDecls.end())
408       return Known->second;
409
410     return D;
411   }
412
413   /// \brief Transform the specified condition.
414   ///
415   /// By default, this transforms the variable and expression and rebuilds
416   /// the condition.
417   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
418                                            Expr *Expr,
419                                            Sema::ConditionKind Kind);
420
421   /// \brief Transform the attributes associated with the given declaration and
422   /// place them on the new declaration.
423   ///
424   /// By default, this operation does nothing. Subclasses may override this
425   /// behavior to transform attributes.
426   void transformAttrs(Decl *Old, Decl *New) { }
427
428   /// \brief Note that a local declaration has been transformed by this
429   /// transformer.
430   ///
431   /// Local declarations are typically transformed via a call to
432   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
433   /// the transformer itself has to transform the declarations. This routine
434   /// can be overridden by a subclass that keeps track of such mappings.
435   void transformedLocalDecl(Decl *Old, Decl *New) {
436     TransformedLocalDecls[Old] = New;
437   }
438
439   /// \brief Transform the definition of the given declaration.
440   ///
441   /// By default, invokes TransformDecl() to transform the declaration.
442   /// Subclasses may override this function to provide alternate behavior.
443   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
444     return getDerived().TransformDecl(Loc, D);
445   }
446
447   /// \brief Transform the given declaration, which was the first part of a
448   /// nested-name-specifier in a member access expression.
449   ///
450   /// This specific declaration transformation only applies to the first
451   /// identifier in a nested-name-specifier of a member access expression, e.g.,
452   /// the \c T in \c x->T::member
453   ///
454   /// By default, invokes TransformDecl() to transform the declaration.
455   /// Subclasses may override this function to provide alternate behavior.
456   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
457     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
458   }
459
460   /// Transform the set of declarations in an OverloadExpr.
461   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
462                                   LookupResult &R);
463
464   /// \brief Transform the given nested-name-specifier with source-location
465   /// information.
466   ///
467   /// By default, transforms all of the types and declarations within the
468   /// nested-name-specifier. Subclasses may override this function to provide
469   /// alternate behavior.
470   NestedNameSpecifierLoc
471   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
472                                   QualType ObjectType = QualType(),
473                                   NamedDecl *FirstQualifierInScope = nullptr);
474
475   /// \brief Transform the given declaration name.
476   ///
477   /// By default, transforms the types of conversion function, constructor,
478   /// and destructor names and then (if needed) rebuilds the declaration name.
479   /// Identifiers and selectors are returned unmodified. Sublcasses may
480   /// override this function to provide alternate behavior.
481   DeclarationNameInfo
482   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
483
484   /// \brief Transform the given template name.
485   ///
486   /// \param SS The nested-name-specifier that qualifies the template
487   /// name. This nested-name-specifier must already have been transformed.
488   ///
489   /// \param Name The template name to transform.
490   ///
491   /// \param NameLoc The source location of the template name.
492   ///
493   /// \param ObjectType If we're translating a template name within a member
494   /// access expression, this is the type of the object whose member template
495   /// is being referenced.
496   ///
497   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
498   /// also refers to a name within the current (lexical) scope, this is the
499   /// declaration it refers to.
500   ///
501   /// By default, transforms the template name by transforming the declarations
502   /// and nested-name-specifiers that occur within the template name.
503   /// Subclasses may override this function to provide alternate behavior.
504   TemplateName
505   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
506                         SourceLocation NameLoc,
507                         QualType ObjectType = QualType(),
508                         NamedDecl *FirstQualifierInScope = nullptr);
509
510   /// \brief Transform the given template argument.
511   ///
512   /// By default, this operation transforms the type, expression, or
513   /// declaration stored within the template argument and constructs a
514   /// new template argument from the transformed result. Subclasses may
515   /// override this function to provide alternate behavior.
516   ///
517   /// Returns true if there was an error.
518   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
519                                  TemplateArgumentLoc &Output,
520                                  bool Uneval = false);
521
522   /// \brief Transform the given set of template arguments.
523   ///
524   /// By default, this operation transforms all of the template arguments
525   /// in the input set using \c TransformTemplateArgument(), and appends
526   /// the transformed arguments to the output list.
527   ///
528   /// Note that this overload of \c TransformTemplateArguments() is merely
529   /// a convenience function. Subclasses that wish to override this behavior
530   /// should override the iterator-based member template version.
531   ///
532   /// \param Inputs The set of template arguments to be transformed.
533   ///
534   /// \param NumInputs The number of template arguments in \p Inputs.
535   ///
536   /// \param Outputs The set of transformed template arguments output by this
537   /// routine.
538   ///
539   /// Returns true if an error occurred.
540   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
541                                   unsigned NumInputs,
542                                   TemplateArgumentListInfo &Outputs,
543                                   bool Uneval = false) {
544     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
545                                       Uneval);
546   }
547
548   /// \brief Transform the given set of template arguments.
549   ///
550   /// By default, this operation transforms all of the template arguments
551   /// in the input set using \c TransformTemplateArgument(), and appends
552   /// the transformed arguments to the output list.
553   ///
554   /// \param First An iterator to the first template argument.
555   ///
556   /// \param Last An iterator one step past the last template argument.
557   ///
558   /// \param Outputs The set of transformed template arguments output by this
559   /// routine.
560   ///
561   /// Returns true if an error occurred.
562   template<typename InputIterator>
563   bool TransformTemplateArguments(InputIterator First,
564                                   InputIterator Last,
565                                   TemplateArgumentListInfo &Outputs,
566                                   bool Uneval = false);
567
568   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
569   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
570                                  TemplateArgumentLoc &ArgLoc);
571
572   /// \brief Fakes up a TypeSourceInfo for a type.
573   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
574     return SemaRef.Context.getTrivialTypeSourceInfo(T,
575                        getDerived().getBaseLocation());
576   }
577
578 #define ABSTRACT_TYPELOC(CLASS, PARENT)
579 #define TYPELOC(CLASS, PARENT)                                   \
580   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
581 #include "clang/AST/TypeLocNodes.def"
582
583   template<typename Fn>
584   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
585                                       FunctionProtoTypeLoc TL,
586                                       CXXRecordDecl *ThisContext,
587                                       unsigned ThisTypeQuals,
588                                       Fn TransformExceptionSpec);
589
590   bool TransformExceptionSpec(SourceLocation Loc,
591                               FunctionProtoType::ExceptionSpecInfo &ESI,
592                               SmallVectorImpl<QualType> &Exceptions,
593                               bool &Changed);
594
595   StmtResult TransformSEHHandler(Stmt *Handler);
596
597   QualType
598   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
599                                       TemplateSpecializationTypeLoc TL,
600                                       TemplateName Template);
601
602   QualType
603   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
604                                       DependentTemplateSpecializationTypeLoc TL,
605                                                TemplateName Template,
606                                                CXXScopeSpec &SS);
607
608   QualType TransformDependentTemplateSpecializationType(
609       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
610       NestedNameSpecifierLoc QualifierLoc);
611
612   /// \brief Transforms the parameters of a function type into the
613   /// given vectors.
614   ///
615   /// The result vectors should be kept in sync; null entries in the
616   /// variables vector are acceptable.
617   ///
618   /// Return true on error.
619   bool TransformFunctionTypeParams(
620       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
621       const QualType *ParamTypes,
622       const FunctionProtoType::ExtParameterInfo *ParamInfos,
623       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
624       Sema::ExtParameterInfoBuilder &PInfos);
625
626   /// \brief Transforms a single function-type parameter.  Return null
627   /// on error.
628   ///
629   /// \param indexAdjustment - A number to add to the parameter's
630   ///   scope index;  can be negative
631   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
632                                           int indexAdjustment,
633                                           Optional<unsigned> NumExpansions,
634                                           bool ExpectParameterPack);
635
636   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
637
638   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
639   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
640
641   TemplateParameterList *TransformTemplateParameterList(
642         TemplateParameterList *TPL) {
643     return TPL;
644   }
645
646   ExprResult TransformAddressOfOperand(Expr *E);
647
648   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
649                                                 bool IsAddressOfOperand,
650                                                 TypeSourceInfo **RecoveryTSI);
651
652   ExprResult TransformParenDependentScopeDeclRefExpr(
653       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
654       TypeSourceInfo **RecoveryTSI);
655
656   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
657
658 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
659 // amount of stack usage with clang.
660 #define STMT(Node, Parent)                        \
661   LLVM_ATTRIBUTE_NOINLINE \
662   StmtResult Transform##Node(Node *S);
663 #define EXPR(Node, Parent)                        \
664   LLVM_ATTRIBUTE_NOINLINE \
665   ExprResult Transform##Node(Node *E);
666 #define ABSTRACT_STMT(Stmt)
667 #include "clang/AST/StmtNodes.inc"
668
669 #define OPENMP_CLAUSE(Name, Class)                        \
670   LLVM_ATTRIBUTE_NOINLINE \
671   OMPClause *Transform ## Class(Class *S);
672 #include "clang/Basic/OpenMPKinds.def"
673
674   /// \brief Build a new pointer type given its pointee type.
675   ///
676   /// By default, performs semantic analysis when building the pointer type.
677   /// Subclasses may override this routine to provide different behavior.
678   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
679
680   /// \brief Build a new block pointer type given its pointee type.
681   ///
682   /// By default, performs semantic analysis when building the block pointer
683   /// type. Subclasses may override this routine to provide different behavior.
684   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
685
686   /// \brief Build a new reference type given the type it references.
687   ///
688   /// By default, performs semantic analysis when building the
689   /// reference type. Subclasses may override this routine to provide
690   /// different behavior.
691   ///
692   /// \param LValue whether the type was written with an lvalue sigil
693   /// or an rvalue sigil.
694   QualType RebuildReferenceType(QualType ReferentType,
695                                 bool LValue,
696                                 SourceLocation Sigil);
697
698   /// \brief Build a new member pointer type given the pointee type and the
699   /// class type it refers into.
700   ///
701   /// By default, performs semantic analysis when building the member pointer
702   /// type. Subclasses may override this routine to provide different behavior.
703   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
704                                     SourceLocation Sigil);
705
706   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
707                                     SourceLocation ProtocolLAngleLoc,
708                                     ArrayRef<ObjCProtocolDecl *> Protocols,
709                                     ArrayRef<SourceLocation> ProtocolLocs,
710                                     SourceLocation ProtocolRAngleLoc);
711
712   /// \brief Build an Objective-C object type.
713   ///
714   /// By default, performs semantic analysis when building the object type.
715   /// Subclasses may override this routine to provide different behavior.
716   QualType RebuildObjCObjectType(QualType BaseType,
717                                  SourceLocation Loc,
718                                  SourceLocation TypeArgsLAngleLoc,
719                                  ArrayRef<TypeSourceInfo *> TypeArgs,
720                                  SourceLocation TypeArgsRAngleLoc,
721                                  SourceLocation ProtocolLAngleLoc,
722                                  ArrayRef<ObjCProtocolDecl *> Protocols,
723                                  ArrayRef<SourceLocation> ProtocolLocs,
724                                  SourceLocation ProtocolRAngleLoc);
725
726   /// \brief Build a new Objective-C object pointer type given the pointee type.
727   ///
728   /// By default, directly builds the pointer type, with no additional semantic
729   /// analysis.
730   QualType RebuildObjCObjectPointerType(QualType PointeeType,
731                                         SourceLocation Star);
732
733   /// \brief Build a new array type given the element type, size
734   /// modifier, size of the array (if known), size expression, and index type
735   /// qualifiers.
736   ///
737   /// By default, performs semantic analysis when building the array type.
738   /// Subclasses may override this routine to provide different behavior.
739   /// Also by default, all of the other Rebuild*Array
740   QualType RebuildArrayType(QualType ElementType,
741                             ArrayType::ArraySizeModifier SizeMod,
742                             const llvm::APInt *Size,
743                             Expr *SizeExpr,
744                             unsigned IndexTypeQuals,
745                             SourceRange BracketsRange);
746
747   /// \brief Build a new constant array type given the element type, size
748   /// modifier, (known) size of the array, and index type qualifiers.
749   ///
750   /// By default, performs semantic analysis when building the array type.
751   /// Subclasses may override this routine to provide different behavior.
752   QualType RebuildConstantArrayType(QualType ElementType,
753                                     ArrayType::ArraySizeModifier SizeMod,
754                                     const llvm::APInt &Size,
755                                     unsigned IndexTypeQuals,
756                                     SourceRange BracketsRange);
757
758   /// \brief Build a new incomplete array type given the element type, size
759   /// modifier, and index type qualifiers.
760   ///
761   /// By default, performs semantic analysis when building the array type.
762   /// Subclasses may override this routine to provide different behavior.
763   QualType RebuildIncompleteArrayType(QualType ElementType,
764                                       ArrayType::ArraySizeModifier SizeMod,
765                                       unsigned IndexTypeQuals,
766                                       SourceRange BracketsRange);
767
768   /// \brief Build a new variable-length array type given the element type,
769   /// size modifier, size expression, and index type qualifiers.
770   ///
771   /// By default, performs semantic analysis when building the array type.
772   /// Subclasses may override this routine to provide different behavior.
773   QualType RebuildVariableArrayType(QualType ElementType,
774                                     ArrayType::ArraySizeModifier SizeMod,
775                                     Expr *SizeExpr,
776                                     unsigned IndexTypeQuals,
777                                     SourceRange BracketsRange);
778
779   /// \brief Build a new dependent-sized array type given the element type,
780   /// size modifier, size expression, and index type qualifiers.
781   ///
782   /// By default, performs semantic analysis when building the array type.
783   /// Subclasses may override this routine to provide different behavior.
784   QualType RebuildDependentSizedArrayType(QualType ElementType,
785                                           ArrayType::ArraySizeModifier SizeMod,
786                                           Expr *SizeExpr,
787                                           unsigned IndexTypeQuals,
788                                           SourceRange BracketsRange);
789
790   /// \brief Build a new vector type given the element type and
791   /// number of elements.
792   ///
793   /// By default, performs semantic analysis when building the vector type.
794   /// Subclasses may override this routine to provide different behavior.
795   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
796                              VectorType::VectorKind VecKind);
797
798   /// \brief Build a new extended vector type given the element type and
799   /// number of elements.
800   ///
801   /// By default, performs semantic analysis when building the vector type.
802   /// Subclasses may override this routine to provide different behavior.
803   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
804                                 SourceLocation AttributeLoc);
805
806   /// \brief Build a new potentially dependently-sized extended vector type
807   /// given the element type and number of elements.
808   ///
809   /// By default, performs semantic analysis when building the vector type.
810   /// Subclasses may override this routine to provide different behavior.
811   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
812                                               Expr *SizeExpr,
813                                               SourceLocation AttributeLoc);
814
815   /// \brief Build a new function type.
816   ///
817   /// By default, performs semantic analysis when building the function type.
818   /// Subclasses may override this routine to provide different behavior.
819   QualType RebuildFunctionProtoType(QualType T,
820                                     MutableArrayRef<QualType> ParamTypes,
821                                     const FunctionProtoType::ExtProtoInfo &EPI);
822
823   /// \brief Build a new unprototyped function type.
824   QualType RebuildFunctionNoProtoType(QualType ResultType);
825
826   /// \brief Rebuild an unresolved typename type, given the decl that
827   /// the UnresolvedUsingTypenameDecl was transformed to.
828   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
829
830   /// \brief Build a new typedef type.
831   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
832     return SemaRef.Context.getTypeDeclType(Typedef);
833   }
834
835   /// \brief Build a new class/struct/union type.
836   QualType RebuildRecordType(RecordDecl *Record) {
837     return SemaRef.Context.getTypeDeclType(Record);
838   }
839
840   /// \brief Build a new Enum type.
841   QualType RebuildEnumType(EnumDecl *Enum) {
842     return SemaRef.Context.getTypeDeclType(Enum);
843   }
844
845   /// \brief Build a new typeof(expr) type.
846   ///
847   /// By default, performs semantic analysis when building the typeof type.
848   /// Subclasses may override this routine to provide different behavior.
849   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
850
851   /// \brief Build a new typeof(type) type.
852   ///
853   /// By default, builds a new TypeOfType with the given underlying type.
854   QualType RebuildTypeOfType(QualType Underlying);
855
856   /// \brief Build a new unary transform type.
857   QualType RebuildUnaryTransformType(QualType BaseType,
858                                      UnaryTransformType::UTTKind UKind,
859                                      SourceLocation Loc);
860
861   /// \brief Build a new C++11 decltype type.
862   ///
863   /// By default, performs semantic analysis when building the decltype type.
864   /// Subclasses may override this routine to provide different behavior.
865   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
866
867   /// \brief Build a new C++11 auto type.
868   ///
869   /// By default, builds a new AutoType with the given deduced type.
870   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) {
871     // Note, IsDependent is always false here: we implicitly convert an 'auto'
872     // which has been deduced to a dependent type into an undeduced 'auto', so
873     // that we'll retry deduction after the transformation.
874     return SemaRef.Context.getAutoType(Deduced, Keyword,
875                                        /*IsDependent*/ false);
876   }
877
878   /// \brief Build a new template specialization type.
879   ///
880   /// By default, performs semantic analysis when building the template
881   /// specialization type. Subclasses may override this routine to provide
882   /// different behavior.
883   QualType RebuildTemplateSpecializationType(TemplateName Template,
884                                              SourceLocation TemplateLoc,
885                                              TemplateArgumentListInfo &Args);
886
887   /// \brief Build a new parenthesized type.
888   ///
889   /// By default, builds a new ParenType type from the inner type.
890   /// Subclasses may override this routine to provide different behavior.
891   QualType RebuildParenType(QualType InnerType) {
892     return SemaRef.Context.getParenType(InnerType);
893   }
894
895   /// \brief Build a new qualified name type.
896   ///
897   /// By default, builds a new ElaboratedType type from the keyword,
898   /// the nested-name-specifier and the named type.
899   /// Subclasses may override this routine to provide different behavior.
900   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
901                                  ElaboratedTypeKeyword Keyword,
902                                  NestedNameSpecifierLoc QualifierLoc,
903                                  QualType Named) {
904     return SemaRef.Context.getElaboratedType(Keyword,
905                                          QualifierLoc.getNestedNameSpecifier(),
906                                              Named);
907   }
908
909   /// \brief Build a new typename type that refers to a template-id.
910   ///
911   /// By default, builds a new DependentNameType type from the
912   /// nested-name-specifier and the given type. Subclasses may override
913   /// this routine to provide different behavior.
914   QualType RebuildDependentTemplateSpecializationType(
915                                           ElaboratedTypeKeyword Keyword,
916                                           NestedNameSpecifierLoc QualifierLoc,
917                                           const IdentifierInfo *Name,
918                                           SourceLocation NameLoc,
919                                           TemplateArgumentListInfo &Args) {
920     // Rebuild the template name.
921     // TODO: avoid TemplateName abstraction
922     CXXScopeSpec SS;
923     SS.Adopt(QualifierLoc);
924     TemplateName InstName
925       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(),
926                                          nullptr);
927
928     if (InstName.isNull())
929       return QualType();
930
931     // If it's still dependent, make a dependent specialization.
932     if (InstName.getAsDependentTemplateName())
933       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
934                                           QualifierLoc.getNestedNameSpecifier(),
935                                                                     Name,
936                                                                     Args);
937
938     // Otherwise, make an elaborated type wrapping a non-dependent
939     // specialization.
940     QualType T =
941     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
942     if (T.isNull()) return QualType();
943
944     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
945       return T;
946
947     return SemaRef.Context.getElaboratedType(Keyword,
948                                        QualifierLoc.getNestedNameSpecifier(),
949                                              T);
950   }
951
952   /// \brief Build a new typename type that refers to an identifier.
953   ///
954   /// By default, performs semantic analysis when building the typename type
955   /// (or elaborated type). Subclasses may override this routine to provide
956   /// different behavior.
957   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
958                                     SourceLocation KeywordLoc,
959                                     NestedNameSpecifierLoc QualifierLoc,
960                                     const IdentifierInfo *Id,
961                                     SourceLocation IdLoc) {
962     CXXScopeSpec SS;
963     SS.Adopt(QualifierLoc);
964
965     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
966       // If the name is still dependent, just build a new dependent name type.
967       if (!SemaRef.computeDeclContext(SS))
968         return SemaRef.Context.getDependentNameType(Keyword,
969                                           QualifierLoc.getNestedNameSpecifier(),
970                                                     Id);
971     }
972
973     if (Keyword == ETK_None || Keyword == ETK_Typename)
974       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
975                                        *Id, IdLoc);
976
977     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
978
979     // We had a dependent elaborated-type-specifier that has been transformed
980     // into a non-dependent elaborated-type-specifier. Find the tag we're
981     // referring to.
982     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
983     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
984     if (!DC)
985       return QualType();
986
987     if (SemaRef.RequireCompleteDeclContext(SS, DC))
988       return QualType();
989
990     TagDecl *Tag = nullptr;
991     SemaRef.LookupQualifiedName(Result, DC);
992     switch (Result.getResultKind()) {
993       case LookupResult::NotFound:
994       case LookupResult::NotFoundInCurrentInstantiation:
995         break;
996
997       case LookupResult::Found:
998         Tag = Result.getAsSingle<TagDecl>();
999         break;
1000
1001       case LookupResult::FoundOverloaded:
1002       case LookupResult::FoundUnresolvedValue:
1003         llvm_unreachable("Tag lookup cannot find non-tags");
1004
1005       case LookupResult::Ambiguous:
1006         // Let the LookupResult structure handle ambiguities.
1007         return QualType();
1008     }
1009
1010     if (!Tag) {
1011       // Check where the name exists but isn't a tag type and use that to emit
1012       // better diagnostics.
1013       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1014       SemaRef.LookupQualifiedName(Result, DC);
1015       switch (Result.getResultKind()) {
1016         case LookupResult::Found:
1017         case LookupResult::FoundOverloaded:
1018         case LookupResult::FoundUnresolvedValue: {
1019           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1020           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1021           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1022                                                                << NTK << Kind;
1023           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1024           break;
1025         }
1026         default:
1027           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1028               << Kind << Id << DC << QualifierLoc.getSourceRange();
1029           break;
1030       }
1031       return QualType();
1032     }
1033
1034     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1035                                               IdLoc, Id)) {
1036       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1037       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1038       return QualType();
1039     }
1040
1041     // Build the elaborated-type-specifier type.
1042     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1043     return SemaRef.Context.getElaboratedType(Keyword,
1044                                          QualifierLoc.getNestedNameSpecifier(),
1045                                              T);
1046   }
1047
1048   /// \brief Build a new pack expansion type.
1049   ///
1050   /// By default, builds a new PackExpansionType type from the given pattern.
1051   /// Subclasses may override this routine to provide different behavior.
1052   QualType RebuildPackExpansionType(QualType Pattern,
1053                                     SourceRange PatternRange,
1054                                     SourceLocation EllipsisLoc,
1055                                     Optional<unsigned> NumExpansions) {
1056     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1057                                         NumExpansions);
1058   }
1059
1060   /// \brief Build a new atomic type given its value type.
1061   ///
1062   /// By default, performs semantic analysis when building the atomic type.
1063   /// Subclasses may override this routine to provide different behavior.
1064   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1065
1066   /// \brief Build a new pipe type given its value type.
1067   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1068                            bool isReadPipe);
1069
1070   /// \brief Build a new template name given a nested name specifier, a flag
1071   /// indicating whether the "template" keyword was provided, and the template
1072   /// that the template name refers to.
1073   ///
1074   /// By default, builds the new template name directly. Subclasses may override
1075   /// this routine to provide different behavior.
1076   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1077                                    bool TemplateKW,
1078                                    TemplateDecl *Template);
1079
1080   /// \brief Build a new template name given a nested name specifier and the
1081   /// name that is referred to as a template.
1082   ///
1083   /// By default, performs semantic analysis to determine whether the name can
1084   /// be resolved to a specific template, then builds the appropriate kind of
1085   /// template name. Subclasses may override this routine to provide different
1086   /// behavior.
1087   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1088                                    const IdentifierInfo &Name,
1089                                    SourceLocation NameLoc,
1090                                    QualType ObjectType,
1091                                    NamedDecl *FirstQualifierInScope);
1092
1093   /// \brief Build a new template name given a nested name specifier and the
1094   /// overloaded operator name that is referred to as a template.
1095   ///
1096   /// By default, performs semantic analysis to determine whether the name can
1097   /// be resolved to a specific template, then builds the appropriate kind of
1098   /// template name. Subclasses may override this routine to provide different
1099   /// behavior.
1100   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1101                                    OverloadedOperatorKind Operator,
1102                                    SourceLocation NameLoc,
1103                                    QualType ObjectType);
1104
1105   /// \brief Build a new template name given a template template parameter pack
1106   /// and the
1107   ///
1108   /// By default, performs semantic analysis to determine whether the name can
1109   /// be resolved to a specific template, then builds the appropriate kind of
1110   /// template name. Subclasses may override this routine to provide different
1111   /// behavior.
1112   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1113                                    const TemplateArgument &ArgPack) {
1114     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1115   }
1116
1117   /// \brief Build a new compound statement.
1118   ///
1119   /// By default, performs semantic analysis to build the new statement.
1120   /// Subclasses may override this routine to provide different behavior.
1121   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1122                                        MultiStmtArg Statements,
1123                                        SourceLocation RBraceLoc,
1124                                        bool IsStmtExpr) {
1125     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1126                                        IsStmtExpr);
1127   }
1128
1129   /// \brief Build a new case statement.
1130   ///
1131   /// By default, performs semantic analysis to build the new statement.
1132   /// Subclasses may override this routine to provide different behavior.
1133   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1134                                    Expr *LHS,
1135                                    SourceLocation EllipsisLoc,
1136                                    Expr *RHS,
1137                                    SourceLocation ColonLoc) {
1138     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1139                                    ColonLoc);
1140   }
1141
1142   /// \brief Attach the body to a new case statement.
1143   ///
1144   /// By default, performs semantic analysis to build the new statement.
1145   /// Subclasses may override this routine to provide different behavior.
1146   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1147     getSema().ActOnCaseStmtBody(S, Body);
1148     return S;
1149   }
1150
1151   /// \brief Build a new default statement.
1152   ///
1153   /// By default, performs semantic analysis to build the new statement.
1154   /// Subclasses may override this routine to provide different behavior.
1155   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1156                                       SourceLocation ColonLoc,
1157                                       Stmt *SubStmt) {
1158     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1159                                       /*CurScope=*/nullptr);
1160   }
1161
1162   /// \brief Build a new label statement.
1163   ///
1164   /// By default, performs semantic analysis to build the new statement.
1165   /// Subclasses may override this routine to provide different behavior.
1166   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1167                               SourceLocation ColonLoc, Stmt *SubStmt) {
1168     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1169   }
1170
1171   /// \brief Build a new label statement.
1172   ///
1173   /// By default, performs semantic analysis to build the new statement.
1174   /// Subclasses may override this routine to provide different behavior.
1175   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1176                                    ArrayRef<const Attr*> Attrs,
1177                                    Stmt *SubStmt) {
1178     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1179   }
1180
1181   /// \brief Build a new "if" statement.
1182   ///
1183   /// By default, performs semantic analysis to build the new statement.
1184   /// Subclasses may override this routine to provide different behavior.
1185   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1186                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1187                            SourceLocation ElseLoc, Stmt *Else) {
1188     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1189                                  ElseLoc, Else);
1190   }
1191
1192   /// \brief Start building a new switch statement.
1193   ///
1194   /// By default, performs semantic analysis to build the new statement.
1195   /// Subclasses may override this routine to provide different behavior.
1196   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1197                                     Sema::ConditionResult Cond) {
1198     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1199   }
1200
1201   /// \brief Attach the body to the switch statement.
1202   ///
1203   /// By default, performs semantic analysis to build the new statement.
1204   /// Subclasses may override this routine to provide different behavior.
1205   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1206                                    Stmt *Switch, Stmt *Body) {
1207     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1208   }
1209
1210   /// \brief Build a new while statement.
1211   ///
1212   /// By default, performs semantic analysis to build the new statement.
1213   /// Subclasses may override this routine to provide different behavior.
1214   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1215                               Sema::ConditionResult Cond, Stmt *Body) {
1216     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1217   }
1218
1219   /// \brief Build a new do-while statement.
1220   ///
1221   /// By default, performs semantic analysis to build the new statement.
1222   /// Subclasses may override this routine to provide different behavior.
1223   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1224                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1225                            Expr *Cond, SourceLocation RParenLoc) {
1226     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1227                                  Cond, RParenLoc);
1228   }
1229
1230   /// \brief Build a new for statement.
1231   ///
1232   /// By default, performs semantic analysis to build the new statement.
1233   /// Subclasses may override this routine to provide different behavior.
1234   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1235                             Stmt *Init, Sema::ConditionResult Cond,
1236                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1237                             Stmt *Body) {
1238     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1239                                   Inc, RParenLoc, Body);
1240   }
1241
1242   /// \brief Build a new goto statement.
1243   ///
1244   /// By default, performs semantic analysis to build the new statement.
1245   /// Subclasses may override this routine to provide different behavior.
1246   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1247                              LabelDecl *Label) {
1248     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1249   }
1250
1251   /// \brief Build a new indirect goto statement.
1252   ///
1253   /// By default, performs semantic analysis to build the new statement.
1254   /// Subclasses may override this routine to provide different behavior.
1255   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1256                                      SourceLocation StarLoc,
1257                                      Expr *Target) {
1258     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1259   }
1260
1261   /// \brief Build a new return statement.
1262   ///
1263   /// By default, performs semantic analysis to build the new statement.
1264   /// Subclasses may override this routine to provide different behavior.
1265   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1266     return getSema().BuildReturnStmt(ReturnLoc, Result);
1267   }
1268
1269   /// \brief Build a new declaration statement.
1270   ///
1271   /// By default, performs semantic analysis to build the new statement.
1272   /// Subclasses may override this routine to provide different behavior.
1273   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1274                              SourceLocation StartLoc, SourceLocation EndLoc) {
1275     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1276     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1277   }
1278
1279   /// \brief Build a new inline asm statement.
1280   ///
1281   /// By default, performs semantic analysis to build the new statement.
1282   /// Subclasses may override this routine to provide different behavior.
1283   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1284                                bool IsVolatile, unsigned NumOutputs,
1285                                unsigned NumInputs, IdentifierInfo **Names,
1286                                MultiExprArg Constraints, MultiExprArg Exprs,
1287                                Expr *AsmString, MultiExprArg Clobbers,
1288                                SourceLocation RParenLoc) {
1289     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1290                                      NumInputs, Names, Constraints, Exprs,
1291                                      AsmString, Clobbers, RParenLoc);
1292   }
1293
1294   /// \brief Build a new MS style inline asm statement.
1295   ///
1296   /// By default, performs semantic analysis to build the new statement.
1297   /// Subclasses may override this routine to provide different behavior.
1298   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1299                               ArrayRef<Token> AsmToks,
1300                               StringRef AsmString,
1301                               unsigned NumOutputs, unsigned NumInputs,
1302                               ArrayRef<StringRef> Constraints,
1303                               ArrayRef<StringRef> Clobbers,
1304                               ArrayRef<Expr*> Exprs,
1305                               SourceLocation EndLoc) {
1306     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1307                                     NumOutputs, NumInputs,
1308                                     Constraints, Clobbers, Exprs, EndLoc);
1309   }
1310
1311   /// \brief Build a new co_return statement.
1312   ///
1313   /// By default, performs semantic analysis to build the new statement.
1314   /// Subclasses may override this routine to provide different behavior.
1315   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result) {
1316     return getSema().BuildCoreturnStmt(CoreturnLoc, Result);
1317   }
1318
1319   /// \brief Build a new co_await expression.
1320   ///
1321   /// By default, performs semantic analysis to build the new expression.
1322   /// Subclasses may override this routine to provide different behavior.
1323   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result) {
1324     return getSema().BuildCoawaitExpr(CoawaitLoc, Result);
1325   }
1326
1327   /// \brief Build a new co_yield expression.
1328   ///
1329   /// By default, performs semantic analysis to build the new expression.
1330   /// Subclasses may override this routine to provide different behavior.
1331   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1332     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1333   }
1334
1335   /// \brief Build a new Objective-C \@try statement.
1336   ///
1337   /// By default, performs semantic analysis to build the new statement.
1338   /// Subclasses may override this routine to provide different behavior.
1339   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1340                                         Stmt *TryBody,
1341                                         MultiStmtArg CatchStmts,
1342                                         Stmt *Finally) {
1343     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1344                                         Finally);
1345   }
1346
1347   /// \brief Rebuild an Objective-C exception declaration.
1348   ///
1349   /// By default, performs semantic analysis to build the new declaration.
1350   /// Subclasses may override this routine to provide different behavior.
1351   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1352                                     TypeSourceInfo *TInfo, QualType T) {
1353     return getSema().BuildObjCExceptionDecl(TInfo, T,
1354                                             ExceptionDecl->getInnerLocStart(),
1355                                             ExceptionDecl->getLocation(),
1356                                             ExceptionDecl->getIdentifier());
1357   }
1358
1359   /// \brief Build a new Objective-C \@catch statement.
1360   ///
1361   /// By default, performs semantic analysis to build the new statement.
1362   /// Subclasses may override this routine to provide different behavior.
1363   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1364                                           SourceLocation RParenLoc,
1365                                           VarDecl *Var,
1366                                           Stmt *Body) {
1367     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1368                                           Var, Body);
1369   }
1370
1371   /// \brief Build a new Objective-C \@finally statement.
1372   ///
1373   /// By default, performs semantic analysis to build the new statement.
1374   /// Subclasses may override this routine to provide different behavior.
1375   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1376                                             Stmt *Body) {
1377     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1378   }
1379
1380   /// \brief Build a new Objective-C \@throw statement.
1381   ///
1382   /// By default, performs semantic analysis to build the new statement.
1383   /// Subclasses may override this routine to provide different behavior.
1384   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1385                                           Expr *Operand) {
1386     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1387   }
1388
1389   /// \brief Build a new OpenMP executable directive.
1390   ///
1391   /// By default, performs semantic analysis to build the new statement.
1392   /// Subclasses may override this routine to provide different behavior.
1393   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1394                                            DeclarationNameInfo DirName,
1395                                            OpenMPDirectiveKind CancelRegion,
1396                                            ArrayRef<OMPClause *> Clauses,
1397                                            Stmt *AStmt, SourceLocation StartLoc,
1398                                            SourceLocation EndLoc) {
1399     return getSema().ActOnOpenMPExecutableDirective(
1400         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1401   }
1402
1403   /// \brief Build a new OpenMP 'if' clause.
1404   ///
1405   /// By default, performs semantic analysis to build the new OpenMP clause.
1406   /// Subclasses may override this routine to provide different behavior.
1407   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1408                                 Expr *Condition, SourceLocation StartLoc,
1409                                 SourceLocation LParenLoc,
1410                                 SourceLocation NameModifierLoc,
1411                                 SourceLocation ColonLoc,
1412                                 SourceLocation EndLoc) {
1413     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1414                                          LParenLoc, NameModifierLoc, ColonLoc,
1415                                          EndLoc);
1416   }
1417
1418   /// \brief Build a new OpenMP 'final' clause.
1419   ///
1420   /// By default, performs semantic analysis to build the new OpenMP clause.
1421   /// Subclasses may override this routine to provide different behavior.
1422   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1423                                    SourceLocation LParenLoc,
1424                                    SourceLocation EndLoc) {
1425     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1426                                             EndLoc);
1427   }
1428
1429   /// \brief Build a new OpenMP 'num_threads' clause.
1430   ///
1431   /// By default, performs semantic analysis to build the new OpenMP clause.
1432   /// Subclasses may override this routine to provide different behavior.
1433   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1434                                         SourceLocation StartLoc,
1435                                         SourceLocation LParenLoc,
1436                                         SourceLocation EndLoc) {
1437     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1438                                                  LParenLoc, EndLoc);
1439   }
1440
1441   /// \brief Build a new OpenMP 'safelen' clause.
1442   ///
1443   /// By default, performs semantic analysis to build the new OpenMP clause.
1444   /// Subclasses may override this routine to provide different behavior.
1445   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1446                                      SourceLocation LParenLoc,
1447                                      SourceLocation EndLoc) {
1448     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1449   }
1450
1451   /// \brief Build a new OpenMP 'simdlen' clause.
1452   ///
1453   /// By default, performs semantic analysis to build the new OpenMP clause.
1454   /// Subclasses may override this routine to provide different behavior.
1455   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1456                                      SourceLocation LParenLoc,
1457                                      SourceLocation EndLoc) {
1458     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1459   }
1460
1461   /// \brief Build a new OpenMP 'collapse' clause.
1462   ///
1463   /// By default, performs semantic analysis to build the new OpenMP clause.
1464   /// Subclasses may override this routine to provide different behavior.
1465   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1466                                       SourceLocation LParenLoc,
1467                                       SourceLocation EndLoc) {
1468     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1469                                                EndLoc);
1470   }
1471
1472   /// \brief Build a new OpenMP 'default' clause.
1473   ///
1474   /// By default, performs semantic analysis to build the new OpenMP clause.
1475   /// Subclasses may override this routine to provide different behavior.
1476   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1477                                      SourceLocation KindKwLoc,
1478                                      SourceLocation StartLoc,
1479                                      SourceLocation LParenLoc,
1480                                      SourceLocation EndLoc) {
1481     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1482                                               StartLoc, LParenLoc, EndLoc);
1483   }
1484
1485   /// \brief Build a new OpenMP 'proc_bind' clause.
1486   ///
1487   /// By default, performs semantic analysis to build the new OpenMP clause.
1488   /// Subclasses may override this routine to provide different behavior.
1489   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1490                                       SourceLocation KindKwLoc,
1491                                       SourceLocation StartLoc,
1492                                       SourceLocation LParenLoc,
1493                                       SourceLocation EndLoc) {
1494     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1495                                                StartLoc, LParenLoc, EndLoc);
1496   }
1497
1498   /// \brief Build a new OpenMP 'schedule' clause.
1499   ///
1500   /// By default, performs semantic analysis to build the new OpenMP clause.
1501   /// Subclasses may override this routine to provide different behavior.
1502   OMPClause *RebuildOMPScheduleClause(
1503       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1504       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1505       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1506       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1507     return getSema().ActOnOpenMPScheduleClause(
1508         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1509         CommaLoc, EndLoc);
1510   }
1511
1512   /// \brief Build a new OpenMP 'ordered' clause.
1513   ///
1514   /// By default, performs semantic analysis to build the new OpenMP clause.
1515   /// Subclasses may override this routine to provide different behavior.
1516   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1517                                      SourceLocation EndLoc,
1518                                      SourceLocation LParenLoc, Expr *Num) {
1519     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1520   }
1521
1522   /// \brief Build a new OpenMP 'private' clause.
1523   ///
1524   /// By default, performs semantic analysis to build the new OpenMP clause.
1525   /// Subclasses may override this routine to provide different behavior.
1526   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1527                                      SourceLocation StartLoc,
1528                                      SourceLocation LParenLoc,
1529                                      SourceLocation EndLoc) {
1530     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1531                                               EndLoc);
1532   }
1533
1534   /// \brief Build a new OpenMP 'firstprivate' clause.
1535   ///
1536   /// By default, performs semantic analysis to build the new OpenMP clause.
1537   /// Subclasses may override this routine to provide different behavior.
1538   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1539                                           SourceLocation StartLoc,
1540                                           SourceLocation LParenLoc,
1541                                           SourceLocation EndLoc) {
1542     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1543                                                    EndLoc);
1544   }
1545
1546   /// \brief Build a new OpenMP 'lastprivate' clause.
1547   ///
1548   /// By default, performs semantic analysis to build the new OpenMP clause.
1549   /// Subclasses may override this routine to provide different behavior.
1550   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1551                                          SourceLocation StartLoc,
1552                                          SourceLocation LParenLoc,
1553                                          SourceLocation EndLoc) {
1554     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1555                                                   EndLoc);
1556   }
1557
1558   /// \brief Build a new OpenMP 'shared' clause.
1559   ///
1560   /// By default, performs semantic analysis to build the new OpenMP clause.
1561   /// Subclasses may override this routine to provide different behavior.
1562   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1563                                     SourceLocation StartLoc,
1564                                     SourceLocation LParenLoc,
1565                                     SourceLocation EndLoc) {
1566     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1567                                              EndLoc);
1568   }
1569
1570   /// \brief Build a new OpenMP 'reduction' clause.
1571   ///
1572   /// By default, performs semantic analysis to build the new statement.
1573   /// Subclasses may override this routine to provide different behavior.
1574   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1575                                        SourceLocation StartLoc,
1576                                        SourceLocation LParenLoc,
1577                                        SourceLocation ColonLoc,
1578                                        SourceLocation EndLoc,
1579                                        CXXScopeSpec &ReductionIdScopeSpec,
1580                                        const DeclarationNameInfo &ReductionId,
1581                                        ArrayRef<Expr *> UnresolvedReductions) {
1582     return getSema().ActOnOpenMPReductionClause(
1583         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1584         ReductionId, UnresolvedReductions);
1585   }
1586
1587   /// \brief Build a new OpenMP 'linear' clause.
1588   ///
1589   /// By default, performs semantic analysis to build the new OpenMP clause.
1590   /// Subclasses may override this routine to provide different behavior.
1591   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1592                                     SourceLocation StartLoc,
1593                                     SourceLocation LParenLoc,
1594                                     OpenMPLinearClauseKind Modifier,
1595                                     SourceLocation ModifierLoc,
1596                                     SourceLocation ColonLoc,
1597                                     SourceLocation EndLoc) {
1598     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1599                                              Modifier, ModifierLoc, ColonLoc,
1600                                              EndLoc);
1601   }
1602
1603   /// \brief Build a new OpenMP 'aligned' clause.
1604   ///
1605   /// By default, performs semantic analysis to build the new OpenMP clause.
1606   /// Subclasses may override this routine to provide different behavior.
1607   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1608                                      SourceLocation StartLoc,
1609                                      SourceLocation LParenLoc,
1610                                      SourceLocation ColonLoc,
1611                                      SourceLocation EndLoc) {
1612     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1613                                               LParenLoc, ColonLoc, EndLoc);
1614   }
1615
1616   /// \brief Build a new OpenMP 'copyin' clause.
1617   ///
1618   /// By default, performs semantic analysis to build the new OpenMP clause.
1619   /// Subclasses may override this routine to provide different behavior.
1620   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1621                                     SourceLocation StartLoc,
1622                                     SourceLocation LParenLoc,
1623                                     SourceLocation EndLoc) {
1624     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1625                                              EndLoc);
1626   }
1627
1628   /// \brief Build a new OpenMP 'copyprivate' clause.
1629   ///
1630   /// By default, performs semantic analysis to build the new OpenMP clause.
1631   /// Subclasses may override this routine to provide different behavior.
1632   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1633                                          SourceLocation StartLoc,
1634                                          SourceLocation LParenLoc,
1635                                          SourceLocation EndLoc) {
1636     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1637                                                   EndLoc);
1638   }
1639
1640   /// \brief Build a new OpenMP 'flush' pseudo clause.
1641   ///
1642   /// By default, performs semantic analysis to build the new OpenMP clause.
1643   /// Subclasses may override this routine to provide different behavior.
1644   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1645                                    SourceLocation StartLoc,
1646                                    SourceLocation LParenLoc,
1647                                    SourceLocation EndLoc) {
1648     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1649                                             EndLoc);
1650   }
1651
1652   /// \brief Build a new OpenMP 'depend' pseudo clause.
1653   ///
1654   /// By default, performs semantic analysis to build the new OpenMP clause.
1655   /// Subclasses may override this routine to provide different behavior.
1656   OMPClause *
1657   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1658                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1659                          SourceLocation StartLoc, SourceLocation LParenLoc,
1660                          SourceLocation EndLoc) {
1661     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1662                                              StartLoc, LParenLoc, EndLoc);
1663   }
1664
1665   /// \brief Build a new OpenMP 'device' clause.
1666   ///
1667   /// By default, performs semantic analysis to build the new statement.
1668   /// Subclasses may override this routine to provide different behavior.
1669   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1670                                     SourceLocation LParenLoc,
1671                                     SourceLocation EndLoc) {
1672     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1673                                              EndLoc);
1674   }
1675
1676   /// \brief Build a new OpenMP 'map' clause.
1677   ///
1678   /// By default, performs semantic analysis to build the new OpenMP clause.
1679   /// Subclasses may override this routine to provide different behavior.
1680   OMPClause *
1681   RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier,
1682                       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1683                       SourceLocation MapLoc, SourceLocation ColonLoc,
1684                       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1685                       SourceLocation LParenLoc, SourceLocation EndLoc) {
1686     return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType,
1687                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1688                                           VarList, StartLoc, LParenLoc, EndLoc);
1689   }
1690
1691   /// \brief Build a new OpenMP 'num_teams' clause.
1692   ///
1693   /// By default, performs semantic analysis to build the new statement.
1694   /// Subclasses may override this routine to provide different behavior.
1695   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1696                                       SourceLocation LParenLoc,
1697                                       SourceLocation EndLoc) {
1698     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 
1699                                                EndLoc);
1700   }
1701
1702   /// \brief Build a new OpenMP 'thread_limit' clause.
1703   ///
1704   /// By default, performs semantic analysis to build the new statement.
1705   /// Subclasses may override this routine to provide different behavior.
1706   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1707                                          SourceLocation StartLoc,
1708                                          SourceLocation LParenLoc,
1709                                          SourceLocation EndLoc) {
1710     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1711                                                   LParenLoc, EndLoc);
1712   }
1713
1714   /// \brief Build a new OpenMP 'priority' clause.
1715   ///
1716   /// By default, performs semantic analysis to build the new statement.
1717   /// Subclasses may override this routine to provide different behavior.
1718   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1719                                       SourceLocation LParenLoc,
1720                                       SourceLocation EndLoc) {
1721     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1722                                                EndLoc);
1723   }
1724
1725   /// \brief Build a new OpenMP 'grainsize' clause.
1726   ///
1727   /// By default, performs semantic analysis to build the new statement.
1728   /// Subclasses may override this routine to provide different behavior.
1729   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1730                                        SourceLocation LParenLoc,
1731                                        SourceLocation EndLoc) {
1732     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1733                                                 EndLoc);
1734   }
1735
1736   /// \brief Build a new OpenMP 'num_tasks' clause.
1737   ///
1738   /// By default, performs semantic analysis to build the new statement.
1739   /// Subclasses may override this routine to provide different behavior.
1740   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1741                                       SourceLocation LParenLoc,
1742                                       SourceLocation EndLoc) {
1743     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1744                                                EndLoc);
1745   }
1746
1747   /// \brief Build a new OpenMP 'hint' clause.
1748   ///
1749   /// By default, performs semantic analysis to build the new statement.
1750   /// Subclasses may override this routine to provide different behavior.
1751   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1752                                   SourceLocation LParenLoc,
1753                                   SourceLocation EndLoc) {
1754     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1755   }
1756
1757   /// \brief Build a new OpenMP 'dist_schedule' clause.
1758   ///
1759   /// By default, performs semantic analysis to build the new OpenMP clause.
1760   /// Subclasses may override this routine to provide different behavior.
1761   OMPClause *
1762   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1763                                Expr *ChunkSize, SourceLocation StartLoc,
1764                                SourceLocation LParenLoc, SourceLocation KindLoc,
1765                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1766     return getSema().ActOnOpenMPDistScheduleClause(
1767         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1768   }
1769
1770   /// \brief Build a new OpenMP 'to' clause.
1771   ///
1772   /// By default, performs semantic analysis to build the new statement.
1773   /// Subclasses may override this routine to provide different behavior.
1774   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1775                                 SourceLocation StartLoc,
1776                                 SourceLocation LParenLoc,
1777                                 SourceLocation EndLoc) {
1778     return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc);
1779   }
1780
1781   /// \brief Build a new OpenMP 'from' clause.
1782   ///
1783   /// By default, performs semantic analysis to build the new statement.
1784   /// Subclasses may override this routine to provide different behavior.
1785   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1786                                   SourceLocation StartLoc,
1787                                   SourceLocation LParenLoc,
1788                                   SourceLocation EndLoc) {
1789     return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc,
1790                                            EndLoc);
1791   }
1792
1793   /// Build a new OpenMP 'use_device_ptr' clause.
1794   ///
1795   /// By default, performs semantic analysis to build the new OpenMP clause.
1796   /// Subclasses may override this routine to provide different behavior.
1797   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1798                                           SourceLocation StartLoc,
1799                                           SourceLocation LParenLoc,
1800                                           SourceLocation EndLoc) {
1801     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc,
1802                                                    EndLoc);
1803   }
1804
1805   /// Build a new OpenMP 'is_device_ptr' clause.
1806   ///
1807   /// By default, performs semantic analysis to build the new OpenMP clause.
1808   /// Subclasses may override this routine to provide different behavior.
1809   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1810                                          SourceLocation StartLoc,
1811                                          SourceLocation LParenLoc,
1812                                          SourceLocation EndLoc) {
1813     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc,
1814                                                   EndLoc);
1815   }
1816
1817   /// \brief Rebuild the operand to an Objective-C \@synchronized statement.
1818   ///
1819   /// By default, performs semantic analysis to build the new statement.
1820   /// Subclasses may override this routine to provide different behavior.
1821   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1822                                               Expr *object) {
1823     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1824   }
1825
1826   /// \brief Build a new Objective-C \@synchronized statement.
1827   ///
1828   /// By default, performs semantic analysis to build the new statement.
1829   /// Subclasses may override this routine to provide different behavior.
1830   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1831                                            Expr *Object, Stmt *Body) {
1832     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1833   }
1834
1835   /// \brief Build a new Objective-C \@autoreleasepool statement.
1836   ///
1837   /// By default, performs semantic analysis to build the new statement.
1838   /// Subclasses may override this routine to provide different behavior.
1839   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1840                                             Stmt *Body) {
1841     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1842   }
1843
1844   /// \brief Build a new Objective-C fast enumeration statement.
1845   ///
1846   /// By default, performs semantic analysis to build the new statement.
1847   /// Subclasses may override this routine to provide different behavior.
1848   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1849                                           Stmt *Element,
1850                                           Expr *Collection,
1851                                           SourceLocation RParenLoc,
1852                                           Stmt *Body) {
1853     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1854                                                 Element,
1855                                                 Collection,
1856                                                 RParenLoc);
1857     if (ForEachStmt.isInvalid())
1858       return StmtError();
1859
1860     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1861   }
1862
1863   /// \brief Build a new C++ exception declaration.
1864   ///
1865   /// By default, performs semantic analysis to build the new decaration.
1866   /// Subclasses may override this routine to provide different behavior.
1867   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1868                                 TypeSourceInfo *Declarator,
1869                                 SourceLocation StartLoc,
1870                                 SourceLocation IdLoc,
1871                                 IdentifierInfo *Id) {
1872     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1873                                                        StartLoc, IdLoc, Id);
1874     if (Var)
1875       getSema().CurContext->addDecl(Var);
1876     return Var;
1877   }
1878
1879   /// \brief Build a new C++ catch statement.
1880   ///
1881   /// By default, performs semantic analysis to build the new statement.
1882   /// Subclasses may override this routine to provide different behavior.
1883   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1884                                  VarDecl *ExceptionDecl,
1885                                  Stmt *Handler) {
1886     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1887                                                       Handler));
1888   }
1889
1890   /// \brief Build a new C++ try statement.
1891   ///
1892   /// By default, performs semantic analysis to build the new statement.
1893   /// Subclasses may override this routine to provide different behavior.
1894   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
1895                                ArrayRef<Stmt *> Handlers) {
1896     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
1897   }
1898
1899   /// \brief Build a new C++0x range-based for statement.
1900   ///
1901   /// By default, performs semantic analysis to build the new statement.
1902   /// Subclasses may override this routine to provide different behavior.
1903   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
1904                                     SourceLocation CoawaitLoc,
1905                                     SourceLocation ColonLoc,
1906                                     Stmt *Range, Stmt *Begin, Stmt *End,
1907                                     Expr *Cond, Expr *Inc,
1908                                     Stmt *LoopVar,
1909                                     SourceLocation RParenLoc) {
1910     // If we've just learned that the range is actually an Objective-C
1911     // collection, treat this as an Objective-C fast enumeration loop.
1912     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
1913       if (RangeStmt->isSingleDecl()) {
1914         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
1915           if (RangeVar->isInvalidDecl())
1916             return StmtError();
1917
1918           Expr *RangeExpr = RangeVar->getInit();
1919           if (!RangeExpr->isTypeDependent() &&
1920               RangeExpr->getType()->isObjCObjectPointerType())
1921             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
1922                                                         RParenLoc);
1923         }
1924       }
1925     }
1926
1927     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc,
1928                                           Range, Begin, End,
1929                                           Cond, Inc, LoopVar, RParenLoc,
1930                                           Sema::BFRK_Rebuild);
1931   }
1932
1933   /// \brief Build a new C++0x range-based for statement.
1934   ///
1935   /// By default, performs semantic analysis to build the new statement.
1936   /// Subclasses may override this routine to provide different behavior.
1937   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
1938                                           bool IsIfExists,
1939                                           NestedNameSpecifierLoc QualifierLoc,
1940                                           DeclarationNameInfo NameInfo,
1941                                           Stmt *Nested) {
1942     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
1943                                                 QualifierLoc, NameInfo, Nested);
1944   }
1945
1946   /// \brief Attach body to a C++0x range-based for statement.
1947   ///
1948   /// By default, performs semantic analysis to finish the new statement.
1949   /// Subclasses may override this routine to provide different behavior.
1950   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
1951     return getSema().FinishCXXForRangeStmt(ForRange, Body);
1952   }
1953
1954   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
1955                                Stmt *TryBlock, Stmt *Handler) {
1956     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
1957   }
1958
1959   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
1960                                   Stmt *Block) {
1961     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
1962   }
1963
1964   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
1965     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
1966   }
1967
1968   /// \brief Build a new predefined expression.
1969   ///
1970   /// By default, performs semantic analysis to build the new expression.
1971   /// Subclasses may override this routine to provide different behavior.
1972   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
1973                                    PredefinedExpr::IdentType IT) {
1974     return getSema().BuildPredefinedExpr(Loc, IT);
1975   }
1976
1977   /// \brief Build a new expression that references a declaration.
1978   ///
1979   /// By default, performs semantic analysis to build the new expression.
1980   /// Subclasses may override this routine to provide different behavior.
1981   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1982                                         LookupResult &R,
1983                                         bool RequiresADL) {
1984     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1985   }
1986
1987
1988   /// \brief Build a new expression that references a declaration.
1989   ///
1990   /// By default, performs semantic analysis to build the new expression.
1991   /// Subclasses may override this routine to provide different behavior.
1992   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
1993                                 ValueDecl *VD,
1994                                 const DeclarationNameInfo &NameInfo,
1995                                 TemplateArgumentListInfo *TemplateArgs) {
1996     CXXScopeSpec SS;
1997     SS.Adopt(QualifierLoc);
1998
1999     // FIXME: loses template args.
2000
2001     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
2002   }
2003
2004   /// \brief Build a new expression in parentheses.
2005   ///
2006   /// By default, performs semantic analysis to build the new expression.
2007   /// Subclasses may override this routine to provide different behavior.
2008   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2009                                     SourceLocation RParen) {
2010     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2011   }
2012
2013   /// \brief Build a new pseudo-destructor expression.
2014   ///
2015   /// By default, performs semantic analysis to build the new expression.
2016   /// Subclasses may override this routine to provide different behavior.
2017   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2018                                             SourceLocation OperatorLoc,
2019                                             bool isArrow,
2020                                             CXXScopeSpec &SS,
2021                                             TypeSourceInfo *ScopeType,
2022                                             SourceLocation CCLoc,
2023                                             SourceLocation TildeLoc,
2024                                         PseudoDestructorTypeStorage Destroyed);
2025
2026   /// \brief Build a new unary operator expression.
2027   ///
2028   /// By default, performs semantic analysis to build the new expression.
2029   /// Subclasses may override this routine to provide different behavior.
2030   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2031                                         UnaryOperatorKind Opc,
2032                                         Expr *SubExpr) {
2033     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2034   }
2035
2036   /// \brief Build a new builtin offsetof expression.
2037   ///
2038   /// By default, performs semantic analysis to build the new expression.
2039   /// Subclasses may override this routine to provide different behavior.
2040   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2041                                  TypeSourceInfo *Type,
2042                                  ArrayRef<Sema::OffsetOfComponent> Components,
2043                                  SourceLocation RParenLoc) {
2044     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2045                                           RParenLoc);
2046   }
2047
2048   /// \brief Build a new sizeof, alignof or vec_step expression with a
2049   /// type argument.
2050   ///
2051   /// By default, performs semantic analysis to build the new expression.
2052   /// Subclasses may override this routine to provide different behavior.
2053   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2054                                          SourceLocation OpLoc,
2055                                          UnaryExprOrTypeTrait ExprKind,
2056                                          SourceRange R) {
2057     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2058   }
2059
2060   /// \brief Build a new sizeof, alignof or vec step expression with an
2061   /// expression argument.
2062   ///
2063   /// By default, performs semantic analysis to build the new expression.
2064   /// Subclasses may override this routine to provide different behavior.
2065   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2066                                          UnaryExprOrTypeTrait ExprKind,
2067                                          SourceRange R) {
2068     ExprResult Result
2069       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2070     if (Result.isInvalid())
2071       return ExprError();
2072
2073     return Result;
2074   }
2075
2076   /// \brief Build a new array subscript expression.
2077   ///
2078   /// By default, performs semantic analysis to build the new expression.
2079   /// Subclasses may override this routine to provide different behavior.
2080   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2081                                              SourceLocation LBracketLoc,
2082                                              Expr *RHS,
2083                                              SourceLocation RBracketLoc) {
2084     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2085                                              LBracketLoc, RHS,
2086                                              RBracketLoc);
2087   }
2088
2089   /// \brief Build a new array section expression.
2090   ///
2091   /// By default, performs semantic analysis to build the new expression.
2092   /// Subclasses may override this routine to provide different behavior.
2093   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2094                                         Expr *LowerBound,
2095                                         SourceLocation ColonLoc, Expr *Length,
2096                                         SourceLocation RBracketLoc) {
2097     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2098                                               ColonLoc, Length, RBracketLoc);
2099   }
2100
2101   /// \brief Build a new call expression.
2102   ///
2103   /// By default, performs semantic analysis to build the new expression.
2104   /// Subclasses may override this routine to provide different behavior.
2105   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2106                                    MultiExprArg Args,
2107                                    SourceLocation RParenLoc,
2108                                    Expr *ExecConfig = nullptr) {
2109     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
2110                                    Args, RParenLoc, ExecConfig);
2111   }
2112
2113   /// \brief Build a new member access expression.
2114   ///
2115   /// By default, performs semantic analysis to build the new expression.
2116   /// Subclasses may override this routine to provide different behavior.
2117   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2118                                bool isArrow,
2119                                NestedNameSpecifierLoc QualifierLoc,
2120                                SourceLocation TemplateKWLoc,
2121                                const DeclarationNameInfo &MemberNameInfo,
2122                                ValueDecl *Member,
2123                                NamedDecl *FoundDecl,
2124                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2125                                NamedDecl *FirstQualifierInScope) {
2126     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2127                                                                       isArrow);
2128     if (!Member->getDeclName()) {
2129       // We have a reference to an unnamed field.  This is always the
2130       // base of an anonymous struct/union member access, i.e. the
2131       // field is always of record type.
2132       assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
2133       assert(Member->getType()->isRecordType() &&
2134              "unnamed member not of record type?");
2135
2136       BaseResult =
2137         getSema().PerformObjectMemberConversion(BaseResult.get(),
2138                                                 QualifierLoc.getNestedNameSpecifier(),
2139                                                 FoundDecl, Member);
2140       if (BaseResult.isInvalid())
2141         return ExprError();
2142       Base = BaseResult.get();
2143       ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
2144       MemberExpr *ME = new (getSema().Context)
2145           MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo,
2146                      cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary);
2147       return ME;
2148     }
2149
2150     CXXScopeSpec SS;
2151     SS.Adopt(QualifierLoc);
2152
2153     Base = BaseResult.get();
2154     QualType BaseType = Base->getType();
2155
2156     // FIXME: this involves duplicating earlier analysis in a lot of
2157     // cases; we should avoid this when possible.
2158     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2159     R.addDecl(FoundDecl);
2160     R.resolveKind();
2161
2162     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2163                                               SS, TemplateKWLoc,
2164                                               FirstQualifierInScope,
2165                                               R, ExplicitTemplateArgs,
2166                                               /*S*/nullptr);
2167   }
2168
2169   /// \brief Build a new binary operator expression.
2170   ///
2171   /// By default, performs semantic analysis to build the new expression.
2172   /// Subclasses may override this routine to provide different behavior.
2173   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2174                                          BinaryOperatorKind Opc,
2175                                          Expr *LHS, Expr *RHS) {
2176     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2177   }
2178
2179   /// \brief Build a new conditional operator expression.
2180   ///
2181   /// By default, performs semantic analysis to build the new expression.
2182   /// Subclasses may override this routine to provide different behavior.
2183   ExprResult RebuildConditionalOperator(Expr *Cond,
2184                                         SourceLocation QuestionLoc,
2185                                         Expr *LHS,
2186                                         SourceLocation ColonLoc,
2187                                         Expr *RHS) {
2188     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2189                                         LHS, RHS);
2190   }
2191
2192   /// \brief Build a new C-style cast expression.
2193   ///
2194   /// By default, performs semantic analysis to build the new expression.
2195   /// Subclasses may override this routine to provide different behavior.
2196   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2197                                          TypeSourceInfo *TInfo,
2198                                          SourceLocation RParenLoc,
2199                                          Expr *SubExpr) {
2200     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2201                                          SubExpr);
2202   }
2203
2204   /// \brief Build a new compound literal expression.
2205   ///
2206   /// By default, performs semantic analysis to build the new expression.
2207   /// Subclasses may override this routine to provide different behavior.
2208   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2209                                               TypeSourceInfo *TInfo,
2210                                               SourceLocation RParenLoc,
2211                                               Expr *Init) {
2212     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2213                                               Init);
2214   }
2215
2216   /// \brief Build a new extended vector element access expression.
2217   ///
2218   /// By default, performs semantic analysis to build the new expression.
2219   /// Subclasses may override this routine to provide different behavior.
2220   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2221                                                SourceLocation OpLoc,
2222                                                SourceLocation AccessorLoc,
2223                                                IdentifierInfo &Accessor) {
2224
2225     CXXScopeSpec SS;
2226     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2227     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2228                                               OpLoc, /*IsArrow*/ false,
2229                                               SS, SourceLocation(),
2230                                               /*FirstQualifierInScope*/ nullptr,
2231                                               NameInfo,
2232                                               /* TemplateArgs */ nullptr,
2233                                               /*S*/ nullptr);
2234   }
2235
2236   /// \brief Build a new initializer list expression.
2237   ///
2238   /// By default, performs semantic analysis to build the new expression.
2239   /// Subclasses may override this routine to provide different behavior.
2240   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2241                              MultiExprArg Inits,
2242                              SourceLocation RBraceLoc,
2243                              QualType ResultTy) {
2244     ExprResult Result
2245       = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
2246     if (Result.isInvalid() || ResultTy->isDependentType())
2247       return Result;
2248
2249     // Patch in the result type we were given, which may have been computed
2250     // when the initial InitListExpr was built.
2251     InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
2252     ILE->setType(ResultTy);
2253     return Result;
2254   }
2255
2256   /// \brief Build a new designated initializer expression.
2257   ///
2258   /// By default, performs semantic analysis to build the new expression.
2259   /// Subclasses may override this routine to provide different behavior.
2260   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2261                                              MultiExprArg ArrayExprs,
2262                                              SourceLocation EqualOrColonLoc,
2263                                              bool GNUSyntax,
2264                                              Expr *Init) {
2265     ExprResult Result
2266       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2267                                            Init);
2268     if (Result.isInvalid())
2269       return ExprError();
2270
2271     return Result;
2272   }
2273
2274   /// \brief Build a new value-initialized expression.
2275   ///
2276   /// By default, builds the implicit value initialization without performing
2277   /// any semantic analysis. Subclasses may override this routine to provide
2278   /// different behavior.
2279   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2280     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2281   }
2282
2283   /// \brief Build a new \c va_arg expression.
2284   ///
2285   /// By default, performs semantic analysis to build the new expression.
2286   /// Subclasses may override this routine to provide different behavior.
2287   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2288                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2289                                     SourceLocation RParenLoc) {
2290     return getSema().BuildVAArgExpr(BuiltinLoc,
2291                                     SubExpr, TInfo,
2292                                     RParenLoc);
2293   }
2294
2295   /// \brief Build a new expression list in parentheses.
2296   ///
2297   /// By default, performs semantic analysis to build the new expression.
2298   /// Subclasses may override this routine to provide different behavior.
2299   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2300                                   MultiExprArg SubExprs,
2301                                   SourceLocation RParenLoc) {
2302     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2303   }
2304
2305   /// \brief Build a new address-of-label expression.
2306   ///
2307   /// By default, performs semantic analysis, using the name of the label
2308   /// rather than attempting to map the label statement itself.
2309   /// Subclasses may override this routine to provide different behavior.
2310   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2311                                   SourceLocation LabelLoc, LabelDecl *Label) {
2312     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2313   }
2314
2315   /// \brief Build a new GNU statement expression.
2316   ///
2317   /// By default, performs semantic analysis to build the new expression.
2318   /// Subclasses may override this routine to provide different behavior.
2319   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2320                                    Stmt *SubStmt,
2321                                    SourceLocation RParenLoc) {
2322     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2323   }
2324
2325   /// \brief Build a new __builtin_choose_expr expression.
2326   ///
2327   /// By default, performs semantic analysis to build the new expression.
2328   /// Subclasses may override this routine to provide different behavior.
2329   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2330                                      Expr *Cond, Expr *LHS, Expr *RHS,
2331                                      SourceLocation RParenLoc) {
2332     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2333                                    Cond, LHS, RHS,
2334                                    RParenLoc);
2335   }
2336
2337   /// \brief Build a new generic selection expression.
2338   ///
2339   /// By default, performs semantic analysis to build the new expression.
2340   /// Subclasses may override this routine to provide different behavior.
2341   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2342                                          SourceLocation DefaultLoc,
2343                                          SourceLocation RParenLoc,
2344                                          Expr *ControllingExpr,
2345                                          ArrayRef<TypeSourceInfo *> Types,
2346                                          ArrayRef<Expr *> Exprs) {
2347     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2348                                                 ControllingExpr, Types, Exprs);
2349   }
2350
2351   /// \brief Build a new overloaded operator call expression.
2352   ///
2353   /// By default, performs semantic analysis to build the new expression.
2354   /// The semantic analysis provides the behavior of template instantiation,
2355   /// copying with transformations that turn what looks like an overloaded
2356   /// operator call into a use of a builtin operator, performing
2357   /// argument-dependent lookup, etc. Subclasses may override this routine to
2358   /// provide different behavior.
2359   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2360                                               SourceLocation OpLoc,
2361                                               Expr *Callee,
2362                                               Expr *First,
2363                                               Expr *Second);
2364
2365   /// \brief Build a new C++ "named" cast expression, such as static_cast or
2366   /// reinterpret_cast.
2367   ///
2368   /// By default, this routine dispatches to one of the more-specific routines
2369   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2370   /// Subclasses may override this routine to provide different behavior.
2371   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2372                                            Stmt::StmtClass Class,
2373                                            SourceLocation LAngleLoc,
2374                                            TypeSourceInfo *TInfo,
2375                                            SourceLocation RAngleLoc,
2376                                            SourceLocation LParenLoc,
2377                                            Expr *SubExpr,
2378                                            SourceLocation RParenLoc) {
2379     switch (Class) {
2380     case Stmt::CXXStaticCastExprClass:
2381       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2382                                                    RAngleLoc, LParenLoc,
2383                                                    SubExpr, RParenLoc);
2384
2385     case Stmt::CXXDynamicCastExprClass:
2386       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2387                                                     RAngleLoc, LParenLoc,
2388                                                     SubExpr, RParenLoc);
2389
2390     case Stmt::CXXReinterpretCastExprClass:
2391       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2392                                                         RAngleLoc, LParenLoc,
2393                                                         SubExpr,
2394                                                         RParenLoc);
2395
2396     case Stmt::CXXConstCastExprClass:
2397       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2398                                                    RAngleLoc, LParenLoc,
2399                                                    SubExpr, RParenLoc);
2400
2401     default:
2402       llvm_unreachable("Invalid C++ named cast");
2403     }
2404   }
2405
2406   /// \brief Build a new C++ static_cast expression.
2407   ///
2408   /// By default, performs semantic analysis to build the new expression.
2409   /// Subclasses may override this routine to provide different behavior.
2410   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2411                                             SourceLocation LAngleLoc,
2412                                             TypeSourceInfo *TInfo,
2413                                             SourceLocation RAngleLoc,
2414                                             SourceLocation LParenLoc,
2415                                             Expr *SubExpr,
2416                                             SourceLocation RParenLoc) {
2417     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2418                                        TInfo, SubExpr,
2419                                        SourceRange(LAngleLoc, RAngleLoc),
2420                                        SourceRange(LParenLoc, RParenLoc));
2421   }
2422
2423   /// \brief Build a new C++ dynamic_cast expression.
2424   ///
2425   /// By default, performs semantic analysis to build the new expression.
2426   /// Subclasses may override this routine to provide different behavior.
2427   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2428                                              SourceLocation LAngleLoc,
2429                                              TypeSourceInfo *TInfo,
2430                                              SourceLocation RAngleLoc,
2431                                              SourceLocation LParenLoc,
2432                                              Expr *SubExpr,
2433                                              SourceLocation RParenLoc) {
2434     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2435                                        TInfo, SubExpr,
2436                                        SourceRange(LAngleLoc, RAngleLoc),
2437                                        SourceRange(LParenLoc, RParenLoc));
2438   }
2439
2440   /// \brief Build a new C++ reinterpret_cast expression.
2441   ///
2442   /// By default, performs semantic analysis to build the new expression.
2443   /// Subclasses may override this routine to provide different behavior.
2444   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2445                                                  SourceLocation LAngleLoc,
2446                                                  TypeSourceInfo *TInfo,
2447                                                  SourceLocation RAngleLoc,
2448                                                  SourceLocation LParenLoc,
2449                                                  Expr *SubExpr,
2450                                                  SourceLocation RParenLoc) {
2451     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2452                                        TInfo, SubExpr,
2453                                        SourceRange(LAngleLoc, RAngleLoc),
2454                                        SourceRange(LParenLoc, RParenLoc));
2455   }
2456
2457   /// \brief Build a new C++ const_cast expression.
2458   ///
2459   /// By default, performs semantic analysis to build the new expression.
2460   /// Subclasses may override this routine to provide different behavior.
2461   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2462                                            SourceLocation LAngleLoc,
2463                                            TypeSourceInfo *TInfo,
2464                                            SourceLocation RAngleLoc,
2465                                            SourceLocation LParenLoc,
2466                                            Expr *SubExpr,
2467                                            SourceLocation RParenLoc) {
2468     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2469                                        TInfo, SubExpr,
2470                                        SourceRange(LAngleLoc, RAngleLoc),
2471                                        SourceRange(LParenLoc, RParenLoc));
2472   }
2473
2474   /// \brief Build a new C++ functional-style cast expression.
2475   ///
2476   /// By default, performs semantic analysis to build the new expression.
2477   /// Subclasses may override this routine to provide different behavior.
2478   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2479                                           SourceLocation LParenLoc,
2480                                           Expr *Sub,
2481                                           SourceLocation RParenLoc) {
2482     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2483                                                MultiExprArg(&Sub, 1),
2484                                                RParenLoc);
2485   }
2486
2487   /// \brief Build a new C++ typeid(type) expression.
2488   ///
2489   /// By default, performs semantic analysis to build the new expression.
2490   /// Subclasses may override this routine to provide different behavior.
2491   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2492                                         SourceLocation TypeidLoc,
2493                                         TypeSourceInfo *Operand,
2494                                         SourceLocation RParenLoc) {
2495     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2496                                     RParenLoc);
2497   }
2498
2499
2500   /// \brief Build a new C++ typeid(expr) expression.
2501   ///
2502   /// By default, performs semantic analysis to build the new expression.
2503   /// Subclasses may override this routine to provide different behavior.
2504   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2505                                         SourceLocation TypeidLoc,
2506                                         Expr *Operand,
2507                                         SourceLocation RParenLoc) {
2508     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2509                                     RParenLoc);
2510   }
2511
2512   /// \brief Build a new C++ __uuidof(type) expression.
2513   ///
2514   /// By default, performs semantic analysis to build the new expression.
2515   /// Subclasses may override this routine to provide different behavior.
2516   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2517                                         SourceLocation TypeidLoc,
2518                                         TypeSourceInfo *Operand,
2519                                         SourceLocation RParenLoc) {
2520     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2521                                     RParenLoc);
2522   }
2523
2524   /// \brief Build a new C++ __uuidof(expr) expression.
2525   ///
2526   /// By default, performs semantic analysis to build the new expression.
2527   /// Subclasses may override this routine to provide different behavior.
2528   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2529                                         SourceLocation TypeidLoc,
2530                                         Expr *Operand,
2531                                         SourceLocation RParenLoc) {
2532     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2533                                     RParenLoc);
2534   }
2535
2536   /// \brief Build a new C++ "this" expression.
2537   ///
2538   /// By default, builds a new "this" expression without performing any
2539   /// semantic analysis. Subclasses may override this routine to provide
2540   /// different behavior.
2541   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2542                                 QualType ThisType,
2543                                 bool isImplicit) {
2544     getSema().CheckCXXThisCapture(ThisLoc);
2545     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2546   }
2547
2548   /// \brief Build a new C++ throw 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 RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2553                                  bool IsThrownVariableInScope) {
2554     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2555   }
2556
2557   /// \brief Build a new C++ default-argument expression.
2558   ///
2559   /// By default, builds a new default-argument expression, which does not
2560   /// require any semantic analysis. Subclasses may override this routine to
2561   /// provide different behavior.
2562   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2563                                             ParmVarDecl *Param) {
2564     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2565   }
2566
2567   /// \brief Build a new C++11 default-initialization expression.
2568   ///
2569   /// By default, builds a new default field initialization expression, which
2570   /// does not require any semantic analysis. Subclasses may override this
2571   /// routine to provide different behavior.
2572   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2573                                        FieldDecl *Field) {
2574     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2575   }
2576
2577   /// \brief Build a new C++ zero-initialization expression.
2578   ///
2579   /// By default, performs semantic analysis to build the new expression.
2580   /// Subclasses may override this routine to provide different behavior.
2581   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2582                                            SourceLocation LParenLoc,
2583                                            SourceLocation RParenLoc) {
2584     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
2585                                                None, RParenLoc);
2586   }
2587
2588   /// \brief Build a new C++ "new" expression.
2589   ///
2590   /// By default, performs semantic analysis to build the new expression.
2591   /// Subclasses may override this routine to provide different behavior.
2592   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2593                                bool UseGlobal,
2594                                SourceLocation PlacementLParen,
2595                                MultiExprArg PlacementArgs,
2596                                SourceLocation PlacementRParen,
2597                                SourceRange TypeIdParens,
2598                                QualType AllocatedType,
2599                                TypeSourceInfo *AllocatedTypeInfo,
2600                                Expr *ArraySize,
2601                                SourceRange DirectInitRange,
2602                                Expr *Initializer) {
2603     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2604                                  PlacementLParen,
2605                                  PlacementArgs,
2606                                  PlacementRParen,
2607                                  TypeIdParens,
2608                                  AllocatedType,
2609                                  AllocatedTypeInfo,
2610                                  ArraySize,
2611                                  DirectInitRange,
2612                                  Initializer);
2613   }
2614
2615   /// \brief Build a new C++ "delete" expression.
2616   ///
2617   /// By default, performs semantic analysis to build the new expression.
2618   /// Subclasses may override this routine to provide different behavior.
2619   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2620                                         bool IsGlobalDelete,
2621                                         bool IsArrayForm,
2622                                         Expr *Operand) {
2623     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2624                                     Operand);
2625   }
2626
2627   /// \brief Build a new type trait expression.
2628   ///
2629   /// By default, performs semantic analysis to build the new expression.
2630   /// Subclasses may override this routine to provide different behavior.
2631   ExprResult RebuildTypeTrait(TypeTrait Trait,
2632                               SourceLocation StartLoc,
2633                               ArrayRef<TypeSourceInfo *> Args,
2634                               SourceLocation RParenLoc) {
2635     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2636   }
2637
2638   /// \brief Build a new array type trait expression.
2639   ///
2640   /// By default, performs semantic analysis to build the new expression.
2641   /// Subclasses may override this routine to provide different behavior.
2642   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2643                                    SourceLocation StartLoc,
2644                                    TypeSourceInfo *TSInfo,
2645                                    Expr *DimExpr,
2646                                    SourceLocation RParenLoc) {
2647     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2648   }
2649
2650   /// \brief Build a new expression trait expression.
2651   ///
2652   /// By default, performs semantic analysis to build the new expression.
2653   /// Subclasses may override this routine to provide different behavior.
2654   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2655                                    SourceLocation StartLoc,
2656                                    Expr *Queried,
2657                                    SourceLocation RParenLoc) {
2658     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2659   }
2660
2661   /// \brief Build a new (previously unresolved) declaration reference
2662   /// 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 RebuildDependentScopeDeclRefExpr(
2667                                           NestedNameSpecifierLoc QualifierLoc,
2668                                           SourceLocation TemplateKWLoc,
2669                                        const DeclarationNameInfo &NameInfo,
2670                               const TemplateArgumentListInfo *TemplateArgs,
2671                                           bool IsAddressOfOperand,
2672                                           TypeSourceInfo **RecoveryTSI) {
2673     CXXScopeSpec SS;
2674     SS.Adopt(QualifierLoc);
2675
2676     if (TemplateArgs || TemplateKWLoc.isValid())
2677       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2678                                                     TemplateArgs);
2679
2680     return getSema().BuildQualifiedDeclarationNameExpr(
2681         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2682   }
2683
2684   /// \brief Build a new template-id expression.
2685   ///
2686   /// By default, performs semantic analysis to build the new expression.
2687   /// Subclasses may override this routine to provide different behavior.
2688   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2689                                    SourceLocation TemplateKWLoc,
2690                                    LookupResult &R,
2691                                    bool RequiresADL,
2692                               const TemplateArgumentListInfo *TemplateArgs) {
2693     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2694                                          TemplateArgs);
2695   }
2696
2697   /// \brief Build a new object-construction expression.
2698   ///
2699   /// By default, performs semantic analysis to build the new expression.
2700   /// Subclasses may override this routine to provide different behavior.
2701   ExprResult RebuildCXXConstructExpr(QualType T,
2702                                      SourceLocation Loc,
2703                                      CXXConstructorDecl *Constructor,
2704                                      bool IsElidable,
2705                                      MultiExprArg Args,
2706                                      bool HadMultipleCandidates,
2707                                      bool ListInitialization,
2708                                      bool StdInitListInitialization,
2709                                      bool RequiresZeroInit,
2710                              CXXConstructExpr::ConstructionKind ConstructKind,
2711                                      SourceRange ParenRange) {
2712     SmallVector<Expr*, 8> ConvertedArgs;
2713     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2714                                           ConvertedArgs))
2715       return ExprError();
2716
2717     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2718                                            IsElidable,
2719                                            ConvertedArgs,
2720                                            HadMultipleCandidates,
2721                                            ListInitialization,
2722                                            StdInitListInitialization,
2723                                            RequiresZeroInit, ConstructKind,
2724                                            ParenRange);
2725   }
2726
2727   /// \brief Build a new implicit construction via inherited constructor
2728   /// expression.
2729   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2730                                              CXXConstructorDecl *Constructor,
2731                                              bool ConstructsVBase,
2732                                              bool InheritedFromVBase) {
2733     return new (getSema().Context) CXXInheritedCtorInitExpr(
2734         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2735   }
2736
2737   /// \brief Build a new object-construction expression.
2738   ///
2739   /// By default, performs semantic analysis to build the new expression.
2740   /// Subclasses may override this routine to provide different behavior.
2741   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2742                                            SourceLocation LParenLoc,
2743                                            MultiExprArg Args,
2744                                            SourceLocation RParenLoc) {
2745     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2746                                                LParenLoc,
2747                                                Args,
2748                                                RParenLoc);
2749   }
2750
2751   /// \brief Build a new object-construction expression.
2752   ///
2753   /// By default, performs semantic analysis to build the new expression.
2754   /// Subclasses may override this routine to provide different behavior.
2755   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2756                                                SourceLocation LParenLoc,
2757                                                MultiExprArg Args,
2758                                                SourceLocation RParenLoc) {
2759     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2760                                                LParenLoc,
2761                                                Args,
2762                                                RParenLoc);
2763   }
2764
2765   /// \brief Build a new member reference expression.
2766   ///
2767   /// By default, performs semantic analysis to build the new expression.
2768   /// Subclasses may override this routine to provide different behavior.
2769   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2770                                                 QualType BaseType,
2771                                                 bool IsArrow,
2772                                                 SourceLocation OperatorLoc,
2773                                           NestedNameSpecifierLoc QualifierLoc,
2774                                                 SourceLocation TemplateKWLoc,
2775                                             NamedDecl *FirstQualifierInScope,
2776                                    const DeclarationNameInfo &MemberNameInfo,
2777                               const TemplateArgumentListInfo *TemplateArgs) {
2778     CXXScopeSpec SS;
2779     SS.Adopt(QualifierLoc);
2780
2781     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2782                                             OperatorLoc, IsArrow,
2783                                             SS, TemplateKWLoc,
2784                                             FirstQualifierInScope,
2785                                             MemberNameInfo,
2786                                             TemplateArgs, /*S*/nullptr);
2787   }
2788
2789   /// \brief Build a new member reference expression.
2790   ///
2791   /// By default, performs semantic analysis to build the new expression.
2792   /// Subclasses may override this routine to provide different behavior.
2793   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2794                                          SourceLocation OperatorLoc,
2795                                          bool IsArrow,
2796                                          NestedNameSpecifierLoc QualifierLoc,
2797                                          SourceLocation TemplateKWLoc,
2798                                          NamedDecl *FirstQualifierInScope,
2799                                          LookupResult &R,
2800                                 const TemplateArgumentListInfo *TemplateArgs) {
2801     CXXScopeSpec SS;
2802     SS.Adopt(QualifierLoc);
2803
2804     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2805                                             OperatorLoc, IsArrow,
2806                                             SS, TemplateKWLoc,
2807                                             FirstQualifierInScope,
2808                                             R, TemplateArgs, /*S*/nullptr);
2809   }
2810
2811   /// \brief Build a new noexcept expression.
2812   ///
2813   /// By default, performs semantic analysis to build the new expression.
2814   /// Subclasses may override this routine to provide different behavior.
2815   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2816     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2817   }
2818
2819   /// \brief Build a new expression to compute the length of a parameter pack.
2820   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
2821                                    NamedDecl *Pack,
2822                                    SourceLocation PackLoc,
2823                                    SourceLocation RParenLoc,
2824                                    Optional<unsigned> Length,
2825                                    ArrayRef<TemplateArgument> PartialArgs) {
2826     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
2827                                   RParenLoc, Length, PartialArgs);
2828   }
2829
2830   /// \brief Build a new Objective-C boxed expression.
2831   ///
2832   /// By default, performs semantic analysis to build the new expression.
2833   /// Subclasses may override this routine to provide different behavior.
2834   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2835     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2836   }
2837
2838   /// \brief Build a new Objective-C array literal.
2839   ///
2840   /// By default, performs semantic analysis to build the new expression.
2841   /// Subclasses may override this routine to provide different behavior.
2842   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2843                                      Expr **Elements, unsigned NumElements) {
2844     return getSema().BuildObjCArrayLiteral(Range,
2845                                            MultiExprArg(Elements, NumElements));
2846   }
2847
2848   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2849                                          Expr *Base, Expr *Key,
2850                                          ObjCMethodDecl *getterMethod,
2851                                          ObjCMethodDecl *setterMethod) {
2852     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2853                                                    getterMethod, setterMethod);
2854   }
2855
2856   /// \brief Build a new Objective-C dictionary literal.
2857   ///
2858   /// By default, performs semantic analysis to build the new expression.
2859   /// Subclasses may override this routine to provide different behavior.
2860   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2861                               MutableArrayRef<ObjCDictionaryElement> Elements) {
2862     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
2863   }
2864
2865   /// \brief Build a new Objective-C \@encode expression.
2866   ///
2867   /// By default, performs semantic analysis to build the new expression.
2868   /// Subclasses may override this routine to provide different behavior.
2869   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2870                                          TypeSourceInfo *EncodeTypeInfo,
2871                                          SourceLocation RParenLoc) {
2872     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2873   }
2874
2875   /// \brief Build a new Objective-C class message.
2876   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2877                                           Selector Sel,
2878                                           ArrayRef<SourceLocation> SelectorLocs,
2879                                           ObjCMethodDecl *Method,
2880                                           SourceLocation LBracLoc,
2881                                           MultiExprArg Args,
2882                                           SourceLocation RBracLoc) {
2883     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2884                                      ReceiverTypeInfo->getType(),
2885                                      /*SuperLoc=*/SourceLocation(),
2886                                      Sel, Method, LBracLoc, SelectorLocs,
2887                                      RBracLoc, Args);
2888   }
2889
2890   /// \brief Build a new Objective-C instance message.
2891   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2892                                           Selector Sel,
2893                                           ArrayRef<SourceLocation> SelectorLocs,
2894                                           ObjCMethodDecl *Method,
2895                                           SourceLocation LBracLoc,
2896                                           MultiExprArg Args,
2897                                           SourceLocation RBracLoc) {
2898     return SemaRef.BuildInstanceMessage(Receiver,
2899                                         Receiver->getType(),
2900                                         /*SuperLoc=*/SourceLocation(),
2901                                         Sel, Method, LBracLoc, SelectorLocs,
2902                                         RBracLoc, Args);
2903   }
2904
2905   /// \brief Build a new Objective-C instance/class message to 'super'.
2906   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
2907                                     Selector Sel,
2908                                     ArrayRef<SourceLocation> SelectorLocs,
2909                                     QualType SuperType,
2910                                     ObjCMethodDecl *Method,
2911                                     SourceLocation LBracLoc,
2912                                     MultiExprArg Args,
2913                                     SourceLocation RBracLoc) {
2914     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
2915                                           SuperType,
2916                                           SuperLoc,
2917                                           Sel, Method, LBracLoc, SelectorLocs,
2918                                           RBracLoc, Args)
2919                                       : SemaRef.BuildClassMessage(nullptr,
2920                                           SuperType,
2921                                           SuperLoc,
2922                                           Sel, Method, LBracLoc, SelectorLocs,
2923                                           RBracLoc, Args);
2924
2925       
2926   }
2927
2928   /// \brief Build a new Objective-C ivar reference expression.
2929   ///
2930   /// By default, performs semantic analysis to build the new expression.
2931   /// Subclasses may override this routine to provide different behavior.
2932   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
2933                                           SourceLocation IvarLoc,
2934                                           bool IsArrow, bool IsFreeIvar) {
2935     // FIXME: We lose track of the IsFreeIvar bit.
2936     CXXScopeSpec SS;
2937     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
2938     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2939                                               /*FIXME:*/IvarLoc, IsArrow,
2940                                               SS, SourceLocation(),
2941                                               /*FirstQualifierInScope=*/nullptr,
2942                                               NameInfo,
2943                                               /*TemplateArgs=*/nullptr,
2944                                               /*S=*/nullptr);
2945   }
2946
2947   /// \brief Build a new Objective-C property reference expression.
2948   ///
2949   /// By default, performs semantic analysis to build the new expression.
2950   /// Subclasses may override this routine to provide different behavior.
2951   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
2952                                         ObjCPropertyDecl *Property,
2953                                         SourceLocation PropertyLoc) {
2954     CXXScopeSpec SS;
2955     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
2956     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2957                                               /*FIXME:*/PropertyLoc,
2958                                               /*IsArrow=*/false,
2959                                               SS, SourceLocation(),
2960                                               /*FirstQualifierInScope=*/nullptr,
2961                                               NameInfo,
2962                                               /*TemplateArgs=*/nullptr,
2963                                               /*S=*/nullptr);
2964   }
2965
2966   /// \brief Build a new Objective-C property reference expression.
2967   ///
2968   /// By default, performs semantic analysis to build the new expression.
2969   /// Subclasses may override this routine to provide different behavior.
2970   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
2971                                         ObjCMethodDecl *Getter,
2972                                         ObjCMethodDecl *Setter,
2973                                         SourceLocation PropertyLoc) {
2974     // Since these expressions can only be value-dependent, we do not
2975     // need to perform semantic analysis again.
2976     return Owned(
2977       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
2978                                                   VK_LValue, OK_ObjCProperty,
2979                                                   PropertyLoc, Base));
2980   }
2981
2982   /// \brief Build a new Objective-C "isa" expression.
2983   ///
2984   /// By default, performs semantic analysis to build the new expression.
2985   /// Subclasses may override this routine to provide different behavior.
2986   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
2987                                 SourceLocation OpLoc, bool IsArrow) {
2988     CXXScopeSpec SS;
2989     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
2990     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2991                                               OpLoc, IsArrow,
2992                                               SS, SourceLocation(),
2993                                               /*FirstQualifierInScope=*/nullptr,
2994                                               NameInfo,
2995                                               /*TemplateArgs=*/nullptr,
2996                                               /*S=*/nullptr);
2997   }
2998
2999   /// \brief Build a new shuffle vector expression.
3000   ///
3001   /// By default, performs semantic analysis to build the new expression.
3002   /// Subclasses may override this routine to provide different behavior.
3003   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3004                                       MultiExprArg SubExprs,
3005                                       SourceLocation RParenLoc) {
3006     // Find the declaration for __builtin_shufflevector
3007     const IdentifierInfo &Name
3008       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3009     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3010     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3011     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3012
3013     // Build a reference to the __builtin_shufflevector builtin
3014     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3015     Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
3016                                                   SemaRef.Context.BuiltinFnTy,
3017                                                   VK_RValue, BuiltinLoc);
3018     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3019     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3020                                        CK_BuiltinFnToFnPtr).get();
3021
3022     // Build the CallExpr
3023     ExprResult TheCall = new (SemaRef.Context) CallExpr(
3024         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3025         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3026
3027     // Type-check the __builtin_shufflevector expression.
3028     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3029   }
3030
3031   /// \brief Build a new convert vector expression.
3032   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3033                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3034                                       SourceLocation RParenLoc) {
3035     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3036                                          BuiltinLoc, RParenLoc);
3037   }
3038
3039   /// \brief Build a new template argument pack expansion.
3040   ///
3041   /// By default, performs semantic analysis to build a new pack expansion
3042   /// for a template argument. Subclasses may override this routine to provide
3043   /// different behavior.
3044   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3045                                            SourceLocation EllipsisLoc,
3046                                            Optional<unsigned> NumExpansions) {
3047     switch (Pattern.getArgument().getKind()) {
3048     case TemplateArgument::Expression: {
3049       ExprResult Result
3050         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3051                                        EllipsisLoc, NumExpansions);
3052       if (Result.isInvalid())
3053         return TemplateArgumentLoc();
3054
3055       return TemplateArgumentLoc(Result.get(), Result.get());
3056     }
3057
3058     case TemplateArgument::Template:
3059       return TemplateArgumentLoc(TemplateArgument(
3060                                           Pattern.getArgument().getAsTemplate(),
3061                                                   NumExpansions),
3062                                  Pattern.getTemplateQualifierLoc(),
3063                                  Pattern.getTemplateNameLoc(),
3064                                  EllipsisLoc);
3065
3066     case TemplateArgument::Null:
3067     case TemplateArgument::Integral:
3068     case TemplateArgument::Declaration:
3069     case TemplateArgument::Pack:
3070     case TemplateArgument::TemplateExpansion:
3071     case TemplateArgument::NullPtr:
3072       llvm_unreachable("Pack expansion pattern has no parameter packs");
3073
3074     case TemplateArgument::Type:
3075       if (TypeSourceInfo *Expansion
3076             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3077                                            EllipsisLoc,
3078                                            NumExpansions))
3079         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3080                                    Expansion);
3081       break;
3082     }
3083
3084     return TemplateArgumentLoc();
3085   }
3086
3087   /// \brief Build a new expression pack expansion.
3088   ///
3089   /// By default, performs semantic analysis to build a new pack expansion
3090   /// for an expression. Subclasses may override this routine to provide
3091   /// different behavior.
3092   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3093                                   Optional<unsigned> NumExpansions) {
3094     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3095   }
3096
3097   /// \brief Build a new C++1z fold-expression.
3098   ///
3099   /// By default, performs semantic analysis in order to build a new fold
3100   /// expression.
3101   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3102                                 BinaryOperatorKind Operator,
3103                                 SourceLocation EllipsisLoc, Expr *RHS,
3104                                 SourceLocation RParenLoc) {
3105     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3106                                       RHS, RParenLoc);
3107   }
3108
3109   /// \brief Build an empty C++1z fold-expression with the given operator.
3110   ///
3111   /// By default, produces the fallback value for the fold-expression, or
3112   /// produce an error if there is no fallback value.
3113   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3114                                      BinaryOperatorKind Operator) {
3115     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3116   }
3117
3118   /// \brief Build a new atomic operation expression.
3119   ///
3120   /// By default, performs semantic analysis to build the new expression.
3121   /// Subclasses may override this routine to provide different behavior.
3122   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
3123                                MultiExprArg SubExprs,
3124                                QualType RetTy,
3125                                AtomicExpr::AtomicOp Op,
3126                                SourceLocation RParenLoc) {
3127     // Just create the expression; there is not any interesting semantic
3128     // analysis here because we can't actually build an AtomicExpr until
3129     // we are sure it is semantically sound.
3130     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
3131                                             RParenLoc);
3132   }
3133
3134 private:
3135   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3136                                      QualType ObjectType,
3137                                      NamedDecl *FirstQualifierInScope,
3138                                      CXXScopeSpec &SS);
3139
3140   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3141                                              QualType ObjectType,
3142                                              NamedDecl *FirstQualifierInScope,
3143                                              CXXScopeSpec &SS);
3144
3145   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3146                                             NamedDecl *FirstQualifierInScope,
3147                                             CXXScopeSpec &SS);
3148 };
3149
3150 template<typename Derived>
3151 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
3152   if (!S)
3153     return S;
3154
3155   switch (S->getStmtClass()) {
3156   case Stmt::NoStmtClass: break;
3157
3158   // Transform individual statement nodes
3159 #define STMT(Node, Parent)                                              \
3160   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3161 #define ABSTRACT_STMT(Node)
3162 #define EXPR(Node, Parent)
3163 #include "clang/AST/StmtNodes.inc"
3164
3165   // Transform expressions by calling TransformExpr.
3166 #define STMT(Node, Parent)
3167 #define ABSTRACT_STMT(Stmt)
3168 #define EXPR(Node, Parent) case Stmt::Node##Class:
3169 #include "clang/AST/StmtNodes.inc"
3170     {
3171       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3172       if (E.isInvalid())
3173         return StmtError();
3174
3175       return getSema().ActOnExprStmt(E);
3176     }
3177   }
3178
3179   return S;
3180 }
3181
3182 template<typename Derived>
3183 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3184   if (!S)
3185     return S;
3186
3187   switch (S->getClauseKind()) {
3188   default: break;
3189   // Transform individual clause nodes
3190 #define OPENMP_CLAUSE(Name, Class)                                             \
3191   case OMPC_ ## Name :                                                         \
3192     return getDerived().Transform ## Class(cast<Class>(S));
3193 #include "clang/Basic/OpenMPKinds.def"
3194   }
3195
3196   return S;
3197 }
3198
3199
3200 template<typename Derived>
3201 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3202   if (!E)
3203     return E;
3204
3205   switch (E->getStmtClass()) {
3206     case Stmt::NoStmtClass: break;
3207 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3208 #define ABSTRACT_STMT(Stmt)
3209 #define EXPR(Node, Parent)                                              \
3210     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3211 #include "clang/AST/StmtNodes.inc"
3212   }
3213
3214   return E;
3215 }
3216
3217 template<typename Derived>
3218 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3219                                                         bool NotCopyInit) {
3220   // Initializers are instantiated like expressions, except that various outer
3221   // layers are stripped.
3222   if (!Init)
3223     return Init;
3224
3225   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
3226     Init = ExprTemp->getSubExpr();
3227
3228   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3229     Init = AIL->getCommonExpr();
3230
3231   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3232     Init = MTE->GetTemporaryExpr();
3233
3234   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3235     Init = Binder->getSubExpr();
3236
3237   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3238     Init = ICE->getSubExprAsWritten();
3239
3240   if (CXXStdInitializerListExpr *ILE =
3241           dyn_cast<CXXStdInitializerListExpr>(Init))
3242     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3243
3244   // If this is copy-initialization, we only need to reconstruct
3245   // InitListExprs. Other forms of copy-initialization will be a no-op if
3246   // the initializer is already the right type.
3247   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3248   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3249     return getDerived().TransformExpr(Init);
3250
3251   // Revert value-initialization back to empty parens.
3252   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3253     SourceRange Parens = VIE->getSourceRange();
3254     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3255                                              Parens.getEnd());
3256   }
3257
3258   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3259   if (isa<ImplicitValueInitExpr>(Init))
3260     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3261                                              SourceLocation());
3262
3263   // Revert initialization by constructor back to a parenthesized or braced list
3264   // of expressions. Any other form of initializer can just be reused directly.
3265   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3266     return getDerived().TransformExpr(Init);
3267
3268   // If the initialization implicitly converted an initializer list to a
3269   // std::initializer_list object, unwrap the std::initializer_list too.
3270   if (Construct && Construct->isStdInitListInitialization())
3271     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3272
3273   SmallVector<Expr*, 8> NewArgs;
3274   bool ArgChanged = false;
3275   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3276                                   /*IsCall*/true, NewArgs, &ArgChanged))
3277     return ExprError();
3278
3279   // If this was list initialization, revert to list form.
3280   if (Construct->isListInitialization())
3281     return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs,
3282                                         Construct->getLocEnd(),
3283                                         Construct->getType());
3284
3285   // Build a ParenListExpr to represent anything else.
3286   SourceRange Parens = Construct->getParenOrBraceRange();
3287   if (Parens.isInvalid()) {
3288     // This was a variable declaration's initialization for which no initializer
3289     // was specified.
3290     assert(NewArgs.empty() &&
3291            "no parens or braces but have direct init with arguments?");
3292     return ExprEmpty();
3293   }
3294   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3295                                            Parens.getEnd());
3296 }
3297
3298 template<typename Derived>
3299 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3300                                             unsigned NumInputs,
3301                                             bool IsCall,
3302                                       SmallVectorImpl<Expr *> &Outputs,
3303                                             bool *ArgChanged) {
3304   for (unsigned I = 0; I != NumInputs; ++I) {
3305     // If requested, drop call arguments that need to be dropped.
3306     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3307       if (ArgChanged)
3308         *ArgChanged = true;
3309
3310       break;
3311     }
3312
3313     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3314       Expr *Pattern = Expansion->getPattern();
3315
3316       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3317       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3318       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3319
3320       // Determine whether the set of unexpanded parameter packs can and should
3321       // be expanded.
3322       bool Expand = true;
3323       bool RetainExpansion = false;
3324       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3325       Optional<unsigned> NumExpansions = OrigNumExpansions;
3326       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3327                                                Pattern->getSourceRange(),
3328                                                Unexpanded,
3329                                                Expand, RetainExpansion,
3330                                                NumExpansions))
3331         return true;
3332
3333       if (!Expand) {
3334         // The transform has determined that we should perform a simple
3335         // transformation on the pack expansion, producing another pack
3336         // expansion.
3337         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3338         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3339         if (OutPattern.isInvalid())
3340           return true;
3341
3342         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3343                                                 Expansion->getEllipsisLoc(),
3344                                                            NumExpansions);
3345         if (Out.isInvalid())
3346           return true;
3347
3348         if (ArgChanged)
3349           *ArgChanged = true;
3350         Outputs.push_back(Out.get());
3351         continue;
3352       }
3353
3354       // Record right away that the argument was changed.  This needs
3355       // to happen even if the array expands to nothing.
3356       if (ArgChanged) *ArgChanged = true;
3357
3358       // The transform has determined that we should perform an elementwise
3359       // expansion of the pattern. Do so.
3360       for (unsigned I = 0; I != *NumExpansions; ++I) {
3361         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3362         ExprResult Out = getDerived().TransformExpr(Pattern);
3363         if (Out.isInvalid())
3364           return true;
3365
3366         if (Out.get()->containsUnexpandedParameterPack()) {
3367           Out = getDerived().RebuildPackExpansion(
3368               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3369           if (Out.isInvalid())
3370             return true;
3371         }
3372
3373         Outputs.push_back(Out.get());
3374       }
3375
3376       // If we're supposed to retain a pack expansion, do so by temporarily
3377       // forgetting the partially-substituted parameter pack.
3378       if (RetainExpansion) {
3379         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3380
3381         ExprResult Out = getDerived().TransformExpr(Pattern);
3382         if (Out.isInvalid())
3383           return true;
3384
3385         Out = getDerived().RebuildPackExpansion(
3386             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3387         if (Out.isInvalid())
3388           return true;
3389
3390         Outputs.push_back(Out.get());
3391       }
3392
3393       continue;
3394     }
3395
3396     ExprResult Result =
3397       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3398              : getDerived().TransformExpr(Inputs[I]);
3399     if (Result.isInvalid())
3400       return true;
3401
3402     if (Result.get() != Inputs[I] && ArgChanged)
3403       *ArgChanged = true;
3404
3405     Outputs.push_back(Result.get());
3406   }
3407
3408   return false;
3409 }
3410
3411 template <typename Derived>
3412 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3413     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3414   if (Var) {
3415     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3416         getDerived().TransformDefinition(Var->getLocation(), Var));
3417
3418     if (!ConditionVar)
3419       return Sema::ConditionError();
3420
3421     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3422   }
3423
3424   if (Expr) {
3425     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3426
3427     if (CondExpr.isInvalid())
3428       return Sema::ConditionError();
3429
3430     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3431   }
3432
3433   return Sema::ConditionResult();
3434 }
3435
3436 template<typename Derived>
3437 NestedNameSpecifierLoc
3438 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3439                                                     NestedNameSpecifierLoc NNS,
3440                                                      QualType ObjectType,
3441                                              NamedDecl *FirstQualifierInScope) {
3442   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3443   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3444        Qualifier = Qualifier.getPrefix())
3445     Qualifiers.push_back(Qualifier);
3446
3447   CXXScopeSpec SS;
3448   while (!Qualifiers.empty()) {
3449     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3450     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3451
3452     switch (QNNS->getKind()) {
3453     case NestedNameSpecifier::Identifier: {
3454       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3455                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3456       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3457                                               SS, FirstQualifierInScope, false))
3458         return NestedNameSpecifierLoc();
3459     }
3460       break;
3461
3462     case NestedNameSpecifier::Namespace: {
3463       NamespaceDecl *NS
3464         = cast_or_null<NamespaceDecl>(
3465                                     getDerived().TransformDecl(
3466                                                           Q.getLocalBeginLoc(),
3467                                                        QNNS->getAsNamespace()));
3468       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3469       break;
3470     }
3471
3472     case NestedNameSpecifier::NamespaceAlias: {
3473       NamespaceAliasDecl *Alias
3474         = cast_or_null<NamespaceAliasDecl>(
3475                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3476                                                  QNNS->getAsNamespaceAlias()));
3477       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3478                 Q.getLocalEndLoc());
3479       break;
3480     }
3481
3482     case NestedNameSpecifier::Global:
3483       // There is no meaningful transformation that one could perform on the
3484       // global scope.
3485       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3486       break;
3487
3488     case NestedNameSpecifier::Super: {
3489       CXXRecordDecl *RD =
3490           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3491               SourceLocation(), QNNS->getAsRecordDecl()));
3492       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3493       break;
3494     }
3495
3496     case NestedNameSpecifier::TypeSpecWithTemplate:
3497     case NestedNameSpecifier::TypeSpec: {
3498       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3499                                               FirstQualifierInScope, SS);
3500
3501       if (!TL)
3502         return NestedNameSpecifierLoc();
3503
3504       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3505           (SemaRef.getLangOpts().CPlusPlus11 &&
3506            TL.getType()->isEnumeralType())) {
3507         assert(!TL.getType().hasLocalQualifiers() &&
3508                "Can't get cv-qualifiers here");
3509         if (TL.getType()->isEnumeralType())
3510           SemaRef.Diag(TL.getBeginLoc(),
3511                        diag::warn_cxx98_compat_enum_nested_name_spec);
3512         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3513                   Q.getLocalEndLoc());
3514         break;
3515       }
3516       // If the nested-name-specifier is an invalid type def, don't emit an
3517       // error because a previous error should have already been emitted.
3518       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3519       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3520         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3521           << TL.getType() << SS.getRange();
3522       }
3523       return NestedNameSpecifierLoc();
3524     }
3525     }
3526
3527     // The qualifier-in-scope and object type only apply to the leftmost entity.
3528     FirstQualifierInScope = nullptr;
3529     ObjectType = QualType();
3530   }
3531
3532   // Don't rebuild the nested-name-specifier if we don't have to.
3533   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3534       !getDerived().AlwaysRebuild())
3535     return NNS;
3536
3537   // If we can re-use the source-location data from the original
3538   // nested-name-specifier, do so.
3539   if (SS.location_size() == NNS.getDataLength() &&
3540       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3541     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3542
3543   // Allocate new nested-name-specifier location information.
3544   return SS.getWithLocInContext(SemaRef.Context);
3545 }
3546
3547 template<typename Derived>
3548 DeclarationNameInfo
3549 TreeTransform<Derived>
3550 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3551   DeclarationName Name = NameInfo.getName();
3552   if (!Name)
3553     return DeclarationNameInfo();
3554
3555   switch (Name.getNameKind()) {
3556   case DeclarationName::Identifier:
3557   case DeclarationName::ObjCZeroArgSelector:
3558   case DeclarationName::ObjCOneArgSelector:
3559   case DeclarationName::ObjCMultiArgSelector:
3560   case DeclarationName::CXXOperatorName:
3561   case DeclarationName::CXXLiteralOperatorName:
3562   case DeclarationName::CXXUsingDirective:
3563     return NameInfo;
3564
3565   case DeclarationName::CXXConstructorName:
3566   case DeclarationName::CXXDestructorName:
3567   case DeclarationName::CXXConversionFunctionName: {
3568     TypeSourceInfo *NewTInfo;
3569     CanQualType NewCanTy;
3570     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3571       NewTInfo = getDerived().TransformType(OldTInfo);
3572       if (!NewTInfo)
3573         return DeclarationNameInfo();
3574       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3575     }
3576     else {
3577       NewTInfo = nullptr;
3578       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3579       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3580       if (NewT.isNull())
3581         return DeclarationNameInfo();
3582       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3583     }
3584
3585     DeclarationName NewName
3586       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3587                                                            NewCanTy);
3588     DeclarationNameInfo NewNameInfo(NameInfo);
3589     NewNameInfo.setName(NewName);
3590     NewNameInfo.setNamedTypeInfo(NewTInfo);
3591     return NewNameInfo;
3592   }
3593   }
3594
3595   llvm_unreachable("Unknown name kind.");
3596 }
3597
3598 template<typename Derived>
3599 TemplateName
3600 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3601                                               TemplateName Name,
3602                                               SourceLocation NameLoc,
3603                                               QualType ObjectType,
3604                                               NamedDecl *FirstQualifierInScope) {
3605   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3606     TemplateDecl *Template = QTN->getTemplateDecl();
3607     assert(Template && "qualified template name must refer to a template");
3608
3609     TemplateDecl *TransTemplate
3610       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3611                                                               Template));
3612     if (!TransTemplate)
3613       return TemplateName();
3614
3615     if (!getDerived().AlwaysRebuild() &&
3616         SS.getScopeRep() == QTN->getQualifier() &&
3617         TransTemplate == Template)
3618       return Name;
3619
3620     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3621                                             TransTemplate);
3622   }
3623
3624   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3625     if (SS.getScopeRep()) {
3626       // These apply to the scope specifier, not the template.
3627       ObjectType = QualType();
3628       FirstQualifierInScope = nullptr;
3629     }
3630
3631     if (!getDerived().AlwaysRebuild() &&
3632         SS.getScopeRep() == DTN->getQualifier() &&
3633         ObjectType.isNull())
3634       return Name;
3635
3636     if (DTN->isIdentifier()) {
3637       return getDerived().RebuildTemplateName(SS,
3638                                               *DTN->getIdentifier(),
3639                                               NameLoc,
3640                                               ObjectType,
3641                                               FirstQualifierInScope);
3642     }
3643
3644     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
3645                                             ObjectType);
3646   }
3647
3648   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3649     TemplateDecl *TransTemplate
3650       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3651                                                               Template));
3652     if (!TransTemplate)
3653       return TemplateName();
3654
3655     if (!getDerived().AlwaysRebuild() &&
3656         TransTemplate == Template)
3657       return Name;
3658
3659     return TemplateName(TransTemplate);
3660   }
3661
3662   if (SubstTemplateTemplateParmPackStorage *SubstPack
3663       = Name.getAsSubstTemplateTemplateParmPack()) {
3664     TemplateTemplateParmDecl *TransParam
3665     = cast_or_null<TemplateTemplateParmDecl>(
3666             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3667     if (!TransParam)
3668       return TemplateName();
3669
3670     if (!getDerived().AlwaysRebuild() &&
3671         TransParam == SubstPack->getParameterPack())
3672       return Name;
3673
3674     return getDerived().RebuildTemplateName(TransParam,
3675                                             SubstPack->getArgumentPack());
3676   }
3677
3678   // These should be getting filtered out before they reach the AST.
3679   llvm_unreachable("overloaded function decl survived to here");
3680 }
3681
3682 template<typename Derived>
3683 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3684                                          const TemplateArgument &Arg,
3685                                          TemplateArgumentLoc &Output) {
3686   SourceLocation Loc = getDerived().getBaseLocation();
3687   switch (Arg.getKind()) {
3688   case TemplateArgument::Null:
3689     llvm_unreachable("null template argument in TreeTransform");
3690     break;
3691
3692   case TemplateArgument::Type:
3693     Output = TemplateArgumentLoc(Arg,
3694                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3695
3696     break;
3697
3698   case TemplateArgument::Template:
3699   case TemplateArgument::TemplateExpansion: {
3700     NestedNameSpecifierLocBuilder Builder;
3701     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
3702     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3703       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3704     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3705       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3706
3707     if (Arg.getKind() == TemplateArgument::Template)
3708       Output = TemplateArgumentLoc(Arg,
3709                                    Builder.getWithLocInContext(SemaRef.Context),
3710                                    Loc);
3711     else
3712       Output = TemplateArgumentLoc(Arg,
3713                                    Builder.getWithLocInContext(SemaRef.Context),
3714                                    Loc, Loc);
3715
3716     break;
3717   }
3718
3719   case TemplateArgument::Expression:
3720     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3721     break;
3722
3723   case TemplateArgument::Declaration:
3724   case TemplateArgument::Integral:
3725   case TemplateArgument::Pack:
3726   case TemplateArgument::NullPtr:
3727     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3728     break;
3729   }
3730 }
3731
3732 template<typename Derived>
3733 bool TreeTransform<Derived>::TransformTemplateArgument(
3734                                          const TemplateArgumentLoc &Input,
3735                                          TemplateArgumentLoc &Output, bool Uneval) {
3736   const TemplateArgument &Arg = Input.getArgument();
3737   switch (Arg.getKind()) {
3738   case TemplateArgument::Null:
3739   case TemplateArgument::Integral:
3740   case TemplateArgument::Pack:
3741   case TemplateArgument::Declaration:
3742   case TemplateArgument::NullPtr:
3743     llvm_unreachable("Unexpected TemplateArgument");
3744
3745   case TemplateArgument::Type: {
3746     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3747     if (!DI)
3748       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3749
3750     DI = getDerived().TransformType(DI);
3751     if (!DI) return true;
3752
3753     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3754     return false;
3755   }
3756
3757   case TemplateArgument::Template: {
3758     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3759     if (QualifierLoc) {
3760       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3761       if (!QualifierLoc)
3762         return true;
3763     }
3764
3765     CXXScopeSpec SS;
3766     SS.Adopt(QualifierLoc);
3767     TemplateName Template
3768       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3769                                            Input.getTemplateNameLoc());
3770     if (Template.isNull())
3771       return true;
3772
3773     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3774                                  Input.getTemplateNameLoc());
3775     return false;
3776   }
3777
3778   case TemplateArgument::TemplateExpansion:
3779     llvm_unreachable("Caller should expand pack expansions");
3780
3781   case TemplateArgument::Expression: {
3782     // Template argument expressions are constant expressions.
3783     EnterExpressionEvaluationContext Unevaluated(
3784         getSema(), Uneval ? Sema::Unevaluated : Sema::ConstantEvaluated);
3785
3786     Expr *InputExpr = Input.getSourceExpression();
3787     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3788
3789     ExprResult E = getDerived().TransformExpr(InputExpr);
3790     E = SemaRef.ActOnConstantExpression(E);
3791     if (E.isInvalid()) return true;
3792     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3793     return false;
3794   }
3795   }
3796
3797   // Work around bogus GCC warning
3798   return true;
3799 }
3800
3801 /// \brief Iterator adaptor that invents template argument location information
3802 /// for each of the template arguments in its underlying iterator.
3803 template<typename Derived, typename InputIterator>
3804 class TemplateArgumentLocInventIterator {
3805   TreeTransform<Derived> &Self;
3806   InputIterator Iter;
3807
3808 public:
3809   typedef TemplateArgumentLoc value_type;
3810   typedef TemplateArgumentLoc reference;
3811   typedef typename std::iterator_traits<InputIterator>::difference_type
3812     difference_type;
3813   typedef std::input_iterator_tag iterator_category;
3814
3815   class pointer {
3816     TemplateArgumentLoc Arg;
3817
3818   public:
3819     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3820
3821     const TemplateArgumentLoc *operator->() const { return &Arg; }
3822   };
3823
3824   TemplateArgumentLocInventIterator() { }
3825
3826   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3827                                              InputIterator Iter)
3828     : Self(Self), Iter(Iter) { }
3829
3830   TemplateArgumentLocInventIterator &operator++() {
3831     ++Iter;
3832     return *this;
3833   }
3834
3835   TemplateArgumentLocInventIterator operator++(int) {
3836     TemplateArgumentLocInventIterator Old(*this);
3837     ++(*this);
3838     return Old;
3839   }
3840
3841   reference operator*() const {
3842     TemplateArgumentLoc Result;
3843     Self.InventTemplateArgumentLoc(*Iter, Result);
3844     return Result;
3845   }
3846
3847   pointer operator->() const { return pointer(**this); }
3848
3849   friend bool operator==(const TemplateArgumentLocInventIterator &X,
3850                          const TemplateArgumentLocInventIterator &Y) {
3851     return X.Iter == Y.Iter;
3852   }
3853
3854   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3855                          const TemplateArgumentLocInventIterator &Y) {
3856     return X.Iter != Y.Iter;
3857   }
3858 };
3859
3860 template<typename Derived>
3861 template<typename InputIterator>
3862 bool TreeTransform<Derived>::TransformTemplateArguments(
3863     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
3864     bool Uneval) {
3865   for (; First != Last; ++First) {
3866     TemplateArgumentLoc Out;
3867     TemplateArgumentLoc In = *First;
3868
3869     if (In.getArgument().getKind() == TemplateArgument::Pack) {
3870       // Unpack argument packs, which we translate them into separate
3871       // arguments.
3872       // FIXME: We could do much better if we could guarantee that the
3873       // TemplateArgumentLocInfo for the pack expansion would be usable for
3874       // all of the template arguments in the argument pack.
3875       typedef TemplateArgumentLocInventIterator<Derived,
3876                                                 TemplateArgument::pack_iterator>
3877         PackLocIterator;
3878       if (TransformTemplateArguments(PackLocIterator(*this,
3879                                                  In.getArgument().pack_begin()),
3880                                      PackLocIterator(*this,
3881                                                    In.getArgument().pack_end()),
3882                                      Outputs, Uneval))
3883         return true;
3884
3885       continue;
3886     }
3887
3888     if (In.getArgument().isPackExpansion()) {
3889       // We have a pack expansion, for which we will be substituting into
3890       // the pattern.
3891       SourceLocation Ellipsis;
3892       Optional<unsigned> OrigNumExpansions;
3893       TemplateArgumentLoc Pattern
3894         = getSema().getTemplateArgumentPackExpansionPattern(
3895               In, Ellipsis, OrigNumExpansions);
3896
3897       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3898       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3899       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3900
3901       // Determine whether the set of unexpanded parameter packs can and should
3902       // be expanded.
3903       bool Expand = true;
3904       bool RetainExpansion = false;
3905       Optional<unsigned> NumExpansions = OrigNumExpansions;
3906       if (getDerived().TryExpandParameterPacks(Ellipsis,
3907                                                Pattern.getSourceRange(),
3908                                                Unexpanded,
3909                                                Expand,
3910                                                RetainExpansion,
3911                                                NumExpansions))
3912         return true;
3913
3914       if (!Expand) {
3915         // The transform has determined that we should perform a simple
3916         // transformation on the pack expansion, producing another pack
3917         // expansion.
3918         TemplateArgumentLoc OutPattern;
3919         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3920         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
3921           return true;
3922
3923         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
3924                                                 NumExpansions);
3925         if (Out.getArgument().isNull())
3926           return true;
3927
3928         Outputs.addArgument(Out);
3929         continue;
3930       }
3931
3932       // The transform has determined that we should perform an elementwise
3933       // expansion of the pattern. Do so.
3934       for (unsigned I = 0; I != *NumExpansions; ++I) {
3935         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3936
3937         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
3938           return true;
3939
3940         if (Out.getArgument().containsUnexpandedParameterPack()) {
3941           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3942                                                   OrigNumExpansions);
3943           if (Out.getArgument().isNull())
3944             return true;
3945         }
3946
3947         Outputs.addArgument(Out);
3948       }
3949
3950       // If we're supposed to retain a pack expansion, do so by temporarily
3951       // forgetting the partially-substituted parameter pack.
3952       if (RetainExpansion) {
3953         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3954
3955         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
3956           return true;
3957
3958         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3959                                                 OrigNumExpansions);
3960         if (Out.getArgument().isNull())
3961           return true;
3962
3963         Outputs.addArgument(Out);
3964       }
3965
3966       continue;
3967     }
3968
3969     // The simple case:
3970     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
3971       return true;
3972
3973     Outputs.addArgument(Out);
3974   }
3975
3976   return false;
3977
3978 }
3979
3980 //===----------------------------------------------------------------------===//
3981 // Type transformation
3982 //===----------------------------------------------------------------------===//
3983
3984 template<typename Derived>
3985 QualType TreeTransform<Derived>::TransformType(QualType T) {
3986   if (getDerived().AlreadyTransformed(T))
3987     return T;
3988
3989   // Temporary workaround.  All of these transformations should
3990   // eventually turn into transformations on TypeLocs.
3991   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
3992                                                 getDerived().getBaseLocation());
3993
3994   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
3995
3996   if (!NewDI)
3997     return QualType();
3998
3999   return NewDI->getType();
4000 }
4001
4002 template<typename Derived>
4003 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4004   // Refine the base location to the type's location.
4005   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4006                        getDerived().getBaseEntity());
4007   if (getDerived().AlreadyTransformed(DI->getType()))
4008     return DI;
4009
4010   TypeLocBuilder TLB;
4011
4012   TypeLoc TL = DI->getTypeLoc();
4013   TLB.reserve(TL.getFullDataSize());
4014
4015   QualType Result = getDerived().TransformType(TLB, TL);
4016   if (Result.isNull())
4017     return nullptr;
4018
4019   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4020 }
4021
4022 template<typename Derived>
4023 QualType
4024 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4025   switch (T.getTypeLocClass()) {
4026 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4027 #define TYPELOC(CLASS, PARENT)                                                 \
4028   case TypeLoc::CLASS:                                                         \
4029     return getDerived().Transform##CLASS##Type(TLB,                            \
4030                                                T.castAs<CLASS##TypeLoc>());
4031 #include "clang/AST/TypeLocNodes.def"
4032   }
4033
4034   llvm_unreachable("unhandled type loc!");
4035 }
4036
4037 /// FIXME: By default, this routine adds type qualifiers only to types
4038 /// that can have qualifiers, and silently suppresses those qualifiers
4039 /// that are not permitted (e.g., qualifiers on reference or function
4040 /// types). This is the right thing for template instantiation, but
4041 /// probably not for other clients.
4042 template<typename Derived>
4043 QualType
4044 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4045                                                QualifiedTypeLoc T) {
4046   Qualifiers Quals = T.getType().getLocalQualifiers();
4047
4048   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4049   if (Result.isNull())
4050     return QualType();
4051
4052   // Silently suppress qualifiers if the result type can't be qualified.
4053   // FIXME: this is the right thing for template instantiation, but
4054   // probably not for other clients.
4055   if (Result->isFunctionType() || Result->isReferenceType())
4056     return Result;
4057
4058   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4059   // resulting type.
4060   if (Quals.hasObjCLifetime()) {
4061     if (!Result->isObjCLifetimeType() && !Result->isDependentType())
4062       Quals.removeObjCLifetime();
4063     else if (Result.getObjCLifetime()) {
4064       // Objective-C ARC:
4065       //   A lifetime qualifier applied to a substituted template parameter
4066       //   overrides the lifetime qualifier from the template argument.
4067       const AutoType *AutoTy;
4068       if (const SubstTemplateTypeParmType *SubstTypeParam
4069                                 = dyn_cast<SubstTemplateTypeParmType>(Result)) {
4070         QualType Replacement = SubstTypeParam->getReplacementType();
4071         Qualifiers Qs = Replacement.getQualifiers();
4072         Qs.removeObjCLifetime();
4073         Replacement
4074           = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(),
4075                                              Qs);
4076         Result = SemaRef.Context.getSubstTemplateTypeParmType(
4077                                         SubstTypeParam->getReplacedParameter(),
4078                                                               Replacement);
4079         TLB.TypeWasModifiedSafely(Result);
4080       } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) {
4081         // 'auto' types behave the same way as template parameters.
4082         QualType Deduced = AutoTy->getDeducedType();
4083         Qualifiers Qs = Deduced.getQualifiers();
4084         Qs.removeObjCLifetime();
4085         Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(),
4086                                                    Qs);
4087         Result = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4088                                 AutoTy->isDependentType());
4089         TLB.TypeWasModifiedSafely(Result);
4090       } else {
4091         // Otherwise, complain about the addition of a qualifier to an
4092         // already-qualified type.
4093         SourceRange R = T.getUnqualifiedLoc().getSourceRange();
4094         SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant)
4095           << Result << R;
4096
4097         Quals.removeObjCLifetime();
4098       }
4099     }
4100   }
4101   if (!Quals.empty()) {
4102     Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
4103     // BuildQualifiedType might not add qualifiers if they are invalid.
4104     if (Result.hasLocalQualifiers())
4105       TLB.push<QualifiedTypeLoc>(Result);
4106     // No location information to preserve.
4107   }
4108
4109   return Result;
4110 }
4111
4112 template<typename Derived>
4113 TypeLoc
4114 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4115                                                    QualType ObjectType,
4116                                                    NamedDecl *UnqualLookup,
4117                                                    CXXScopeSpec &SS) {
4118   if (getDerived().AlreadyTransformed(TL.getType()))
4119     return TL;
4120
4121   TypeSourceInfo *TSI =
4122       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4123   if (TSI)
4124     return TSI->getTypeLoc();
4125   return TypeLoc();
4126 }
4127
4128 template<typename Derived>
4129 TypeSourceInfo *
4130 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4131                                                    QualType ObjectType,
4132                                                    NamedDecl *UnqualLookup,
4133                                                    CXXScopeSpec &SS) {
4134   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4135     return TSInfo;
4136
4137   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4138                                    UnqualLookup, SS);
4139 }
4140
4141 template <typename Derived>
4142 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4143     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4144     CXXScopeSpec &SS) {
4145   QualType T = TL.getType();
4146   assert(!getDerived().AlreadyTransformed(T));
4147
4148   TypeLocBuilder TLB;
4149   QualType Result;
4150
4151   if (isa<TemplateSpecializationType>(T)) {
4152     TemplateSpecializationTypeLoc SpecTL =
4153         TL.castAs<TemplateSpecializationTypeLoc>();
4154
4155     TemplateName Template
4156     = getDerived().TransformTemplateName(SS,
4157                                          SpecTL.getTypePtr()->getTemplateName(),
4158                                          SpecTL.getTemplateNameLoc(),
4159                                          ObjectType, UnqualLookup);
4160     if (Template.isNull())
4161       return nullptr;
4162
4163     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4164                                                               Template);
4165   } else if (isa<DependentTemplateSpecializationType>(T)) {
4166     DependentTemplateSpecializationTypeLoc SpecTL =
4167         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4168
4169     TemplateName Template
4170       = getDerived().RebuildTemplateName(SS,
4171                                          *SpecTL.getTypePtr()->getIdentifier(),
4172                                          SpecTL.getTemplateNameLoc(),
4173                                          ObjectType, UnqualLookup);
4174     if (Template.isNull())
4175       return nullptr;
4176
4177     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4178                                                                        SpecTL,
4179                                                                        Template,
4180                                                                        SS);
4181   } else {
4182     // Nothing special needs to be done for these.
4183     Result = getDerived().TransformType(TLB, TL);
4184   }
4185
4186   if (Result.isNull())
4187     return nullptr;
4188
4189   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4190 }
4191
4192 template <class TyLoc> static inline
4193 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4194   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4195   NewT.setNameLoc(T.getNameLoc());
4196   return T.getType();
4197 }
4198
4199 template<typename Derived>
4200 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4201                                                       BuiltinTypeLoc T) {
4202   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4203   NewT.setBuiltinLoc(T.getBuiltinLoc());
4204   if (T.needsExtraLocalData())
4205     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4206   return T.getType();
4207 }
4208
4209 template<typename Derived>
4210 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4211                                                       ComplexTypeLoc T) {
4212   // FIXME: recurse?
4213   return TransformTypeSpecType(TLB, T);
4214 }
4215
4216 template <typename Derived>
4217 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4218                                                        AdjustedTypeLoc TL) {
4219   // Adjustments applied during transformation are handled elsewhere.
4220   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4221 }
4222
4223 template<typename Derived>
4224 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4225                                                       DecayedTypeLoc TL) {
4226   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4227   if (OriginalType.isNull())
4228     return QualType();
4229
4230   QualType Result = TL.getType();
4231   if (getDerived().AlwaysRebuild() ||
4232       OriginalType != TL.getOriginalLoc().getType())
4233     Result = SemaRef.Context.getDecayedType(OriginalType);
4234   TLB.push<DecayedTypeLoc>(Result);
4235   // Nothing to set for DecayedTypeLoc.
4236   return Result;
4237 }
4238
4239 template<typename Derived>
4240 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4241                                                       PointerTypeLoc TL) {
4242   QualType PointeeType
4243     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4244   if (PointeeType.isNull())
4245     return QualType();
4246
4247   QualType Result = TL.getType();
4248   if (PointeeType->getAs<ObjCObjectType>()) {
4249     // A dependent pointer type 'T *' has is being transformed such
4250     // that an Objective-C class type is being replaced for 'T'. The
4251     // resulting pointer type is an ObjCObjectPointerType, not a
4252     // PointerType.
4253     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4254
4255     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4256     NewT.setStarLoc(TL.getStarLoc());
4257     return Result;
4258   }
4259
4260   if (getDerived().AlwaysRebuild() ||
4261       PointeeType != TL.getPointeeLoc().getType()) {
4262     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4263     if (Result.isNull())
4264       return QualType();
4265   }
4266
4267   // Objective-C ARC can add lifetime qualifiers to the type that we're
4268   // pointing to.
4269   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4270
4271   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4272   NewT.setSigilLoc(TL.getSigilLoc());
4273   return Result;
4274 }
4275
4276 template<typename Derived>
4277 QualType
4278 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4279                                                   BlockPointerTypeLoc TL) {
4280   QualType PointeeType
4281     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4282   if (PointeeType.isNull())
4283     return QualType();
4284
4285   QualType Result = TL.getType();
4286   if (getDerived().AlwaysRebuild() ||
4287       PointeeType != TL.getPointeeLoc().getType()) {
4288     Result = getDerived().RebuildBlockPointerType(PointeeType,
4289                                                   TL.getSigilLoc());
4290     if (Result.isNull())
4291       return QualType();
4292   }
4293
4294   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4295   NewT.setSigilLoc(TL.getSigilLoc());
4296   return Result;
4297 }
4298
4299 /// Transforms a reference type.  Note that somewhat paradoxically we
4300 /// don't care whether the type itself is an l-value type or an r-value
4301 /// type;  we only care if the type was *written* as an l-value type
4302 /// or an r-value type.
4303 template<typename Derived>
4304 QualType
4305 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4306                                                ReferenceTypeLoc TL) {
4307   const ReferenceType *T = TL.getTypePtr();
4308
4309   // Note that this works with the pointee-as-written.
4310   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4311   if (PointeeType.isNull())
4312     return QualType();
4313
4314   QualType Result = TL.getType();
4315   if (getDerived().AlwaysRebuild() ||
4316       PointeeType != T->getPointeeTypeAsWritten()) {
4317     Result = getDerived().RebuildReferenceType(PointeeType,
4318                                                T->isSpelledAsLValue(),
4319                                                TL.getSigilLoc());
4320     if (Result.isNull())
4321       return QualType();
4322   }
4323
4324   // Objective-C ARC can add lifetime qualifiers to the type that we're
4325   // referring to.
4326   TLB.TypeWasModifiedSafely(
4327                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4328
4329   // r-value references can be rebuilt as l-value references.
4330   ReferenceTypeLoc NewTL;
4331   if (isa<LValueReferenceType>(Result))
4332     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4333   else
4334     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4335   NewTL.setSigilLoc(TL.getSigilLoc());
4336
4337   return Result;
4338 }
4339
4340 template<typename Derived>
4341 QualType
4342 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4343                                                  LValueReferenceTypeLoc TL) {
4344   return TransformReferenceType(TLB, TL);
4345 }
4346
4347 template<typename Derived>
4348 QualType
4349 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4350                                                  RValueReferenceTypeLoc TL) {
4351   return TransformReferenceType(TLB, TL);
4352 }
4353
4354 template<typename Derived>
4355 QualType
4356 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4357                                                    MemberPointerTypeLoc TL) {
4358   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4359   if (PointeeType.isNull())
4360     return QualType();
4361
4362   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4363   TypeSourceInfo *NewClsTInfo = nullptr;
4364   if (OldClsTInfo) {
4365     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4366     if (!NewClsTInfo)
4367       return QualType();
4368   }
4369
4370   const MemberPointerType *T = TL.getTypePtr();
4371   QualType OldClsType = QualType(T->getClass(), 0);
4372   QualType NewClsType;
4373   if (NewClsTInfo)
4374     NewClsType = NewClsTInfo->getType();
4375   else {
4376     NewClsType = getDerived().TransformType(OldClsType);
4377     if (NewClsType.isNull())
4378       return QualType();
4379   }
4380
4381   QualType Result = TL.getType();
4382   if (getDerived().AlwaysRebuild() ||
4383       PointeeType != T->getPointeeType() ||
4384       NewClsType != OldClsType) {
4385     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4386                                                    TL.getStarLoc());
4387     if (Result.isNull())
4388       return QualType();
4389   }
4390
4391   // If we had to adjust the pointee type when building a member pointer, make
4392   // sure to push TypeLoc info for it.
4393   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4394   if (MPT && PointeeType != MPT->getPointeeType()) {
4395     assert(isa<AdjustedType>(MPT->getPointeeType()));
4396     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4397   }
4398
4399   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4400   NewTL.setSigilLoc(TL.getSigilLoc());
4401   NewTL.setClassTInfo(NewClsTInfo);
4402
4403   return Result;
4404 }
4405
4406 template<typename Derived>
4407 QualType
4408 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4409                                                    ConstantArrayTypeLoc TL) {
4410   const ConstantArrayType *T = TL.getTypePtr();
4411   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4412   if (ElementType.isNull())
4413     return QualType();
4414
4415   QualType Result = TL.getType();
4416   if (getDerived().AlwaysRebuild() ||
4417       ElementType != T->getElementType()) {
4418     Result = getDerived().RebuildConstantArrayType(ElementType,
4419                                                    T->getSizeModifier(),
4420                                                    T->getSize(),
4421                                              T->getIndexTypeCVRQualifiers(),
4422                                                    TL.getBracketsRange());
4423     if (Result.isNull())
4424       return QualType();
4425   }
4426
4427   // We might have either a ConstantArrayType or a VariableArrayType now:
4428   // a ConstantArrayType is allowed to have an element type which is a
4429   // VariableArrayType if the type is dependent.  Fortunately, all array
4430   // types have the same location layout.
4431   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4432   NewTL.setLBracketLoc(TL.getLBracketLoc());
4433   NewTL.setRBracketLoc(TL.getRBracketLoc());
4434
4435   Expr *Size = TL.getSizeExpr();
4436   if (Size) {
4437     EnterExpressionEvaluationContext Unevaluated(SemaRef,
4438                                                  Sema::ConstantEvaluated);
4439     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4440     Size = SemaRef.ActOnConstantExpression(Size).get();
4441   }
4442   NewTL.setSizeExpr(Size);
4443
4444   return Result;
4445 }
4446
4447 template<typename Derived>
4448 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4449                                               TypeLocBuilder &TLB,
4450                                               IncompleteArrayTypeLoc TL) {
4451   const IncompleteArrayType *T = TL.getTypePtr();
4452   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4453   if (ElementType.isNull())
4454     return QualType();
4455
4456   QualType Result = TL.getType();
4457   if (getDerived().AlwaysRebuild() ||
4458       ElementType != T->getElementType()) {
4459     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4460                                                      T->getSizeModifier(),
4461                                            T->getIndexTypeCVRQualifiers(),
4462                                                      TL.getBracketsRange());
4463     if (Result.isNull())
4464       return QualType();
4465   }
4466
4467   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4468   NewTL.setLBracketLoc(TL.getLBracketLoc());
4469   NewTL.setRBracketLoc(TL.getRBracketLoc());
4470   NewTL.setSizeExpr(nullptr);
4471
4472   return Result;
4473 }
4474
4475 template<typename Derived>
4476 QualType
4477 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4478                                                    VariableArrayTypeLoc TL) {
4479   const VariableArrayType *T = TL.getTypePtr();
4480   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4481   if (ElementType.isNull())
4482     return QualType();
4483
4484   ExprResult SizeResult
4485     = getDerived().TransformExpr(T->getSizeExpr());
4486   if (SizeResult.isInvalid())
4487     return QualType();
4488
4489   Expr *Size = SizeResult.get();
4490
4491   QualType Result = TL.getType();
4492   if (getDerived().AlwaysRebuild() ||
4493       ElementType != T->getElementType() ||
4494       Size != T->getSizeExpr()) {
4495     Result = getDerived().RebuildVariableArrayType(ElementType,
4496                                                    T->getSizeModifier(),
4497                                                    Size,
4498                                              T->getIndexTypeCVRQualifiers(),
4499                                                    TL.getBracketsRange());
4500     if (Result.isNull())
4501       return QualType();
4502   }
4503
4504   // We might have constant size array now, but fortunately it has the same
4505   // location layout.
4506   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4507   NewTL.setLBracketLoc(TL.getLBracketLoc());
4508   NewTL.setRBracketLoc(TL.getRBracketLoc());
4509   NewTL.setSizeExpr(Size);
4510
4511   return Result;
4512 }
4513
4514 template<typename Derived>
4515 QualType
4516 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4517                                              DependentSizedArrayTypeLoc TL) {
4518   const DependentSizedArrayType *T = TL.getTypePtr();
4519   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4520   if (ElementType.isNull())
4521     return QualType();
4522
4523   // Array bounds are constant expressions.
4524   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4525                                                Sema::ConstantEvaluated);
4526
4527   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4528   Expr *origSize = TL.getSizeExpr();
4529   if (!origSize) origSize = T->getSizeExpr();
4530
4531   ExprResult sizeResult
4532     = getDerived().TransformExpr(origSize);
4533   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4534   if (sizeResult.isInvalid())
4535     return QualType();
4536
4537   Expr *size = sizeResult.get();
4538
4539   QualType Result = TL.getType();
4540   if (getDerived().AlwaysRebuild() ||
4541       ElementType != T->getElementType() ||
4542       size != origSize) {
4543     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4544                                                          T->getSizeModifier(),
4545                                                          size,
4546                                                 T->getIndexTypeCVRQualifiers(),
4547                                                         TL.getBracketsRange());
4548     if (Result.isNull())
4549       return QualType();
4550   }
4551
4552   // We might have any sort of array type now, but fortunately they
4553   // all have the same location layout.
4554   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4555   NewTL.setLBracketLoc(TL.getLBracketLoc());
4556   NewTL.setRBracketLoc(TL.getRBracketLoc());
4557   NewTL.setSizeExpr(size);
4558
4559   return Result;
4560 }
4561
4562 template<typename Derived>
4563 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4564                                       TypeLocBuilder &TLB,
4565                                       DependentSizedExtVectorTypeLoc TL) {
4566   const DependentSizedExtVectorType *T = TL.getTypePtr();
4567
4568   // FIXME: ext vector locs should be nested
4569   QualType ElementType = getDerived().TransformType(T->getElementType());
4570   if (ElementType.isNull())
4571     return QualType();
4572
4573   // Vector sizes are constant expressions.
4574   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4575                                                Sema::ConstantEvaluated);
4576
4577   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4578   Size = SemaRef.ActOnConstantExpression(Size);
4579   if (Size.isInvalid())
4580     return QualType();
4581
4582   QualType Result = TL.getType();
4583   if (getDerived().AlwaysRebuild() ||
4584       ElementType != T->getElementType() ||
4585       Size.get() != T->getSizeExpr()) {
4586     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4587                                                              Size.get(),
4588                                                          T->getAttributeLoc());
4589     if (Result.isNull())
4590       return QualType();
4591   }
4592
4593   // Result might be dependent or not.
4594   if (isa<DependentSizedExtVectorType>(Result)) {
4595     DependentSizedExtVectorTypeLoc NewTL
4596       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4597     NewTL.setNameLoc(TL.getNameLoc());
4598   } else {
4599     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4600     NewTL.setNameLoc(TL.getNameLoc());
4601   }
4602
4603   return Result;
4604 }
4605
4606 template<typename Derived>
4607 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4608                                                      VectorTypeLoc TL) {
4609   const VectorType *T = TL.getTypePtr();
4610   QualType ElementType = getDerived().TransformType(T->getElementType());
4611   if (ElementType.isNull())
4612     return QualType();
4613
4614   QualType Result = TL.getType();
4615   if (getDerived().AlwaysRebuild() ||
4616       ElementType != T->getElementType()) {
4617     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4618                                             T->getVectorKind());
4619     if (Result.isNull())
4620       return QualType();
4621   }
4622
4623   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4624   NewTL.setNameLoc(TL.getNameLoc());
4625
4626   return Result;
4627 }
4628
4629 template<typename Derived>
4630 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4631                                                         ExtVectorTypeLoc TL) {
4632   const VectorType *T = TL.getTypePtr();
4633   QualType ElementType = getDerived().TransformType(T->getElementType());
4634   if (ElementType.isNull())
4635     return QualType();
4636
4637   QualType Result = TL.getType();
4638   if (getDerived().AlwaysRebuild() ||
4639       ElementType != T->getElementType()) {
4640     Result = getDerived().RebuildExtVectorType(ElementType,
4641                                                T->getNumElements(),
4642                                                /*FIXME*/ SourceLocation());
4643     if (Result.isNull())
4644       return QualType();
4645   }
4646
4647   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4648   NewTL.setNameLoc(TL.getNameLoc());
4649
4650   return Result;
4651 }
4652
4653 template <typename Derived>
4654 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4655     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4656     bool ExpectParameterPack) {
4657   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4658   TypeSourceInfo *NewDI = nullptr;
4659
4660   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4661     // If we're substituting into a pack expansion type and we know the
4662     // length we want to expand to, just substitute for the pattern.
4663     TypeLoc OldTL = OldDI->getTypeLoc();
4664     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4665
4666     TypeLocBuilder TLB;
4667     TypeLoc NewTL = OldDI->getTypeLoc();
4668     TLB.reserve(NewTL.getFullDataSize());
4669
4670     QualType Result = getDerived().TransformType(TLB,
4671                                                OldExpansionTL.getPatternLoc());
4672     if (Result.isNull())
4673       return nullptr;
4674
4675     Result = RebuildPackExpansionType(Result,
4676                                 OldExpansionTL.getPatternLoc().getSourceRange(),
4677                                       OldExpansionTL.getEllipsisLoc(),
4678                                       NumExpansions);
4679     if (Result.isNull())
4680       return nullptr;
4681
4682     PackExpansionTypeLoc NewExpansionTL
4683       = TLB.push<PackExpansionTypeLoc>(Result);
4684     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4685     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4686   } else
4687     NewDI = getDerived().TransformType(OldDI);
4688   if (!NewDI)
4689     return nullptr;
4690
4691   if (NewDI == OldDI && indexAdjustment == 0)
4692     return OldParm;
4693
4694   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4695                                              OldParm->getDeclContext(),
4696                                              OldParm->getInnerLocStart(),
4697                                              OldParm->getLocation(),
4698                                              OldParm->getIdentifier(),
4699                                              NewDI->getType(),
4700                                              NewDI,
4701                                              OldParm->getStorageClass(),
4702                                              /* DefArg */ nullptr);
4703   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4704                         OldParm->getFunctionScopeIndex() + indexAdjustment);
4705   return newParm;
4706 }
4707
4708 template <typename Derived>
4709 bool TreeTransform<Derived>::TransformFunctionTypeParams(
4710     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
4711     const QualType *ParamTypes,
4712     const FunctionProtoType::ExtParameterInfo *ParamInfos,
4713     SmallVectorImpl<QualType> &OutParamTypes,
4714     SmallVectorImpl<ParmVarDecl *> *PVars,
4715     Sema::ExtParameterInfoBuilder &PInfos) {
4716   int indexAdjustment = 0;
4717
4718   unsigned NumParams = Params.size();
4719   for (unsigned i = 0; i != NumParams; ++i) {
4720     if (ParmVarDecl *OldParm = Params[i]) {
4721       assert(OldParm->getFunctionScopeIndex() == i);
4722
4723       Optional<unsigned> NumExpansions;
4724       ParmVarDecl *NewParm = nullptr;
4725       if (OldParm->isParameterPack()) {
4726         // We have a function parameter pack that may need to be expanded.
4727         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4728
4729         // Find the parameter packs that could be expanded.
4730         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
4731         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
4732         TypeLoc Pattern = ExpansionTL.getPatternLoc();
4733         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
4734         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
4735
4736         // Determine whether we should expand the parameter packs.
4737         bool ShouldExpand = false;
4738         bool RetainExpansion = false;
4739         Optional<unsigned> OrigNumExpansions =
4740             ExpansionTL.getTypePtr()->getNumExpansions();
4741         NumExpansions = OrigNumExpansions;
4742         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
4743                                                  Pattern.getSourceRange(),
4744                                                  Unexpanded,
4745                                                  ShouldExpand,
4746                                                  RetainExpansion,
4747                                                  NumExpansions)) {
4748           return true;
4749         }
4750
4751         if (ShouldExpand) {
4752           // Expand the function parameter pack into multiple, separate
4753           // parameters.
4754           getDerived().ExpandingFunctionParameterPack(OldParm);
4755           for (unsigned I = 0; I != *NumExpansions; ++I) {
4756             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4757             ParmVarDecl *NewParm
4758               = getDerived().TransformFunctionTypeParam(OldParm,
4759                                                         indexAdjustment++,
4760                                                         OrigNumExpansions,
4761                                                 /*ExpectParameterPack=*/false);
4762             if (!NewParm)
4763               return true;
4764
4765             if (ParamInfos)
4766               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4767             OutParamTypes.push_back(NewParm->getType());
4768             if (PVars)
4769               PVars->push_back(NewParm);
4770           }
4771
4772           // If we're supposed to retain a pack expansion, do so by temporarily
4773           // forgetting the partially-substituted parameter pack.
4774           if (RetainExpansion) {
4775             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4776             ParmVarDecl *NewParm
4777               = getDerived().TransformFunctionTypeParam(OldParm,
4778                                                         indexAdjustment++,
4779                                                         OrigNumExpansions,
4780                                                 /*ExpectParameterPack=*/false);
4781             if (!NewParm)
4782               return true;
4783
4784             if (ParamInfos)
4785               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4786             OutParamTypes.push_back(NewParm->getType());
4787             if (PVars)
4788               PVars->push_back(NewParm);
4789           }
4790
4791           // The next parameter should have the same adjustment as the
4792           // last thing we pushed, but we post-incremented indexAdjustment
4793           // on every push.  Also, if we push nothing, the adjustment should
4794           // go down by one.
4795           indexAdjustment--;
4796
4797           // We're done with the pack expansion.
4798           continue;
4799         }
4800
4801         // We'll substitute the parameter now without expanding the pack
4802         // expansion.
4803         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4804         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
4805                                                           indexAdjustment,
4806                                                           NumExpansions,
4807                                                   /*ExpectParameterPack=*/true);
4808       } else {
4809         NewParm = getDerived().TransformFunctionTypeParam(
4810             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
4811       }
4812
4813       if (!NewParm)
4814         return true;
4815
4816       if (ParamInfos)
4817         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4818       OutParamTypes.push_back(NewParm->getType());
4819       if (PVars)
4820         PVars->push_back(NewParm);
4821       continue;
4822     }
4823
4824     // Deal with the possibility that we don't have a parameter
4825     // declaration for this parameter.
4826     QualType OldType = ParamTypes[i];
4827     bool IsPackExpansion = false;
4828     Optional<unsigned> NumExpansions;
4829     QualType NewType;
4830     if (const PackExpansionType *Expansion
4831                                        = dyn_cast<PackExpansionType>(OldType)) {
4832       // We have a function parameter pack that may need to be expanded.
4833       QualType Pattern = Expansion->getPattern();
4834       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4835       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4836
4837       // Determine whether we should expand the parameter packs.
4838       bool ShouldExpand = false;
4839       bool RetainExpansion = false;
4840       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
4841                                                Unexpanded,
4842                                                ShouldExpand,
4843                                                RetainExpansion,
4844                                                NumExpansions)) {
4845         return true;
4846       }
4847
4848       if (ShouldExpand) {
4849         // Expand the function parameter pack into multiple, separate
4850         // parameters.
4851         for (unsigned I = 0; I != *NumExpansions; ++I) {
4852           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4853           QualType NewType = getDerived().TransformType(Pattern);
4854           if (NewType.isNull())
4855             return true;
4856
4857           if (NewType->containsUnexpandedParameterPack()) {
4858             NewType =
4859                 getSema().getASTContext().getPackExpansionType(NewType, None);
4860
4861             if (NewType.isNull())
4862               return true;
4863           }
4864
4865           if (ParamInfos)
4866             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4867           OutParamTypes.push_back(NewType);
4868           if (PVars)
4869             PVars->push_back(nullptr);
4870         }
4871
4872         // We're done with the pack expansion.
4873         continue;
4874       }
4875
4876       // If we're supposed to retain a pack expansion, do so by temporarily
4877       // forgetting the partially-substituted parameter pack.
4878       if (RetainExpansion) {
4879         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4880         QualType NewType = getDerived().TransformType(Pattern);
4881         if (NewType.isNull())
4882           return true;
4883
4884         if (ParamInfos)
4885           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4886         OutParamTypes.push_back(NewType);
4887         if (PVars)
4888           PVars->push_back(nullptr);
4889       }
4890
4891       // We'll substitute the parameter now without expanding the pack
4892       // expansion.
4893       OldType = Expansion->getPattern();
4894       IsPackExpansion = true;
4895       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4896       NewType = getDerived().TransformType(OldType);
4897     } else {
4898       NewType = getDerived().TransformType(OldType);
4899     }
4900
4901     if (NewType.isNull())
4902       return true;
4903
4904     if (IsPackExpansion)
4905       NewType = getSema().Context.getPackExpansionType(NewType,
4906                                                        NumExpansions);
4907
4908     if (ParamInfos)
4909       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4910     OutParamTypes.push_back(NewType);
4911     if (PVars)
4912       PVars->push_back(nullptr);
4913   }
4914
4915 #ifndef NDEBUG
4916   if (PVars) {
4917     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
4918       if (ParmVarDecl *parm = (*PVars)[i])
4919         assert(parm->getFunctionScopeIndex() == i);
4920   }
4921 #endif
4922
4923   return false;
4924 }
4925
4926 template<typename Derived>
4927 QualType
4928 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
4929                                                    FunctionProtoTypeLoc TL) {
4930   SmallVector<QualType, 4> ExceptionStorage;
4931   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
4932   return getDerived().TransformFunctionProtoType(
4933       TLB, TL, nullptr, 0,
4934       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
4935         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
4936                                             ExceptionStorage, Changed);
4937       });
4938 }
4939
4940 template<typename Derived> template<typename Fn>
4941 QualType TreeTransform<Derived>::TransformFunctionProtoType(
4942     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
4943     unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
4944
4945   // Transform the parameters and return type.
4946   //
4947   // We are required to instantiate the params and return type in source order.
4948   // When the function has a trailing return type, we instantiate the
4949   // parameters before the return type,  since the return type can then refer
4950   // to the parameters themselves (via decltype, sizeof, etc.).
4951   //
4952   SmallVector<QualType, 4> ParamTypes;
4953   SmallVector<ParmVarDecl*, 4> ParamDecls;
4954   Sema::ExtParameterInfoBuilder ExtParamInfos;
4955   const FunctionProtoType *T = TL.getTypePtr();
4956
4957   QualType ResultType;
4958
4959   if (T->hasTrailingReturn()) {
4960     if (getDerived().TransformFunctionTypeParams(
4961             TL.getBeginLoc(), TL.getParams(),
4962             TL.getTypePtr()->param_type_begin(),
4963             T->getExtParameterInfosOrNull(),
4964             ParamTypes, &ParamDecls, ExtParamInfos))
4965       return QualType();
4966
4967     {
4968       // C++11 [expr.prim.general]p3:
4969       //   If a declaration declares a member function or member function
4970       //   template of a class X, the expression this is a prvalue of type
4971       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
4972       //   and the end of the function-definition, member-declarator, or
4973       //   declarator.
4974       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
4975
4976       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4977       if (ResultType.isNull())
4978         return QualType();
4979     }
4980   }
4981   else {
4982     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4983     if (ResultType.isNull())
4984       return QualType();
4985
4986     if (getDerived().TransformFunctionTypeParams(
4987             TL.getBeginLoc(), TL.getParams(),
4988             TL.getTypePtr()->param_type_begin(),
4989             T->getExtParameterInfosOrNull(),
4990             ParamTypes, &ParamDecls, ExtParamInfos))
4991       return QualType();
4992   }
4993
4994   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
4995
4996   bool EPIChanged = false;
4997   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
4998     return QualType();
4999
5000   // Handle extended parameter information.
5001   if (auto NewExtParamInfos =
5002         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5003     if (!EPI.ExtParameterInfos ||
5004         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5005           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5006       EPIChanged = true;
5007     }
5008     EPI.ExtParameterInfos = NewExtParamInfos;
5009   } else if (EPI.ExtParameterInfos) {
5010     EPIChanged = true;
5011     EPI.ExtParameterInfos = nullptr;
5012   }
5013
5014   QualType Result = TL.getType();
5015   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5016       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5017     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5018     if (Result.isNull())
5019       return QualType();
5020   }
5021
5022   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5023   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5024   NewTL.setLParenLoc(TL.getLParenLoc());
5025   NewTL.setRParenLoc(TL.getRParenLoc());
5026   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5027   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5028   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5029     NewTL.setParam(i, ParamDecls[i]);
5030
5031   return Result;
5032 }
5033
5034 template<typename Derived>
5035 bool TreeTransform<Derived>::TransformExceptionSpec(
5036     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5037     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5038   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5039
5040   // Instantiate a dynamic noexcept expression, if any.
5041   if (ESI.Type == EST_ComputedNoexcept) {
5042     EnterExpressionEvaluationContext Unevaluated(getSema(),
5043                                                  Sema::ConstantEvaluated);
5044     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5045     if (NoexceptExpr.isInvalid())
5046       return true;
5047
5048     // FIXME: This is bogus, a noexcept expression is not a condition.
5049     NoexceptExpr = getSema().CheckBooleanCondition(Loc, NoexceptExpr.get());
5050     if (NoexceptExpr.isInvalid())
5051       return true;
5052
5053     if (!NoexceptExpr.get()->isValueDependent()) {
5054       NoexceptExpr = getSema().VerifyIntegerConstantExpression(
5055           NoexceptExpr.get(), nullptr,
5056           diag::err_noexcept_needs_constant_expression,
5057           /*AllowFold*/false);
5058       if (NoexceptExpr.isInvalid())
5059         return true;
5060     }
5061
5062     if (ESI.NoexceptExpr != NoexceptExpr.get())
5063       Changed = true;
5064     ESI.NoexceptExpr = NoexceptExpr.get();
5065   }
5066
5067   if (ESI.Type != EST_Dynamic)
5068     return false;
5069
5070   // Instantiate a dynamic exception specification's type.
5071   for (QualType T : ESI.Exceptions) {
5072     if (const PackExpansionType *PackExpansion =
5073             T->getAs<PackExpansionType>()) {
5074       Changed = true;
5075
5076       // We have a pack expansion. Instantiate it.
5077       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5078       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5079                                               Unexpanded);
5080       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5081
5082       // Determine whether the set of unexpanded parameter packs can and
5083       // should
5084       // be expanded.
5085       bool Expand = false;
5086       bool RetainExpansion = false;
5087       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5088       // FIXME: Track the location of the ellipsis (and track source location
5089       // information for the types in the exception specification in general).
5090       if (getDerived().TryExpandParameterPacks(
5091               Loc, SourceRange(), Unexpanded, Expand,
5092               RetainExpansion, NumExpansions))
5093         return true;
5094
5095       if (!Expand) {
5096         // We can't expand this pack expansion into separate arguments yet;
5097         // just substitute into the pattern and create a new pack expansion
5098         // type.
5099         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5100         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5101         if (U.isNull())
5102           return true;
5103
5104         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5105         Exceptions.push_back(U);
5106         continue;
5107       }
5108
5109       // Substitute into the pack expansion pattern for each slice of the
5110       // pack.
5111       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5112         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5113
5114         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5115         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5116           return true;
5117
5118         Exceptions.push_back(U);
5119       }
5120     } else {
5121       QualType U = getDerived().TransformType(T);
5122       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5123         return true;
5124       if (T != U)
5125         Changed = true;
5126
5127       Exceptions.push_back(U);
5128     }
5129   }
5130
5131   ESI.Exceptions = Exceptions;
5132   if (ESI.Exceptions.empty())
5133     ESI.Type = EST_DynamicNone;
5134   return false;
5135 }
5136
5137 template<typename Derived>
5138 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5139                                                  TypeLocBuilder &TLB,
5140                                                  FunctionNoProtoTypeLoc TL) {
5141   const FunctionNoProtoType *T = TL.getTypePtr();
5142   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5143   if (ResultType.isNull())
5144     return QualType();
5145
5146   QualType Result = TL.getType();
5147   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5148     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5149
5150   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5151   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5152   NewTL.setLParenLoc(TL.getLParenLoc());
5153   NewTL.setRParenLoc(TL.getRParenLoc());
5154   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5155
5156   return Result;
5157 }
5158
5159 template<typename Derived> QualType
5160 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5161                                                  UnresolvedUsingTypeLoc TL) {
5162   const UnresolvedUsingType *T = TL.getTypePtr();
5163   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5164   if (!D)
5165     return QualType();
5166
5167   QualType Result = TL.getType();
5168   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5169     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5170     if (Result.isNull())
5171       return QualType();
5172   }
5173
5174   // We might get an arbitrary type spec type back.  We should at
5175   // least always get a type spec type, though.
5176   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5177   NewTL.setNameLoc(TL.getNameLoc());
5178
5179   return Result;
5180 }
5181
5182 template<typename Derived>
5183 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5184                                                       TypedefTypeLoc TL) {
5185   const TypedefType *T = TL.getTypePtr();
5186   TypedefNameDecl *Typedef
5187     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5188                                                                T->getDecl()));
5189   if (!Typedef)
5190     return QualType();
5191
5192   QualType Result = TL.getType();
5193   if (getDerived().AlwaysRebuild() ||
5194       Typedef != T->getDecl()) {
5195     Result = getDerived().RebuildTypedefType(Typedef);
5196     if (Result.isNull())
5197       return QualType();
5198   }
5199
5200   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5201   NewTL.setNameLoc(TL.getNameLoc());
5202
5203   return Result;
5204 }
5205
5206 template<typename Derived>
5207 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5208                                                       TypeOfExprTypeLoc TL) {
5209   // typeof expressions are not potentially evaluated contexts
5210   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
5211                                                Sema::ReuseLambdaContextDecl);
5212
5213   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5214   if (E.isInvalid())
5215     return QualType();
5216
5217   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5218   if (E.isInvalid())
5219     return QualType();
5220
5221   QualType Result = TL.getType();
5222   if (getDerived().AlwaysRebuild() ||
5223       E.get() != TL.getUnderlyingExpr()) {
5224     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5225     if (Result.isNull())
5226       return QualType();
5227   }
5228   else E.get();
5229
5230   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5231   NewTL.setTypeofLoc(TL.getTypeofLoc());
5232   NewTL.setLParenLoc(TL.getLParenLoc());
5233   NewTL.setRParenLoc(TL.getRParenLoc());
5234
5235   return Result;
5236 }
5237
5238 template<typename Derived>
5239 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5240                                                      TypeOfTypeLoc TL) {
5241   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5242   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5243   if (!New_Under_TI)
5244     return QualType();
5245
5246   QualType Result = TL.getType();
5247   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5248     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5249     if (Result.isNull())
5250       return QualType();
5251   }
5252
5253   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5254   NewTL.setTypeofLoc(TL.getTypeofLoc());
5255   NewTL.setLParenLoc(TL.getLParenLoc());
5256   NewTL.setRParenLoc(TL.getRParenLoc());
5257   NewTL.setUnderlyingTInfo(New_Under_TI);
5258
5259   return Result;
5260 }
5261
5262 template<typename Derived>
5263 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5264                                                        DecltypeTypeLoc TL) {
5265   const DecltypeType *T = TL.getTypePtr();
5266
5267   // decltype expressions are not potentially evaluated contexts
5268   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
5269                                                nullptr, /*IsDecltype=*/ true);
5270
5271   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5272   if (E.isInvalid())
5273     return QualType();
5274
5275   E = getSema().ActOnDecltypeExpression(E.get());
5276   if (E.isInvalid())
5277     return QualType();
5278
5279   QualType Result = TL.getType();
5280   if (getDerived().AlwaysRebuild() ||
5281       E.get() != T->getUnderlyingExpr()) {
5282     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5283     if (Result.isNull())
5284       return QualType();
5285   }
5286   else E.get();
5287
5288   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5289   NewTL.setNameLoc(TL.getNameLoc());
5290
5291   return Result;
5292 }
5293
5294 template<typename Derived>
5295 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5296                                                             TypeLocBuilder &TLB,
5297                                                      UnaryTransformTypeLoc TL) {
5298   QualType Result = TL.getType();
5299   if (Result->isDependentType()) {
5300     const UnaryTransformType *T = TL.getTypePtr();
5301     QualType NewBase =
5302       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5303     Result = getDerived().RebuildUnaryTransformType(NewBase,
5304                                                     T->getUTTKind(),
5305                                                     TL.getKWLoc());
5306     if (Result.isNull())
5307       return QualType();
5308   }
5309
5310   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5311   NewTL.setKWLoc(TL.getKWLoc());
5312   NewTL.setParensRange(TL.getParensRange());
5313   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5314   return Result;
5315 }
5316
5317 template<typename Derived>
5318 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5319                                                    AutoTypeLoc TL) {
5320   const AutoType *T = TL.getTypePtr();
5321   QualType OldDeduced = T->getDeducedType();
5322   QualType NewDeduced;
5323   if (!OldDeduced.isNull()) {
5324     NewDeduced = getDerived().TransformType(OldDeduced);
5325     if (NewDeduced.isNull())
5326       return QualType();
5327   }
5328
5329   QualType Result = TL.getType();
5330   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5331       T->isDependentType()) {
5332     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5333     if (Result.isNull())
5334       return QualType();
5335   }
5336
5337   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5338   NewTL.setNameLoc(TL.getNameLoc());
5339
5340   return Result;
5341 }
5342
5343 template<typename Derived>
5344 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5345                                                      RecordTypeLoc TL) {
5346   const RecordType *T = TL.getTypePtr();
5347   RecordDecl *Record
5348     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5349                                                           T->getDecl()));
5350   if (!Record)
5351     return QualType();
5352
5353   QualType Result = TL.getType();
5354   if (getDerived().AlwaysRebuild() ||
5355       Record != T->getDecl()) {
5356     Result = getDerived().RebuildRecordType(Record);
5357     if (Result.isNull())
5358       return QualType();
5359   }
5360
5361   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5362   NewTL.setNameLoc(TL.getNameLoc());
5363
5364   return Result;
5365 }
5366
5367 template<typename Derived>
5368 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5369                                                    EnumTypeLoc TL) {
5370   const EnumType *T = TL.getTypePtr();
5371   EnumDecl *Enum
5372     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5373                                                         T->getDecl()));
5374   if (!Enum)
5375     return QualType();
5376
5377   QualType Result = TL.getType();
5378   if (getDerived().AlwaysRebuild() ||
5379       Enum != T->getDecl()) {
5380     Result = getDerived().RebuildEnumType(Enum);
5381     if (Result.isNull())
5382       return QualType();
5383   }
5384
5385   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5386   NewTL.setNameLoc(TL.getNameLoc());
5387
5388   return Result;
5389 }
5390
5391 template<typename Derived>
5392 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5393                                          TypeLocBuilder &TLB,
5394                                          InjectedClassNameTypeLoc TL) {
5395   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5396                                        TL.getTypePtr()->getDecl());
5397   if (!D) return QualType();
5398
5399   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5400   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5401   return T;
5402 }
5403
5404 template<typename Derived>
5405 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5406                                                 TypeLocBuilder &TLB,
5407                                                 TemplateTypeParmTypeLoc TL) {
5408   return TransformTypeSpecType(TLB, TL);
5409 }
5410
5411 template<typename Derived>
5412 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5413                                          TypeLocBuilder &TLB,
5414                                          SubstTemplateTypeParmTypeLoc TL) {
5415   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5416
5417   // Substitute into the replacement type, which itself might involve something
5418   // that needs to be transformed. This only tends to occur with default
5419   // template arguments of template template parameters.
5420   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5421   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5422   if (Replacement.isNull())
5423     return QualType();
5424
5425   // Always canonicalize the replacement type.
5426   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5427   QualType Result
5428     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5429                                                    Replacement);
5430
5431   // Propagate type-source information.
5432   SubstTemplateTypeParmTypeLoc NewTL
5433     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5434   NewTL.setNameLoc(TL.getNameLoc());
5435   return Result;
5436
5437 }
5438
5439 template<typename Derived>
5440 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5441                                           TypeLocBuilder &TLB,
5442                                           SubstTemplateTypeParmPackTypeLoc TL) {
5443   return TransformTypeSpecType(TLB, TL);
5444 }
5445
5446 template<typename Derived>
5447 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5448                                                         TypeLocBuilder &TLB,
5449                                            TemplateSpecializationTypeLoc TL) {
5450   const TemplateSpecializationType *T = TL.getTypePtr();
5451
5452   // The nested-name-specifier never matters in a TemplateSpecializationType,
5453   // because we can't have a dependent nested-name-specifier anyway.
5454   CXXScopeSpec SS;
5455   TemplateName Template
5456     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5457                                          TL.getTemplateNameLoc());
5458   if (Template.isNull())
5459     return QualType();
5460
5461   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5462 }
5463
5464 template<typename Derived>
5465 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5466                                                      AtomicTypeLoc TL) {
5467   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5468   if (ValueType.isNull())
5469     return QualType();
5470
5471   QualType Result = TL.getType();
5472   if (getDerived().AlwaysRebuild() ||
5473       ValueType != TL.getValueLoc().getType()) {
5474     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5475     if (Result.isNull())
5476       return QualType();
5477   }
5478
5479   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5480   NewTL.setKWLoc(TL.getKWLoc());
5481   NewTL.setLParenLoc(TL.getLParenLoc());
5482   NewTL.setRParenLoc(TL.getRParenLoc());
5483
5484   return Result;
5485 }
5486
5487 template <typename Derived>
5488 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5489                                                    PipeTypeLoc TL) {
5490   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5491   if (ValueType.isNull())
5492     return QualType();
5493
5494   QualType Result = TL.getType();
5495   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5496     const PipeType *PT = Result->getAs<PipeType>();
5497     bool isReadPipe = PT->isReadOnly();
5498     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
5499     if (Result.isNull())
5500       return QualType();
5501   }
5502
5503   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5504   NewTL.setKWLoc(TL.getKWLoc());
5505
5506   return Result;
5507 }
5508
5509   /// \brief Simple iterator that traverses the template arguments in a
5510   /// container that provides a \c getArgLoc() member function.
5511   ///
5512   /// This iterator is intended to be used with the iterator form of
5513   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5514   template<typename ArgLocContainer>
5515   class TemplateArgumentLocContainerIterator {
5516     ArgLocContainer *Container;
5517     unsigned Index;
5518
5519   public:
5520     typedef TemplateArgumentLoc value_type;
5521     typedef TemplateArgumentLoc reference;
5522     typedef int difference_type;
5523     typedef std::input_iterator_tag iterator_category;
5524
5525     class pointer {
5526       TemplateArgumentLoc Arg;
5527
5528     public:
5529       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5530
5531       const TemplateArgumentLoc *operator->() const {
5532         return &Arg;
5533       }
5534     };
5535
5536
5537     TemplateArgumentLocContainerIterator() {}
5538
5539     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5540                                  unsigned Index)
5541       : Container(&Container), Index(Index) { }
5542
5543     TemplateArgumentLocContainerIterator &operator++() {
5544       ++Index;
5545       return *this;
5546     }
5547
5548     TemplateArgumentLocContainerIterator operator++(int) {
5549       TemplateArgumentLocContainerIterator Old(*this);
5550       ++(*this);
5551       return Old;
5552     }
5553
5554     TemplateArgumentLoc operator*() const {
5555       return Container->getArgLoc(Index);
5556     }
5557
5558     pointer operator->() const {
5559       return pointer(Container->getArgLoc(Index));
5560     }
5561
5562     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5563                            const TemplateArgumentLocContainerIterator &Y) {
5564       return X.Container == Y.Container && X.Index == Y.Index;
5565     }
5566
5567     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5568                            const TemplateArgumentLocContainerIterator &Y) {
5569       return !(X == Y);
5570     }
5571   };
5572
5573
5574 template <typename Derived>
5575 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5576                                                         TypeLocBuilder &TLB,
5577                                            TemplateSpecializationTypeLoc TL,
5578                                                       TemplateName Template) {
5579   TemplateArgumentListInfo NewTemplateArgs;
5580   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5581   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5582   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5583     ArgIterator;
5584   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5585                                               ArgIterator(TL, TL.getNumArgs()),
5586                                               NewTemplateArgs))
5587     return QualType();
5588
5589   // FIXME: maybe don't rebuild if all the template arguments are the same.
5590
5591   QualType Result =
5592     getDerived().RebuildTemplateSpecializationType(Template,
5593                                                    TL.getTemplateNameLoc(),
5594                                                    NewTemplateArgs);
5595
5596   if (!Result.isNull()) {
5597     // Specializations of template template parameters are represented as
5598     // TemplateSpecializationTypes, and substitution of type alias templates
5599     // within a dependent context can transform them into
5600     // DependentTemplateSpecializationTypes.
5601     if (isa<DependentTemplateSpecializationType>(Result)) {
5602       DependentTemplateSpecializationTypeLoc NewTL
5603         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5604       NewTL.setElaboratedKeywordLoc(SourceLocation());
5605       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5606       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5607       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5608       NewTL.setLAngleLoc(TL.getLAngleLoc());
5609       NewTL.setRAngleLoc(TL.getRAngleLoc());
5610       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5611         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5612       return Result;
5613     }
5614
5615     TemplateSpecializationTypeLoc NewTL
5616       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5617     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5618     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5619     NewTL.setLAngleLoc(TL.getLAngleLoc());
5620     NewTL.setRAngleLoc(TL.getRAngleLoc());
5621     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5622       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5623   }
5624
5625   return Result;
5626 }
5627
5628 template <typename Derived>
5629 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5630                                      TypeLocBuilder &TLB,
5631                                      DependentTemplateSpecializationTypeLoc TL,
5632                                      TemplateName Template,
5633                                      CXXScopeSpec &SS) {
5634   TemplateArgumentListInfo NewTemplateArgs;
5635   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5636   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5637   typedef TemplateArgumentLocContainerIterator<
5638             DependentTemplateSpecializationTypeLoc> ArgIterator;
5639   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5640                                               ArgIterator(TL, TL.getNumArgs()),
5641                                               NewTemplateArgs))
5642     return QualType();
5643
5644   // FIXME: maybe don't rebuild if all the template arguments are the same.
5645
5646   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5647     QualType Result
5648       = getSema().Context.getDependentTemplateSpecializationType(
5649                                                 TL.getTypePtr()->getKeyword(),
5650                                                          DTN->getQualifier(),
5651                                                          DTN->getIdentifier(),
5652                                                                NewTemplateArgs);
5653
5654     DependentTemplateSpecializationTypeLoc NewTL
5655       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5656     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5657     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5658     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5659     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5660     NewTL.setLAngleLoc(TL.getLAngleLoc());
5661     NewTL.setRAngleLoc(TL.getRAngleLoc());
5662     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5663       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5664     return Result;
5665   }
5666
5667   QualType Result
5668     = getDerived().RebuildTemplateSpecializationType(Template,
5669                                                      TL.getTemplateNameLoc(),
5670                                                      NewTemplateArgs);
5671
5672   if (!Result.isNull()) {
5673     /// FIXME: Wrap this in an elaborated-type-specifier?
5674     TemplateSpecializationTypeLoc NewTL
5675       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5676     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5677     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5678     NewTL.setLAngleLoc(TL.getLAngleLoc());
5679     NewTL.setRAngleLoc(TL.getRAngleLoc());
5680     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5681       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5682   }
5683
5684   return Result;
5685 }
5686
5687 template<typename Derived>
5688 QualType
5689 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5690                                                 ElaboratedTypeLoc TL) {
5691   const ElaboratedType *T = TL.getTypePtr();
5692
5693   NestedNameSpecifierLoc QualifierLoc;
5694   // NOTE: the qualifier in an ElaboratedType is optional.
5695   if (TL.getQualifierLoc()) {
5696     QualifierLoc
5697       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5698     if (!QualifierLoc)
5699       return QualType();
5700   }
5701
5702   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5703   if (NamedT.isNull())
5704     return QualType();
5705
5706   // C++0x [dcl.type.elab]p2:
5707   //   If the identifier resolves to a typedef-name or the simple-template-id
5708   //   resolves to an alias template specialization, the
5709   //   elaborated-type-specifier is ill-formed.
5710   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5711     if (const TemplateSpecializationType *TST =
5712           NamedT->getAs<TemplateSpecializationType>()) {
5713       TemplateName Template = TST->getTemplateName();
5714       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
5715               Template.getAsTemplateDecl())) {
5716         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5717                      diag::err_tag_reference_non_tag)
5718             << TAT << Sema::NTK_TypeAliasTemplate
5719             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
5720         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5721       }
5722     }
5723   }
5724
5725   QualType Result = TL.getType();
5726   if (getDerived().AlwaysRebuild() ||
5727       QualifierLoc != TL.getQualifierLoc() ||
5728       NamedT != T->getNamedType()) {
5729     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5730                                                 T->getKeyword(),
5731                                                 QualifierLoc, NamedT);
5732     if (Result.isNull())
5733       return QualType();
5734   }
5735
5736   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5737   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5738   NewTL.setQualifierLoc(QualifierLoc);
5739   return Result;
5740 }
5741
5742 template<typename Derived>
5743 QualType TreeTransform<Derived>::TransformAttributedType(
5744                                                 TypeLocBuilder &TLB,
5745                                                 AttributedTypeLoc TL) {
5746   const AttributedType *oldType = TL.getTypePtr();
5747   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
5748   if (modifiedType.isNull())
5749     return QualType();
5750
5751   QualType result = TL.getType();
5752
5753   // FIXME: dependent operand expressions?
5754   if (getDerived().AlwaysRebuild() ||
5755       modifiedType != oldType->getModifiedType()) {
5756     // TODO: this is really lame; we should really be rebuilding the
5757     // equivalent type from first principles.
5758     QualType equivalentType
5759       = getDerived().TransformType(oldType->getEquivalentType());
5760     if (equivalentType.isNull())
5761       return QualType();
5762
5763     // Check whether we can add nullability; it is only represented as
5764     // type sugar, and therefore cannot be diagnosed in any other way.
5765     if (auto nullability = oldType->getImmediateNullability()) {
5766       if (!modifiedType->canHaveNullability()) {
5767         SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer)
5768           << DiagNullabilityKind(*nullability, false) << modifiedType;
5769         return QualType();
5770       }
5771     }
5772
5773     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
5774                                                modifiedType,
5775                                                equivalentType);
5776   }
5777
5778   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
5779   newTL.setAttrNameLoc(TL.getAttrNameLoc());
5780   if (TL.hasAttrOperand())
5781     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5782   if (TL.hasAttrExprOperand())
5783     newTL.setAttrExprOperand(TL.getAttrExprOperand());
5784   else if (TL.hasAttrEnumOperand())
5785     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
5786
5787   return result;
5788 }
5789
5790 template<typename Derived>
5791 QualType
5792 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
5793                                            ParenTypeLoc TL) {
5794   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
5795   if (Inner.isNull())
5796     return QualType();
5797
5798   QualType Result = TL.getType();
5799   if (getDerived().AlwaysRebuild() ||
5800       Inner != TL.getInnerLoc().getType()) {
5801     Result = getDerived().RebuildParenType(Inner);
5802     if (Result.isNull())
5803       return QualType();
5804   }
5805
5806   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
5807   NewTL.setLParenLoc(TL.getLParenLoc());
5808   NewTL.setRParenLoc(TL.getRParenLoc());
5809   return Result;
5810 }
5811
5812 template<typename Derived>
5813 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
5814                                                       DependentNameTypeLoc TL) {
5815   const DependentNameType *T = TL.getTypePtr();
5816
5817   NestedNameSpecifierLoc QualifierLoc
5818     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5819   if (!QualifierLoc)
5820     return QualType();
5821
5822   QualType Result
5823     = getDerived().RebuildDependentNameType(T->getKeyword(),
5824                                             TL.getElaboratedKeywordLoc(),
5825                                             QualifierLoc,
5826                                             T->getIdentifier(),
5827                                             TL.getNameLoc());
5828   if (Result.isNull())
5829     return QualType();
5830
5831   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
5832     QualType NamedT = ElabT->getNamedType();
5833     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
5834
5835     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5836     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5837     NewTL.setQualifierLoc(QualifierLoc);
5838   } else {
5839     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
5840     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5841     NewTL.setQualifierLoc(QualifierLoc);
5842     NewTL.setNameLoc(TL.getNameLoc());
5843   }
5844   return Result;
5845 }
5846
5847 template<typename Derived>
5848 QualType TreeTransform<Derived>::
5849           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5850                                  DependentTemplateSpecializationTypeLoc TL) {
5851   NestedNameSpecifierLoc QualifierLoc;
5852   if (TL.getQualifierLoc()) {
5853     QualifierLoc
5854       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5855     if (!QualifierLoc)
5856       return QualType();
5857   }
5858
5859   return getDerived()
5860            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
5861 }
5862
5863 template<typename Derived>
5864 QualType TreeTransform<Derived>::
5865 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5866                                    DependentTemplateSpecializationTypeLoc TL,
5867                                        NestedNameSpecifierLoc QualifierLoc) {
5868   const DependentTemplateSpecializationType *T = TL.getTypePtr();
5869
5870   TemplateArgumentListInfo NewTemplateArgs;
5871   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5872   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5873
5874   typedef TemplateArgumentLocContainerIterator<
5875   DependentTemplateSpecializationTypeLoc> ArgIterator;
5876   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5877                                               ArgIterator(TL, TL.getNumArgs()),
5878                                               NewTemplateArgs))
5879     return QualType();
5880
5881   QualType Result
5882     = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
5883                                                               QualifierLoc,
5884                                                             T->getIdentifier(),
5885                                                        TL.getTemplateNameLoc(),
5886                                                             NewTemplateArgs);
5887   if (Result.isNull())
5888     return QualType();
5889
5890   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
5891     QualType NamedT = ElabT->getNamedType();
5892
5893     // Copy information relevant to the template specialization.
5894     TemplateSpecializationTypeLoc NamedTL
5895       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
5896     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5897     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5898     NamedTL.setLAngleLoc(TL.getLAngleLoc());
5899     NamedTL.setRAngleLoc(TL.getRAngleLoc());
5900     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5901       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5902
5903     // Copy information relevant to the elaborated type.
5904     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5905     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5906     NewTL.setQualifierLoc(QualifierLoc);
5907   } else if (isa<DependentTemplateSpecializationType>(Result)) {
5908     DependentTemplateSpecializationTypeLoc SpecTL
5909       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5910     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5911     SpecTL.setQualifierLoc(QualifierLoc);
5912     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5913     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5914     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5915     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5916     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5917       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5918   } else {
5919     TemplateSpecializationTypeLoc SpecTL
5920       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5921     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5922     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5923     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5924     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5925     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5926       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5927   }
5928   return Result;
5929 }
5930
5931 template<typename Derived>
5932 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
5933                                                       PackExpansionTypeLoc TL) {
5934   QualType Pattern
5935     = getDerived().TransformType(TLB, TL.getPatternLoc());
5936   if (Pattern.isNull())
5937     return QualType();
5938
5939   QualType Result = TL.getType();
5940   if (getDerived().AlwaysRebuild() ||
5941       Pattern != TL.getPatternLoc().getType()) {
5942     Result = getDerived().RebuildPackExpansionType(Pattern,
5943                                            TL.getPatternLoc().getSourceRange(),
5944                                                    TL.getEllipsisLoc(),
5945                                            TL.getTypePtr()->getNumExpansions());
5946     if (Result.isNull())
5947       return QualType();
5948   }
5949
5950   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
5951   NewT.setEllipsisLoc(TL.getEllipsisLoc());
5952   return Result;
5953 }
5954
5955 template<typename Derived>
5956 QualType
5957 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
5958                                                    ObjCInterfaceTypeLoc TL) {
5959   // ObjCInterfaceType is never dependent.
5960   TLB.pushFullCopy(TL);
5961   return TL.getType();
5962 }
5963
5964 template<typename Derived>
5965 QualType
5966 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
5967                                                    ObjCTypeParamTypeLoc TL) {
5968   const ObjCTypeParamType *T = TL.getTypePtr();
5969   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
5970       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
5971   if (!OTP)
5972     return QualType();
5973
5974   QualType Result = TL.getType();
5975   if (getDerived().AlwaysRebuild() ||
5976       OTP != T->getDecl()) {
5977     Result = getDerived().RebuildObjCTypeParamType(OTP,
5978                  TL.getProtocolLAngleLoc(),
5979                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
5980                                     TL.getNumProtocols()),
5981                  TL.getProtocolLocs(),
5982                  TL.getProtocolRAngleLoc());
5983     if (Result.isNull())
5984       return QualType();
5985   }
5986
5987   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
5988   if (TL.getNumProtocols()) {
5989     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
5990     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
5991       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
5992     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
5993   }
5994   return Result;
5995 }
5996
5997 template<typename Derived>
5998 QualType
5999 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6000                                                 ObjCObjectTypeLoc TL) {
6001   // Transform base type.
6002   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6003   if (BaseType.isNull())
6004     return QualType();
6005
6006   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6007
6008   // Transform type arguments.
6009   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6010   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6011     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6012     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6013     QualType TypeArg = TypeArgInfo->getType();
6014     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6015       AnyChanged = true;
6016
6017       // We have a pack expansion. Instantiate it.
6018       const auto *PackExpansion = PackExpansionLoc.getType()
6019                                     ->castAs<PackExpansionType>();
6020       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6021       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6022                                               Unexpanded);
6023       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6024
6025       // Determine whether the set of unexpanded parameter packs can
6026       // and should be expanded.
6027       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6028       bool Expand = false;
6029       bool RetainExpansion = false;
6030       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6031       if (getDerived().TryExpandParameterPacks(
6032             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6033             Unexpanded, Expand, RetainExpansion, NumExpansions))
6034         return QualType();
6035
6036       if (!Expand) {
6037         // We can't expand this pack expansion into separate arguments yet;
6038         // just substitute into the pattern and create a new pack expansion
6039         // type.
6040         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6041
6042         TypeLocBuilder TypeArgBuilder;
6043         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6044         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 
6045                                                              PatternLoc);
6046         if (NewPatternType.isNull())
6047           return QualType();
6048
6049         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6050                                       NewPatternType, NumExpansions);
6051         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6052         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6053         NewTypeArgInfos.push_back(
6054           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6055         continue;
6056       }
6057
6058       // Substitute into the pack expansion pattern for each slice of the
6059       // pack.
6060       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6061         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6062
6063         TypeLocBuilder TypeArgBuilder;
6064         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6065
6066         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6067                                                          PatternLoc);
6068         if (NewTypeArg.isNull())
6069           return QualType();
6070
6071         NewTypeArgInfos.push_back(
6072           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6073       }
6074
6075       continue;
6076     }
6077
6078     TypeLocBuilder TypeArgBuilder;
6079     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6080     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6081     if (NewTypeArg.isNull())
6082       return QualType();
6083
6084     // If nothing changed, just keep the old TypeSourceInfo.
6085     if (NewTypeArg == TypeArg) {
6086       NewTypeArgInfos.push_back(TypeArgInfo);
6087       continue;
6088     }
6089
6090     NewTypeArgInfos.push_back(
6091       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6092     AnyChanged = true;
6093   }
6094
6095   QualType Result = TL.getType();
6096   if (getDerived().AlwaysRebuild() || AnyChanged) {
6097     // Rebuild the type.
6098     Result = getDerived().RebuildObjCObjectType(
6099                BaseType,
6100                TL.getLocStart(),
6101                TL.getTypeArgsLAngleLoc(),
6102                NewTypeArgInfos,
6103                TL.getTypeArgsRAngleLoc(),
6104                TL.getProtocolLAngleLoc(),
6105                llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6106                                   TL.getNumProtocols()),
6107                TL.getProtocolLocs(),
6108                TL.getProtocolRAngleLoc());
6109
6110     if (Result.isNull())
6111       return QualType();
6112   }
6113
6114   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6115   NewT.setHasBaseTypeAsWritten(true);
6116   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6117   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6118     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6119   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6120   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6121   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6122     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6123   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6124   return Result;
6125 }
6126
6127 template<typename Derived>
6128 QualType
6129 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6130                                                ObjCObjectPointerTypeLoc TL) {
6131   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6132   if (PointeeType.isNull())
6133     return QualType();
6134
6135   QualType Result = TL.getType();
6136   if (getDerived().AlwaysRebuild() ||
6137       PointeeType != TL.getPointeeLoc().getType()) {
6138     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6139                                                        TL.getStarLoc());
6140     if (Result.isNull())
6141       return QualType();
6142   }
6143
6144   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6145   NewT.setStarLoc(TL.getStarLoc());
6146   return Result;
6147 }
6148
6149 //===----------------------------------------------------------------------===//
6150 // Statement transformation
6151 //===----------------------------------------------------------------------===//
6152 template<typename Derived>
6153 StmtResult
6154 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6155   return S;
6156 }
6157
6158 template<typename Derived>
6159 StmtResult
6160 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6161   return getDerived().TransformCompoundStmt(S, false);
6162 }
6163
6164 template<typename Derived>
6165 StmtResult
6166 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6167                                               bool IsStmtExpr) {
6168   Sema::CompoundScopeRAII CompoundScope(getSema());
6169
6170   bool SubStmtInvalid = false;
6171   bool SubStmtChanged = false;
6172   SmallVector<Stmt*, 8> Statements;
6173   for (auto *B : S->body()) {
6174     StmtResult Result = getDerived().TransformStmt(B);
6175     if (Result.isInvalid()) {
6176       // Immediately fail if this was a DeclStmt, since it's very
6177       // likely that this will cause problems for future statements.
6178       if (isa<DeclStmt>(B))
6179         return StmtError();
6180
6181       // Otherwise, just keep processing substatements and fail later.
6182       SubStmtInvalid = true;
6183       continue;
6184     }
6185
6186     SubStmtChanged = SubStmtChanged || Result.get() != B;
6187     Statements.push_back(Result.getAs<Stmt>());
6188   }
6189
6190   if (SubStmtInvalid)
6191     return StmtError();
6192
6193   if (!getDerived().AlwaysRebuild() &&
6194       !SubStmtChanged)
6195     return S;
6196
6197   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6198                                           Statements,
6199                                           S->getRBracLoc(),
6200                                           IsStmtExpr);
6201 }
6202
6203 template<typename Derived>
6204 StmtResult
6205 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6206   ExprResult LHS, RHS;
6207   {
6208     EnterExpressionEvaluationContext Unevaluated(SemaRef,
6209                                                  Sema::ConstantEvaluated);
6210
6211     // Transform the left-hand case value.
6212     LHS = getDerived().TransformExpr(S->getLHS());
6213     LHS = SemaRef.ActOnConstantExpression(LHS);
6214     if (LHS.isInvalid())
6215       return StmtError();
6216
6217     // Transform the right-hand case value (for the GNU case-range extension).
6218     RHS = getDerived().TransformExpr(S->getRHS());
6219     RHS = SemaRef.ActOnConstantExpression(RHS);
6220     if (RHS.isInvalid())
6221       return StmtError();
6222   }
6223
6224   // Build the case statement.
6225   // Case statements are always rebuilt so that they will attached to their
6226   // transformed switch statement.
6227   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6228                                                        LHS.get(),
6229                                                        S->getEllipsisLoc(),
6230                                                        RHS.get(),
6231                                                        S->getColonLoc());
6232   if (Case.isInvalid())
6233     return StmtError();
6234
6235   // Transform the statement following the case
6236   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6237   if (SubStmt.isInvalid())
6238     return StmtError();
6239
6240   // Attach the body to the case statement
6241   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6242 }
6243
6244 template<typename Derived>
6245 StmtResult
6246 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6247   // Transform the statement following the default case
6248   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6249   if (SubStmt.isInvalid())
6250     return StmtError();
6251
6252   // Default statements are always rebuilt
6253   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6254                                          SubStmt.get());
6255 }
6256
6257 template<typename Derived>
6258 StmtResult
6259 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
6260   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6261   if (SubStmt.isInvalid())
6262     return StmtError();
6263
6264   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6265                                         S->getDecl());
6266   if (!LD)
6267     return StmtError();
6268
6269
6270   // FIXME: Pass the real colon location in.
6271   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6272                                        cast<LabelDecl>(LD), SourceLocation(),
6273                                        SubStmt.get());
6274 }
6275
6276 template <typename Derived>
6277 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6278   if (!R)
6279     return R;
6280
6281   switch (R->getKind()) {
6282 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6283 #define ATTR(X)
6284 #define PRAGMA_SPELLING_ATTR(X)                                                \
6285   case attr::X:                                                                \
6286     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6287 #include "clang/Basic/AttrList.inc"
6288   default:
6289     return R;
6290   }
6291 }
6292
6293 template <typename Derived>
6294 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
6295   bool AttrsChanged = false;
6296   SmallVector<const Attr *, 1> Attrs;
6297
6298   // Visit attributes and keep track if any are transformed.
6299   for (const auto *I : S->getAttrs()) {
6300     const Attr *R = getDerived().TransformAttr(I);
6301     AttrsChanged |= (I != R);
6302     Attrs.push_back(R);
6303   }
6304
6305   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6306   if (SubStmt.isInvalid())
6307     return StmtError();
6308
6309   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6310     return S;
6311
6312   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6313                                             SubStmt.get());
6314 }
6315
6316 template<typename Derived>
6317 StmtResult
6318 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6319   // Transform the initialization statement
6320   StmtResult Init = getDerived().TransformStmt(S->getInit());
6321   if (Init.isInvalid())
6322     return StmtError();
6323
6324   // Transform the condition
6325   Sema::ConditionResult Cond = getDerived().TransformCondition(
6326       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6327       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6328                        : Sema::ConditionKind::Boolean);
6329   if (Cond.isInvalid())
6330     return StmtError();
6331
6332   // If this is a constexpr if, determine which arm we should instantiate.
6333   llvm::Optional<bool> ConstexprConditionValue;
6334   if (S->isConstexpr())
6335     ConstexprConditionValue = Cond.getKnownValue();
6336
6337   // Transform the "then" branch.
6338   StmtResult Then;
6339   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6340     Then = getDerived().TransformStmt(S->getThen());
6341     if (Then.isInvalid())
6342       return StmtError();
6343   } else {
6344     Then = new (getSema().Context) NullStmt(S->getThen()->getLocStart());
6345   }
6346
6347   // Transform the "else" branch.
6348   StmtResult Else;
6349   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6350     Else = getDerived().TransformStmt(S->getElse());
6351     if (Else.isInvalid())
6352       return StmtError();
6353   }
6354
6355   if (!getDerived().AlwaysRebuild() &&
6356       Init.get() == S->getInit() &&
6357       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6358       Then.get() == S->getThen() &&
6359       Else.get() == S->getElse())
6360     return S;
6361
6362   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6363                                     Init.get(), Then.get(), S->getElseLoc(),
6364                                     Else.get());
6365 }
6366
6367 template<typename Derived>
6368 StmtResult
6369 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6370   // Transform the initialization statement
6371   StmtResult Init = getDerived().TransformStmt(S->getInit());
6372   if (Init.isInvalid())
6373     return StmtError();
6374
6375   // Transform the condition.
6376   Sema::ConditionResult Cond = getDerived().TransformCondition(
6377       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6378       Sema::ConditionKind::Switch);
6379   if (Cond.isInvalid())
6380     return StmtError();
6381
6382   // Rebuild the switch statement.
6383   StmtResult Switch
6384     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(),
6385                                           S->getInit(), Cond);
6386   if (Switch.isInvalid())
6387     return StmtError();
6388
6389   // Transform the body of the switch statement.
6390   StmtResult Body = getDerived().TransformStmt(S->getBody());
6391   if (Body.isInvalid())
6392     return StmtError();
6393
6394   // Complete the switch statement.
6395   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6396                                             Body.get());
6397 }
6398
6399 template<typename Derived>
6400 StmtResult
6401 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6402   // Transform the condition
6403   Sema::ConditionResult Cond = getDerived().TransformCondition(
6404       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6405       Sema::ConditionKind::Boolean);
6406   if (Cond.isInvalid())
6407     return StmtError();
6408
6409   // Transform the body
6410   StmtResult Body = getDerived().TransformStmt(S->getBody());
6411   if (Body.isInvalid())
6412     return StmtError();
6413
6414   if (!getDerived().AlwaysRebuild() &&
6415       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6416       Body.get() == S->getBody())
6417     return Owned(S);
6418
6419   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6420 }
6421
6422 template<typename Derived>
6423 StmtResult
6424 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6425   // Transform the body
6426   StmtResult Body = getDerived().TransformStmt(S->getBody());
6427   if (Body.isInvalid())
6428     return StmtError();
6429
6430   // Transform the condition
6431   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6432   if (Cond.isInvalid())
6433     return StmtError();
6434
6435   if (!getDerived().AlwaysRebuild() &&
6436       Cond.get() == S->getCond() &&
6437       Body.get() == S->getBody())
6438     return S;
6439
6440   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6441                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6442                                     S->getRParenLoc());
6443 }
6444
6445 template<typename Derived>
6446 StmtResult
6447 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6448   // Transform the initialization statement
6449   StmtResult Init = getDerived().TransformStmt(S->getInit());
6450   if (Init.isInvalid())
6451     return StmtError();
6452
6453   // In OpenMP loop region loop control variable must be captured and be
6454   // private. Perform analysis of first part (if any).
6455   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6456     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6457
6458   // Transform the condition
6459   Sema::ConditionResult Cond = getDerived().TransformCondition(
6460       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6461       Sema::ConditionKind::Boolean);
6462   if (Cond.isInvalid())
6463     return StmtError();
6464
6465   // Transform the increment
6466   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6467   if (Inc.isInvalid())
6468     return StmtError();
6469
6470   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6471   if (S->getInc() && !FullInc.get())
6472     return StmtError();
6473
6474   // Transform the body
6475   StmtResult Body = getDerived().TransformStmt(S->getBody());
6476   if (Body.isInvalid())
6477     return StmtError();
6478
6479   if (!getDerived().AlwaysRebuild() &&
6480       Init.get() == S->getInit() &&
6481       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6482       Inc.get() == S->getInc() &&
6483       Body.get() == S->getBody())
6484     return S;
6485
6486   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6487                                      Init.get(), Cond, FullInc,
6488                                      S->getRParenLoc(), Body.get());
6489 }
6490
6491 template<typename Derived>
6492 StmtResult
6493 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6494   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6495                                         S->getLabel());
6496   if (!LD)
6497     return StmtError();
6498
6499   // Goto statements must always be rebuilt, to resolve the label.
6500   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6501                                       cast<LabelDecl>(LD));
6502 }
6503
6504 template<typename Derived>
6505 StmtResult
6506 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6507   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6508   if (Target.isInvalid())
6509     return StmtError();
6510   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6511
6512   if (!getDerived().AlwaysRebuild() &&
6513       Target.get() == S->getTarget())
6514     return S;
6515
6516   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6517                                               Target.get());
6518 }
6519
6520 template<typename Derived>
6521 StmtResult
6522 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6523   return S;
6524 }
6525
6526 template<typename Derived>
6527 StmtResult
6528 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6529   return S;
6530 }
6531
6532 template<typename Derived>
6533 StmtResult
6534 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6535   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6536                                                         /*NotCopyInit*/false);
6537   if (Result.isInvalid())
6538     return StmtError();
6539
6540   // FIXME: We always rebuild the return statement because there is no way
6541   // to tell whether the return type of the function has changed.
6542   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6543 }
6544
6545 template<typename Derived>
6546 StmtResult
6547 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6548   bool DeclChanged = false;
6549   SmallVector<Decl *, 4> Decls;
6550   for (auto *D : S->decls()) {
6551     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6552     if (!Transformed)
6553       return StmtError();
6554
6555     if (Transformed != D)
6556       DeclChanged = true;
6557
6558     Decls.push_back(Transformed);
6559   }
6560
6561   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6562     return S;
6563
6564   return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
6565 }
6566
6567 template<typename Derived>
6568 StmtResult
6569 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6570
6571   SmallVector<Expr*, 8> Constraints;
6572   SmallVector<Expr*, 8> Exprs;
6573   SmallVector<IdentifierInfo *, 4> Names;
6574
6575   ExprResult AsmString;
6576   SmallVector<Expr*, 8> Clobbers;
6577
6578   bool ExprsChanged = false;
6579
6580   // Go through the outputs.
6581   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6582     Names.push_back(S->getOutputIdentifier(I));
6583
6584     // No need to transform the constraint literal.
6585     Constraints.push_back(S->getOutputConstraintLiteral(I));
6586
6587     // Transform the output expr.
6588     Expr *OutputExpr = S->getOutputExpr(I);
6589     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6590     if (Result.isInvalid())
6591       return StmtError();
6592
6593     ExprsChanged |= Result.get() != OutputExpr;
6594
6595     Exprs.push_back(Result.get());
6596   }
6597
6598   // Go through the inputs.
6599   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6600     Names.push_back(S->getInputIdentifier(I));
6601
6602     // No need to transform the constraint literal.
6603     Constraints.push_back(S->getInputConstraintLiteral(I));
6604
6605     // Transform the input expr.
6606     Expr *InputExpr = S->getInputExpr(I);
6607     ExprResult Result = getDerived().TransformExpr(InputExpr);
6608     if (Result.isInvalid())
6609       return StmtError();
6610
6611     ExprsChanged |= Result.get() != InputExpr;
6612
6613     Exprs.push_back(Result.get());
6614   }
6615
6616   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6617     return S;
6618
6619   // Go through the clobbers.
6620   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6621     Clobbers.push_back(S->getClobberStringLiteral(I));
6622
6623   // No need to transform the asm string literal.
6624   AsmString = S->getAsmString();
6625   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6626                                         S->isVolatile(), S->getNumOutputs(),
6627                                         S->getNumInputs(), Names.data(),
6628                                         Constraints, Exprs, AsmString.get(),
6629                                         Clobbers, S->getRParenLoc());
6630 }
6631
6632 template<typename Derived>
6633 StmtResult
6634 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6635   ArrayRef<Token> AsmToks =
6636     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6637
6638   bool HadError = false, HadChange = false;
6639
6640   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6641   SmallVector<Expr*, 8> TransformedExprs;
6642   TransformedExprs.reserve(SrcExprs.size());
6643   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6644     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6645     if (!Result.isUsable()) {
6646       HadError = true;
6647     } else {
6648       HadChange |= (Result.get() != SrcExprs[i]);
6649       TransformedExprs.push_back(Result.get());
6650     }
6651   }
6652
6653   if (HadError) return StmtError();
6654   if (!HadChange && !getDerived().AlwaysRebuild())
6655     return Owned(S);
6656
6657   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6658                                        AsmToks, S->getAsmString(),
6659                                        S->getNumOutputs(), S->getNumInputs(),
6660                                        S->getAllConstraints(), S->getClobbers(),
6661                                        TransformedExprs, S->getEndLoc());
6662 }
6663
6664 // C++ Coroutines TS
6665
6666 template<typename Derived>
6667 StmtResult
6668 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
6669   // The coroutine body should be re-formed by the caller if necessary.
6670   // FIXME: The coroutine body is always rebuilt by ActOnFinishFunctionBody
6671   return getDerived().TransformStmt(S->getBody());
6672 }
6673
6674 template<typename Derived>
6675 StmtResult
6676 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
6677   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
6678                                                         /*NotCopyInit*/false);
6679   if (Result.isInvalid())
6680     return StmtError();
6681
6682   // Always rebuild; we don't know if this needs to be injected into a new
6683   // context or if the promise type has changed.
6684   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get());
6685 }
6686
6687 template<typename Derived>
6688 ExprResult
6689 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
6690   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
6691                                                         /*NotCopyInit*/false);
6692   if (Result.isInvalid())
6693     return ExprError();
6694
6695   // Always rebuild; we don't know if this needs to be injected into a new
6696   // context or if the promise type has changed.
6697   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get());
6698 }
6699
6700 template<typename Derived>
6701 ExprResult
6702 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
6703   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
6704                                                         /*NotCopyInit*/false);
6705   if (Result.isInvalid())
6706     return ExprError();
6707
6708   // Always rebuild; we don't know if this needs to be injected into a new
6709   // context or if the promise type has changed.
6710   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
6711 }
6712
6713 // Objective-C Statements.
6714
6715 template<typename Derived>
6716 StmtResult
6717 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
6718   // Transform the body of the @try.
6719   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
6720   if (TryBody.isInvalid())
6721     return StmtError();
6722
6723   // Transform the @catch statements (if present).
6724   bool AnyCatchChanged = false;
6725   SmallVector<Stmt*, 8> CatchStmts;
6726   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
6727     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
6728     if (Catch.isInvalid())
6729       return StmtError();
6730     if (Catch.get() != S->getCatchStmt(I))
6731       AnyCatchChanged = true;
6732     CatchStmts.push_back(Catch.get());
6733   }
6734
6735   // Transform the @finally statement (if present).
6736   StmtResult Finally;
6737   if (S->getFinallyStmt()) {
6738     Finally = getDerived().TransformStmt(S->getFinallyStmt());
6739     if (Finally.isInvalid())
6740       return StmtError();
6741   }
6742
6743   // If nothing changed, just retain this statement.
6744   if (!getDerived().AlwaysRebuild() &&
6745       TryBody.get() == S->getTryBody() &&
6746       !AnyCatchChanged &&
6747       Finally.get() == S->getFinallyStmt())
6748     return S;
6749
6750   // Build a new statement.
6751   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
6752                                            CatchStmts, Finally.get());
6753 }
6754
6755 template<typename Derived>
6756 StmtResult
6757 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
6758   // Transform the @catch parameter, if there is one.
6759   VarDecl *Var = nullptr;
6760   if (VarDecl *FromVar = S->getCatchParamDecl()) {
6761     TypeSourceInfo *TSInfo = nullptr;
6762     if (FromVar->getTypeSourceInfo()) {
6763       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
6764       if (!TSInfo)
6765         return StmtError();
6766     }
6767
6768     QualType T;
6769     if (TSInfo)
6770       T = TSInfo->getType();
6771     else {
6772       T = getDerived().TransformType(FromVar->getType());
6773       if (T.isNull())
6774         return StmtError();
6775     }
6776
6777     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
6778     if (!Var)
6779       return StmtError();
6780   }
6781
6782   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
6783   if (Body.isInvalid())
6784     return StmtError();
6785
6786   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
6787                                              S->getRParenLoc(),
6788                                              Var, Body.get());
6789 }
6790
6791 template<typename Derived>
6792 StmtResult
6793 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
6794   // Transform the body.
6795   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
6796   if (Body.isInvalid())
6797     return StmtError();
6798
6799   // If nothing changed, just retain this statement.
6800   if (!getDerived().AlwaysRebuild() &&
6801       Body.get() == S->getFinallyBody())
6802     return S;
6803
6804   // Build a new statement.
6805   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
6806                                                Body.get());
6807 }
6808
6809 template<typename Derived>
6810 StmtResult
6811 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6812   ExprResult Operand;
6813   if (S->getThrowExpr()) {
6814     Operand = getDerived().TransformExpr(S->getThrowExpr());
6815     if (Operand.isInvalid())
6816       return StmtError();
6817   }
6818
6819   if (!getDerived().AlwaysRebuild() &&
6820       Operand.get() == S->getThrowExpr())
6821     return S;
6822
6823   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
6824 }
6825
6826 template<typename Derived>
6827 StmtResult
6828 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
6829                                                   ObjCAtSynchronizedStmt *S) {
6830   // Transform the object we are locking.
6831   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
6832   if (Object.isInvalid())
6833     return StmtError();
6834   Object =
6835     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
6836                                                   Object.get());
6837   if (Object.isInvalid())
6838     return StmtError();
6839
6840   // Transform the body.
6841   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
6842   if (Body.isInvalid())
6843     return StmtError();
6844
6845   // If nothing change, just retain the current statement.
6846   if (!getDerived().AlwaysRebuild() &&
6847       Object.get() == S->getSynchExpr() &&
6848       Body.get() == S->getSynchBody())
6849     return S;
6850
6851   // Build a new statement.
6852   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
6853                                                     Object.get(), Body.get());
6854 }
6855
6856 template<typename Derived>
6857 StmtResult
6858 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
6859                                               ObjCAutoreleasePoolStmt *S) {
6860   // Transform the body.
6861   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
6862   if (Body.isInvalid())
6863     return StmtError();
6864
6865   // If nothing changed, just retain this statement.
6866   if (!getDerived().AlwaysRebuild() &&
6867       Body.get() == S->getSubStmt())
6868     return S;
6869
6870   // Build a new statement.
6871   return getDerived().RebuildObjCAutoreleasePoolStmt(
6872                         S->getAtLoc(), Body.get());
6873 }
6874
6875 template<typename Derived>
6876 StmtResult
6877 TreeTransform<Derived>::TransformObjCForCollectionStmt(
6878                                                   ObjCForCollectionStmt *S) {
6879   // Transform the element statement.
6880   StmtResult Element = getDerived().TransformStmt(S->getElement());
6881   if (Element.isInvalid())
6882     return StmtError();
6883
6884   // Transform the collection expression.
6885   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
6886   if (Collection.isInvalid())
6887     return StmtError();
6888
6889   // Transform the body.
6890   StmtResult Body = getDerived().TransformStmt(S->getBody());
6891   if (Body.isInvalid())
6892     return StmtError();
6893
6894   // If nothing changed, just retain this statement.
6895   if (!getDerived().AlwaysRebuild() &&
6896       Element.get() == S->getElement() &&
6897       Collection.get() == S->getCollection() &&
6898       Body.get() == S->getBody())
6899     return S;
6900
6901   // Build a new statement.
6902   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
6903                                                    Element.get(),
6904                                                    Collection.get(),
6905                                                    S->getRParenLoc(),
6906                                                    Body.get());
6907 }
6908
6909 template <typename Derived>
6910 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
6911   // Transform the exception declaration, if any.
6912   VarDecl *Var = nullptr;
6913   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
6914     TypeSourceInfo *T =
6915         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
6916     if (!T)
6917       return StmtError();
6918
6919     Var = getDerived().RebuildExceptionDecl(
6920         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
6921         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
6922     if (!Var || Var->isInvalidDecl())
6923       return StmtError();
6924   }
6925
6926   // Transform the actual exception handler.
6927   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
6928   if (Handler.isInvalid())
6929     return StmtError();
6930
6931   if (!getDerived().AlwaysRebuild() && !Var &&
6932       Handler.get() == S->getHandlerBlock())
6933     return S;
6934
6935   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
6936 }
6937
6938 template <typename Derived>
6939 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
6940   // Transform the try block itself.
6941   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6942   if (TryBlock.isInvalid())
6943     return StmtError();
6944
6945   // Transform the handlers.
6946   bool HandlerChanged = false;
6947   SmallVector<Stmt *, 8> Handlers;
6948   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
6949     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
6950     if (Handler.isInvalid())
6951       return StmtError();
6952
6953     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
6954     Handlers.push_back(Handler.getAs<Stmt>());
6955   }
6956
6957   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6958       !HandlerChanged)
6959     return S;
6960
6961   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
6962                                         Handlers);
6963 }
6964
6965 template<typename Derived>
6966 StmtResult
6967 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
6968   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
6969   if (Range.isInvalid())
6970     return StmtError();
6971
6972   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
6973   if (Begin.isInvalid())
6974     return StmtError();
6975   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
6976   if (End.isInvalid())
6977     return StmtError();
6978
6979   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6980   if (Cond.isInvalid())
6981     return StmtError();
6982   if (Cond.get())
6983     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
6984   if (Cond.isInvalid())
6985     return StmtError();
6986   if (Cond.get())
6987     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
6988
6989   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6990   if (Inc.isInvalid())
6991     return StmtError();
6992   if (Inc.get())
6993     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
6994
6995   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
6996   if (LoopVar.isInvalid())
6997     return StmtError();
6998
6999   StmtResult NewStmt = S;
7000   if (getDerived().AlwaysRebuild() ||
7001       Range.get() != S->getRangeStmt() ||
7002       Begin.get() != S->getBeginStmt() ||
7003       End.get() != S->getEndStmt() ||
7004       Cond.get() != S->getCond() ||
7005       Inc.get() != S->getInc() ||
7006       LoopVar.get() != S->getLoopVarStmt()) {
7007     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7008                                                   S->getCoawaitLoc(),
7009                                                   S->getColonLoc(), Range.get(),
7010                                                   Begin.get(), End.get(),
7011                                                   Cond.get(),
7012                                                   Inc.get(), LoopVar.get(),
7013                                                   S->getRParenLoc());
7014     if (NewStmt.isInvalid())
7015       return StmtError();
7016   }
7017
7018   StmtResult Body = getDerived().TransformStmt(S->getBody());
7019   if (Body.isInvalid())
7020     return StmtError();
7021
7022   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7023   // it now so we have a new statement to attach the body to.
7024   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7025     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7026                                                   S->getCoawaitLoc(),
7027                                                   S->getColonLoc(), Range.get(),
7028                                                   Begin.get(), End.get(),
7029                                                   Cond.get(),
7030                                                   Inc.get(), LoopVar.get(),
7031                                                   S->getRParenLoc());
7032     if (NewStmt.isInvalid())
7033       return StmtError();
7034   }
7035
7036   if (NewStmt.get() == S)
7037     return S;
7038
7039   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7040 }
7041
7042 template<typename Derived>
7043 StmtResult
7044 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7045                                                     MSDependentExistsStmt *S) {
7046   // Transform the nested-name-specifier, if any.
7047   NestedNameSpecifierLoc QualifierLoc;
7048   if (S->getQualifierLoc()) {
7049     QualifierLoc
7050       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7051     if (!QualifierLoc)
7052       return StmtError();
7053   }
7054
7055   // Transform the declaration name.
7056   DeclarationNameInfo NameInfo = S->getNameInfo();
7057   if (NameInfo.getName()) {
7058     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7059     if (!NameInfo.getName())
7060       return StmtError();
7061   }
7062
7063   // Check whether anything changed.
7064   if (!getDerived().AlwaysRebuild() &&
7065       QualifierLoc == S->getQualifierLoc() &&
7066       NameInfo.getName() == S->getNameInfo().getName())
7067     return S;
7068
7069   // Determine whether this name exists, if we can.
7070   CXXScopeSpec SS;
7071   SS.Adopt(QualifierLoc);
7072   bool Dependent = false;
7073   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7074   case Sema::IER_Exists:
7075     if (S->isIfExists())
7076       break;
7077
7078     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7079
7080   case Sema::IER_DoesNotExist:
7081     if (S->isIfNotExists())
7082       break;
7083
7084     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7085
7086   case Sema::IER_Dependent:
7087     Dependent = true;
7088     break;
7089
7090   case Sema::IER_Error:
7091     return StmtError();
7092   }
7093
7094   // We need to continue with the instantiation, so do so now.
7095   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7096   if (SubStmt.isInvalid())
7097     return StmtError();
7098
7099   // If we have resolved the name, just transform to the substatement.
7100   if (!Dependent)
7101     return SubStmt;
7102
7103   // The name is still dependent, so build a dependent expression again.
7104   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7105                                                    S->isIfExists(),
7106                                                    QualifierLoc,
7107                                                    NameInfo,
7108                                                    SubStmt.get());
7109 }
7110
7111 template<typename Derived>
7112 ExprResult
7113 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7114   NestedNameSpecifierLoc QualifierLoc;
7115   if (E->getQualifierLoc()) {
7116     QualifierLoc
7117     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7118     if (!QualifierLoc)
7119       return ExprError();
7120   }
7121
7122   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7123     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7124   if (!PD)
7125     return ExprError();
7126
7127   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7128   if (Base.isInvalid())
7129     return ExprError();
7130
7131   return new (SemaRef.getASTContext())
7132       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7133                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7134                         QualifierLoc, E->getMemberLoc());
7135 }
7136
7137 template <typename Derived>
7138 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7139     MSPropertySubscriptExpr *E) {
7140   auto BaseRes = getDerived().TransformExpr(E->getBase());
7141   if (BaseRes.isInvalid())
7142     return ExprError();
7143   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7144   if (IdxRes.isInvalid())
7145     return ExprError();
7146
7147   if (!getDerived().AlwaysRebuild() &&
7148       BaseRes.get() == E->getBase() &&
7149       IdxRes.get() == E->getIdx())
7150     return E;
7151
7152   return getDerived().RebuildArraySubscriptExpr(
7153       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7154 }
7155
7156 template <typename Derived>
7157 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7158   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7159   if (TryBlock.isInvalid())
7160     return StmtError();
7161
7162   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7163   if (Handler.isInvalid())
7164     return StmtError();
7165
7166   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7167       Handler.get() == S->getHandler())
7168     return S;
7169
7170   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7171                                         TryBlock.get(), Handler.get());
7172 }
7173
7174 template <typename Derived>
7175 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7176   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7177   if (Block.isInvalid())
7178     return StmtError();
7179
7180   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7181 }
7182
7183 template <typename Derived>
7184 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7185   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7186   if (FilterExpr.isInvalid())
7187     return StmtError();
7188
7189   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7190   if (Block.isInvalid())
7191     return StmtError();
7192
7193   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7194                                            Block.get());
7195 }
7196
7197 template <typename Derived>
7198 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7199   if (isa<SEHFinallyStmt>(Handler))
7200     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7201   else
7202     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7203 }
7204
7205 template<typename Derived>
7206 StmtResult
7207 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7208   return S;
7209 }
7210
7211 //===----------------------------------------------------------------------===//
7212 // OpenMP directive transformation
7213 //===----------------------------------------------------------------------===//
7214 template <typename Derived>
7215 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7216     OMPExecutableDirective *D) {
7217
7218   // Transform the clauses
7219   llvm::SmallVector<OMPClause *, 16> TClauses;
7220   ArrayRef<OMPClause *> Clauses = D->clauses();
7221   TClauses.reserve(Clauses.size());
7222   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7223        I != E; ++I) {
7224     if (*I) {
7225       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7226       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7227       getDerived().getSema().EndOpenMPClause();
7228       if (Clause)
7229         TClauses.push_back(Clause);
7230     } else {
7231       TClauses.push_back(nullptr);
7232     }
7233   }
7234   StmtResult AssociatedStmt;
7235   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7236     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7237                                                   /*CurScope=*/nullptr);
7238     StmtResult Body;
7239     {
7240       Sema::CompoundScopeRAII CompoundScope(getSema());
7241       Body = getDerived().TransformStmt(
7242           cast<CapturedStmt>(D->getAssociatedStmt())->getCapturedStmt());
7243     }
7244     AssociatedStmt =
7245         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7246     if (AssociatedStmt.isInvalid()) {
7247       return StmtError();
7248     }
7249   }
7250   if (TClauses.size() != Clauses.size()) {
7251     return StmtError();
7252   }
7253
7254   // Transform directive name for 'omp critical' directive.
7255   DeclarationNameInfo DirName;
7256   if (D->getDirectiveKind() == OMPD_critical) {
7257     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7258     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7259   }
7260   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7261   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7262     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7263   } else if (D->getDirectiveKind() == OMPD_cancel) {
7264     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7265   }
7266
7267   return getDerived().RebuildOMPExecutableDirective(
7268       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7269       AssociatedStmt.get(), D->getLocStart(), D->getLocEnd());
7270 }
7271
7272 template <typename Derived>
7273 StmtResult
7274 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7275   DeclarationNameInfo DirName;
7276   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7277                                              D->getLocStart());
7278   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7279   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7280   return Res;
7281 }
7282
7283 template <typename Derived>
7284 StmtResult
7285 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7286   DeclarationNameInfo DirName;
7287   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7288                                              D->getLocStart());
7289   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7290   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7291   return Res;
7292 }
7293
7294 template <typename Derived>
7295 StmtResult
7296 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7297   DeclarationNameInfo DirName;
7298   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7299                                              D->getLocStart());
7300   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7301   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7302   return Res;
7303 }
7304
7305 template <typename Derived>
7306 StmtResult
7307 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7308   DeclarationNameInfo DirName;
7309   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7310                                              D->getLocStart());
7311   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7312   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7313   return Res;
7314 }
7315
7316 template <typename Derived>
7317 StmtResult
7318 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7319   DeclarationNameInfo DirName;
7320   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7321                                              D->getLocStart());
7322   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7323   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7324   return Res;
7325 }
7326
7327 template <typename Derived>
7328 StmtResult
7329 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7330   DeclarationNameInfo DirName;
7331   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7332                                              D->getLocStart());
7333   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7334   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7335   return Res;
7336 }
7337
7338 template <typename Derived>
7339 StmtResult
7340 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7341   DeclarationNameInfo DirName;
7342   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7343                                              D->getLocStart());
7344   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7345   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7346   return Res;
7347 }
7348
7349 template <typename Derived>
7350 StmtResult
7351 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7352   DeclarationNameInfo DirName;
7353   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7354                                              D->getLocStart());
7355   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7356   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7357   return Res;
7358 }
7359
7360 template <typename Derived>
7361 StmtResult
7362 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7363   getDerived().getSema().StartOpenMPDSABlock(
7364       OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart());
7365   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7366   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7367   return Res;
7368 }
7369
7370 template <typename Derived>
7371 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7372     OMPParallelForDirective *D) {
7373   DeclarationNameInfo DirName;
7374   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7375                                              nullptr, D->getLocStart());
7376   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7377   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7378   return Res;
7379 }
7380
7381 template <typename Derived>
7382 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
7383     OMPParallelForSimdDirective *D) {
7384   DeclarationNameInfo DirName;
7385   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
7386                                              nullptr, D->getLocStart());
7387   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7388   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7389   return Res;
7390 }
7391
7392 template <typename Derived>
7393 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
7394     OMPParallelSectionsDirective *D) {
7395   DeclarationNameInfo DirName;
7396   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
7397                                              nullptr, D->getLocStart());
7398   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7399   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7400   return Res;
7401 }
7402
7403 template <typename Derived>
7404 StmtResult
7405 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
7406   DeclarationNameInfo DirName;
7407   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
7408                                              D->getLocStart());
7409   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7410   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7411   return Res;
7412 }
7413
7414 template <typename Derived>
7415 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
7416     OMPTaskyieldDirective *D) {
7417   DeclarationNameInfo DirName;
7418   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
7419                                              D->getLocStart());
7420   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7421   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7422   return Res;
7423 }
7424
7425 template <typename Derived>
7426 StmtResult
7427 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
7428   DeclarationNameInfo DirName;
7429   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
7430                                              D->getLocStart());
7431   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7432   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7433   return Res;
7434 }
7435
7436 template <typename Derived>
7437 StmtResult
7438 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
7439   DeclarationNameInfo DirName;
7440   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
7441                                              D->getLocStart());
7442   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7443   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7444   return Res;
7445 }
7446
7447 template <typename Derived>
7448 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
7449     OMPTaskgroupDirective *D) {
7450   DeclarationNameInfo DirName;
7451   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
7452                                              D->getLocStart());
7453   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7454   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7455   return Res;
7456 }
7457
7458 template <typename Derived>
7459 StmtResult
7460 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
7461   DeclarationNameInfo DirName;
7462   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
7463                                              D->getLocStart());
7464   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7465   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7466   return Res;
7467 }
7468
7469 template <typename Derived>
7470 StmtResult
7471 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
7472   DeclarationNameInfo DirName;
7473   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
7474                                              D->getLocStart());
7475   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7476   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7477   return Res;
7478 }
7479
7480 template <typename Derived>
7481 StmtResult
7482 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
7483   DeclarationNameInfo DirName;
7484   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
7485                                              D->getLocStart());
7486   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7487   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7488   return Res;
7489 }
7490
7491 template <typename Derived>
7492 StmtResult
7493 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
7494   DeclarationNameInfo DirName;
7495   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
7496                                              D->getLocStart());
7497   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7498   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7499   return Res;
7500 }
7501
7502 template <typename Derived>
7503 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
7504     OMPTargetDataDirective *D) {
7505   DeclarationNameInfo DirName;
7506   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
7507                                              D->getLocStart());
7508   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7509   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7510   return Res;
7511 }
7512
7513 template <typename Derived>
7514 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
7515     OMPTargetEnterDataDirective *D) {
7516   DeclarationNameInfo DirName;
7517   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
7518                                              nullptr, D->getLocStart());
7519   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7520   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7521   return Res;
7522 }
7523
7524 template <typename Derived>
7525 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
7526     OMPTargetExitDataDirective *D) {
7527   DeclarationNameInfo DirName;
7528   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
7529                                              nullptr, D->getLocStart());
7530   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7531   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7532   return Res;
7533 }
7534
7535 template <typename Derived>
7536 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
7537     OMPTargetParallelDirective *D) {
7538   DeclarationNameInfo DirName;
7539   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
7540                                              nullptr, D->getLocStart());
7541   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7542   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7543   return Res;
7544 }
7545
7546 template <typename Derived>
7547 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
7548     OMPTargetParallelForDirective *D) {
7549   DeclarationNameInfo DirName;
7550   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
7551                                              nullptr, D->getLocStart());
7552   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7553   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7554   return Res;
7555 }
7556
7557 template <typename Derived>
7558 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
7559     OMPTargetUpdateDirective *D) {
7560   DeclarationNameInfo DirName;
7561   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
7562                                              nullptr, D->getLocStart());
7563   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7564   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7565   return Res;
7566 }
7567
7568 template <typename Derived>
7569 StmtResult
7570 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
7571   DeclarationNameInfo DirName;
7572   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
7573                                              D->getLocStart());
7574   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7575   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7576   return Res;
7577 }
7578
7579 template <typename Derived>
7580 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
7581     OMPCancellationPointDirective *D) {
7582   DeclarationNameInfo DirName;
7583   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
7584                                              nullptr, D->getLocStart());
7585   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7586   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7587   return Res;
7588 }
7589
7590 template <typename Derived>
7591 StmtResult
7592 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
7593   DeclarationNameInfo DirName;
7594   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
7595                                              D->getLocStart());
7596   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7597   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7598   return Res;
7599 }
7600
7601 template <typename Derived>
7602 StmtResult
7603 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
7604   DeclarationNameInfo DirName;
7605   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
7606                                              D->getLocStart());
7607   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7608   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7609   return Res;
7610 }
7611
7612 template <typename Derived>
7613 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
7614     OMPTaskLoopSimdDirective *D) {
7615   DeclarationNameInfo DirName;
7616   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
7617                                              nullptr, D->getLocStart());
7618   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7619   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7620   return Res;
7621 }
7622
7623 template <typename Derived>
7624 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
7625     OMPDistributeDirective *D) {
7626   DeclarationNameInfo DirName;
7627   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
7628                                              D->getLocStart());
7629   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7630   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7631   return Res;
7632 }
7633
7634 template <typename Derived>
7635 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
7636     OMPDistributeParallelForDirective *D) {
7637   DeclarationNameInfo DirName;
7638   getDerived().getSema().StartOpenMPDSABlock(
7639       OMPD_distribute_parallel_for, DirName, nullptr, D->getLocStart());
7640   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7641   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7642   return Res;
7643 }
7644
7645 template <typename Derived>
7646 StmtResult
7647 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
7648     OMPDistributeParallelForSimdDirective *D) {
7649   DeclarationNameInfo DirName;
7650   getDerived().getSema().StartOpenMPDSABlock(
7651       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
7652   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7653   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7654   return Res;
7655 }
7656
7657 template <typename Derived>
7658 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
7659     OMPDistributeSimdDirective *D) {
7660   DeclarationNameInfo DirName;
7661   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
7662                                              nullptr, D->getLocStart());
7663   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7664   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7665   return Res;
7666 }
7667
7668 template <typename Derived>
7669 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
7670     OMPTargetParallelForSimdDirective *D) {
7671   DeclarationNameInfo DirName;
7672   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for_simd,
7673                                              DirName, nullptr,
7674                                              D->getLocStart());
7675   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7676   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7677   return Res;
7678 }
7679
7680 template <typename Derived>
7681 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
7682     OMPTargetSimdDirective *D) {
7683   DeclarationNameInfo DirName;
7684   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
7685                                              D->getLocStart());
7686   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7687   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7688   return Res;
7689 }
7690
7691 template <typename Derived>
7692 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
7693     OMPTeamsDistributeDirective *D) {
7694   DeclarationNameInfo DirName;
7695   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
7696                                              nullptr, D->getLocStart());
7697   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7698   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7699   return Res;
7700 }
7701
7702 template <typename Derived>
7703 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
7704     OMPTeamsDistributeSimdDirective *D) {
7705   DeclarationNameInfo DirName;
7706   getDerived().getSema().StartOpenMPDSABlock(
7707       OMPD_teams_distribute_simd, DirName, nullptr, D->getLocStart());
7708   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7709   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7710   return Res;
7711 }
7712
7713 template <typename Derived>
7714 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
7715     OMPTeamsDistributeParallelForSimdDirective *D) {
7716   DeclarationNameInfo DirName;
7717   getDerived().getSema().StartOpenMPDSABlock(
7718       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
7719   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7720   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7721   return Res;
7722 }
7723
7724 template <typename Derived>
7725 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
7726     OMPTeamsDistributeParallelForDirective *D) {
7727   DeclarationNameInfo DirName;
7728   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute_parallel_for,
7729       DirName, nullptr, D->getLocStart());
7730   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7731   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7732   return Res;
7733 }
7734
7735 template <typename Derived>
7736 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
7737     OMPTargetTeamsDirective *D) {
7738   DeclarationNameInfo DirName;
7739   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
7740                                              nullptr, D->getLocStart());
7741   auto Res = getDerived().TransformOMPExecutableDirective(D);
7742   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7743   return Res;
7744 }
7745
7746 template <typename Derived>
7747 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
7748     OMPTargetTeamsDistributeDirective *D) {
7749   DeclarationNameInfo DirName;
7750   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_distribute,
7751       DirName, nullptr, D->getLocStart());
7752   auto Res = getDerived().TransformOMPExecutableDirective(D);
7753   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7754   return Res;
7755 }
7756
7757 template <typename Derived>
7758 StmtResult
7759 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
7760     OMPTargetTeamsDistributeParallelForDirective *D) {
7761   DeclarationNameInfo DirName;
7762   getDerived().getSema().StartOpenMPDSABlock(
7763       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
7764       D->getLocStart());
7765   auto Res = getDerived().TransformOMPExecutableDirective(D);
7766   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7767   return Res;
7768 }
7769
7770 template <typename Derived>
7771 StmtResult TreeTransform<Derived>::
7772     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
7773         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
7774   DeclarationNameInfo DirName;
7775   getDerived().getSema().StartOpenMPDSABlock(
7776       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
7777       D->getLocStart());
7778   auto Res = getDerived().TransformOMPExecutableDirective(D);
7779   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7780   return Res;
7781 }
7782
7783 template <typename Derived>
7784 StmtResult
7785 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
7786     OMPTargetTeamsDistributeSimdDirective *D) {
7787   DeclarationNameInfo DirName;
7788   getDerived().getSema().StartOpenMPDSABlock(
7789       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getLocStart());
7790   auto Res = getDerived().TransformOMPExecutableDirective(D);
7791   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7792   return Res;
7793 }
7794
7795
7796 //===----------------------------------------------------------------------===//
7797 // OpenMP clause transformation
7798 //===----------------------------------------------------------------------===//
7799 template <typename Derived>
7800 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
7801   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
7802   if (Cond.isInvalid())
7803     return nullptr;
7804   return getDerived().RebuildOMPIfClause(
7805       C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(),
7806       C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd());
7807 }
7808
7809 template <typename Derived>
7810 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
7811   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
7812   if (Cond.isInvalid())
7813     return nullptr;
7814   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(),
7815                                             C->getLParenLoc(), C->getLocEnd());
7816 }
7817
7818 template <typename Derived>
7819 OMPClause *
7820 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
7821   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
7822   if (NumThreads.isInvalid())
7823     return nullptr;
7824   return getDerived().RebuildOMPNumThreadsClause(
7825       NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7826 }
7827
7828 template <typename Derived>
7829 OMPClause *
7830 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
7831   ExprResult E = getDerived().TransformExpr(C->getSafelen());
7832   if (E.isInvalid())
7833     return nullptr;
7834   return getDerived().RebuildOMPSafelenClause(
7835       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7836 }
7837
7838 template <typename Derived>
7839 OMPClause *
7840 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
7841   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
7842   if (E.isInvalid())
7843     return nullptr;
7844   return getDerived().RebuildOMPSimdlenClause(
7845       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7846 }
7847
7848 template <typename Derived>
7849 OMPClause *
7850 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
7851   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
7852   if (E.isInvalid())
7853     return nullptr;
7854   return getDerived().RebuildOMPCollapseClause(
7855       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7856 }
7857
7858 template <typename Derived>
7859 OMPClause *
7860 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
7861   return getDerived().RebuildOMPDefaultClause(
7862       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
7863       C->getLParenLoc(), C->getLocEnd());
7864 }
7865
7866 template <typename Derived>
7867 OMPClause *
7868 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
7869   return getDerived().RebuildOMPProcBindClause(
7870       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
7871       C->getLParenLoc(), C->getLocEnd());
7872 }
7873
7874 template <typename Derived>
7875 OMPClause *
7876 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
7877   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
7878   if (E.isInvalid())
7879     return nullptr;
7880   return getDerived().RebuildOMPScheduleClause(
7881       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
7882       C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
7883       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
7884       C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
7885 }
7886
7887 template <typename Derived>
7888 OMPClause *
7889 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
7890   ExprResult E;
7891   if (auto *Num = C->getNumForLoops()) {
7892     E = getDerived().TransformExpr(Num);
7893     if (E.isInvalid())
7894       return nullptr;
7895   }
7896   return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(),
7897                                               C->getLParenLoc(), E.get());
7898 }
7899
7900 template <typename Derived>
7901 OMPClause *
7902 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
7903   // No need to rebuild this clause, no template-dependent parameters.
7904   return C;
7905 }
7906
7907 template <typename Derived>
7908 OMPClause *
7909 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
7910   // No need to rebuild this clause, no template-dependent parameters.
7911   return C;
7912 }
7913
7914 template <typename Derived>
7915 OMPClause *
7916 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
7917   // No need to rebuild this clause, no template-dependent parameters.
7918   return C;
7919 }
7920
7921 template <typename Derived>
7922 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
7923   // No need to rebuild this clause, no template-dependent parameters.
7924   return C;
7925 }
7926
7927 template <typename Derived>
7928 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
7929   // No need to rebuild this clause, no template-dependent parameters.
7930   return C;
7931 }
7932
7933 template <typename Derived>
7934 OMPClause *
7935 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
7936   // No need to rebuild this clause, no template-dependent parameters.
7937   return C;
7938 }
7939
7940 template <typename Derived>
7941 OMPClause *
7942 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
7943   // No need to rebuild this clause, no template-dependent parameters.
7944   return C;
7945 }
7946
7947 template <typename Derived>
7948 OMPClause *
7949 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
7950   // No need to rebuild this clause, no template-dependent parameters.
7951   return C;
7952 }
7953
7954 template <typename Derived>
7955 OMPClause *
7956 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
7957   // No need to rebuild this clause, no template-dependent parameters.
7958   return C;
7959 }
7960
7961 template <typename Derived>
7962 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
7963   // No need to rebuild this clause, no template-dependent parameters.
7964   return C;
7965 }
7966
7967 template <typename Derived>
7968 OMPClause *
7969 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
7970   // No need to rebuild this clause, no template-dependent parameters.
7971   return C;
7972 }
7973
7974 template <typename Derived>
7975 OMPClause *
7976 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
7977   llvm::SmallVector<Expr *, 16> Vars;
7978   Vars.reserve(C->varlist_size());
7979   for (auto *VE : C->varlists()) {
7980     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7981     if (EVar.isInvalid())
7982       return nullptr;
7983     Vars.push_back(EVar.get());
7984   }
7985   return getDerived().RebuildOMPPrivateClause(
7986       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7987 }
7988
7989 template <typename Derived>
7990 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
7991     OMPFirstprivateClause *C) {
7992   llvm::SmallVector<Expr *, 16> Vars;
7993   Vars.reserve(C->varlist_size());
7994   for (auto *VE : C->varlists()) {
7995     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7996     if (EVar.isInvalid())
7997       return nullptr;
7998     Vars.push_back(EVar.get());
7999   }
8000   return getDerived().RebuildOMPFirstprivateClause(
8001       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8002 }
8003
8004 template <typename Derived>
8005 OMPClause *
8006 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8007   llvm::SmallVector<Expr *, 16> Vars;
8008   Vars.reserve(C->varlist_size());
8009   for (auto *VE : C->varlists()) {
8010     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8011     if (EVar.isInvalid())
8012       return nullptr;
8013     Vars.push_back(EVar.get());
8014   }
8015   return getDerived().RebuildOMPLastprivateClause(
8016       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8017 }
8018
8019 template <typename Derived>
8020 OMPClause *
8021 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8022   llvm::SmallVector<Expr *, 16> Vars;
8023   Vars.reserve(C->varlist_size());
8024   for (auto *VE : C->varlists()) {
8025     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8026     if (EVar.isInvalid())
8027       return nullptr;
8028     Vars.push_back(EVar.get());
8029   }
8030   return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
8031                                              C->getLParenLoc(), C->getLocEnd());
8032 }
8033
8034 template <typename Derived>
8035 OMPClause *
8036 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8037   llvm::SmallVector<Expr *, 16> Vars;
8038   Vars.reserve(C->varlist_size());
8039   for (auto *VE : C->varlists()) {
8040     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8041     if (EVar.isInvalid())
8042       return nullptr;
8043     Vars.push_back(EVar.get());
8044   }
8045   CXXScopeSpec ReductionIdScopeSpec;
8046   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8047
8048   DeclarationNameInfo NameInfo = C->getNameInfo();
8049   if (NameInfo.getName()) {
8050     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8051     if (!NameInfo.getName())
8052       return nullptr;
8053   }
8054   // Build a list of all UDR decls with the same names ranged by the Scopes.
8055   // The Scope boundary is a duplication of the previous decl.
8056   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8057   for (auto *E : C->reduction_ops()) {
8058     // Transform all the decls.
8059     if (E) {
8060       auto *ULE = cast<UnresolvedLookupExpr>(E);
8061       UnresolvedSet<8> Decls;
8062       for (auto *D : ULE->decls()) {
8063         NamedDecl *InstD =
8064             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8065         Decls.addDecl(InstD, InstD->getAccess());
8066       }
8067       UnresolvedReductions.push_back(
8068        UnresolvedLookupExpr::Create(
8069           SemaRef.Context, /*NamingClass=*/nullptr,
8070           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8071           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8072           Decls.begin(), Decls.end()));
8073     } else
8074       UnresolvedReductions.push_back(nullptr);
8075   }
8076   return getDerived().RebuildOMPReductionClause(
8077       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8078       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8079 }
8080
8081 template <typename Derived>
8082 OMPClause *
8083 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
8084   llvm::SmallVector<Expr *, 16> Vars;
8085   Vars.reserve(C->varlist_size());
8086   for (auto *VE : C->varlists()) {
8087     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8088     if (EVar.isInvalid())
8089       return nullptr;
8090     Vars.push_back(EVar.get());
8091   }
8092   ExprResult Step = getDerived().TransformExpr(C->getStep());
8093   if (Step.isInvalid())
8094     return nullptr;
8095   return getDerived().RebuildOMPLinearClause(
8096       Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(),
8097       C->getModifierLoc(), C->getColonLoc(), C->getLocEnd());
8098 }
8099
8100 template <typename Derived>
8101 OMPClause *
8102 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
8103   llvm::SmallVector<Expr *, 16> Vars;
8104   Vars.reserve(C->varlist_size());
8105   for (auto *VE : C->varlists()) {
8106     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8107     if (EVar.isInvalid())
8108       return nullptr;
8109     Vars.push_back(EVar.get());
8110   }
8111   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
8112   if (Alignment.isInvalid())
8113     return nullptr;
8114   return getDerived().RebuildOMPAlignedClause(
8115       Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
8116       C->getColonLoc(), C->getLocEnd());
8117 }
8118
8119 template <typename Derived>
8120 OMPClause *
8121 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
8122   llvm::SmallVector<Expr *, 16> Vars;
8123   Vars.reserve(C->varlist_size());
8124   for (auto *VE : C->varlists()) {
8125     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8126     if (EVar.isInvalid())
8127       return nullptr;
8128     Vars.push_back(EVar.get());
8129   }
8130   return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
8131                                              C->getLParenLoc(), C->getLocEnd());
8132 }
8133
8134 template <typename Derived>
8135 OMPClause *
8136 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
8137   llvm::SmallVector<Expr *, 16> Vars;
8138   Vars.reserve(C->varlist_size());
8139   for (auto *VE : C->varlists()) {
8140     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8141     if (EVar.isInvalid())
8142       return nullptr;
8143     Vars.push_back(EVar.get());
8144   }
8145   return getDerived().RebuildOMPCopyprivateClause(
8146       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8147 }
8148
8149 template <typename Derived>
8150 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
8151   llvm::SmallVector<Expr *, 16> Vars;
8152   Vars.reserve(C->varlist_size());
8153   for (auto *VE : C->varlists()) {
8154     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8155     if (EVar.isInvalid())
8156       return nullptr;
8157     Vars.push_back(EVar.get());
8158   }
8159   return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(),
8160                                             C->getLParenLoc(), C->getLocEnd());
8161 }
8162
8163 template <typename Derived>
8164 OMPClause *
8165 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
8166   llvm::SmallVector<Expr *, 16> Vars;
8167   Vars.reserve(C->varlist_size());
8168   for (auto *VE : C->varlists()) {
8169     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8170     if (EVar.isInvalid())
8171       return nullptr;
8172     Vars.push_back(EVar.get());
8173   }
8174   return getDerived().RebuildOMPDependClause(
8175       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8176       C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8177 }
8178
8179 template <typename Derived>
8180 OMPClause *
8181 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8182   ExprResult E = getDerived().TransformExpr(C->getDevice());
8183   if (E.isInvalid())
8184     return nullptr;
8185   return getDerived().RebuildOMPDeviceClause(
8186       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8187 }
8188
8189 template <typename Derived>
8190 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
8191   llvm::SmallVector<Expr *, 16> Vars;
8192   Vars.reserve(C->varlist_size());
8193   for (auto *VE : C->varlists()) {
8194     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8195     if (EVar.isInvalid())
8196       return nullptr;
8197     Vars.push_back(EVar.get());
8198   }
8199   return getDerived().RebuildOMPMapClause(
8200       C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(),
8201       C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(),
8202       C->getLParenLoc(), C->getLocEnd());
8203 }
8204
8205 template <typename Derived>
8206 OMPClause *
8207 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
8208   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
8209   if (E.isInvalid())
8210     return nullptr;
8211   return getDerived().RebuildOMPNumTeamsClause(
8212       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8213 }
8214
8215 template <typename Derived>
8216 OMPClause *
8217 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
8218   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
8219   if (E.isInvalid())
8220     return nullptr;
8221   return getDerived().RebuildOMPThreadLimitClause(
8222       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8223 }
8224
8225 template <typename Derived>
8226 OMPClause *
8227 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
8228   ExprResult E = getDerived().TransformExpr(C->getPriority());
8229   if (E.isInvalid())
8230     return nullptr;
8231   return getDerived().RebuildOMPPriorityClause(
8232       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8233 }
8234
8235 template <typename Derived>
8236 OMPClause *
8237 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
8238   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
8239   if (E.isInvalid())
8240     return nullptr;
8241   return getDerived().RebuildOMPGrainsizeClause(
8242       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8243 }
8244
8245 template <typename Derived>
8246 OMPClause *
8247 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
8248   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
8249   if (E.isInvalid())
8250     return nullptr;
8251   return getDerived().RebuildOMPNumTasksClause(
8252       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8253 }
8254
8255 template <typename Derived>
8256 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
8257   ExprResult E = getDerived().TransformExpr(C->getHint());
8258   if (E.isInvalid())
8259     return nullptr;
8260   return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(),
8261                                            C->getLParenLoc(), C->getLocEnd());
8262 }
8263
8264 template <typename Derived>
8265 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
8266     OMPDistScheduleClause *C) {
8267   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8268   if (E.isInvalid())
8269     return nullptr;
8270   return getDerived().RebuildOMPDistScheduleClause(
8271       C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8272       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8273 }
8274
8275 template <typename Derived>
8276 OMPClause *
8277 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
8278   return C;
8279 }
8280
8281 template <typename Derived>
8282 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
8283   llvm::SmallVector<Expr *, 16> Vars;
8284   Vars.reserve(C->varlist_size());
8285   for (auto *VE : C->varlists()) {
8286     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8287     if (EVar.isInvalid())
8288       return 0;
8289     Vars.push_back(EVar.get());
8290   }
8291   return getDerived().RebuildOMPToClause(Vars, C->getLocStart(),
8292                                          C->getLParenLoc(), C->getLocEnd());
8293 }
8294
8295 template <typename Derived>
8296 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
8297   llvm::SmallVector<Expr *, 16> Vars;
8298   Vars.reserve(C->varlist_size());
8299   for (auto *VE : C->varlists()) {
8300     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8301     if (EVar.isInvalid())
8302       return 0;
8303     Vars.push_back(EVar.get());
8304   }
8305   return getDerived().RebuildOMPFromClause(Vars, C->getLocStart(),
8306                                            C->getLParenLoc(), C->getLocEnd());
8307 }
8308
8309 template <typename Derived>
8310 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
8311     OMPUseDevicePtrClause *C) {
8312   llvm::SmallVector<Expr *, 16> Vars;
8313   Vars.reserve(C->varlist_size());
8314   for (auto *VE : C->varlists()) {
8315     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8316     if (EVar.isInvalid())
8317       return nullptr;
8318     Vars.push_back(EVar.get());
8319   }
8320   return getDerived().RebuildOMPUseDevicePtrClause(
8321       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8322 }
8323
8324 template <typename Derived>
8325 OMPClause *
8326 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
8327   llvm::SmallVector<Expr *, 16> Vars;
8328   Vars.reserve(C->varlist_size());
8329   for (auto *VE : C->varlists()) {
8330     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8331     if (EVar.isInvalid())
8332       return nullptr;
8333     Vars.push_back(EVar.get());
8334   }
8335   return getDerived().RebuildOMPIsDevicePtrClause(
8336       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8337 }
8338
8339 //===----------------------------------------------------------------------===//
8340 // Expression transformation
8341 //===----------------------------------------------------------------------===//
8342 template<typename Derived>
8343 ExprResult
8344 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
8345   if (!E->isTypeDependent())
8346     return E;
8347
8348   return getDerived().RebuildPredefinedExpr(E->getLocation(),
8349                                             E->getIdentType());
8350 }
8351
8352 template<typename Derived>
8353 ExprResult
8354 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
8355   NestedNameSpecifierLoc QualifierLoc;
8356   if (E->getQualifierLoc()) {
8357     QualifierLoc
8358       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8359     if (!QualifierLoc)
8360       return ExprError();
8361   }
8362
8363   ValueDecl *ND
8364     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
8365                                                          E->getDecl()));
8366   if (!ND)
8367     return ExprError();
8368
8369   DeclarationNameInfo NameInfo = E->getNameInfo();
8370   if (NameInfo.getName()) {
8371     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8372     if (!NameInfo.getName())
8373       return ExprError();
8374   }
8375
8376   if (!getDerived().AlwaysRebuild() &&
8377       QualifierLoc == E->getQualifierLoc() &&
8378       ND == E->getDecl() &&
8379       NameInfo.getName() == E->getDecl()->getDeclName() &&
8380       !E->hasExplicitTemplateArgs()) {
8381
8382     // Mark it referenced in the new context regardless.
8383     // FIXME: this is a bit instantiation-specific.
8384     SemaRef.MarkDeclRefReferenced(E);
8385
8386     return E;
8387   }
8388
8389   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
8390   if (E->hasExplicitTemplateArgs()) {
8391     TemplateArgs = &TransArgs;
8392     TransArgs.setLAngleLoc(E->getLAngleLoc());
8393     TransArgs.setRAngleLoc(E->getRAngleLoc());
8394     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8395                                                 E->getNumTemplateArgs(),
8396                                                 TransArgs))
8397       return ExprError();
8398   }
8399
8400   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
8401                                          TemplateArgs);
8402 }
8403
8404 template<typename Derived>
8405 ExprResult
8406 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
8407   return E;
8408 }
8409
8410 template<typename Derived>
8411 ExprResult
8412 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
8413   return E;
8414 }
8415
8416 template<typename Derived>
8417 ExprResult
8418 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
8419   return E;
8420 }
8421
8422 template<typename Derived>
8423 ExprResult
8424 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
8425   return E;
8426 }
8427
8428 template<typename Derived>
8429 ExprResult
8430 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
8431   return E;
8432 }
8433
8434 template<typename Derived>
8435 ExprResult
8436 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
8437   if (FunctionDecl *FD = E->getDirectCallee())
8438     SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
8439   return SemaRef.MaybeBindToTemporary(E);
8440 }
8441
8442 template<typename Derived>
8443 ExprResult
8444 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
8445   ExprResult ControllingExpr =
8446     getDerived().TransformExpr(E->getControllingExpr());
8447   if (ControllingExpr.isInvalid())
8448     return ExprError();
8449
8450   SmallVector<Expr *, 4> AssocExprs;
8451   SmallVector<TypeSourceInfo *, 4> AssocTypes;
8452   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
8453     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
8454     if (TS) {
8455       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
8456       if (!AssocType)
8457         return ExprError();
8458       AssocTypes.push_back(AssocType);
8459     } else {
8460       AssocTypes.push_back(nullptr);
8461     }
8462
8463     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
8464     if (AssocExpr.isInvalid())
8465       return ExprError();
8466     AssocExprs.push_back(AssocExpr.get());
8467   }
8468
8469   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
8470                                                   E->getDefaultLoc(),
8471                                                   E->getRParenLoc(),
8472                                                   ControllingExpr.get(),
8473                                                   AssocTypes,
8474                                                   AssocExprs);
8475 }
8476
8477 template<typename Derived>
8478 ExprResult
8479 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
8480   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8481   if (SubExpr.isInvalid())
8482     return ExprError();
8483
8484   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8485     return E;
8486
8487   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
8488                                        E->getRParen());
8489 }
8490
8491 /// \brief The operand of a unary address-of operator has special rules: it's
8492 /// allowed to refer to a non-static member of a class even if there's no 'this'
8493 /// object available.
8494 template<typename Derived>
8495 ExprResult
8496 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
8497   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
8498     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
8499   else
8500     return getDerived().TransformExpr(E);
8501 }
8502
8503 template<typename Derived>
8504 ExprResult
8505 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
8506   ExprResult SubExpr;
8507   if (E->getOpcode() == UO_AddrOf)
8508     SubExpr = TransformAddressOfOperand(E->getSubExpr());
8509   else
8510     SubExpr = TransformExpr(E->getSubExpr());
8511   if (SubExpr.isInvalid())
8512     return ExprError();
8513
8514   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8515     return E;
8516
8517   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
8518                                            E->getOpcode(),
8519                                            SubExpr.get());
8520 }
8521
8522 template<typename Derived>
8523 ExprResult
8524 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
8525   // Transform the type.
8526   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
8527   if (!Type)
8528     return ExprError();
8529
8530   // Transform all of the components into components similar to what the
8531   // parser uses.
8532   // FIXME: It would be slightly more efficient in the non-dependent case to
8533   // just map FieldDecls, rather than requiring the rebuilder to look for
8534   // the fields again. However, __builtin_offsetof is rare enough in
8535   // template code that we don't care.
8536   bool ExprChanged = false;
8537   typedef Sema::OffsetOfComponent Component;
8538   SmallVector<Component, 4> Components;
8539   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
8540     const OffsetOfNode &ON = E->getComponent(I);
8541     Component Comp;
8542     Comp.isBrackets = true;
8543     Comp.LocStart = ON.getSourceRange().getBegin();
8544     Comp.LocEnd = ON.getSourceRange().getEnd();
8545     switch (ON.getKind()) {
8546     case OffsetOfNode::Array: {
8547       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
8548       ExprResult Index = getDerived().TransformExpr(FromIndex);
8549       if (Index.isInvalid())
8550         return ExprError();
8551
8552       ExprChanged = ExprChanged || Index.get() != FromIndex;
8553       Comp.isBrackets = true;
8554       Comp.U.E = Index.get();
8555       break;
8556     }
8557
8558     case OffsetOfNode::Field:
8559     case OffsetOfNode::Identifier:
8560       Comp.isBrackets = false;
8561       Comp.U.IdentInfo = ON.getFieldName();
8562       if (!Comp.U.IdentInfo)
8563         continue;
8564
8565       break;
8566
8567     case OffsetOfNode::Base:
8568       // Will be recomputed during the rebuild.
8569       continue;
8570     }
8571
8572     Components.push_back(Comp);
8573   }
8574
8575   // If nothing changed, retain the existing expression.
8576   if (!getDerived().AlwaysRebuild() &&
8577       Type == E->getTypeSourceInfo() &&
8578       !ExprChanged)
8579     return E;
8580
8581   // Build a new offsetof expression.
8582   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
8583                                           Components, E->getRParenLoc());
8584 }
8585
8586 template<typename Derived>
8587 ExprResult
8588 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
8589   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
8590          "opaque value expression requires transformation");
8591   return E;
8592 }
8593
8594 template<typename Derived>
8595 ExprResult
8596 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
8597   return E;
8598 }
8599
8600 template<typename Derived>
8601 ExprResult
8602 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
8603   // Rebuild the syntactic form.  The original syntactic form has
8604   // opaque-value expressions in it, so strip those away and rebuild
8605   // the result.  This is a really awful way of doing this, but the
8606   // better solution (rebuilding the semantic expressions and
8607   // rebinding OVEs as necessary) doesn't work; we'd need
8608   // TreeTransform to not strip away implicit conversions.
8609   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
8610   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
8611   if (result.isInvalid()) return ExprError();
8612
8613   // If that gives us a pseudo-object result back, the pseudo-object
8614   // expression must have been an lvalue-to-rvalue conversion which we
8615   // should reapply.
8616   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
8617     result = SemaRef.checkPseudoObjectRValue(result.get());
8618
8619   return result;
8620 }
8621
8622 template<typename Derived>
8623 ExprResult
8624 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
8625                                                 UnaryExprOrTypeTraitExpr *E) {
8626   if (E->isArgumentType()) {
8627     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
8628
8629     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
8630     if (!NewT)
8631       return ExprError();
8632
8633     if (!getDerived().AlwaysRebuild() && OldT == NewT)
8634       return E;
8635
8636     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
8637                                                     E->getKind(),
8638                                                     E->getSourceRange());
8639   }
8640
8641   // C++0x [expr.sizeof]p1:
8642   //   The operand is either an expression, which is an unevaluated operand
8643   //   [...]
8644   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
8645                                                Sema::ReuseLambdaContextDecl);
8646
8647   // Try to recover if we have something like sizeof(T::X) where X is a type.
8648   // Notably, there must be *exactly* one set of parens if X is a type.
8649   TypeSourceInfo *RecoveryTSI = nullptr;
8650   ExprResult SubExpr;
8651   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
8652   if (auto *DRE =
8653           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
8654     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
8655         PE, DRE, false, &RecoveryTSI);
8656   else
8657     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
8658
8659   if (RecoveryTSI) {
8660     return getDerived().RebuildUnaryExprOrTypeTrait(
8661         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
8662   } else if (SubExpr.isInvalid())
8663     return ExprError();
8664
8665   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
8666     return E;
8667
8668   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
8669                                                   E->getOperatorLoc(),
8670                                                   E->getKind(),
8671                                                   E->getSourceRange());
8672 }
8673
8674 template<typename Derived>
8675 ExprResult
8676 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
8677   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8678   if (LHS.isInvalid())
8679     return ExprError();
8680
8681   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8682   if (RHS.isInvalid())
8683     return ExprError();
8684
8685
8686   if (!getDerived().AlwaysRebuild() &&
8687       LHS.get() == E->getLHS() &&
8688       RHS.get() == E->getRHS())
8689     return E;
8690
8691   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
8692                                            /*FIXME:*/E->getLHS()->getLocStart(),
8693                                                 RHS.get(),
8694                                                 E->getRBracketLoc());
8695 }
8696
8697 template <typename Derived>
8698 ExprResult
8699 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
8700   ExprResult Base = getDerived().TransformExpr(E->getBase());
8701   if (Base.isInvalid())
8702     return ExprError();
8703
8704   ExprResult LowerBound;
8705   if (E->getLowerBound()) {
8706     LowerBound = getDerived().TransformExpr(E->getLowerBound());
8707     if (LowerBound.isInvalid())
8708       return ExprError();
8709   }
8710
8711   ExprResult Length;
8712   if (E->getLength()) {
8713     Length = getDerived().TransformExpr(E->getLength());
8714     if (Length.isInvalid())
8715       return ExprError();
8716   }
8717
8718   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
8719       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
8720     return E;
8721
8722   return getDerived().RebuildOMPArraySectionExpr(
8723       Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(),
8724       Length.get(), E->getRBracketLoc());
8725 }
8726
8727 template<typename Derived>
8728 ExprResult
8729 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
8730   // Transform the callee.
8731   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8732   if (Callee.isInvalid())
8733     return ExprError();
8734
8735   // Transform arguments.
8736   bool ArgChanged = false;
8737   SmallVector<Expr*, 8> Args;
8738   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
8739                                   &ArgChanged))
8740     return ExprError();
8741
8742   if (!getDerived().AlwaysRebuild() &&
8743       Callee.get() == E->getCallee() &&
8744       !ArgChanged)
8745     return SemaRef.MaybeBindToTemporary(E);
8746
8747   // FIXME: Wrong source location information for the '('.
8748   SourceLocation FakeLParenLoc
8749     = ((Expr *)Callee.get())->getSourceRange().getBegin();
8750   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
8751                                       Args,
8752                                       E->getRParenLoc());
8753 }
8754
8755 template<typename Derived>
8756 ExprResult
8757 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
8758   ExprResult Base = getDerived().TransformExpr(E->getBase());
8759   if (Base.isInvalid())
8760     return ExprError();
8761
8762   NestedNameSpecifierLoc QualifierLoc;
8763   if (E->hasQualifier()) {
8764     QualifierLoc
8765       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8766
8767     if (!QualifierLoc)
8768       return ExprError();
8769   }
8770   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
8771
8772   ValueDecl *Member
8773     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
8774                                                          E->getMemberDecl()));
8775   if (!Member)
8776     return ExprError();
8777
8778   NamedDecl *FoundDecl = E->getFoundDecl();
8779   if (FoundDecl == E->getMemberDecl()) {
8780     FoundDecl = Member;
8781   } else {
8782     FoundDecl = cast_or_null<NamedDecl>(
8783                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
8784     if (!FoundDecl)
8785       return ExprError();
8786   }
8787
8788   if (!getDerived().AlwaysRebuild() &&
8789       Base.get() == E->getBase() &&
8790       QualifierLoc == E->getQualifierLoc() &&
8791       Member == E->getMemberDecl() &&
8792       FoundDecl == E->getFoundDecl() &&
8793       !E->hasExplicitTemplateArgs()) {
8794
8795     // Mark it referenced in the new context regardless.
8796     // FIXME: this is a bit instantiation-specific.
8797     SemaRef.MarkMemberReferenced(E);
8798
8799     return E;
8800   }
8801
8802   TemplateArgumentListInfo TransArgs;
8803   if (E->hasExplicitTemplateArgs()) {
8804     TransArgs.setLAngleLoc(E->getLAngleLoc());
8805     TransArgs.setRAngleLoc(E->getRAngleLoc());
8806     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8807                                                 E->getNumTemplateArgs(),
8808                                                 TransArgs))
8809       return ExprError();
8810   }
8811
8812   // FIXME: Bogus source location for the operator
8813   SourceLocation FakeOperatorLoc =
8814       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
8815
8816   // FIXME: to do this check properly, we will need to preserve the
8817   // first-qualifier-in-scope here, just in case we had a dependent
8818   // base (and therefore couldn't do the check) and a
8819   // nested-name-qualifier (and therefore could do the lookup).
8820   NamedDecl *FirstQualifierInScope = nullptr;
8821
8822   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
8823                                         E->isArrow(),
8824                                         QualifierLoc,
8825                                         TemplateKWLoc,
8826                                         E->getMemberNameInfo(),
8827                                         Member,
8828                                         FoundDecl,
8829                                         (E->hasExplicitTemplateArgs()
8830                                            ? &TransArgs : nullptr),
8831                                         FirstQualifierInScope);
8832 }
8833
8834 template<typename Derived>
8835 ExprResult
8836 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
8837   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8838   if (LHS.isInvalid())
8839     return ExprError();
8840
8841   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8842   if (RHS.isInvalid())
8843     return ExprError();
8844
8845   if (!getDerived().AlwaysRebuild() &&
8846       LHS.get() == E->getLHS() &&
8847       RHS.get() == E->getRHS())
8848     return E;
8849
8850   Sema::FPContractStateRAII FPContractState(getSema());
8851   getSema().FPFeatures.fp_contract = E->isFPContractable();
8852
8853   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
8854                                             LHS.get(), RHS.get());
8855 }
8856
8857 template<typename Derived>
8858 ExprResult
8859 TreeTransform<Derived>::TransformCompoundAssignOperator(
8860                                                       CompoundAssignOperator *E) {
8861   return getDerived().TransformBinaryOperator(E);
8862 }
8863
8864 template<typename Derived>
8865 ExprResult TreeTransform<Derived>::
8866 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
8867   // Just rebuild the common and RHS expressions and see whether we
8868   // get any changes.
8869
8870   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
8871   if (commonExpr.isInvalid())
8872     return ExprError();
8873
8874   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
8875   if (rhs.isInvalid())
8876     return ExprError();
8877
8878   if (!getDerived().AlwaysRebuild() &&
8879       commonExpr.get() == e->getCommon() &&
8880       rhs.get() == e->getFalseExpr())
8881     return e;
8882
8883   return getDerived().RebuildConditionalOperator(commonExpr.get(),
8884                                                  e->getQuestionLoc(),
8885                                                  nullptr,
8886                                                  e->getColonLoc(),
8887                                                  rhs.get());
8888 }
8889
8890 template<typename Derived>
8891 ExprResult
8892 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
8893   ExprResult Cond = getDerived().TransformExpr(E->getCond());
8894   if (Cond.isInvalid())
8895     return ExprError();
8896
8897   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8898   if (LHS.isInvalid())
8899     return ExprError();
8900
8901   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8902   if (RHS.isInvalid())
8903     return ExprError();
8904
8905   if (!getDerived().AlwaysRebuild() &&
8906       Cond.get() == E->getCond() &&
8907       LHS.get() == E->getLHS() &&
8908       RHS.get() == E->getRHS())
8909     return E;
8910
8911   return getDerived().RebuildConditionalOperator(Cond.get(),
8912                                                  E->getQuestionLoc(),
8913                                                  LHS.get(),
8914                                                  E->getColonLoc(),
8915                                                  RHS.get());
8916 }
8917
8918 template<typename Derived>
8919 ExprResult
8920 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
8921   // Implicit casts are eliminated during transformation, since they
8922   // will be recomputed by semantic analysis after transformation.
8923   return getDerived().TransformExpr(E->getSubExprAsWritten());
8924 }
8925
8926 template<typename Derived>
8927 ExprResult
8928 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
8929   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8930   if (!Type)
8931     return ExprError();
8932
8933   ExprResult SubExpr
8934     = getDerived().TransformExpr(E->getSubExprAsWritten());
8935   if (SubExpr.isInvalid())
8936     return ExprError();
8937
8938   if (!getDerived().AlwaysRebuild() &&
8939       Type == E->getTypeInfoAsWritten() &&
8940       SubExpr.get() == E->getSubExpr())
8941     return E;
8942
8943   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
8944                                             Type,
8945                                             E->getRParenLoc(),
8946                                             SubExpr.get());
8947 }
8948
8949 template<typename Derived>
8950 ExprResult
8951 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
8952   TypeSourceInfo *OldT = E->getTypeSourceInfo();
8953   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
8954   if (!NewT)
8955     return ExprError();
8956
8957   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
8958   if (Init.isInvalid())
8959     return ExprError();
8960
8961   if (!getDerived().AlwaysRebuild() &&
8962       OldT == NewT &&
8963       Init.get() == E->getInitializer())
8964     return SemaRef.MaybeBindToTemporary(E);
8965
8966   // Note: the expression type doesn't necessarily match the
8967   // type-as-written, but that's okay, because it should always be
8968   // derivable from the initializer.
8969
8970   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
8971                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
8972                                                  Init.get());
8973 }
8974
8975 template<typename Derived>
8976 ExprResult
8977 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
8978   ExprResult Base = getDerived().TransformExpr(E->getBase());
8979   if (Base.isInvalid())
8980     return ExprError();
8981
8982   if (!getDerived().AlwaysRebuild() &&
8983       Base.get() == E->getBase())
8984     return E;
8985
8986   // FIXME: Bad source location
8987   SourceLocation FakeOperatorLoc =
8988       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
8989   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
8990                                                   E->getAccessorLoc(),
8991                                                   E->getAccessor());
8992 }
8993
8994 template<typename Derived>
8995 ExprResult
8996 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
8997   if (InitListExpr *Syntactic = E->getSyntacticForm())
8998     E = Syntactic;
8999
9000   bool InitChanged = false;
9001
9002   SmallVector<Expr*, 4> Inits;
9003   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
9004                                   Inits, &InitChanged))
9005     return ExprError();
9006
9007   if (!getDerived().AlwaysRebuild() && !InitChanged) {
9008     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
9009     // in some cases. We can't reuse it in general, because the syntactic and
9010     // semantic forms are linked, and we can't know that semantic form will
9011     // match even if the syntactic form does.
9012   }
9013
9014   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
9015                                       E->getRBraceLoc(), E->getType());
9016 }
9017
9018 template<typename Derived>
9019 ExprResult
9020 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
9021   Designation Desig;
9022
9023   // transform the initializer value
9024   ExprResult Init = getDerived().TransformExpr(E->getInit());
9025   if (Init.isInvalid())
9026     return ExprError();
9027
9028   // transform the designators.
9029   SmallVector<Expr*, 4> ArrayExprs;
9030   bool ExprChanged = false;
9031   for (const DesignatedInitExpr::Designator &D : E->designators()) {
9032     if (D.isFieldDesignator()) {
9033       Desig.AddDesignator(Designator::getField(D.getFieldName(),
9034                                                D.getDotLoc(),
9035                                                D.getFieldLoc()));
9036       if (D.getField()) {
9037         FieldDecl *Field = cast_or_null<FieldDecl>(
9038             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
9039         if (Field != D.getField())
9040           // Rebuild the expression when the transformed FieldDecl is
9041           // different to the already assigned FieldDecl.
9042           ExprChanged = true;
9043       } else {
9044         // Ensure that the designator expression is rebuilt when there isn't
9045         // a resolved FieldDecl in the designator as we don't want to assign
9046         // a FieldDecl to a pattern designator that will be instantiated again.
9047         ExprChanged = true;
9048       }
9049       continue;
9050     }
9051
9052     if (D.isArrayDesignator()) {
9053       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
9054       if (Index.isInvalid())
9055         return ExprError();
9056
9057       Desig.AddDesignator(
9058           Designator::getArray(Index.get(), D.getLBracketLoc()));
9059
9060       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
9061       ArrayExprs.push_back(Index.get());
9062       continue;
9063     }
9064
9065     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9066     ExprResult Start
9067       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9068     if (Start.isInvalid())
9069       return ExprError();
9070
9071     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9072     if (End.isInvalid())
9073       return ExprError();
9074
9075     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9076                                                   End.get(),
9077                                                   D.getLBracketLoc(),
9078                                                   D.getEllipsisLoc()));
9079
9080     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9081                   End.get() != E->getArrayRangeEnd(D);
9082
9083     ArrayExprs.push_back(Start.get());
9084     ArrayExprs.push_back(End.get());
9085   }
9086
9087   if (!getDerived().AlwaysRebuild() &&
9088       Init.get() == E->getInit() &&
9089       !ExprChanged)
9090     return E;
9091
9092   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9093                                                 E->getEqualOrColonLoc(),
9094                                                 E->usesGNUSyntax(), Init.get());
9095 }
9096
9097 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9098 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9099 template<typename Derived>
9100 ExprResult
9101 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9102     DesignatedInitUpdateExpr *E) {
9103   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9104                    "initializer");
9105   return ExprError();
9106 }
9107
9108 template<typename Derived>
9109 ExprResult
9110 TreeTransform<Derived>::TransformNoInitExpr(
9111     NoInitExpr *E) {
9112   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9113   return ExprError();
9114 }
9115
9116 template<typename Derived>
9117 ExprResult
9118 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9119   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9120   return ExprError();
9121 }
9122
9123 template<typename Derived>
9124 ExprResult
9125 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9126   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9127   return ExprError();
9128 }
9129
9130 template<typename Derived>
9131 ExprResult
9132 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9133                                                      ImplicitValueInitExpr *E) {
9134   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
9135
9136   // FIXME: Will we ever have proper type location here? Will we actually
9137   // need to transform the type?
9138   QualType T = getDerived().TransformType(E->getType());
9139   if (T.isNull())
9140     return ExprError();
9141
9142   if (!getDerived().AlwaysRebuild() &&
9143       T == E->getType())
9144     return E;
9145
9146   return getDerived().RebuildImplicitValueInitExpr(T);
9147 }
9148
9149 template<typename Derived>
9150 ExprResult
9151 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
9152   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
9153   if (!TInfo)
9154     return ExprError();
9155
9156   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9157   if (SubExpr.isInvalid())
9158     return ExprError();
9159
9160   if (!getDerived().AlwaysRebuild() &&
9161       TInfo == E->getWrittenTypeInfo() &&
9162       SubExpr.get() == E->getSubExpr())
9163     return E;
9164
9165   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
9166                                        TInfo, E->getRParenLoc());
9167 }
9168
9169 template<typename Derived>
9170 ExprResult
9171 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
9172   bool ArgumentChanged = false;
9173   SmallVector<Expr*, 4> Inits;
9174   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
9175                      &ArgumentChanged))
9176     return ExprError();
9177
9178   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
9179                                            Inits,
9180                                            E->getRParenLoc());
9181 }
9182
9183 /// \brief Transform an address-of-label expression.
9184 ///
9185 /// By default, the transformation of an address-of-label expression always
9186 /// rebuilds the expression, so that the label identifier can be resolved to
9187 /// the corresponding label statement by semantic analysis.
9188 template<typename Derived>
9189 ExprResult
9190 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
9191   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
9192                                         E->getLabel());
9193   if (!LD)
9194     return ExprError();
9195
9196   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9197                                            cast<LabelDecl>(LD));
9198 }
9199
9200 template<typename Derived>
9201 ExprResult
9202 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9203   SemaRef.ActOnStartStmtExpr();
9204   StmtResult SubStmt
9205     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9206   if (SubStmt.isInvalid()) {
9207     SemaRef.ActOnStmtExprError();
9208     return ExprError();
9209   }
9210
9211   if (!getDerived().AlwaysRebuild() &&
9212       SubStmt.get() == E->getSubStmt()) {
9213     // Calling this an 'error' is unintuitive, but it does the right thing.
9214     SemaRef.ActOnStmtExprError();
9215     return SemaRef.MaybeBindToTemporary(E);
9216   }
9217
9218   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9219                                       SubStmt.get(),
9220                                       E->getRParenLoc());
9221 }
9222
9223 template<typename Derived>
9224 ExprResult
9225 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9226   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9227   if (Cond.isInvalid())
9228     return ExprError();
9229
9230   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9231   if (LHS.isInvalid())
9232     return ExprError();
9233
9234   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9235   if (RHS.isInvalid())
9236     return ExprError();
9237
9238   if (!getDerived().AlwaysRebuild() &&
9239       Cond.get() == E->getCond() &&
9240       LHS.get() == E->getLHS() &&
9241       RHS.get() == E->getRHS())
9242     return E;
9243
9244   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9245                                         Cond.get(), LHS.get(), RHS.get(),
9246                                         E->getRParenLoc());
9247 }
9248
9249 template<typename Derived>
9250 ExprResult
9251 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9252   return E;
9253 }
9254
9255 template<typename Derived>
9256 ExprResult
9257 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9258   switch (E->getOperator()) {
9259   case OO_New:
9260   case OO_Delete:
9261   case OO_Array_New:
9262   case OO_Array_Delete:
9263     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9264
9265   case OO_Call: {
9266     // This is a call to an object's operator().
9267     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9268
9269     // Transform the object itself.
9270     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9271     if (Object.isInvalid())
9272       return ExprError();
9273
9274     // FIXME: Poor location information
9275     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
9276         static_cast<Expr *>(Object.get())->getLocEnd());
9277
9278     // Transform the call arguments.
9279     SmallVector<Expr*, 8> Args;
9280     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
9281                                     Args))
9282       return ExprError();
9283
9284     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
9285                                         Args,
9286                                         E->getLocEnd());
9287   }
9288
9289 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
9290   case OO_##Name:
9291 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
9292 #include "clang/Basic/OperatorKinds.def"
9293   case OO_Subscript:
9294     // Handled below.
9295     break;
9296
9297   case OO_Conditional:
9298     llvm_unreachable("conditional operator is not actually overloadable");
9299
9300   case OO_None:
9301   case NUM_OVERLOADED_OPERATORS:
9302     llvm_unreachable("not an overloaded operator?");
9303   }
9304
9305   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9306   if (Callee.isInvalid())
9307     return ExprError();
9308
9309   ExprResult First;
9310   if (E->getOperator() == OO_Amp)
9311     First = getDerived().TransformAddressOfOperand(E->getArg(0));
9312   else
9313     First = getDerived().TransformExpr(E->getArg(0));
9314   if (First.isInvalid())
9315     return ExprError();
9316
9317   ExprResult Second;
9318   if (E->getNumArgs() == 2) {
9319     Second = getDerived().TransformExpr(E->getArg(1));
9320     if (Second.isInvalid())
9321       return ExprError();
9322   }
9323
9324   if (!getDerived().AlwaysRebuild() &&
9325       Callee.get() == E->getCallee() &&
9326       First.get() == E->getArg(0) &&
9327       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
9328     return SemaRef.MaybeBindToTemporary(E);
9329
9330   Sema::FPContractStateRAII FPContractState(getSema());
9331   getSema().FPFeatures.fp_contract = E->isFPContractable();
9332
9333   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
9334                                                  E->getOperatorLoc(),
9335                                                  Callee.get(),
9336                                                  First.get(),
9337                                                  Second.get());
9338 }
9339
9340 template<typename Derived>
9341 ExprResult
9342 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
9343   return getDerived().TransformCallExpr(E);
9344 }
9345
9346 template<typename Derived>
9347 ExprResult
9348 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
9349   // Transform the callee.
9350   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9351   if (Callee.isInvalid())
9352     return ExprError();
9353
9354   // Transform exec config.
9355   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
9356   if (EC.isInvalid())
9357     return ExprError();
9358
9359   // Transform arguments.
9360   bool ArgChanged = false;
9361   SmallVector<Expr*, 8> Args;
9362   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9363                                   &ArgChanged))
9364     return ExprError();
9365
9366   if (!getDerived().AlwaysRebuild() &&
9367       Callee.get() == E->getCallee() &&
9368       !ArgChanged)
9369     return SemaRef.MaybeBindToTemporary(E);
9370
9371   // FIXME: Wrong source location information for the '('.
9372   SourceLocation FakeLParenLoc
9373     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9374   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9375                                       Args,
9376                                       E->getRParenLoc(), EC.get());
9377 }
9378
9379 template<typename Derived>
9380 ExprResult
9381 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
9382   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9383   if (!Type)
9384     return ExprError();
9385
9386   ExprResult SubExpr
9387     = getDerived().TransformExpr(E->getSubExprAsWritten());
9388   if (SubExpr.isInvalid())
9389     return ExprError();
9390
9391   if (!getDerived().AlwaysRebuild() &&
9392       Type == E->getTypeInfoAsWritten() &&
9393       SubExpr.get() == E->getSubExpr())
9394     return E;
9395   return getDerived().RebuildCXXNamedCastExpr(
9396       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
9397       Type, E->getAngleBrackets().getEnd(),
9398       // FIXME. this should be '(' location
9399       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
9400 }
9401
9402 template<typename Derived>
9403 ExprResult
9404 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
9405   return getDerived().TransformCXXNamedCastExpr(E);
9406 }
9407
9408 template<typename Derived>
9409 ExprResult
9410 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
9411   return getDerived().TransformCXXNamedCastExpr(E);
9412 }
9413
9414 template<typename Derived>
9415 ExprResult
9416 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
9417                                                       CXXReinterpretCastExpr *E) {
9418   return getDerived().TransformCXXNamedCastExpr(E);
9419 }
9420
9421 template<typename Derived>
9422 ExprResult
9423 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
9424   return getDerived().TransformCXXNamedCastExpr(E);
9425 }
9426
9427 template<typename Derived>
9428 ExprResult
9429 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
9430                                                      CXXFunctionalCastExpr *E) {
9431   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9432   if (!Type)
9433     return ExprError();
9434
9435   ExprResult SubExpr
9436     = getDerived().TransformExpr(E->getSubExprAsWritten());
9437   if (SubExpr.isInvalid())
9438     return ExprError();
9439
9440   if (!getDerived().AlwaysRebuild() &&
9441       Type == E->getTypeInfoAsWritten() &&
9442       SubExpr.get() == E->getSubExpr())
9443     return E;
9444
9445   return getDerived().RebuildCXXFunctionalCastExpr(Type,
9446                                                    E->getLParenLoc(),
9447                                                    SubExpr.get(),
9448                                                    E->getRParenLoc());
9449 }
9450
9451 template<typename Derived>
9452 ExprResult
9453 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
9454   if (E->isTypeOperand()) {
9455     TypeSourceInfo *TInfo
9456       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9457     if (!TInfo)
9458       return ExprError();
9459
9460     if (!getDerived().AlwaysRebuild() &&
9461         TInfo == E->getTypeOperandSourceInfo())
9462       return E;
9463
9464     return getDerived().RebuildCXXTypeidExpr(E->getType(),
9465                                              E->getLocStart(),
9466                                              TInfo,
9467                                              E->getLocEnd());
9468   }
9469
9470   // We don't know whether the subexpression is potentially evaluated until
9471   // after we perform semantic analysis.  We speculatively assume it is
9472   // unevaluated; it will get fixed later if the subexpression is in fact
9473   // potentially evaluated.
9474   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
9475                                                Sema::ReuseLambdaContextDecl);
9476
9477   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9478   if (SubExpr.isInvalid())
9479     return ExprError();
9480
9481   if (!getDerived().AlwaysRebuild() &&
9482       SubExpr.get() == E->getExprOperand())
9483     return E;
9484
9485   return getDerived().RebuildCXXTypeidExpr(E->getType(),
9486                                            E->getLocStart(),
9487                                            SubExpr.get(),
9488                                            E->getLocEnd());
9489 }
9490
9491 template<typename Derived>
9492 ExprResult
9493 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
9494   if (E->isTypeOperand()) {
9495     TypeSourceInfo *TInfo
9496       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9497     if (!TInfo)
9498       return ExprError();
9499
9500     if (!getDerived().AlwaysRebuild() &&
9501         TInfo == E->getTypeOperandSourceInfo())
9502       return E;
9503
9504     return getDerived().RebuildCXXUuidofExpr(E->getType(),
9505                                              E->getLocStart(),
9506                                              TInfo,
9507                                              E->getLocEnd());
9508   }
9509
9510   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9511
9512   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9513   if (SubExpr.isInvalid())
9514     return ExprError();
9515
9516   if (!getDerived().AlwaysRebuild() &&
9517       SubExpr.get() == E->getExprOperand())
9518     return E;
9519
9520   return getDerived().RebuildCXXUuidofExpr(E->getType(),
9521                                            E->getLocStart(),
9522                                            SubExpr.get(),
9523                                            E->getLocEnd());
9524 }
9525
9526 template<typename Derived>
9527 ExprResult
9528 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
9529   return E;
9530 }
9531
9532 template<typename Derived>
9533 ExprResult
9534 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
9535                                                      CXXNullPtrLiteralExpr *E) {
9536   return E;
9537 }
9538
9539 template<typename Derived>
9540 ExprResult
9541 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
9542   QualType T = getSema().getCurrentThisType();
9543
9544   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
9545     // Make sure that we capture 'this'.
9546     getSema().CheckCXXThisCapture(E->getLocStart());
9547     return E;
9548   }
9549
9550   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
9551 }
9552
9553 template<typename Derived>
9554 ExprResult
9555 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
9556   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9557   if (SubExpr.isInvalid())
9558     return ExprError();
9559
9560   if (!getDerived().AlwaysRebuild() &&
9561       SubExpr.get() == E->getSubExpr())
9562     return E;
9563
9564   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
9565                                           E->isThrownVariableInScope());
9566 }
9567
9568 template<typename Derived>
9569 ExprResult
9570 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
9571   ParmVarDecl *Param
9572     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
9573                                                            E->getParam()));
9574   if (!Param)
9575     return ExprError();
9576
9577   if (!getDerived().AlwaysRebuild() &&
9578       Param == E->getParam())
9579     return E;
9580
9581   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
9582 }
9583
9584 template<typename Derived>
9585 ExprResult
9586 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
9587   FieldDecl *Field
9588     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
9589                                                          E->getField()));
9590   if (!Field)
9591     return ExprError();
9592
9593   if (!getDerived().AlwaysRebuild() && Field == E->getField())
9594     return E;
9595
9596   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
9597 }
9598
9599 template<typename Derived>
9600 ExprResult
9601 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
9602                                                     CXXScalarValueInitExpr *E) {
9603   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9604   if (!T)
9605     return ExprError();
9606
9607   if (!getDerived().AlwaysRebuild() &&
9608       T == E->getTypeSourceInfo())
9609     return E;
9610
9611   return getDerived().RebuildCXXScalarValueInitExpr(T,
9612                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
9613                                                     E->getRParenLoc());
9614 }
9615
9616 template<typename Derived>
9617 ExprResult
9618 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
9619   // Transform the type that we're allocating
9620   TypeSourceInfo *AllocTypeInfo
9621     = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
9622   if (!AllocTypeInfo)
9623     return ExprError();
9624
9625   // Transform the size of the array we're allocating (if any).
9626   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
9627   if (ArraySize.isInvalid())
9628     return ExprError();
9629
9630   // Transform the placement arguments (if any).
9631   bool ArgumentChanged = false;
9632   SmallVector<Expr*, 8> PlacementArgs;
9633   if (getDerived().TransformExprs(E->getPlacementArgs(),
9634                                   E->getNumPlacementArgs(), true,
9635                                   PlacementArgs, &ArgumentChanged))
9636     return ExprError();
9637
9638   // Transform the initializer (if any).
9639   Expr *OldInit = E->getInitializer();
9640   ExprResult NewInit;
9641   if (OldInit)
9642     NewInit = getDerived().TransformInitializer(OldInit, true);
9643   if (NewInit.isInvalid())
9644     return ExprError();
9645
9646   // Transform new operator and delete operator.
9647   FunctionDecl *OperatorNew = nullptr;
9648   if (E->getOperatorNew()) {
9649     OperatorNew = cast_or_null<FunctionDecl>(
9650                                  getDerived().TransformDecl(E->getLocStart(),
9651                                                          E->getOperatorNew()));
9652     if (!OperatorNew)
9653       return ExprError();
9654   }
9655
9656   FunctionDecl *OperatorDelete = nullptr;
9657   if (E->getOperatorDelete()) {
9658     OperatorDelete = cast_or_null<FunctionDecl>(
9659                                    getDerived().TransformDecl(E->getLocStart(),
9660                                                        E->getOperatorDelete()));
9661     if (!OperatorDelete)
9662       return ExprError();
9663   }
9664
9665   if (!getDerived().AlwaysRebuild() &&
9666       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
9667       ArraySize.get() == E->getArraySize() &&
9668       NewInit.get() == OldInit &&
9669       OperatorNew == E->getOperatorNew() &&
9670       OperatorDelete == E->getOperatorDelete() &&
9671       !ArgumentChanged) {
9672     // Mark any declarations we need as referenced.
9673     // FIXME: instantiation-specific.
9674     if (OperatorNew)
9675       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
9676     if (OperatorDelete)
9677       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
9678
9679     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
9680       QualType ElementType
9681         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
9682       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
9683         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
9684         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
9685           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
9686         }
9687       }
9688     }
9689
9690     return E;
9691   }
9692
9693   QualType AllocType = AllocTypeInfo->getType();
9694   if (!ArraySize.get()) {
9695     // If no array size was specified, but the new expression was
9696     // instantiated with an array type (e.g., "new T" where T is
9697     // instantiated with "int[4]"), extract the outer bound from the
9698     // array type as our array size. We do this with constant and
9699     // dependently-sized array types.
9700     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
9701     if (!ArrayT) {
9702       // Do nothing
9703     } else if (const ConstantArrayType *ConsArrayT
9704                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
9705       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
9706                                          SemaRef.Context.getSizeType(),
9707                                          /*FIXME:*/ E->getLocStart());
9708       AllocType = ConsArrayT->getElementType();
9709     } else if (const DependentSizedArrayType *DepArrayT
9710                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
9711       if (DepArrayT->getSizeExpr()) {
9712         ArraySize = DepArrayT->getSizeExpr();
9713         AllocType = DepArrayT->getElementType();
9714       }
9715     }
9716   }
9717
9718   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
9719                                         E->isGlobalNew(),
9720                                         /*FIXME:*/E->getLocStart(),
9721                                         PlacementArgs,
9722                                         /*FIXME:*/E->getLocStart(),
9723                                         E->getTypeIdParens(),
9724                                         AllocType,
9725                                         AllocTypeInfo,
9726                                         ArraySize.get(),
9727                                         E->getDirectInitRange(),
9728                                         NewInit.get());
9729 }
9730
9731 template<typename Derived>
9732 ExprResult
9733 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
9734   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
9735   if (Operand.isInvalid())
9736     return ExprError();
9737
9738   // Transform the delete operator, if known.
9739   FunctionDecl *OperatorDelete = nullptr;
9740   if (E->getOperatorDelete()) {
9741     OperatorDelete = cast_or_null<FunctionDecl>(
9742                                    getDerived().TransformDecl(E->getLocStart(),
9743                                                        E->getOperatorDelete()));
9744     if (!OperatorDelete)
9745       return ExprError();
9746   }
9747
9748   if (!getDerived().AlwaysRebuild() &&
9749       Operand.get() == E->getArgument() &&
9750       OperatorDelete == E->getOperatorDelete()) {
9751     // Mark any declarations we need as referenced.
9752     // FIXME: instantiation-specific.
9753     if (OperatorDelete)
9754       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
9755
9756     if (!E->getArgument()->isTypeDependent()) {
9757       QualType Destroyed = SemaRef.Context.getBaseElementType(
9758                                                          E->getDestroyedType());
9759       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
9760         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
9761         SemaRef.MarkFunctionReferenced(E->getLocStart(),
9762                                        SemaRef.LookupDestructor(Record));
9763       }
9764     }
9765
9766     return E;
9767   }
9768
9769   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
9770                                            E->isGlobalDelete(),
9771                                            E->isArrayForm(),
9772                                            Operand.get());
9773 }
9774
9775 template<typename Derived>
9776 ExprResult
9777 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
9778                                                      CXXPseudoDestructorExpr *E) {
9779   ExprResult Base = getDerived().TransformExpr(E->getBase());
9780   if (Base.isInvalid())
9781     return ExprError();
9782
9783   ParsedType ObjectTypePtr;
9784   bool MayBePseudoDestructor = false;
9785   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
9786                                               E->getOperatorLoc(),
9787                                         E->isArrow()? tok::arrow : tok::period,
9788                                               ObjectTypePtr,
9789                                               MayBePseudoDestructor);
9790   if (Base.isInvalid())
9791     return ExprError();
9792
9793   QualType ObjectType = ObjectTypePtr.get();
9794   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
9795   if (QualifierLoc) {
9796     QualifierLoc
9797       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
9798     if (!QualifierLoc)
9799       return ExprError();
9800   }
9801   CXXScopeSpec SS;
9802   SS.Adopt(QualifierLoc);
9803
9804   PseudoDestructorTypeStorage Destroyed;
9805   if (E->getDestroyedTypeInfo()) {
9806     TypeSourceInfo *DestroyedTypeInfo
9807       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
9808                                                 ObjectType, nullptr, SS);
9809     if (!DestroyedTypeInfo)
9810       return ExprError();
9811     Destroyed = DestroyedTypeInfo;
9812   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
9813     // We aren't likely to be able to resolve the identifier down to a type
9814     // now anyway, so just retain the identifier.
9815     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
9816                                             E->getDestroyedTypeLoc());
9817   } else {
9818     // Look for a destructor known with the given name.
9819     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
9820                                               *E->getDestroyedTypeIdentifier(),
9821                                                 E->getDestroyedTypeLoc(),
9822                                                 /*Scope=*/nullptr,
9823                                                 SS, ObjectTypePtr,
9824                                                 false);
9825     if (!T)
9826       return ExprError();
9827
9828     Destroyed
9829       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
9830                                                  E->getDestroyedTypeLoc());
9831   }
9832
9833   TypeSourceInfo *ScopeTypeInfo = nullptr;
9834   if (E->getScopeTypeInfo()) {
9835     CXXScopeSpec EmptySS;
9836     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
9837                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
9838     if (!ScopeTypeInfo)
9839       return ExprError();
9840   }
9841
9842   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
9843                                                      E->getOperatorLoc(),
9844                                                      E->isArrow(),
9845                                                      SS,
9846                                                      ScopeTypeInfo,
9847                                                      E->getColonColonLoc(),
9848                                                      E->getTildeLoc(),
9849                                                      Destroyed);
9850 }
9851
9852 template <typename Derived>
9853 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
9854                                                         bool RequiresADL,
9855                                                         LookupResult &R) {
9856   // Transform all the decls.
9857   bool AllEmptyPacks = true;
9858   for (auto *OldD : Old->decls()) {
9859     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
9860     if (!InstD) {
9861       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
9862       // This can happen because of dependent hiding.
9863       if (isa<UsingShadowDecl>(OldD))
9864         continue;
9865       else {
9866         R.clear();
9867         return true;
9868       }
9869     }
9870
9871     // Expand using pack declarations.
9872     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
9873     ArrayRef<NamedDecl*> Decls = SingleDecl;
9874     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
9875       Decls = UPD->expansions();
9876
9877     // Expand using declarations.
9878     for (auto *D : Decls) {
9879       if (auto *UD = dyn_cast<UsingDecl>(D)) {
9880         for (auto *SD : UD->shadows())
9881           R.addDecl(SD);
9882       } else {
9883         R.addDecl(D);
9884       }
9885     }
9886
9887     AllEmptyPacks &= Decls.empty();
9888   };
9889
9890   // C++ [temp.res]/8.4.2:
9891   //   The program is ill-formed, no diagnostic required, if [...] lookup for
9892   //   a name in the template definition found a using-declaration, but the
9893   //   lookup in the corresponding scope in the instantiation odoes not find
9894   //   any declarations because the using-declaration was a pack expansion and
9895   //   the corresponding pack is empty
9896   if (AllEmptyPacks && !RequiresADL) {
9897     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
9898         << isa<UnresolvedMemberExpr>(Old) << Old->getNameInfo().getName();
9899     return true;
9900   }
9901
9902   // Resolve a kind, but don't do any further analysis.  If it's
9903   // ambiguous, the callee needs to deal with it.
9904   R.resolveKind();
9905   return false;
9906 }
9907
9908 template<typename Derived>
9909 ExprResult
9910 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
9911                                                   UnresolvedLookupExpr *Old) {
9912   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
9913                  Sema::LookupOrdinaryName);
9914
9915   // Transform the declaration set.
9916   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
9917     return ExprError();
9918
9919   // Rebuild the nested-name qualifier, if present.
9920   CXXScopeSpec SS;
9921   if (Old->getQualifierLoc()) {
9922     NestedNameSpecifierLoc QualifierLoc
9923       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
9924     if (!QualifierLoc)
9925       return ExprError();
9926
9927     SS.Adopt(QualifierLoc);
9928   }
9929
9930   if (Old->getNamingClass()) {
9931     CXXRecordDecl *NamingClass
9932       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
9933                                                             Old->getNameLoc(),
9934                                                         Old->getNamingClass()));
9935     if (!NamingClass) {
9936       R.clear();
9937       return ExprError();
9938     }
9939
9940     R.setNamingClass(NamingClass);
9941   }
9942
9943   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
9944
9945   // If we have neither explicit template arguments, nor the template keyword,
9946   // it's a normal declaration name or member reference.
9947   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
9948     NamedDecl *D = R.getAsSingle<NamedDecl>();
9949     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
9950     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
9951     // give a good diagnostic.
9952     if (D && D->isCXXInstanceMember()) {
9953       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
9954                                                      /*TemplateArgs=*/nullptr,
9955                                                      /*Scope=*/nullptr);
9956     }
9957
9958     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
9959   }
9960
9961   // If we have template arguments, rebuild them, then rebuild the
9962   // templateid expression.
9963   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
9964   if (Old->hasExplicitTemplateArgs() &&
9965       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
9966                                               Old->getNumTemplateArgs(),
9967                                               TransArgs)) {
9968     R.clear();
9969     return ExprError();
9970   }
9971
9972   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
9973                                             Old->requiresADL(), &TransArgs);
9974 }
9975
9976 template<typename Derived>
9977 ExprResult
9978 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
9979   bool ArgChanged = false;
9980   SmallVector<TypeSourceInfo *, 4> Args;
9981   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
9982     TypeSourceInfo *From = E->getArg(I);
9983     TypeLoc FromTL = From->getTypeLoc();
9984     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
9985       TypeLocBuilder TLB;
9986       TLB.reserve(FromTL.getFullDataSize());
9987       QualType To = getDerived().TransformType(TLB, FromTL);
9988       if (To.isNull())
9989         return ExprError();
9990
9991       if (To == From->getType())
9992         Args.push_back(From);
9993       else {
9994         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
9995         ArgChanged = true;
9996       }
9997       continue;
9998     }
9999
10000     ArgChanged = true;
10001
10002     // We have a pack expansion. Instantiate it.
10003     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
10004     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
10005     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10006     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
10007
10008     // Determine whether the set of unexpanded parameter packs can and should
10009     // be expanded.
10010     bool Expand = true;
10011     bool RetainExpansion = false;
10012     Optional<unsigned> OrigNumExpansions =
10013         ExpansionTL.getTypePtr()->getNumExpansions();
10014     Optional<unsigned> NumExpansions = OrigNumExpansions;
10015     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
10016                                              PatternTL.getSourceRange(),
10017                                              Unexpanded,
10018                                              Expand, RetainExpansion,
10019                                              NumExpansions))
10020       return ExprError();
10021
10022     if (!Expand) {
10023       // The transform has determined that we should perform a simple
10024       // transformation on the pack expansion, producing another pack
10025       // expansion.
10026       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10027
10028       TypeLocBuilder TLB;
10029       TLB.reserve(From->getTypeLoc().getFullDataSize());
10030
10031       QualType To = getDerived().TransformType(TLB, PatternTL);
10032       if (To.isNull())
10033         return ExprError();
10034
10035       To = getDerived().RebuildPackExpansionType(To,
10036                                                  PatternTL.getSourceRange(),
10037                                                  ExpansionTL.getEllipsisLoc(),
10038                                                  NumExpansions);
10039       if (To.isNull())
10040         return ExprError();
10041
10042       PackExpansionTypeLoc ToExpansionTL
10043         = TLB.push<PackExpansionTypeLoc>(To);
10044       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10045       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10046       continue;
10047     }
10048
10049     // Expand the pack expansion by substituting for each argument in the
10050     // pack(s).
10051     for (unsigned I = 0; I != *NumExpansions; ++I) {
10052       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
10053       TypeLocBuilder TLB;
10054       TLB.reserve(PatternTL.getFullDataSize());
10055       QualType To = getDerived().TransformType(TLB, PatternTL);
10056       if (To.isNull())
10057         return ExprError();
10058
10059       if (To->containsUnexpandedParameterPack()) {
10060         To = getDerived().RebuildPackExpansionType(To,
10061                                                    PatternTL.getSourceRange(),
10062                                                    ExpansionTL.getEllipsisLoc(),
10063                                                    NumExpansions);
10064         if (To.isNull())
10065           return ExprError();
10066
10067         PackExpansionTypeLoc ToExpansionTL
10068           = TLB.push<PackExpansionTypeLoc>(To);
10069         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10070       }
10071
10072       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10073     }
10074
10075     if (!RetainExpansion)
10076       continue;
10077
10078     // If we're supposed to retain a pack expansion, do so by temporarily
10079     // forgetting the partially-substituted parameter pack.
10080     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10081
10082     TypeLocBuilder TLB;
10083     TLB.reserve(From->getTypeLoc().getFullDataSize());
10084
10085     QualType To = getDerived().TransformType(TLB, PatternTL);
10086     if (To.isNull())
10087       return ExprError();
10088
10089     To = getDerived().RebuildPackExpansionType(To,
10090                                                PatternTL.getSourceRange(),
10091                                                ExpansionTL.getEllipsisLoc(),
10092                                                NumExpansions);
10093     if (To.isNull())
10094       return ExprError();
10095
10096     PackExpansionTypeLoc ToExpansionTL
10097       = TLB.push<PackExpansionTypeLoc>(To);
10098     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10099     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10100   }
10101
10102   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10103     return E;
10104
10105   return getDerived().RebuildTypeTrait(E->getTrait(),
10106                                        E->getLocStart(),
10107                                        Args,
10108                                        E->getLocEnd());
10109 }
10110
10111 template<typename Derived>
10112 ExprResult
10113 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10114   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10115   if (!T)
10116     return ExprError();
10117
10118   if (!getDerived().AlwaysRebuild() &&
10119       T == E->getQueriedTypeSourceInfo())
10120     return E;
10121
10122   ExprResult SubExpr;
10123   {
10124     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10125     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10126     if (SubExpr.isInvalid())
10127       return ExprError();
10128
10129     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
10130       return E;
10131   }
10132
10133   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
10134                                             E->getLocStart(),
10135                                             T,
10136                                             SubExpr.get(),
10137                                             E->getLocEnd());
10138 }
10139
10140 template<typename Derived>
10141 ExprResult
10142 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
10143   ExprResult SubExpr;
10144   {
10145     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10146     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
10147     if (SubExpr.isInvalid())
10148       return ExprError();
10149
10150     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
10151       return E;
10152   }
10153
10154   return getDerived().RebuildExpressionTrait(
10155       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
10156 }
10157
10158 template <typename Derived>
10159 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
10160     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
10161     TypeSourceInfo **RecoveryTSI) {
10162   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
10163       DRE, AddrTaken, RecoveryTSI);
10164
10165   // Propagate both errors and recovered types, which return ExprEmpty.
10166   if (!NewDRE.isUsable())
10167     return NewDRE;
10168
10169   // We got an expr, wrap it up in parens.
10170   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
10171     return PE;
10172   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
10173                                        PE->getRParen());
10174 }
10175
10176 template <typename Derived>
10177 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10178     DependentScopeDeclRefExpr *E) {
10179   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
10180                                             nullptr);
10181 }
10182
10183 template<typename Derived>
10184 ExprResult
10185 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10186                                                DependentScopeDeclRefExpr *E,
10187                                                bool IsAddressOfOperand,
10188                                                TypeSourceInfo **RecoveryTSI) {
10189   assert(E->getQualifierLoc());
10190   NestedNameSpecifierLoc QualifierLoc
10191   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10192   if (!QualifierLoc)
10193     return ExprError();
10194   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10195
10196   // TODO: If this is a conversion-function-id, verify that the
10197   // destination type name (if present) resolves the same way after
10198   // instantiation as it did in the local scope.
10199
10200   DeclarationNameInfo NameInfo
10201     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
10202   if (!NameInfo.getName())
10203     return ExprError();
10204
10205   if (!E->hasExplicitTemplateArgs()) {
10206     if (!getDerived().AlwaysRebuild() &&
10207         QualifierLoc == E->getQualifierLoc() &&
10208         // Note: it is sufficient to compare the Name component of NameInfo:
10209         // if name has not changed, DNLoc has not changed either.
10210         NameInfo.getName() == E->getDeclName())
10211       return E;
10212
10213     return getDerived().RebuildDependentScopeDeclRefExpr(
10214         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
10215         IsAddressOfOperand, RecoveryTSI);
10216   }
10217
10218   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10219   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10220                                               E->getNumTemplateArgs(),
10221                                               TransArgs))
10222     return ExprError();
10223
10224   return getDerived().RebuildDependentScopeDeclRefExpr(
10225       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10226       RecoveryTSI);
10227 }
10228
10229 template<typename Derived>
10230 ExprResult
10231 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10232   // CXXConstructExprs other than for list-initialization and
10233   // CXXTemporaryObjectExpr are always implicit, so when we have
10234   // a 1-argument construction we just transform that argument.
10235   if ((E->getNumArgs() == 1 ||
10236        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10237       (!getDerived().DropCallArgument(E->getArg(0))) &&
10238       !E->isListInitialization())
10239     return getDerived().TransformExpr(E->getArg(0));
10240
10241   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
10242
10243   QualType T = getDerived().TransformType(E->getType());
10244   if (T.isNull())
10245     return ExprError();
10246
10247   CXXConstructorDecl *Constructor
10248     = cast_or_null<CXXConstructorDecl>(
10249                                 getDerived().TransformDecl(E->getLocStart(),
10250                                                          E->getConstructor()));
10251   if (!Constructor)
10252     return ExprError();
10253
10254   bool ArgumentChanged = false;
10255   SmallVector<Expr*, 8> Args;
10256   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10257                                   &ArgumentChanged))
10258     return ExprError();
10259
10260   if (!getDerived().AlwaysRebuild() &&
10261       T == E->getType() &&
10262       Constructor == E->getConstructor() &&
10263       !ArgumentChanged) {
10264     // Mark the constructor as referenced.
10265     // FIXME: Instantiation-specific
10266     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10267     return E;
10268   }
10269
10270   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
10271                                               Constructor,
10272                                               E->isElidable(), Args,
10273                                               E->hadMultipleCandidates(),
10274                                               E->isListInitialization(),
10275                                               E->isStdInitListInitialization(),
10276                                               E->requiresZeroInitialization(),
10277                                               E->getConstructionKind(),
10278                                               E->getParenOrBraceRange());
10279 }
10280
10281 template<typename Derived>
10282 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10283     CXXInheritedCtorInitExpr *E) {
10284   QualType T = getDerived().TransformType(E->getType());
10285   if (T.isNull())
10286     return ExprError();
10287
10288   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10289       getDerived().TransformDecl(E->getLocStart(), E->getConstructor()));
10290   if (!Constructor)
10291     return ExprError();
10292
10293   if (!getDerived().AlwaysRebuild() &&
10294       T == E->getType() &&
10295       Constructor == E->getConstructor()) {
10296     // Mark the constructor as referenced.
10297     // FIXME: Instantiation-specific
10298     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10299     return E;
10300   }
10301
10302   return getDerived().RebuildCXXInheritedCtorInitExpr(
10303       T, E->getLocation(), Constructor,
10304       E->constructsVBase(), E->inheritedFromVBase());
10305 }
10306
10307 /// \brief Transform a C++ temporary-binding expression.
10308 ///
10309 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
10310 /// transform the subexpression and return that.
10311 template<typename Derived>
10312 ExprResult
10313 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10314   return getDerived().TransformExpr(E->getSubExpr());
10315 }
10316
10317 /// \brief Transform a C++ expression that contains cleanups that should
10318 /// be run after the expression is evaluated.
10319 ///
10320 /// Since ExprWithCleanups nodes are implicitly generated, we
10321 /// just transform the subexpression and return that.
10322 template<typename Derived>
10323 ExprResult
10324 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
10325   return getDerived().TransformExpr(E->getSubExpr());
10326 }
10327
10328 template<typename Derived>
10329 ExprResult
10330 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
10331                                                     CXXTemporaryObjectExpr *E) {
10332   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10333   if (!T)
10334     return ExprError();
10335
10336   CXXConstructorDecl *Constructor
10337     = cast_or_null<CXXConstructorDecl>(
10338                                   getDerived().TransformDecl(E->getLocStart(),
10339                                                          E->getConstructor()));
10340   if (!Constructor)
10341     return ExprError();
10342
10343   bool ArgumentChanged = false;
10344   SmallVector<Expr*, 8> Args;
10345   Args.reserve(E->getNumArgs());
10346   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10347                      &ArgumentChanged))
10348     return ExprError();
10349
10350   if (!getDerived().AlwaysRebuild() &&
10351       T == E->getTypeSourceInfo() &&
10352       Constructor == E->getConstructor() &&
10353       !ArgumentChanged) {
10354     // FIXME: Instantiation-specific
10355     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10356     return SemaRef.MaybeBindToTemporary(E);
10357   }
10358
10359   // FIXME: Pass in E->isListInitialization().
10360   return getDerived().RebuildCXXTemporaryObjectExpr(T,
10361                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10362                                                     Args,
10363                                                     E->getLocEnd());
10364 }
10365
10366 template<typename Derived>
10367 ExprResult
10368 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
10369   // Transform any init-capture expressions before entering the scope of the
10370   // lambda body, because they are not semantically within that scope.
10371   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
10372   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
10373   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
10374                                   E->explicit_capture_begin());
10375   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10376                                     CEnd = E->capture_end();
10377        C != CEnd; ++C) {
10378     if (!E->isInitCapture(C))
10379       continue;
10380     EnterExpressionEvaluationContext EEEC(getSema(),
10381                                           Sema::PotentiallyEvaluated);
10382     ExprResult NewExprInitResult = getDerived().TransformInitializer(
10383         C->getCapturedVar()->getInit(),
10384         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
10385
10386     if (NewExprInitResult.isInvalid())
10387       return ExprError();
10388     Expr *NewExprInit = NewExprInitResult.get();
10389
10390     VarDecl *OldVD = C->getCapturedVar();
10391     QualType NewInitCaptureType =
10392         getSema().buildLambdaInitCaptureInitialization(
10393             C->getLocation(), OldVD->getType()->isReferenceType(),
10394             OldVD->getIdentifier(),
10395             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
10396     NewExprInitResult = NewExprInit;
10397     InitCaptureExprsAndTypes[C - E->capture_begin()] =
10398         std::make_pair(NewExprInitResult, NewInitCaptureType);
10399   }
10400
10401   // Transform the template parameters, and add them to the current
10402   // instantiation scope. The null case is handled correctly.
10403   auto TPL = getDerived().TransformTemplateParameterList(
10404       E->getTemplateParameterList());
10405
10406   // Transform the type of the original lambda's call operator.
10407   // The transformation MUST be done in the CurrentInstantiationScope since
10408   // it introduces a mapping of the original to the newly created
10409   // transformed parameters.
10410   TypeSourceInfo *NewCallOpTSI = nullptr;
10411   {
10412     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
10413     FunctionProtoTypeLoc OldCallOpFPTL = 
10414         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
10415
10416     TypeLocBuilder NewCallOpTLBuilder;
10417     SmallVector<QualType, 4> ExceptionStorage;
10418     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
10419     QualType NewCallOpType = TransformFunctionProtoType(
10420         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
10421         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
10422           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
10423                                               ExceptionStorage, Changed);
10424         });
10425     if (NewCallOpType.isNull())
10426       return ExprError();
10427     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
10428                                                         NewCallOpType);
10429   }
10430
10431   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
10432   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
10433   LSI->GLTemplateParameterList = TPL;
10434
10435   // Create the local class that will describe the lambda.
10436   CXXRecordDecl *Class
10437     = getSema().createLambdaClosureType(E->getIntroducerRange(),
10438                                         NewCallOpTSI,
10439                                         /*KnownDependent=*/false,
10440                                         E->getCaptureDefault());
10441   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
10442
10443   // Build the call operator.
10444   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
10445       Class, E->getIntroducerRange(), NewCallOpTSI,
10446       E->getCallOperator()->getLocEnd(),
10447       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
10448       E->getCallOperator()->isConstexpr());
10449
10450   LSI->CallOperator = NewCallOperator;
10451
10452   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
10453        I != NumParams; ++I) {
10454     auto *P = NewCallOperator->getParamDecl(I);
10455     if (P->hasUninstantiatedDefaultArg()) {
10456       EnterExpressionEvaluationContext Eval(
10457           getSema(), Sema::PotentiallyEvaluatedIfUsed, P);
10458       ExprResult R = getDerived().TransformExpr(
10459           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
10460       P->setDefaultArg(R.get());
10461     }
10462   }
10463
10464   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
10465   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
10466
10467   // Introduce the context of the call operator.
10468   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
10469                                  /*NewThisContext*/false);
10470
10471   // Enter the scope of the lambda.
10472   getSema().buildLambdaScope(LSI, NewCallOperator,
10473                              E->getIntroducerRange(),
10474                              E->getCaptureDefault(),
10475                              E->getCaptureDefaultLoc(),
10476                              E->hasExplicitParameters(),
10477                              E->hasExplicitResultType(),
10478                              E->isMutable());
10479
10480   bool Invalid = false;
10481
10482   // Transform captures.
10483   bool FinishedExplicitCaptures = false;
10484   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10485                                  CEnd = E->capture_end();
10486        C != CEnd; ++C) {
10487     // When we hit the first implicit capture, tell Sema that we've finished
10488     // the list of explicit captures.
10489     if (!FinishedExplicitCaptures && C->isImplicit()) {
10490       getSema().finishLambdaExplicitCaptures(LSI);
10491       FinishedExplicitCaptures = true;
10492     }
10493
10494     // Capturing 'this' is trivial.
10495     if (C->capturesThis()) {
10496       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
10497                                     /*BuildAndDiagnose*/ true, nullptr,
10498                                     C->getCaptureKind() == LCK_StarThis);
10499       continue;
10500     }
10501     // Captured expression will be recaptured during captured variables
10502     // rebuilding.
10503     if (C->capturesVLAType())
10504       continue;
10505
10506     // Rebuild init-captures, including the implied field declaration.
10507     if (E->isInitCapture(C)) {
10508       InitCaptureInfoTy InitExprTypePair = 
10509           InitCaptureExprsAndTypes[C - E->capture_begin()];
10510       ExprResult Init = InitExprTypePair.first;
10511       QualType InitQualType = InitExprTypePair.second;
10512       if (Init.isInvalid() || InitQualType.isNull()) {
10513         Invalid = true;
10514         continue;
10515       }
10516       VarDecl *OldVD = C->getCapturedVar();
10517       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
10518           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
10519           OldVD->getInitStyle(), Init.get());
10520       if (!NewVD)
10521         Invalid = true;
10522       else {
10523         getDerived().transformedLocalDecl(OldVD, NewVD);
10524       }
10525       getSema().buildInitCaptureField(LSI, NewVD);
10526       continue;
10527     }
10528
10529     assert(C->capturesVariable() && "unexpected kind of lambda capture");
10530
10531     // Determine the capture kind for Sema.
10532     Sema::TryCaptureKind Kind
10533       = C->isImplicit()? Sema::TryCapture_Implicit
10534                        : C->getCaptureKind() == LCK_ByCopy
10535                            ? Sema::TryCapture_ExplicitByVal
10536                            : Sema::TryCapture_ExplicitByRef;
10537     SourceLocation EllipsisLoc;
10538     if (C->isPackExpansion()) {
10539       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
10540       bool ShouldExpand = false;
10541       bool RetainExpansion = false;
10542       Optional<unsigned> NumExpansions;
10543       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
10544                                                C->getLocation(),
10545                                                Unexpanded,
10546                                                ShouldExpand, RetainExpansion,
10547                                                NumExpansions)) {
10548         Invalid = true;
10549         continue;
10550       }
10551
10552       if (ShouldExpand) {
10553         // The transform has determined that we should perform an expansion;
10554         // transform and capture each of the arguments.
10555         // expansion of the pattern. Do so.
10556         VarDecl *Pack = C->getCapturedVar();
10557         for (unsigned I = 0; I != *NumExpansions; ++I) {
10558           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
10559           VarDecl *CapturedVar
10560             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10561                                                                Pack));
10562           if (!CapturedVar) {
10563             Invalid = true;
10564             continue;
10565           }
10566
10567           // Capture the transformed variable.
10568           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
10569         }
10570
10571         // FIXME: Retain a pack expansion if RetainExpansion is true.
10572
10573         continue;
10574       }
10575
10576       EllipsisLoc = C->getEllipsisLoc();
10577     }
10578
10579     // Transform the captured variable.
10580     VarDecl *CapturedVar
10581       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10582                                                          C->getCapturedVar()));
10583     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
10584       Invalid = true;
10585       continue;
10586     }
10587
10588     // Capture the transformed variable.
10589     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
10590                                  EllipsisLoc);
10591   }
10592   if (!FinishedExplicitCaptures)
10593     getSema().finishLambdaExplicitCaptures(LSI);
10594
10595   // Enter a new evaluation context to insulate the lambda from any
10596   // cleanups from the enclosing full-expression.
10597   getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated);
10598
10599   // Instantiate the body of the lambda expression.
10600   StmtResult Body =
10601       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
10602
10603   // ActOnLambda* will pop the function scope for us.
10604   FuncScopeCleanup.disable();
10605
10606   if (Body.isInvalid()) {
10607     SavedContext.pop();
10608     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
10609                                /*IsInstantiation=*/true);
10610     return ExprError();
10611   }
10612
10613   // Copy the LSI before ActOnFinishFunctionBody removes it.
10614   // FIXME: This is dumb. Store the lambda information somewhere that outlives
10615   // the call operator.
10616   auto LSICopy = *LSI;
10617   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
10618                                     /*IsInstantiation*/ true);
10619   SavedContext.pop();
10620
10621   return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(),
10622                                    &LSICopy);
10623 }
10624
10625 template<typename Derived>
10626 ExprResult
10627 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
10628                                                   CXXUnresolvedConstructExpr *E) {
10629   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10630   if (!T)
10631     return ExprError();
10632
10633   bool ArgumentChanged = false;
10634   SmallVector<Expr*, 8> Args;
10635   Args.reserve(E->arg_size());
10636   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
10637                                   &ArgumentChanged))
10638     return ExprError();
10639
10640   if (!getDerived().AlwaysRebuild() &&
10641       T == E->getTypeSourceInfo() &&
10642       !ArgumentChanged)
10643     return E;
10644
10645   // FIXME: we're faking the locations of the commas
10646   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
10647                                                         E->getLParenLoc(),
10648                                                         Args,
10649                                                         E->getRParenLoc());
10650 }
10651
10652 template<typename Derived>
10653 ExprResult
10654 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
10655                                              CXXDependentScopeMemberExpr *E) {
10656   // Transform the base of the expression.
10657   ExprResult Base((Expr*) nullptr);
10658   Expr *OldBase;
10659   QualType BaseType;
10660   QualType ObjectType;
10661   if (!E->isImplicitAccess()) {
10662     OldBase = E->getBase();
10663     Base = getDerived().TransformExpr(OldBase);
10664     if (Base.isInvalid())
10665       return ExprError();
10666
10667     // Start the member reference and compute the object's type.
10668     ParsedType ObjectTy;
10669     bool MayBePseudoDestructor = false;
10670     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10671                                                 E->getOperatorLoc(),
10672                                       E->isArrow()? tok::arrow : tok::period,
10673                                                 ObjectTy,
10674                                                 MayBePseudoDestructor);
10675     if (Base.isInvalid())
10676       return ExprError();
10677
10678     ObjectType = ObjectTy.get();
10679     BaseType = ((Expr*) Base.get())->getType();
10680   } else {
10681     OldBase = nullptr;
10682     BaseType = getDerived().TransformType(E->getBaseType());
10683     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
10684   }
10685
10686   // Transform the first part of the nested-name-specifier that qualifies
10687   // the member name.
10688   NamedDecl *FirstQualifierInScope
10689     = getDerived().TransformFirstQualifierInScope(
10690                                             E->getFirstQualifierFoundInScope(),
10691                                             E->getQualifierLoc().getBeginLoc());
10692
10693   NestedNameSpecifierLoc QualifierLoc;
10694   if (E->getQualifier()) {
10695     QualifierLoc
10696       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
10697                                                      ObjectType,
10698                                                      FirstQualifierInScope);
10699     if (!QualifierLoc)
10700       return ExprError();
10701   }
10702
10703   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10704
10705   // TODO: If this is a conversion-function-id, verify that the
10706   // destination type name (if present) resolves the same way after
10707   // instantiation as it did in the local scope.
10708
10709   DeclarationNameInfo NameInfo
10710     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
10711   if (!NameInfo.getName())
10712     return ExprError();
10713
10714   if (!E->hasExplicitTemplateArgs()) {
10715     // This is a reference to a member without an explicitly-specified
10716     // template argument list. Optimize for this common case.
10717     if (!getDerived().AlwaysRebuild() &&
10718         Base.get() == OldBase &&
10719         BaseType == E->getBaseType() &&
10720         QualifierLoc == E->getQualifierLoc() &&
10721         NameInfo.getName() == E->getMember() &&
10722         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
10723       return E;
10724
10725     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
10726                                                        BaseType,
10727                                                        E->isArrow(),
10728                                                        E->getOperatorLoc(),
10729                                                        QualifierLoc,
10730                                                        TemplateKWLoc,
10731                                                        FirstQualifierInScope,
10732                                                        NameInfo,
10733                                                        /*TemplateArgs*/nullptr);
10734   }
10735
10736   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10737   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10738                                               E->getNumTemplateArgs(),
10739                                               TransArgs))
10740     return ExprError();
10741
10742   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
10743                                                      BaseType,
10744                                                      E->isArrow(),
10745                                                      E->getOperatorLoc(),
10746                                                      QualifierLoc,
10747                                                      TemplateKWLoc,
10748                                                      FirstQualifierInScope,
10749                                                      NameInfo,
10750                                                      &TransArgs);
10751 }
10752
10753 template<typename Derived>
10754 ExprResult
10755 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
10756   // Transform the base of the expression.
10757   ExprResult Base((Expr*) nullptr);
10758   QualType BaseType;
10759   if (!Old->isImplicitAccess()) {
10760     Base = getDerived().TransformExpr(Old->getBase());
10761     if (Base.isInvalid())
10762       return ExprError();
10763     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
10764                                                      Old->isArrow());
10765     if (Base.isInvalid())
10766       return ExprError();
10767     BaseType = Base.get()->getType();
10768   } else {
10769     BaseType = getDerived().TransformType(Old->getBaseType());
10770   }
10771
10772   NestedNameSpecifierLoc QualifierLoc;
10773   if (Old->getQualifierLoc()) {
10774     QualifierLoc
10775     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10776     if (!QualifierLoc)
10777       return ExprError();
10778   }
10779
10780   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10781
10782   LookupResult R(SemaRef, Old->getMemberNameInfo(),
10783                  Sema::LookupOrdinaryName);
10784
10785   // Transform the declaration set.
10786   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
10787     return ExprError();
10788
10789   // Determine the naming class.
10790   if (Old->getNamingClass()) {
10791     CXXRecordDecl *NamingClass
10792       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10793                                                           Old->getMemberLoc(),
10794                                                         Old->getNamingClass()));
10795     if (!NamingClass)
10796       return ExprError();
10797
10798     R.setNamingClass(NamingClass);
10799   }
10800
10801   TemplateArgumentListInfo TransArgs;
10802   if (Old->hasExplicitTemplateArgs()) {
10803     TransArgs.setLAngleLoc(Old->getLAngleLoc());
10804     TransArgs.setRAngleLoc(Old->getRAngleLoc());
10805     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10806                                                 Old->getNumTemplateArgs(),
10807                                                 TransArgs))
10808       return ExprError();
10809   }
10810
10811   // FIXME: to do this check properly, we will need to preserve the
10812   // first-qualifier-in-scope here, just in case we had a dependent
10813   // base (and therefore couldn't do the check) and a
10814   // nested-name-qualifier (and therefore could do the lookup).
10815   NamedDecl *FirstQualifierInScope = nullptr;
10816
10817   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
10818                                                   BaseType,
10819                                                   Old->getOperatorLoc(),
10820                                                   Old->isArrow(),
10821                                                   QualifierLoc,
10822                                                   TemplateKWLoc,
10823                                                   FirstQualifierInScope,
10824                                                   R,
10825                                               (Old->hasExplicitTemplateArgs()
10826                                                   ? &TransArgs : nullptr));
10827 }
10828
10829 template<typename Derived>
10830 ExprResult
10831 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
10832   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10833   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
10834   if (SubExpr.isInvalid())
10835     return ExprError();
10836
10837   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
10838     return E;
10839
10840   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
10841 }
10842
10843 template<typename Derived>
10844 ExprResult
10845 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
10846   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
10847   if (Pattern.isInvalid())
10848     return ExprError();
10849
10850   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
10851     return E;
10852
10853   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
10854                                            E->getNumExpansions());
10855 }
10856
10857 template<typename Derived>
10858 ExprResult
10859 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
10860   // If E is not value-dependent, then nothing will change when we transform it.
10861   // Note: This is an instantiation-centric view.
10862   if (!E->isValueDependent())
10863     return E;
10864
10865   EnterExpressionEvaluationContext Unevaluated(getSema(), Sema::Unevaluated);
10866
10867   ArrayRef<TemplateArgument> PackArgs;
10868   TemplateArgument ArgStorage;
10869
10870   // Find the argument list to transform.
10871   if (E->isPartiallySubstituted()) {
10872     PackArgs = E->getPartialArguments();
10873   } else if (E->isValueDependent()) {
10874     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
10875     bool ShouldExpand = false;
10876     bool RetainExpansion = false;
10877     Optional<unsigned> NumExpansions;
10878     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
10879                                              Unexpanded,
10880                                              ShouldExpand, RetainExpansion,
10881                                              NumExpansions))
10882       return ExprError();
10883
10884     // If we need to expand the pack, build a template argument from it and
10885     // expand that.
10886     if (ShouldExpand) {
10887       auto *Pack = E->getPack();
10888       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
10889         ArgStorage = getSema().Context.getPackExpansionType(
10890             getSema().Context.getTypeDeclType(TTPD), None);
10891       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
10892         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
10893       } else {
10894         auto *VD = cast<ValueDecl>(Pack);
10895         ExprResult DRE = getSema().BuildDeclRefExpr(VD, VD->getType(),
10896                                                     VK_RValue, E->getPackLoc());
10897         if (DRE.isInvalid())
10898           return ExprError();
10899         ArgStorage = new (getSema().Context) PackExpansionExpr(
10900             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
10901       }
10902       PackArgs = ArgStorage;
10903     }
10904   }
10905
10906   // If we're not expanding the pack, just transform the decl.
10907   if (!PackArgs.size()) {
10908     auto *Pack = cast_or_null<NamedDecl>(
10909         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
10910     if (!Pack)
10911       return ExprError();
10912     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
10913                                               E->getPackLoc(),
10914                                               E->getRParenLoc(), None, None);
10915   }
10916
10917   // Try to compute the result without performing a partial substitution.
10918   Optional<unsigned> Result = 0;
10919   for (const TemplateArgument &Arg : PackArgs) {
10920     if (!Arg.isPackExpansion()) {
10921       Result = *Result + 1;
10922       continue;
10923     }
10924
10925     TemplateArgumentLoc ArgLoc;
10926     InventTemplateArgumentLoc(Arg, ArgLoc);
10927
10928     // Find the pattern of the pack expansion.
10929     SourceLocation Ellipsis;
10930     Optional<unsigned> OrigNumExpansions;
10931     TemplateArgumentLoc Pattern =
10932         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
10933                                                           OrigNumExpansions);
10934
10935     // Substitute under the pack expansion. Do not expand the pack (yet).
10936     TemplateArgumentLoc OutPattern;
10937     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10938     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
10939                                                /*Uneval*/ true))
10940       return true;
10941
10942     // See if we can determine the number of arguments from the result.
10943     Optional<unsigned> NumExpansions =
10944         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
10945     if (!NumExpansions) {
10946       // No: we must be in an alias template expansion, and we're going to need
10947       // to actually expand the packs.
10948       Result = None;
10949       break;
10950     }
10951
10952     Result = *Result + *NumExpansions;
10953   }
10954
10955   // Common case: we could determine the number of expansions without
10956   // substituting.
10957   if (Result)
10958     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10959                                               E->getPackLoc(),
10960                                               E->getRParenLoc(), *Result, None);
10961
10962   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
10963                                                E->getPackLoc());
10964   {
10965     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
10966     typedef TemplateArgumentLocInventIterator<
10967         Derived, const TemplateArgument*> PackLocIterator;
10968     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
10969                                    PackLocIterator(*this, PackArgs.end()),
10970                                    TransformedPackArgs, /*Uneval*/true))
10971       return ExprError();
10972   }
10973
10974   // Check whether we managed to fully-expand the pack.
10975   // FIXME: Is it possible for us to do so and not hit the early exit path?
10976   SmallVector<TemplateArgument, 8> Args;
10977   bool PartialSubstitution = false;
10978   for (auto &Loc : TransformedPackArgs.arguments()) {
10979     Args.push_back(Loc.getArgument());
10980     if (Loc.getArgument().isPackExpansion())
10981       PartialSubstitution = true;
10982   }
10983
10984   if (PartialSubstitution)
10985     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10986                                               E->getPackLoc(),
10987                                               E->getRParenLoc(), None, Args);
10988
10989   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10990                                             E->getPackLoc(), E->getRParenLoc(),
10991                                             Args.size(), None);
10992 }
10993
10994 template<typename Derived>
10995 ExprResult
10996 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
10997                                           SubstNonTypeTemplateParmPackExpr *E) {
10998   // Default behavior is to do nothing with this transformation.
10999   return E;
11000 }
11001
11002 template<typename Derived>
11003 ExprResult
11004 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
11005                                           SubstNonTypeTemplateParmExpr *E) {
11006   // Default behavior is to do nothing with this transformation.
11007   return E;
11008 }
11009
11010 template<typename Derived>
11011 ExprResult
11012 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
11013   // Default behavior is to do nothing with this transformation.
11014   return E;
11015 }
11016
11017 template<typename Derived>
11018 ExprResult
11019 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
11020                                                   MaterializeTemporaryExpr *E) {
11021   return getDerived().TransformExpr(E->GetTemporaryExpr());
11022 }
11023
11024 template<typename Derived>
11025 ExprResult
11026 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
11027   Expr *Pattern = E->getPattern();
11028
11029   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11030   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
11031   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11032
11033   // Determine whether the set of unexpanded parameter packs can and should
11034   // be expanded.
11035   bool Expand = true;
11036   bool RetainExpansion = false;
11037   Optional<unsigned> NumExpansions;
11038   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
11039                                            Pattern->getSourceRange(),
11040                                            Unexpanded,
11041                                            Expand, RetainExpansion,
11042                                            NumExpansions))
11043     return true;
11044
11045   if (!Expand) {
11046     // Do not expand any packs here, just transform and rebuild a fold
11047     // expression.
11048     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11049
11050     ExprResult LHS =
11051         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
11052     if (LHS.isInvalid())
11053       return true;
11054
11055     ExprResult RHS =
11056         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
11057     if (RHS.isInvalid())
11058       return true;
11059
11060     if (!getDerived().AlwaysRebuild() &&
11061         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
11062       return E;
11063
11064     return getDerived().RebuildCXXFoldExpr(
11065         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
11066         RHS.get(), E->getLocEnd());
11067   }
11068
11069   // The transform has determined that we should perform an elementwise
11070   // expansion of the pattern. Do so.
11071   ExprResult Result = getDerived().TransformExpr(E->getInit());
11072   if (Result.isInvalid())
11073     return true;
11074   bool LeftFold = E->isLeftFold();
11075
11076   // If we're retaining an expansion for a right fold, it is the innermost
11077   // component and takes the init (if any).
11078   if (!LeftFold && RetainExpansion) {
11079     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11080
11081     ExprResult Out = getDerived().TransformExpr(Pattern);
11082     if (Out.isInvalid())
11083       return true;
11084
11085     Result = getDerived().RebuildCXXFoldExpr(
11086         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
11087         Result.get(), E->getLocEnd());
11088     if (Result.isInvalid())
11089       return true;
11090   }
11091
11092   for (unsigned I = 0; I != *NumExpansions; ++I) {
11093     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
11094         getSema(), LeftFold ? I : *NumExpansions - I - 1);
11095     ExprResult Out = getDerived().TransformExpr(Pattern);
11096     if (Out.isInvalid())
11097       return true;
11098
11099     if (Out.get()->containsUnexpandedParameterPack()) {
11100       // We still have a pack; retain a pack expansion for this slice.
11101       Result = getDerived().RebuildCXXFoldExpr(
11102           E->getLocStart(),
11103           LeftFold ? Result.get() : Out.get(),
11104           E->getOperator(), E->getEllipsisLoc(),
11105           LeftFold ? Out.get() : Result.get(),
11106           E->getLocEnd());
11107     } else if (Result.isUsable()) {
11108       // We've got down to a single element; build a binary operator.
11109       Result = getDerived().RebuildBinaryOperator(
11110           E->getEllipsisLoc(), E->getOperator(),
11111           LeftFold ? Result.get() : Out.get(),
11112           LeftFold ? Out.get() : Result.get());
11113     } else
11114       Result = Out;
11115
11116     if (Result.isInvalid())
11117       return true;
11118   }
11119
11120   // If we're retaining an expansion for a left fold, it is the outermost
11121   // component and takes the complete expansion so far as its init (if any).
11122   if (LeftFold && RetainExpansion) {
11123     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11124
11125     ExprResult Out = getDerived().TransformExpr(Pattern);
11126     if (Out.isInvalid())
11127       return true;
11128
11129     Result = getDerived().RebuildCXXFoldExpr(
11130         E->getLocStart(), Result.get(),
11131         E->getOperator(), E->getEllipsisLoc(),
11132         Out.get(), E->getLocEnd());
11133     if (Result.isInvalid())
11134       return true;
11135   }
11136
11137   // If we had no init and an empty pack, and we're not retaining an expansion,
11138   // then produce a fallback value or error.
11139   if (Result.isUnset())
11140     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
11141                                                 E->getOperator());
11142
11143   return Result;
11144 }
11145
11146 template<typename Derived>
11147 ExprResult
11148 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
11149     CXXStdInitializerListExpr *E) {
11150   return getDerived().TransformExpr(E->getSubExpr());
11151 }
11152
11153 template<typename Derived>
11154 ExprResult
11155 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
11156   return SemaRef.MaybeBindToTemporary(E);
11157 }
11158
11159 template<typename Derived>
11160 ExprResult
11161 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
11162   return E;
11163 }
11164
11165 template<typename Derived>
11166 ExprResult
11167 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
11168   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11169   if (SubExpr.isInvalid())
11170     return ExprError();
11171
11172   if (!getDerived().AlwaysRebuild() &&
11173       SubExpr.get() == E->getSubExpr())
11174     return E;
11175
11176   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
11177 }
11178
11179 template<typename Derived>
11180 ExprResult
11181 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
11182   // Transform each of the elements.
11183   SmallVector<Expr *, 8> Elements;
11184   bool ArgChanged = false;
11185   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
11186                                   /*IsCall=*/false, Elements, &ArgChanged))
11187     return ExprError();
11188
11189   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11190     return SemaRef.MaybeBindToTemporary(E);
11191
11192   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
11193                                               Elements.data(),
11194                                               Elements.size());
11195 }
11196
11197 template<typename Derived>
11198 ExprResult
11199 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
11200                                                     ObjCDictionaryLiteral *E) {
11201   // Transform each of the elements.
11202   SmallVector<ObjCDictionaryElement, 8> Elements;
11203   bool ArgChanged = false;
11204   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
11205     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
11206
11207     if (OrigElement.isPackExpansion()) {
11208       // This key/value element is a pack expansion.
11209       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11210       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
11211       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
11212       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11213
11214       // Determine whether the set of unexpanded parameter packs can
11215       // and should be expanded.
11216       bool Expand = true;
11217       bool RetainExpansion = false;
11218       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
11219       Optional<unsigned> NumExpansions = OrigNumExpansions;
11220       SourceRange PatternRange(OrigElement.Key->getLocStart(),
11221                                OrigElement.Value->getLocEnd());
11222      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
11223                                                PatternRange,
11224                                                Unexpanded,
11225                                                Expand, RetainExpansion,
11226                                                NumExpansions))
11227         return ExprError();
11228
11229       if (!Expand) {
11230         // The transform has determined that we should perform a simple
11231         // transformation on the pack expansion, producing another pack
11232         // expansion.
11233         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11234         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11235         if (Key.isInvalid())
11236           return ExprError();
11237
11238         if (Key.get() != OrigElement.Key)
11239           ArgChanged = true;
11240
11241         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11242         if (Value.isInvalid())
11243           return ExprError();
11244
11245         if (Value.get() != OrigElement.Value)
11246           ArgChanged = true;
11247
11248         ObjCDictionaryElement Expansion = {
11249           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
11250         };
11251         Elements.push_back(Expansion);
11252         continue;
11253       }
11254
11255       // Record right away that the argument was changed.  This needs
11256       // to happen even if the array expands to nothing.
11257       ArgChanged = true;
11258
11259       // The transform has determined that we should perform an elementwise
11260       // expansion of the pattern. Do so.
11261       for (unsigned I = 0; I != *NumExpansions; ++I) {
11262         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11263         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11264         if (Key.isInvalid())
11265           return ExprError();
11266
11267         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11268         if (Value.isInvalid())
11269           return ExprError();
11270
11271         ObjCDictionaryElement Element = {
11272           Key.get(), Value.get(), SourceLocation(), NumExpansions
11273         };
11274
11275         // If any unexpanded parameter packs remain, we still have a
11276         // pack expansion.
11277         // FIXME: Can this really happen?
11278         if (Key.get()->containsUnexpandedParameterPack() ||
11279             Value.get()->containsUnexpandedParameterPack())
11280           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11281
11282         Elements.push_back(Element);
11283       }
11284
11285       // FIXME: Retain a pack expansion if RetainExpansion is true.
11286
11287       // We've finished with this pack expansion.
11288       continue;
11289     }
11290
11291     // Transform and check key.
11292     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11293     if (Key.isInvalid())
11294       return ExprError();
11295
11296     if (Key.get() != OrigElement.Key)
11297       ArgChanged = true;
11298
11299     // Transform and check value.
11300     ExprResult Value
11301       = getDerived().TransformExpr(OrigElement.Value);
11302     if (Value.isInvalid())
11303       return ExprError();
11304
11305     if (Value.get() != OrigElement.Value)
11306       ArgChanged = true;
11307
11308     ObjCDictionaryElement Element = {
11309       Key.get(), Value.get(), SourceLocation(), None
11310     };
11311     Elements.push_back(Element);
11312   }
11313
11314   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11315     return SemaRef.MaybeBindToTemporary(E);
11316
11317   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
11318                                                    Elements);
11319 }
11320
11321 template<typename Derived>
11322 ExprResult
11323 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
11324   TypeSourceInfo *EncodedTypeInfo
11325     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
11326   if (!EncodedTypeInfo)
11327     return ExprError();
11328
11329   if (!getDerived().AlwaysRebuild() &&
11330       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
11331     return E;
11332
11333   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
11334                                             EncodedTypeInfo,
11335                                             E->getRParenLoc());
11336 }
11337
11338 template<typename Derived>
11339 ExprResult TreeTransform<Derived>::
11340 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
11341   // This is a kind of implicit conversion, and it needs to get dropped
11342   // and recomputed for the same general reasons that ImplicitCastExprs
11343   // do, as well a more specific one: this expression is only valid when
11344   // it appears *immediately* as an argument expression.
11345   return getDerived().TransformExpr(E->getSubExpr());
11346 }
11347
11348 template<typename Derived>
11349 ExprResult TreeTransform<Derived>::
11350 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
11351   TypeSourceInfo *TSInfo
11352     = getDerived().TransformType(E->getTypeInfoAsWritten());
11353   if (!TSInfo)
11354     return ExprError();
11355
11356   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
11357   if (Result.isInvalid())
11358     return ExprError();
11359
11360   if (!getDerived().AlwaysRebuild() &&
11361       TSInfo == E->getTypeInfoAsWritten() &&
11362       Result.get() == E->getSubExpr())
11363     return E;
11364
11365   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
11366                                       E->getBridgeKeywordLoc(), TSInfo,
11367                                       Result.get());
11368 }
11369
11370 template <typename Derived>
11371 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
11372     ObjCAvailabilityCheckExpr *E) {
11373   return E;
11374 }
11375
11376 template<typename Derived>
11377 ExprResult
11378 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
11379   // Transform arguments.
11380   bool ArgChanged = false;
11381   SmallVector<Expr*, 8> Args;
11382   Args.reserve(E->getNumArgs());
11383   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
11384                                   &ArgChanged))
11385     return ExprError();
11386
11387   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
11388     // Class message: transform the receiver type.
11389     TypeSourceInfo *ReceiverTypeInfo
11390       = getDerived().TransformType(E->getClassReceiverTypeInfo());
11391     if (!ReceiverTypeInfo)
11392       return ExprError();
11393
11394     // If nothing changed, just retain the existing message send.
11395     if (!getDerived().AlwaysRebuild() &&
11396         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
11397       return SemaRef.MaybeBindToTemporary(E);
11398
11399     // Build a new class message send.
11400     SmallVector<SourceLocation, 16> SelLocs;
11401     E->getSelectorLocs(SelLocs);
11402     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
11403                                                E->getSelector(),
11404                                                SelLocs,
11405                                                E->getMethodDecl(),
11406                                                E->getLeftLoc(),
11407                                                Args,
11408                                                E->getRightLoc());
11409   }
11410   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
11411            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
11412     if (!E->getMethodDecl())
11413       return ExprError();
11414
11415     // Build a new class message send to 'super'.
11416     SmallVector<SourceLocation, 16> SelLocs;
11417     E->getSelectorLocs(SelLocs);
11418     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
11419                                                E->getSelector(),
11420                                                SelLocs,
11421                                                E->getReceiverType(),
11422                                                E->getMethodDecl(),
11423                                                E->getLeftLoc(),
11424                                                Args,
11425                                                E->getRightLoc());
11426   }
11427
11428   // Instance message: transform the receiver
11429   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
11430          "Only class and instance messages may be instantiated");
11431   ExprResult Receiver
11432     = getDerived().TransformExpr(E->getInstanceReceiver());
11433   if (Receiver.isInvalid())
11434     return ExprError();
11435
11436   // If nothing changed, just retain the existing message send.
11437   if (!getDerived().AlwaysRebuild() &&
11438       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
11439     return SemaRef.MaybeBindToTemporary(E);
11440
11441   // Build a new instance message send.
11442   SmallVector<SourceLocation, 16> SelLocs;
11443   E->getSelectorLocs(SelLocs);
11444   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
11445                                              E->getSelector(),
11446                                              SelLocs,
11447                                              E->getMethodDecl(),
11448                                              E->getLeftLoc(),
11449                                              Args,
11450                                              E->getRightLoc());
11451 }
11452
11453 template<typename Derived>
11454 ExprResult
11455 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
11456   return E;
11457 }
11458
11459 template<typename Derived>
11460 ExprResult
11461 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
11462   return E;
11463 }
11464
11465 template<typename Derived>
11466 ExprResult
11467 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
11468   // Transform the base expression.
11469   ExprResult Base = getDerived().TransformExpr(E->getBase());
11470   if (Base.isInvalid())
11471     return ExprError();
11472
11473   // We don't need to transform the ivar; it will never change.
11474
11475   // If nothing changed, just retain the existing expression.
11476   if (!getDerived().AlwaysRebuild() &&
11477       Base.get() == E->getBase())
11478     return E;
11479
11480   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
11481                                              E->getLocation(),
11482                                              E->isArrow(), E->isFreeIvar());
11483 }
11484
11485 template<typename Derived>
11486 ExprResult
11487 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
11488   // 'super' and types never change. Property never changes. Just
11489   // retain the existing expression.
11490   if (!E->isObjectReceiver())
11491     return E;
11492
11493   // Transform the base expression.
11494   ExprResult Base = getDerived().TransformExpr(E->getBase());
11495   if (Base.isInvalid())
11496     return ExprError();
11497
11498   // We don't need to transform the property; it will never change.
11499
11500   // If nothing changed, just retain the existing expression.
11501   if (!getDerived().AlwaysRebuild() &&
11502       Base.get() == E->getBase())
11503     return E;
11504
11505   if (E->isExplicitProperty())
11506     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11507                                                    E->getExplicitProperty(),
11508                                                    E->getLocation());
11509
11510   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11511                                                  SemaRef.Context.PseudoObjectTy,
11512                                                  E->getImplicitPropertyGetter(),
11513                                                  E->getImplicitPropertySetter(),
11514                                                  E->getLocation());
11515 }
11516
11517 template<typename Derived>
11518 ExprResult
11519 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
11520   // Transform the base expression.
11521   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
11522   if (Base.isInvalid())
11523     return ExprError();
11524
11525   // Transform the key expression.
11526   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
11527   if (Key.isInvalid())
11528     return ExprError();
11529
11530   // If nothing changed, just retain the existing expression.
11531   if (!getDerived().AlwaysRebuild() &&
11532       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
11533     return E;
11534
11535   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
11536                                                   Base.get(), Key.get(),
11537                                                   E->getAtIndexMethodDecl(),
11538                                                   E->setAtIndexMethodDecl());
11539 }
11540
11541 template<typename Derived>
11542 ExprResult
11543 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
11544   // Transform the base expression.
11545   ExprResult Base = getDerived().TransformExpr(E->getBase());
11546   if (Base.isInvalid())
11547     return ExprError();
11548
11549   // If nothing changed, just retain the existing expression.
11550   if (!getDerived().AlwaysRebuild() &&
11551       Base.get() == E->getBase())
11552     return E;
11553
11554   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
11555                                          E->getOpLoc(),
11556                                          E->isArrow());
11557 }
11558
11559 template<typename Derived>
11560 ExprResult
11561 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
11562   bool ArgumentChanged = false;
11563   SmallVector<Expr*, 8> SubExprs;
11564   SubExprs.reserve(E->getNumSubExprs());
11565   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
11566                                   SubExprs, &ArgumentChanged))
11567     return ExprError();
11568
11569   if (!getDerived().AlwaysRebuild() &&
11570       !ArgumentChanged)
11571     return E;
11572
11573   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
11574                                                SubExprs,
11575                                                E->getRParenLoc());
11576 }
11577
11578 template<typename Derived>
11579 ExprResult
11580 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
11581   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
11582   if (SrcExpr.isInvalid())
11583     return ExprError();
11584
11585   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
11586   if (!Type)
11587     return ExprError();
11588
11589   if (!getDerived().AlwaysRebuild() &&
11590       Type == E->getTypeSourceInfo() &&
11591       SrcExpr.get() == E->getSrcExpr())
11592     return E;
11593
11594   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
11595                                                SrcExpr.get(), Type,
11596                                                E->getRParenLoc());
11597 }
11598
11599 template<typename Derived>
11600 ExprResult
11601 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
11602   BlockDecl *oldBlock = E->getBlockDecl();
11603
11604   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
11605   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
11606
11607   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
11608   blockScope->TheDecl->setBlockMissingReturnType(
11609                          oldBlock->blockMissingReturnType());
11610
11611   SmallVector<ParmVarDecl*, 4> params;
11612   SmallVector<QualType, 4> paramTypes;
11613
11614   const FunctionProtoType *exprFunctionType = E->getFunctionType();
11615
11616   // Parameter substitution.
11617   Sema::ExtParameterInfoBuilder extParamInfos;
11618   if (getDerived().TransformFunctionTypeParams(
11619           E->getCaretLocation(), oldBlock->parameters(), nullptr,
11620           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
11621           extParamInfos)) {
11622     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11623     return ExprError();
11624   }
11625
11626   QualType exprResultType =
11627       getDerived().TransformType(exprFunctionType->getReturnType());
11628
11629   auto epi = exprFunctionType->getExtProtoInfo();
11630   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
11631
11632   QualType functionType =
11633     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
11634   blockScope->FunctionType = functionType;
11635
11636   // Set the parameters on the block decl.
11637   if (!params.empty())
11638     blockScope->TheDecl->setParams(params);
11639
11640   if (!oldBlock->blockMissingReturnType()) {
11641     blockScope->HasImplicitReturnType = false;
11642     blockScope->ReturnType = exprResultType;
11643   }
11644
11645   // Transform the body
11646   StmtResult body = getDerived().TransformStmt(E->getBody());
11647   if (body.isInvalid()) {
11648     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11649     return ExprError();
11650   }
11651
11652 #ifndef NDEBUG
11653   // In builds with assertions, make sure that we captured everything we
11654   // captured before.
11655   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
11656     for (const auto &I : oldBlock->captures()) {
11657       VarDecl *oldCapture = I.getVariable();
11658
11659       // Ignore parameter packs.
11660       if (isa<ParmVarDecl>(oldCapture) &&
11661           cast<ParmVarDecl>(oldCapture)->isParameterPack())
11662         continue;
11663
11664       VarDecl *newCapture =
11665         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
11666                                                  oldCapture));
11667       assert(blockScope->CaptureMap.count(newCapture));
11668     }
11669     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
11670   }
11671 #endif
11672
11673   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
11674                                     /*Scope=*/nullptr);
11675 }
11676
11677 template<typename Derived>
11678 ExprResult
11679 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
11680   llvm_unreachable("Cannot transform asType expressions yet");
11681 }
11682
11683 template<typename Derived>
11684 ExprResult
11685 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
11686   QualType RetTy = getDerived().TransformType(E->getType());
11687   bool ArgumentChanged = false;
11688   SmallVector<Expr*, 8> SubExprs;
11689   SubExprs.reserve(E->getNumSubExprs());
11690   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
11691                                   SubExprs, &ArgumentChanged))
11692     return ExprError();
11693
11694   if (!getDerived().AlwaysRebuild() &&
11695       !ArgumentChanged)
11696     return E;
11697
11698   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
11699                                         RetTy, E->getOp(), E->getRParenLoc());
11700 }
11701
11702 //===----------------------------------------------------------------------===//
11703 // Type reconstruction
11704 //===----------------------------------------------------------------------===//
11705
11706 template<typename Derived>
11707 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
11708                                                     SourceLocation Star) {
11709   return SemaRef.BuildPointerType(PointeeType, Star,
11710                                   getDerived().getBaseEntity());
11711 }
11712
11713 template<typename Derived>
11714 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
11715                                                          SourceLocation Star) {
11716   return SemaRef.BuildBlockPointerType(PointeeType, Star,
11717                                        getDerived().getBaseEntity());
11718 }
11719
11720 template<typename Derived>
11721 QualType
11722 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
11723                                              bool WrittenAsLValue,
11724                                              SourceLocation Sigil) {
11725   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
11726                                     Sigil, getDerived().getBaseEntity());
11727 }
11728
11729 template<typename Derived>
11730 QualType
11731 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
11732                                                  QualType ClassType,
11733                                                  SourceLocation Sigil) {
11734   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
11735                                         getDerived().getBaseEntity());
11736 }
11737
11738 template<typename Derived>
11739 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
11740            const ObjCTypeParamDecl *Decl,
11741            SourceLocation ProtocolLAngleLoc,
11742            ArrayRef<ObjCProtocolDecl *> Protocols,
11743            ArrayRef<SourceLocation> ProtocolLocs,
11744            SourceLocation ProtocolRAngleLoc) {
11745   return SemaRef.BuildObjCTypeParamType(Decl,
11746                                         ProtocolLAngleLoc, Protocols,
11747                                         ProtocolLocs, ProtocolRAngleLoc,
11748                                         /*FailOnError=*/true);
11749 }
11750
11751 template<typename Derived>
11752 QualType TreeTransform<Derived>::RebuildObjCObjectType(
11753            QualType BaseType,
11754            SourceLocation Loc,
11755            SourceLocation TypeArgsLAngleLoc,
11756            ArrayRef<TypeSourceInfo *> TypeArgs,
11757            SourceLocation TypeArgsRAngleLoc,
11758            SourceLocation ProtocolLAngleLoc,
11759            ArrayRef<ObjCProtocolDecl *> Protocols,
11760            ArrayRef<SourceLocation> ProtocolLocs,
11761            SourceLocation ProtocolRAngleLoc) {
11762   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
11763                                      TypeArgs, TypeArgsRAngleLoc,
11764                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
11765                                      ProtocolRAngleLoc,
11766                                      /*FailOnError=*/true);
11767 }
11768
11769 template<typename Derived>
11770 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
11771            QualType PointeeType,
11772            SourceLocation Star) {
11773   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
11774 }
11775
11776 template<typename Derived>
11777 QualType
11778 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
11779                                          ArrayType::ArraySizeModifier SizeMod,
11780                                          const llvm::APInt *Size,
11781                                          Expr *SizeExpr,
11782                                          unsigned IndexTypeQuals,
11783                                          SourceRange BracketsRange) {
11784   if (SizeExpr || !Size)
11785     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
11786                                   IndexTypeQuals, BracketsRange,
11787                                   getDerived().getBaseEntity());
11788
11789   QualType Types[] = {
11790     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
11791     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
11792     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
11793   };
11794   const unsigned NumTypes = llvm::array_lengthof(Types);
11795   QualType SizeType;
11796   for (unsigned I = 0; I != NumTypes; ++I)
11797     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
11798       SizeType = Types[I];
11799       break;
11800     }
11801
11802   // Note that we can return a VariableArrayType here in the case where
11803   // the element type was a dependent VariableArrayType.
11804   IntegerLiteral *ArraySize
11805       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
11806                                /*FIXME*/BracketsRange.getBegin());
11807   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
11808                                 IndexTypeQuals, BracketsRange,
11809                                 getDerived().getBaseEntity());
11810 }
11811
11812 template<typename Derived>
11813 QualType
11814 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
11815                                                  ArrayType::ArraySizeModifier SizeMod,
11816                                                  const llvm::APInt &Size,
11817                                                  unsigned IndexTypeQuals,
11818                                                  SourceRange BracketsRange) {
11819   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
11820                                         IndexTypeQuals, BracketsRange);
11821 }
11822
11823 template<typename Derived>
11824 QualType
11825 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
11826                                           ArrayType::ArraySizeModifier SizeMod,
11827                                                  unsigned IndexTypeQuals,
11828                                                    SourceRange BracketsRange) {
11829   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
11830                                        IndexTypeQuals, BracketsRange);
11831 }
11832
11833 template<typename Derived>
11834 QualType
11835 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
11836                                           ArrayType::ArraySizeModifier SizeMod,
11837                                                  Expr *SizeExpr,
11838                                                  unsigned IndexTypeQuals,
11839                                                  SourceRange BracketsRange) {
11840   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
11841                                        SizeExpr,
11842                                        IndexTypeQuals, BracketsRange);
11843 }
11844
11845 template<typename Derived>
11846 QualType
11847 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
11848                                           ArrayType::ArraySizeModifier SizeMod,
11849                                                        Expr *SizeExpr,
11850                                                        unsigned IndexTypeQuals,
11851                                                    SourceRange BracketsRange) {
11852   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
11853                                        SizeExpr,
11854                                        IndexTypeQuals, BracketsRange);
11855 }
11856
11857 template<typename Derived>
11858 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
11859                                                unsigned NumElements,
11860                                                VectorType::VectorKind VecKind) {
11861   // FIXME: semantic checking!
11862   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
11863 }
11864
11865 template<typename Derived>
11866 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
11867                                                       unsigned NumElements,
11868                                                  SourceLocation AttributeLoc) {
11869   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
11870                           NumElements, true);
11871   IntegerLiteral *VectorSize
11872     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
11873                              AttributeLoc);
11874   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
11875 }
11876
11877 template<typename Derived>
11878 QualType
11879 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
11880                                                            Expr *SizeExpr,
11881                                                   SourceLocation AttributeLoc) {
11882   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
11883 }
11884
11885 template<typename Derived>
11886 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
11887     QualType T,
11888     MutableArrayRef<QualType> ParamTypes,
11889     const FunctionProtoType::ExtProtoInfo &EPI) {
11890   return SemaRef.BuildFunctionType(T, ParamTypes,
11891                                    getDerived().getBaseLocation(),
11892                                    getDerived().getBaseEntity(),
11893                                    EPI);
11894 }
11895
11896 template<typename Derived>
11897 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
11898   return SemaRef.Context.getFunctionNoProtoType(T);
11899 }
11900
11901 template<typename Derived>
11902 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
11903                                                             Decl *D) {
11904   assert(D && "no decl found");
11905   if (D->isInvalidDecl()) return QualType();
11906
11907   // FIXME: Doesn't account for ObjCInterfaceDecl!
11908   TypeDecl *Ty;
11909   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
11910     // A valid resolved using typename pack expansion decl can have multiple
11911     // UsingDecls, but they must each have exactly one type, and it must be
11912     // the same type in every case. But we must have at least one expansion!
11913     if (UPD->expansions().empty()) {
11914       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
11915           << UPD->isCXXClassMember() << UPD;
11916       return QualType();
11917     }
11918
11919     // We might still have some unresolved types. Try to pick a resolved type
11920     // if we can. The final instantiation will check that the remaining
11921     // unresolved types instantiate to the type we pick.
11922     QualType FallbackT;
11923     QualType T;
11924     for (auto *E : UPD->expansions()) {
11925       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
11926       if (ThisT.isNull())
11927         continue;
11928       else if (ThisT->getAs<UnresolvedUsingType>())
11929         FallbackT = ThisT;
11930       else if (T.isNull())
11931         T = ThisT;
11932       else
11933         assert(getSema().Context.hasSameType(ThisT, T) &&
11934                "mismatched resolved types in using pack expansion");
11935     }
11936     return T.isNull() ? FallbackT : T;
11937   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
11938     assert(Using->hasTypename() &&
11939            "UnresolvedUsingTypenameDecl transformed to non-typename using");
11940
11941     // A valid resolved using typename decl points to exactly one type decl.
11942     assert(++Using->shadow_begin() == Using->shadow_end());
11943     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
11944   } else {
11945     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
11946            "UnresolvedUsingTypenameDecl transformed to non-using decl");
11947     Ty = cast<UnresolvedUsingTypenameDecl>(D);
11948   }
11949
11950   return SemaRef.Context.getTypeDeclType(Ty);
11951 }
11952
11953 template<typename Derived>
11954 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
11955                                                        SourceLocation Loc) {
11956   return SemaRef.BuildTypeofExprType(E, Loc);
11957 }
11958
11959 template<typename Derived>
11960 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
11961   return SemaRef.Context.getTypeOfType(Underlying);
11962 }
11963
11964 template<typename Derived>
11965 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
11966                                                      SourceLocation Loc) {
11967   return SemaRef.BuildDecltypeType(E, Loc);
11968 }
11969
11970 template<typename Derived>
11971 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
11972                                             UnaryTransformType::UTTKind UKind,
11973                                             SourceLocation Loc) {
11974   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
11975 }
11976
11977 template<typename Derived>
11978 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
11979                                                       TemplateName Template,
11980                                              SourceLocation TemplateNameLoc,
11981                                      TemplateArgumentListInfo &TemplateArgs) {
11982   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
11983 }
11984
11985 template<typename Derived>
11986 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
11987                                                    SourceLocation KWLoc) {
11988   return SemaRef.BuildAtomicType(ValueType, KWLoc);
11989 }
11990
11991 template<typename Derived>
11992 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
11993                                                  SourceLocation KWLoc,
11994                                                  bool isReadPipe) {
11995   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
11996                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
11997 }
11998
11999 template<typename Derived>
12000 TemplateName
12001 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12002                                             bool TemplateKW,
12003                                             TemplateDecl *Template) {
12004   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
12005                                                   Template);
12006 }
12007
12008 template<typename Derived>
12009 TemplateName
12010 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12011                                             const IdentifierInfo &Name,
12012                                             SourceLocation NameLoc,
12013                                             QualType ObjectType,
12014                                             NamedDecl *FirstQualifierInScope) {
12015   UnqualifiedId TemplateName;
12016   TemplateName.setIdentifier(&Name, NameLoc);
12017   Sema::TemplateTy Template;
12018   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12019   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12020                                        SS, TemplateKWLoc, TemplateName,
12021                                        ParsedType::make(ObjectType),
12022                                        /*EnteringContext=*/false,
12023                                        Template);
12024   return Template.get();
12025 }
12026
12027 template<typename Derived>
12028 TemplateName
12029 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12030                                             OverloadedOperatorKind Operator,
12031                                             SourceLocation NameLoc,
12032                                             QualType ObjectType) {
12033   UnqualifiedId Name;
12034   // FIXME: Bogus location information.
12035   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
12036   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
12037   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12038   Sema::TemplateTy Template;
12039   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12040                                        SS, TemplateKWLoc, Name,
12041                                        ParsedType::make(ObjectType),
12042                                        /*EnteringContext=*/false,
12043                                        Template);
12044   return Template.get();
12045 }
12046
12047 template<typename Derived>
12048 ExprResult
12049 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
12050                                                    SourceLocation OpLoc,
12051                                                    Expr *OrigCallee,
12052                                                    Expr *First,
12053                                                    Expr *Second) {
12054   Expr *Callee = OrigCallee->IgnoreParenCasts();
12055   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
12056
12057   if (First->getObjectKind() == OK_ObjCProperty) {
12058     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12059     if (BinaryOperator::isAssignmentOp(Opc))
12060       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
12061                                                  First, Second);
12062     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
12063     if (Result.isInvalid())
12064       return ExprError();
12065     First = Result.get();
12066   }
12067
12068   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
12069     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
12070     if (Result.isInvalid())
12071       return ExprError();
12072     Second = Result.get();
12073   }
12074
12075   // Determine whether this should be a builtin operation.
12076   if (Op == OO_Subscript) {
12077     if (!First->getType()->isOverloadableType() &&
12078         !Second->getType()->isOverloadableType())
12079       return getSema().CreateBuiltinArraySubscriptExpr(First,
12080                                                        Callee->getLocStart(),
12081                                                        Second, OpLoc);
12082   } else if (Op == OO_Arrow) {
12083     // -> is never a builtin operation.
12084     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
12085   } else if (Second == nullptr || isPostIncDec) {
12086     if (!First->getType()->isOverloadableType()) {
12087       // The argument is not of overloadable type, so try to create a
12088       // built-in unary operation.
12089       UnaryOperatorKind Opc
12090         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12091
12092       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
12093     }
12094   } else {
12095     if (!First->getType()->isOverloadableType() &&
12096         !Second->getType()->isOverloadableType()) {
12097       // Neither of the arguments is an overloadable type, so try to
12098       // create a built-in binary operation.
12099       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12100       ExprResult Result
12101         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
12102       if (Result.isInvalid())
12103         return ExprError();
12104
12105       return Result;
12106     }
12107   }
12108
12109   // Compute the transformed set of functions (and function templates) to be
12110   // used during overload resolution.
12111   UnresolvedSet<16> Functions;
12112
12113   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12114     assert(ULE->requiresADL());
12115     Functions.append(ULE->decls_begin(), ULE->decls_end());
12116   } else {
12117     // If we've resolved this to a particular non-member function, just call
12118     // that function. If we resolved it to a member function,
12119     // CreateOverloaded* will find that function for us.
12120     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
12121     if (!isa<CXXMethodDecl>(ND))
12122       Functions.addDecl(ND);
12123   }
12124
12125   // Add any functions found via argument-dependent lookup.
12126   Expr *Args[2] = { First, Second };
12127   unsigned NumArgs = 1 + (Second != nullptr);
12128
12129   // Create the overloaded operator invocation for unary operators.
12130   if (NumArgs == 1 || isPostIncDec) {
12131     UnaryOperatorKind Opc
12132       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12133     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
12134   }
12135
12136   if (Op == OO_Subscript) {
12137     SourceLocation LBrace;
12138     SourceLocation RBrace;
12139
12140     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
12141         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
12142         LBrace = SourceLocation::getFromRawEncoding(
12143                     NameLoc.CXXOperatorName.BeginOpNameLoc);
12144         RBrace = SourceLocation::getFromRawEncoding(
12145                     NameLoc.CXXOperatorName.EndOpNameLoc);
12146     } else {
12147         LBrace = Callee->getLocStart();
12148         RBrace = OpLoc;
12149     }
12150
12151     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
12152                                                       First, Second);
12153   }
12154
12155   // Create the overloaded operator invocation for binary operators.
12156   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12157   ExprResult Result
12158     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
12159   if (Result.isInvalid())
12160     return ExprError();
12161
12162   return Result;
12163 }
12164
12165 template<typename Derived>
12166 ExprResult
12167 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
12168                                                      SourceLocation OperatorLoc,
12169                                                        bool isArrow,
12170                                                        CXXScopeSpec &SS,
12171                                                      TypeSourceInfo *ScopeType,
12172                                                        SourceLocation CCLoc,
12173                                                        SourceLocation TildeLoc,
12174                                         PseudoDestructorTypeStorage Destroyed) {
12175   QualType BaseType = Base->getType();
12176   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
12177       (!isArrow && !BaseType->getAs<RecordType>()) ||
12178       (isArrow && BaseType->getAs<PointerType>() &&
12179        !BaseType->getAs<PointerType>()->getPointeeType()
12180                                               ->template getAs<RecordType>())){
12181     // This pseudo-destructor expression is still a pseudo-destructor.
12182     return SemaRef.BuildPseudoDestructorExpr(
12183         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
12184         CCLoc, TildeLoc, Destroyed);
12185   }
12186
12187   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
12188   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
12189                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
12190   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
12191   NameInfo.setNamedTypeInfo(DestroyedType);
12192
12193   // The scope type is now known to be a valid nested name specifier
12194   // component. Tack it on to the end of the nested name specifier.
12195   if (ScopeType) {
12196     if (!ScopeType->getType()->getAs<TagType>()) {
12197       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
12198                      diag::err_expected_class_or_namespace)
12199           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
12200       return ExprError();
12201     }
12202     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
12203               CCLoc);
12204   }
12205
12206   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12207   return getSema().BuildMemberReferenceExpr(Base, BaseType,
12208                                             OperatorLoc, isArrow,
12209                                             SS, TemplateKWLoc,
12210                                             /*FIXME: FirstQualifier*/ nullptr,
12211                                             NameInfo,
12212                                             /*TemplateArgs*/ nullptr,
12213                                             /*S*/nullptr);
12214 }
12215
12216 template<typename Derived>
12217 StmtResult
12218 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
12219   SourceLocation Loc = S->getLocStart();
12220   CapturedDecl *CD = S->getCapturedDecl();
12221   unsigned NumParams = CD->getNumParams();
12222   unsigned ContextParamPos = CD->getContextParamPosition();
12223   SmallVector<Sema::CapturedParamNameType, 4> Params;
12224   for (unsigned I = 0; I < NumParams; ++I) {
12225     if (I != ContextParamPos) {
12226       Params.push_back(
12227              std::make_pair(
12228                   CD->getParam(I)->getName(),
12229                   getDerived().TransformType(CD->getParam(I)->getType())));
12230     } else {
12231       Params.push_back(std::make_pair(StringRef(), QualType()));
12232     }
12233   }
12234   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
12235                                      S->getCapturedRegionKind(), Params);
12236   StmtResult Body;
12237   {
12238     Sema::CompoundScopeRAII CompoundScope(getSema());
12239     Body = getDerived().TransformStmt(S->getCapturedStmt());
12240   }
12241
12242   if (Body.isInvalid()) {
12243     getSema().ActOnCapturedRegionError();
12244     return StmtError();
12245   }
12246
12247   return getSema().ActOnCapturedRegionEnd(Body.get());
12248 }
12249
12250 } // end namespace clang
12251
12252 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H