]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Sema/TreeTransform.h
Merge llvm, clang, compiler-rt, libc++, lld and lldb release_40 branch
[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   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
8822   if (MemberNameInfo.getName()) {
8823     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
8824     if (!MemberNameInfo.getName())
8825       return ExprError();
8826   }
8827
8828   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
8829                                         E->isArrow(),
8830                                         QualifierLoc,
8831                                         TemplateKWLoc,
8832                                         MemberNameInfo,
8833                                         Member,
8834                                         FoundDecl,
8835                                         (E->hasExplicitTemplateArgs()
8836                                            ? &TransArgs : nullptr),
8837                                         FirstQualifierInScope);
8838 }
8839
8840 template<typename Derived>
8841 ExprResult
8842 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
8843   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8844   if (LHS.isInvalid())
8845     return ExprError();
8846
8847   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8848   if (RHS.isInvalid())
8849     return ExprError();
8850
8851   if (!getDerived().AlwaysRebuild() &&
8852       LHS.get() == E->getLHS() &&
8853       RHS.get() == E->getRHS())
8854     return E;
8855
8856   Sema::FPContractStateRAII FPContractState(getSema());
8857   getSema().FPFeatures.fp_contract = E->isFPContractable();
8858
8859   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
8860                                             LHS.get(), RHS.get());
8861 }
8862
8863 template<typename Derived>
8864 ExprResult
8865 TreeTransform<Derived>::TransformCompoundAssignOperator(
8866                                                       CompoundAssignOperator *E) {
8867   return getDerived().TransformBinaryOperator(E);
8868 }
8869
8870 template<typename Derived>
8871 ExprResult TreeTransform<Derived>::
8872 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
8873   // Just rebuild the common and RHS expressions and see whether we
8874   // get any changes.
8875
8876   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
8877   if (commonExpr.isInvalid())
8878     return ExprError();
8879
8880   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
8881   if (rhs.isInvalid())
8882     return ExprError();
8883
8884   if (!getDerived().AlwaysRebuild() &&
8885       commonExpr.get() == e->getCommon() &&
8886       rhs.get() == e->getFalseExpr())
8887     return e;
8888
8889   return getDerived().RebuildConditionalOperator(commonExpr.get(),
8890                                                  e->getQuestionLoc(),
8891                                                  nullptr,
8892                                                  e->getColonLoc(),
8893                                                  rhs.get());
8894 }
8895
8896 template<typename Derived>
8897 ExprResult
8898 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
8899   ExprResult Cond = getDerived().TransformExpr(E->getCond());
8900   if (Cond.isInvalid())
8901     return ExprError();
8902
8903   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8904   if (LHS.isInvalid())
8905     return ExprError();
8906
8907   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8908   if (RHS.isInvalid())
8909     return ExprError();
8910
8911   if (!getDerived().AlwaysRebuild() &&
8912       Cond.get() == E->getCond() &&
8913       LHS.get() == E->getLHS() &&
8914       RHS.get() == E->getRHS())
8915     return E;
8916
8917   return getDerived().RebuildConditionalOperator(Cond.get(),
8918                                                  E->getQuestionLoc(),
8919                                                  LHS.get(),
8920                                                  E->getColonLoc(),
8921                                                  RHS.get());
8922 }
8923
8924 template<typename Derived>
8925 ExprResult
8926 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
8927   // Implicit casts are eliminated during transformation, since they
8928   // will be recomputed by semantic analysis after transformation.
8929   return getDerived().TransformExpr(E->getSubExprAsWritten());
8930 }
8931
8932 template<typename Derived>
8933 ExprResult
8934 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
8935   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8936   if (!Type)
8937     return ExprError();
8938
8939   ExprResult SubExpr
8940     = getDerived().TransformExpr(E->getSubExprAsWritten());
8941   if (SubExpr.isInvalid())
8942     return ExprError();
8943
8944   if (!getDerived().AlwaysRebuild() &&
8945       Type == E->getTypeInfoAsWritten() &&
8946       SubExpr.get() == E->getSubExpr())
8947     return E;
8948
8949   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
8950                                             Type,
8951                                             E->getRParenLoc(),
8952                                             SubExpr.get());
8953 }
8954
8955 template<typename Derived>
8956 ExprResult
8957 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
8958   TypeSourceInfo *OldT = E->getTypeSourceInfo();
8959   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
8960   if (!NewT)
8961     return ExprError();
8962
8963   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
8964   if (Init.isInvalid())
8965     return ExprError();
8966
8967   if (!getDerived().AlwaysRebuild() &&
8968       OldT == NewT &&
8969       Init.get() == E->getInitializer())
8970     return SemaRef.MaybeBindToTemporary(E);
8971
8972   // Note: the expression type doesn't necessarily match the
8973   // type-as-written, but that's okay, because it should always be
8974   // derivable from the initializer.
8975
8976   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
8977                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
8978                                                  Init.get());
8979 }
8980
8981 template<typename Derived>
8982 ExprResult
8983 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
8984   ExprResult Base = getDerived().TransformExpr(E->getBase());
8985   if (Base.isInvalid())
8986     return ExprError();
8987
8988   if (!getDerived().AlwaysRebuild() &&
8989       Base.get() == E->getBase())
8990     return E;
8991
8992   // FIXME: Bad source location
8993   SourceLocation FakeOperatorLoc =
8994       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
8995   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
8996                                                   E->getAccessorLoc(),
8997                                                   E->getAccessor());
8998 }
8999
9000 template<typename Derived>
9001 ExprResult
9002 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
9003   if (InitListExpr *Syntactic = E->getSyntacticForm())
9004     E = Syntactic;
9005
9006   bool InitChanged = false;
9007
9008   SmallVector<Expr*, 4> Inits;
9009   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
9010                                   Inits, &InitChanged))
9011     return ExprError();
9012
9013   if (!getDerived().AlwaysRebuild() && !InitChanged) {
9014     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
9015     // in some cases. We can't reuse it in general, because the syntactic and
9016     // semantic forms are linked, and we can't know that semantic form will
9017     // match even if the syntactic form does.
9018   }
9019
9020   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
9021                                       E->getRBraceLoc(), E->getType());
9022 }
9023
9024 template<typename Derived>
9025 ExprResult
9026 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
9027   Designation Desig;
9028
9029   // transform the initializer value
9030   ExprResult Init = getDerived().TransformExpr(E->getInit());
9031   if (Init.isInvalid())
9032     return ExprError();
9033
9034   // transform the designators.
9035   SmallVector<Expr*, 4> ArrayExprs;
9036   bool ExprChanged = false;
9037   for (const DesignatedInitExpr::Designator &D : E->designators()) {
9038     if (D.isFieldDesignator()) {
9039       Desig.AddDesignator(Designator::getField(D.getFieldName(),
9040                                                D.getDotLoc(),
9041                                                D.getFieldLoc()));
9042       if (D.getField()) {
9043         FieldDecl *Field = cast_or_null<FieldDecl>(
9044             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
9045         if (Field != D.getField())
9046           // Rebuild the expression when the transformed FieldDecl is
9047           // different to the already assigned FieldDecl.
9048           ExprChanged = true;
9049       } else {
9050         // Ensure that the designator expression is rebuilt when there isn't
9051         // a resolved FieldDecl in the designator as we don't want to assign
9052         // a FieldDecl to a pattern designator that will be instantiated again.
9053         ExprChanged = true;
9054       }
9055       continue;
9056     }
9057
9058     if (D.isArrayDesignator()) {
9059       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
9060       if (Index.isInvalid())
9061         return ExprError();
9062
9063       Desig.AddDesignator(
9064           Designator::getArray(Index.get(), D.getLBracketLoc()));
9065
9066       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
9067       ArrayExprs.push_back(Index.get());
9068       continue;
9069     }
9070
9071     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9072     ExprResult Start
9073       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9074     if (Start.isInvalid())
9075       return ExprError();
9076
9077     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9078     if (End.isInvalid())
9079       return ExprError();
9080
9081     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9082                                                   End.get(),
9083                                                   D.getLBracketLoc(),
9084                                                   D.getEllipsisLoc()));
9085
9086     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9087                   End.get() != E->getArrayRangeEnd(D);
9088
9089     ArrayExprs.push_back(Start.get());
9090     ArrayExprs.push_back(End.get());
9091   }
9092
9093   if (!getDerived().AlwaysRebuild() &&
9094       Init.get() == E->getInit() &&
9095       !ExprChanged)
9096     return E;
9097
9098   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9099                                                 E->getEqualOrColonLoc(),
9100                                                 E->usesGNUSyntax(), Init.get());
9101 }
9102
9103 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9104 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9105 template<typename Derived>
9106 ExprResult
9107 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9108     DesignatedInitUpdateExpr *E) {
9109   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9110                    "initializer");
9111   return ExprError();
9112 }
9113
9114 template<typename Derived>
9115 ExprResult
9116 TreeTransform<Derived>::TransformNoInitExpr(
9117     NoInitExpr *E) {
9118   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9119   return ExprError();
9120 }
9121
9122 template<typename Derived>
9123 ExprResult
9124 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9125   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9126   return ExprError();
9127 }
9128
9129 template<typename Derived>
9130 ExprResult
9131 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9132   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9133   return ExprError();
9134 }
9135
9136 template<typename Derived>
9137 ExprResult
9138 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9139                                                      ImplicitValueInitExpr *E) {
9140   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
9141
9142   // FIXME: Will we ever have proper type location here? Will we actually
9143   // need to transform the type?
9144   QualType T = getDerived().TransformType(E->getType());
9145   if (T.isNull())
9146     return ExprError();
9147
9148   if (!getDerived().AlwaysRebuild() &&
9149       T == E->getType())
9150     return E;
9151
9152   return getDerived().RebuildImplicitValueInitExpr(T);
9153 }
9154
9155 template<typename Derived>
9156 ExprResult
9157 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
9158   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
9159   if (!TInfo)
9160     return ExprError();
9161
9162   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9163   if (SubExpr.isInvalid())
9164     return ExprError();
9165
9166   if (!getDerived().AlwaysRebuild() &&
9167       TInfo == E->getWrittenTypeInfo() &&
9168       SubExpr.get() == E->getSubExpr())
9169     return E;
9170
9171   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
9172                                        TInfo, E->getRParenLoc());
9173 }
9174
9175 template<typename Derived>
9176 ExprResult
9177 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
9178   bool ArgumentChanged = false;
9179   SmallVector<Expr*, 4> Inits;
9180   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
9181                      &ArgumentChanged))
9182     return ExprError();
9183
9184   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
9185                                            Inits,
9186                                            E->getRParenLoc());
9187 }
9188
9189 /// \brief Transform an address-of-label expression.
9190 ///
9191 /// By default, the transformation of an address-of-label expression always
9192 /// rebuilds the expression, so that the label identifier can be resolved to
9193 /// the corresponding label statement by semantic analysis.
9194 template<typename Derived>
9195 ExprResult
9196 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
9197   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
9198                                         E->getLabel());
9199   if (!LD)
9200     return ExprError();
9201
9202   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9203                                            cast<LabelDecl>(LD));
9204 }
9205
9206 template<typename Derived>
9207 ExprResult
9208 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9209   SemaRef.ActOnStartStmtExpr();
9210   StmtResult SubStmt
9211     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9212   if (SubStmt.isInvalid()) {
9213     SemaRef.ActOnStmtExprError();
9214     return ExprError();
9215   }
9216
9217   if (!getDerived().AlwaysRebuild() &&
9218       SubStmt.get() == E->getSubStmt()) {
9219     // Calling this an 'error' is unintuitive, but it does the right thing.
9220     SemaRef.ActOnStmtExprError();
9221     return SemaRef.MaybeBindToTemporary(E);
9222   }
9223
9224   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9225                                       SubStmt.get(),
9226                                       E->getRParenLoc());
9227 }
9228
9229 template<typename Derived>
9230 ExprResult
9231 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9232   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9233   if (Cond.isInvalid())
9234     return ExprError();
9235
9236   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9237   if (LHS.isInvalid())
9238     return ExprError();
9239
9240   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9241   if (RHS.isInvalid())
9242     return ExprError();
9243
9244   if (!getDerived().AlwaysRebuild() &&
9245       Cond.get() == E->getCond() &&
9246       LHS.get() == E->getLHS() &&
9247       RHS.get() == E->getRHS())
9248     return E;
9249
9250   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9251                                         Cond.get(), LHS.get(), RHS.get(),
9252                                         E->getRParenLoc());
9253 }
9254
9255 template<typename Derived>
9256 ExprResult
9257 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9258   return E;
9259 }
9260
9261 template<typename Derived>
9262 ExprResult
9263 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9264   switch (E->getOperator()) {
9265   case OO_New:
9266   case OO_Delete:
9267   case OO_Array_New:
9268   case OO_Array_Delete:
9269     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9270
9271   case OO_Call: {
9272     // This is a call to an object's operator().
9273     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9274
9275     // Transform the object itself.
9276     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9277     if (Object.isInvalid())
9278       return ExprError();
9279
9280     // FIXME: Poor location information
9281     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
9282         static_cast<Expr *>(Object.get())->getLocEnd());
9283
9284     // Transform the call arguments.
9285     SmallVector<Expr*, 8> Args;
9286     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
9287                                     Args))
9288       return ExprError();
9289
9290     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
9291                                         Args,
9292                                         E->getLocEnd());
9293   }
9294
9295 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
9296   case OO_##Name:
9297 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
9298 #include "clang/Basic/OperatorKinds.def"
9299   case OO_Subscript:
9300     // Handled below.
9301     break;
9302
9303   case OO_Conditional:
9304     llvm_unreachable("conditional operator is not actually overloadable");
9305
9306   case OO_None:
9307   case NUM_OVERLOADED_OPERATORS:
9308     llvm_unreachable("not an overloaded operator?");
9309   }
9310
9311   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9312   if (Callee.isInvalid())
9313     return ExprError();
9314
9315   ExprResult First;
9316   if (E->getOperator() == OO_Amp)
9317     First = getDerived().TransformAddressOfOperand(E->getArg(0));
9318   else
9319     First = getDerived().TransformExpr(E->getArg(0));
9320   if (First.isInvalid())
9321     return ExprError();
9322
9323   ExprResult Second;
9324   if (E->getNumArgs() == 2) {
9325     Second = getDerived().TransformExpr(E->getArg(1));
9326     if (Second.isInvalid())
9327       return ExprError();
9328   }
9329
9330   if (!getDerived().AlwaysRebuild() &&
9331       Callee.get() == E->getCallee() &&
9332       First.get() == E->getArg(0) &&
9333       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
9334     return SemaRef.MaybeBindToTemporary(E);
9335
9336   Sema::FPContractStateRAII FPContractState(getSema());
9337   getSema().FPFeatures.fp_contract = E->isFPContractable();
9338
9339   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
9340                                                  E->getOperatorLoc(),
9341                                                  Callee.get(),
9342                                                  First.get(),
9343                                                  Second.get());
9344 }
9345
9346 template<typename Derived>
9347 ExprResult
9348 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
9349   return getDerived().TransformCallExpr(E);
9350 }
9351
9352 template<typename Derived>
9353 ExprResult
9354 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
9355   // Transform the callee.
9356   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9357   if (Callee.isInvalid())
9358     return ExprError();
9359
9360   // Transform exec config.
9361   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
9362   if (EC.isInvalid())
9363     return ExprError();
9364
9365   // Transform arguments.
9366   bool ArgChanged = false;
9367   SmallVector<Expr*, 8> Args;
9368   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9369                                   &ArgChanged))
9370     return ExprError();
9371
9372   if (!getDerived().AlwaysRebuild() &&
9373       Callee.get() == E->getCallee() &&
9374       !ArgChanged)
9375     return SemaRef.MaybeBindToTemporary(E);
9376
9377   // FIXME: Wrong source location information for the '('.
9378   SourceLocation FakeLParenLoc
9379     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9380   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9381                                       Args,
9382                                       E->getRParenLoc(), EC.get());
9383 }
9384
9385 template<typename Derived>
9386 ExprResult
9387 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
9388   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9389   if (!Type)
9390     return ExprError();
9391
9392   ExprResult SubExpr
9393     = getDerived().TransformExpr(E->getSubExprAsWritten());
9394   if (SubExpr.isInvalid())
9395     return ExprError();
9396
9397   if (!getDerived().AlwaysRebuild() &&
9398       Type == E->getTypeInfoAsWritten() &&
9399       SubExpr.get() == E->getSubExpr())
9400     return E;
9401   return getDerived().RebuildCXXNamedCastExpr(
9402       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
9403       Type, E->getAngleBrackets().getEnd(),
9404       // FIXME. this should be '(' location
9405       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
9406 }
9407
9408 template<typename Derived>
9409 ExprResult
9410 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
9411   return getDerived().TransformCXXNamedCastExpr(E);
9412 }
9413
9414 template<typename Derived>
9415 ExprResult
9416 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
9417   return getDerived().TransformCXXNamedCastExpr(E);
9418 }
9419
9420 template<typename Derived>
9421 ExprResult
9422 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
9423                                                       CXXReinterpretCastExpr *E) {
9424   return getDerived().TransformCXXNamedCastExpr(E);
9425 }
9426
9427 template<typename Derived>
9428 ExprResult
9429 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
9430   return getDerived().TransformCXXNamedCastExpr(E);
9431 }
9432
9433 template<typename Derived>
9434 ExprResult
9435 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
9436                                                      CXXFunctionalCastExpr *E) {
9437   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9438   if (!Type)
9439     return ExprError();
9440
9441   ExprResult SubExpr
9442     = getDerived().TransformExpr(E->getSubExprAsWritten());
9443   if (SubExpr.isInvalid())
9444     return ExprError();
9445
9446   if (!getDerived().AlwaysRebuild() &&
9447       Type == E->getTypeInfoAsWritten() &&
9448       SubExpr.get() == E->getSubExpr())
9449     return E;
9450
9451   return getDerived().RebuildCXXFunctionalCastExpr(Type,
9452                                                    E->getLParenLoc(),
9453                                                    SubExpr.get(),
9454                                                    E->getRParenLoc());
9455 }
9456
9457 template<typename Derived>
9458 ExprResult
9459 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
9460   if (E->isTypeOperand()) {
9461     TypeSourceInfo *TInfo
9462       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9463     if (!TInfo)
9464       return ExprError();
9465
9466     if (!getDerived().AlwaysRebuild() &&
9467         TInfo == E->getTypeOperandSourceInfo())
9468       return E;
9469
9470     return getDerived().RebuildCXXTypeidExpr(E->getType(),
9471                                              E->getLocStart(),
9472                                              TInfo,
9473                                              E->getLocEnd());
9474   }
9475
9476   // We don't know whether the subexpression is potentially evaluated until
9477   // after we perform semantic analysis.  We speculatively assume it is
9478   // unevaluated; it will get fixed later if the subexpression is in fact
9479   // potentially evaluated.
9480   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
9481                                                Sema::ReuseLambdaContextDecl);
9482
9483   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9484   if (SubExpr.isInvalid())
9485     return ExprError();
9486
9487   if (!getDerived().AlwaysRebuild() &&
9488       SubExpr.get() == E->getExprOperand())
9489     return E;
9490
9491   return getDerived().RebuildCXXTypeidExpr(E->getType(),
9492                                            E->getLocStart(),
9493                                            SubExpr.get(),
9494                                            E->getLocEnd());
9495 }
9496
9497 template<typename Derived>
9498 ExprResult
9499 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
9500   if (E->isTypeOperand()) {
9501     TypeSourceInfo *TInfo
9502       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9503     if (!TInfo)
9504       return ExprError();
9505
9506     if (!getDerived().AlwaysRebuild() &&
9507         TInfo == E->getTypeOperandSourceInfo())
9508       return E;
9509
9510     return getDerived().RebuildCXXUuidofExpr(E->getType(),
9511                                              E->getLocStart(),
9512                                              TInfo,
9513                                              E->getLocEnd());
9514   }
9515
9516   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9517
9518   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9519   if (SubExpr.isInvalid())
9520     return ExprError();
9521
9522   if (!getDerived().AlwaysRebuild() &&
9523       SubExpr.get() == E->getExprOperand())
9524     return E;
9525
9526   return getDerived().RebuildCXXUuidofExpr(E->getType(),
9527                                            E->getLocStart(),
9528                                            SubExpr.get(),
9529                                            E->getLocEnd());
9530 }
9531
9532 template<typename Derived>
9533 ExprResult
9534 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
9535   return E;
9536 }
9537
9538 template<typename Derived>
9539 ExprResult
9540 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
9541                                                      CXXNullPtrLiteralExpr *E) {
9542   return E;
9543 }
9544
9545 template<typename Derived>
9546 ExprResult
9547 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
9548   QualType T = getSema().getCurrentThisType();
9549
9550   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
9551     // Make sure that we capture 'this'.
9552     getSema().CheckCXXThisCapture(E->getLocStart());
9553     return E;
9554   }
9555
9556   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
9557 }
9558
9559 template<typename Derived>
9560 ExprResult
9561 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
9562   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9563   if (SubExpr.isInvalid())
9564     return ExprError();
9565
9566   if (!getDerived().AlwaysRebuild() &&
9567       SubExpr.get() == E->getSubExpr())
9568     return E;
9569
9570   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
9571                                           E->isThrownVariableInScope());
9572 }
9573
9574 template<typename Derived>
9575 ExprResult
9576 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
9577   ParmVarDecl *Param
9578     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
9579                                                            E->getParam()));
9580   if (!Param)
9581     return ExprError();
9582
9583   if (!getDerived().AlwaysRebuild() &&
9584       Param == E->getParam())
9585     return E;
9586
9587   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
9588 }
9589
9590 template<typename Derived>
9591 ExprResult
9592 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
9593   FieldDecl *Field
9594     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
9595                                                          E->getField()));
9596   if (!Field)
9597     return ExprError();
9598
9599   if (!getDerived().AlwaysRebuild() && Field == E->getField())
9600     return E;
9601
9602   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
9603 }
9604
9605 template<typename Derived>
9606 ExprResult
9607 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
9608                                                     CXXScalarValueInitExpr *E) {
9609   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9610   if (!T)
9611     return ExprError();
9612
9613   if (!getDerived().AlwaysRebuild() &&
9614       T == E->getTypeSourceInfo())
9615     return E;
9616
9617   return getDerived().RebuildCXXScalarValueInitExpr(T,
9618                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
9619                                                     E->getRParenLoc());
9620 }
9621
9622 template<typename Derived>
9623 ExprResult
9624 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
9625   // Transform the type that we're allocating
9626   TypeSourceInfo *AllocTypeInfo
9627     = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
9628   if (!AllocTypeInfo)
9629     return ExprError();
9630
9631   // Transform the size of the array we're allocating (if any).
9632   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
9633   if (ArraySize.isInvalid())
9634     return ExprError();
9635
9636   // Transform the placement arguments (if any).
9637   bool ArgumentChanged = false;
9638   SmallVector<Expr*, 8> PlacementArgs;
9639   if (getDerived().TransformExprs(E->getPlacementArgs(),
9640                                   E->getNumPlacementArgs(), true,
9641                                   PlacementArgs, &ArgumentChanged))
9642     return ExprError();
9643
9644   // Transform the initializer (if any).
9645   Expr *OldInit = E->getInitializer();
9646   ExprResult NewInit;
9647   if (OldInit)
9648     NewInit = getDerived().TransformInitializer(OldInit, true);
9649   if (NewInit.isInvalid())
9650     return ExprError();
9651
9652   // Transform new operator and delete operator.
9653   FunctionDecl *OperatorNew = nullptr;
9654   if (E->getOperatorNew()) {
9655     OperatorNew = cast_or_null<FunctionDecl>(
9656                                  getDerived().TransformDecl(E->getLocStart(),
9657                                                          E->getOperatorNew()));
9658     if (!OperatorNew)
9659       return ExprError();
9660   }
9661
9662   FunctionDecl *OperatorDelete = nullptr;
9663   if (E->getOperatorDelete()) {
9664     OperatorDelete = cast_or_null<FunctionDecl>(
9665                                    getDerived().TransformDecl(E->getLocStart(),
9666                                                        E->getOperatorDelete()));
9667     if (!OperatorDelete)
9668       return ExprError();
9669   }
9670
9671   if (!getDerived().AlwaysRebuild() &&
9672       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
9673       ArraySize.get() == E->getArraySize() &&
9674       NewInit.get() == OldInit &&
9675       OperatorNew == E->getOperatorNew() &&
9676       OperatorDelete == E->getOperatorDelete() &&
9677       !ArgumentChanged) {
9678     // Mark any declarations we need as referenced.
9679     // FIXME: instantiation-specific.
9680     if (OperatorNew)
9681       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
9682     if (OperatorDelete)
9683       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
9684
9685     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
9686       QualType ElementType
9687         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
9688       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
9689         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
9690         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
9691           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
9692         }
9693       }
9694     }
9695
9696     return E;
9697   }
9698
9699   QualType AllocType = AllocTypeInfo->getType();
9700   if (!ArraySize.get()) {
9701     // If no array size was specified, but the new expression was
9702     // instantiated with an array type (e.g., "new T" where T is
9703     // instantiated with "int[4]"), extract the outer bound from the
9704     // array type as our array size. We do this with constant and
9705     // dependently-sized array types.
9706     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
9707     if (!ArrayT) {
9708       // Do nothing
9709     } else if (const ConstantArrayType *ConsArrayT
9710                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
9711       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
9712                                          SemaRef.Context.getSizeType(),
9713                                          /*FIXME:*/ E->getLocStart());
9714       AllocType = ConsArrayT->getElementType();
9715     } else if (const DependentSizedArrayType *DepArrayT
9716                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
9717       if (DepArrayT->getSizeExpr()) {
9718         ArraySize = DepArrayT->getSizeExpr();
9719         AllocType = DepArrayT->getElementType();
9720       }
9721     }
9722   }
9723
9724   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
9725                                         E->isGlobalNew(),
9726                                         /*FIXME:*/E->getLocStart(),
9727                                         PlacementArgs,
9728                                         /*FIXME:*/E->getLocStart(),
9729                                         E->getTypeIdParens(),
9730                                         AllocType,
9731                                         AllocTypeInfo,
9732                                         ArraySize.get(),
9733                                         E->getDirectInitRange(),
9734                                         NewInit.get());
9735 }
9736
9737 template<typename Derived>
9738 ExprResult
9739 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
9740   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
9741   if (Operand.isInvalid())
9742     return ExprError();
9743
9744   // Transform the delete operator, if known.
9745   FunctionDecl *OperatorDelete = nullptr;
9746   if (E->getOperatorDelete()) {
9747     OperatorDelete = cast_or_null<FunctionDecl>(
9748                                    getDerived().TransformDecl(E->getLocStart(),
9749                                                        E->getOperatorDelete()));
9750     if (!OperatorDelete)
9751       return ExprError();
9752   }
9753
9754   if (!getDerived().AlwaysRebuild() &&
9755       Operand.get() == E->getArgument() &&
9756       OperatorDelete == E->getOperatorDelete()) {
9757     // Mark any declarations we need as referenced.
9758     // FIXME: instantiation-specific.
9759     if (OperatorDelete)
9760       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
9761
9762     if (!E->getArgument()->isTypeDependent()) {
9763       QualType Destroyed = SemaRef.Context.getBaseElementType(
9764                                                          E->getDestroyedType());
9765       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
9766         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
9767         SemaRef.MarkFunctionReferenced(E->getLocStart(),
9768                                        SemaRef.LookupDestructor(Record));
9769       }
9770     }
9771
9772     return E;
9773   }
9774
9775   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
9776                                            E->isGlobalDelete(),
9777                                            E->isArrayForm(),
9778                                            Operand.get());
9779 }
9780
9781 template<typename Derived>
9782 ExprResult
9783 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
9784                                                      CXXPseudoDestructorExpr *E) {
9785   ExprResult Base = getDerived().TransformExpr(E->getBase());
9786   if (Base.isInvalid())
9787     return ExprError();
9788
9789   ParsedType ObjectTypePtr;
9790   bool MayBePseudoDestructor = false;
9791   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
9792                                               E->getOperatorLoc(),
9793                                         E->isArrow()? tok::arrow : tok::period,
9794                                               ObjectTypePtr,
9795                                               MayBePseudoDestructor);
9796   if (Base.isInvalid())
9797     return ExprError();
9798
9799   QualType ObjectType = ObjectTypePtr.get();
9800   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
9801   if (QualifierLoc) {
9802     QualifierLoc
9803       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
9804     if (!QualifierLoc)
9805       return ExprError();
9806   }
9807   CXXScopeSpec SS;
9808   SS.Adopt(QualifierLoc);
9809
9810   PseudoDestructorTypeStorage Destroyed;
9811   if (E->getDestroyedTypeInfo()) {
9812     TypeSourceInfo *DestroyedTypeInfo
9813       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
9814                                                 ObjectType, nullptr, SS);
9815     if (!DestroyedTypeInfo)
9816       return ExprError();
9817     Destroyed = DestroyedTypeInfo;
9818   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
9819     // We aren't likely to be able to resolve the identifier down to a type
9820     // now anyway, so just retain the identifier.
9821     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
9822                                             E->getDestroyedTypeLoc());
9823   } else {
9824     // Look for a destructor known with the given name.
9825     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
9826                                               *E->getDestroyedTypeIdentifier(),
9827                                                 E->getDestroyedTypeLoc(),
9828                                                 /*Scope=*/nullptr,
9829                                                 SS, ObjectTypePtr,
9830                                                 false);
9831     if (!T)
9832       return ExprError();
9833
9834     Destroyed
9835       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
9836                                                  E->getDestroyedTypeLoc());
9837   }
9838
9839   TypeSourceInfo *ScopeTypeInfo = nullptr;
9840   if (E->getScopeTypeInfo()) {
9841     CXXScopeSpec EmptySS;
9842     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
9843                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
9844     if (!ScopeTypeInfo)
9845       return ExprError();
9846   }
9847
9848   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
9849                                                      E->getOperatorLoc(),
9850                                                      E->isArrow(),
9851                                                      SS,
9852                                                      ScopeTypeInfo,
9853                                                      E->getColonColonLoc(),
9854                                                      E->getTildeLoc(),
9855                                                      Destroyed);
9856 }
9857
9858 template <typename Derived>
9859 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
9860                                                         bool RequiresADL,
9861                                                         LookupResult &R) {
9862   // Transform all the decls.
9863   bool AllEmptyPacks = true;
9864   for (auto *OldD : Old->decls()) {
9865     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
9866     if (!InstD) {
9867       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
9868       // This can happen because of dependent hiding.
9869       if (isa<UsingShadowDecl>(OldD))
9870         continue;
9871       else {
9872         R.clear();
9873         return true;
9874       }
9875     }
9876
9877     // Expand using pack declarations.
9878     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
9879     ArrayRef<NamedDecl*> Decls = SingleDecl;
9880     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
9881       Decls = UPD->expansions();
9882
9883     // Expand using declarations.
9884     for (auto *D : Decls) {
9885       if (auto *UD = dyn_cast<UsingDecl>(D)) {
9886         for (auto *SD : UD->shadows())
9887           R.addDecl(SD);
9888       } else {
9889         R.addDecl(D);
9890       }
9891     }
9892
9893     AllEmptyPacks &= Decls.empty();
9894   };
9895
9896   // C++ [temp.res]/8.4.2:
9897   //   The program is ill-formed, no diagnostic required, if [...] lookup for
9898   //   a name in the template definition found a using-declaration, but the
9899   //   lookup in the corresponding scope in the instantiation odoes not find
9900   //   any declarations because the using-declaration was a pack expansion and
9901   //   the corresponding pack is empty
9902   if (AllEmptyPacks && !RequiresADL) {
9903     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
9904         << isa<UnresolvedMemberExpr>(Old) << Old->getNameInfo().getName();
9905     return true;
9906   }
9907
9908   // Resolve a kind, but don't do any further analysis.  If it's
9909   // ambiguous, the callee needs to deal with it.
9910   R.resolveKind();
9911   return false;
9912 }
9913
9914 template<typename Derived>
9915 ExprResult
9916 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
9917                                                   UnresolvedLookupExpr *Old) {
9918   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
9919                  Sema::LookupOrdinaryName);
9920
9921   // Transform the declaration set.
9922   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
9923     return ExprError();
9924
9925   // Rebuild the nested-name qualifier, if present.
9926   CXXScopeSpec SS;
9927   if (Old->getQualifierLoc()) {
9928     NestedNameSpecifierLoc QualifierLoc
9929       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
9930     if (!QualifierLoc)
9931       return ExprError();
9932
9933     SS.Adopt(QualifierLoc);
9934   }
9935
9936   if (Old->getNamingClass()) {
9937     CXXRecordDecl *NamingClass
9938       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
9939                                                             Old->getNameLoc(),
9940                                                         Old->getNamingClass()));
9941     if (!NamingClass) {
9942       R.clear();
9943       return ExprError();
9944     }
9945
9946     R.setNamingClass(NamingClass);
9947   }
9948
9949   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
9950
9951   // If we have neither explicit template arguments, nor the template keyword,
9952   // it's a normal declaration name or member reference.
9953   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
9954     NamedDecl *D = R.getAsSingle<NamedDecl>();
9955     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
9956     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
9957     // give a good diagnostic.
9958     if (D && D->isCXXInstanceMember()) {
9959       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
9960                                                      /*TemplateArgs=*/nullptr,
9961                                                      /*Scope=*/nullptr);
9962     }
9963
9964     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
9965   }
9966
9967   // If we have template arguments, rebuild them, then rebuild the
9968   // templateid expression.
9969   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
9970   if (Old->hasExplicitTemplateArgs() &&
9971       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
9972                                               Old->getNumTemplateArgs(),
9973                                               TransArgs)) {
9974     R.clear();
9975     return ExprError();
9976   }
9977
9978   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
9979                                             Old->requiresADL(), &TransArgs);
9980 }
9981
9982 template<typename Derived>
9983 ExprResult
9984 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
9985   bool ArgChanged = false;
9986   SmallVector<TypeSourceInfo *, 4> Args;
9987   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
9988     TypeSourceInfo *From = E->getArg(I);
9989     TypeLoc FromTL = From->getTypeLoc();
9990     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
9991       TypeLocBuilder TLB;
9992       TLB.reserve(FromTL.getFullDataSize());
9993       QualType To = getDerived().TransformType(TLB, FromTL);
9994       if (To.isNull())
9995         return ExprError();
9996
9997       if (To == From->getType())
9998         Args.push_back(From);
9999       else {
10000         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10001         ArgChanged = true;
10002       }
10003       continue;
10004     }
10005
10006     ArgChanged = true;
10007
10008     // We have a pack expansion. Instantiate it.
10009     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
10010     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
10011     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10012     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
10013
10014     // Determine whether the set of unexpanded parameter packs can and should
10015     // be expanded.
10016     bool Expand = true;
10017     bool RetainExpansion = false;
10018     Optional<unsigned> OrigNumExpansions =
10019         ExpansionTL.getTypePtr()->getNumExpansions();
10020     Optional<unsigned> NumExpansions = OrigNumExpansions;
10021     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
10022                                              PatternTL.getSourceRange(),
10023                                              Unexpanded,
10024                                              Expand, RetainExpansion,
10025                                              NumExpansions))
10026       return ExprError();
10027
10028     if (!Expand) {
10029       // The transform has determined that we should perform a simple
10030       // transformation on the pack expansion, producing another pack
10031       // expansion.
10032       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10033
10034       TypeLocBuilder TLB;
10035       TLB.reserve(From->getTypeLoc().getFullDataSize());
10036
10037       QualType To = getDerived().TransformType(TLB, PatternTL);
10038       if (To.isNull())
10039         return ExprError();
10040
10041       To = getDerived().RebuildPackExpansionType(To,
10042                                                  PatternTL.getSourceRange(),
10043                                                  ExpansionTL.getEllipsisLoc(),
10044                                                  NumExpansions);
10045       if (To.isNull())
10046         return ExprError();
10047
10048       PackExpansionTypeLoc ToExpansionTL
10049         = TLB.push<PackExpansionTypeLoc>(To);
10050       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10051       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10052       continue;
10053     }
10054
10055     // Expand the pack expansion by substituting for each argument in the
10056     // pack(s).
10057     for (unsigned I = 0; I != *NumExpansions; ++I) {
10058       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
10059       TypeLocBuilder TLB;
10060       TLB.reserve(PatternTL.getFullDataSize());
10061       QualType To = getDerived().TransformType(TLB, PatternTL);
10062       if (To.isNull())
10063         return ExprError();
10064
10065       if (To->containsUnexpandedParameterPack()) {
10066         To = getDerived().RebuildPackExpansionType(To,
10067                                                    PatternTL.getSourceRange(),
10068                                                    ExpansionTL.getEllipsisLoc(),
10069                                                    NumExpansions);
10070         if (To.isNull())
10071           return ExprError();
10072
10073         PackExpansionTypeLoc ToExpansionTL
10074           = TLB.push<PackExpansionTypeLoc>(To);
10075         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10076       }
10077
10078       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10079     }
10080
10081     if (!RetainExpansion)
10082       continue;
10083
10084     // If we're supposed to retain a pack expansion, do so by temporarily
10085     // forgetting the partially-substituted parameter pack.
10086     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10087
10088     TypeLocBuilder TLB;
10089     TLB.reserve(From->getTypeLoc().getFullDataSize());
10090
10091     QualType To = getDerived().TransformType(TLB, PatternTL);
10092     if (To.isNull())
10093       return ExprError();
10094
10095     To = getDerived().RebuildPackExpansionType(To,
10096                                                PatternTL.getSourceRange(),
10097                                                ExpansionTL.getEllipsisLoc(),
10098                                                NumExpansions);
10099     if (To.isNull())
10100       return ExprError();
10101
10102     PackExpansionTypeLoc ToExpansionTL
10103       = TLB.push<PackExpansionTypeLoc>(To);
10104     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10105     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10106   }
10107
10108   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10109     return E;
10110
10111   return getDerived().RebuildTypeTrait(E->getTrait(),
10112                                        E->getLocStart(),
10113                                        Args,
10114                                        E->getLocEnd());
10115 }
10116
10117 template<typename Derived>
10118 ExprResult
10119 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10120   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10121   if (!T)
10122     return ExprError();
10123
10124   if (!getDerived().AlwaysRebuild() &&
10125       T == E->getQueriedTypeSourceInfo())
10126     return E;
10127
10128   ExprResult SubExpr;
10129   {
10130     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10131     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10132     if (SubExpr.isInvalid())
10133       return ExprError();
10134
10135     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
10136       return E;
10137   }
10138
10139   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
10140                                             E->getLocStart(),
10141                                             T,
10142                                             SubExpr.get(),
10143                                             E->getLocEnd());
10144 }
10145
10146 template<typename Derived>
10147 ExprResult
10148 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
10149   ExprResult SubExpr;
10150   {
10151     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10152     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
10153     if (SubExpr.isInvalid())
10154       return ExprError();
10155
10156     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
10157       return E;
10158   }
10159
10160   return getDerived().RebuildExpressionTrait(
10161       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
10162 }
10163
10164 template <typename Derived>
10165 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
10166     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
10167     TypeSourceInfo **RecoveryTSI) {
10168   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
10169       DRE, AddrTaken, RecoveryTSI);
10170
10171   // Propagate both errors and recovered types, which return ExprEmpty.
10172   if (!NewDRE.isUsable())
10173     return NewDRE;
10174
10175   // We got an expr, wrap it up in parens.
10176   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
10177     return PE;
10178   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
10179                                        PE->getRParen());
10180 }
10181
10182 template <typename Derived>
10183 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10184     DependentScopeDeclRefExpr *E) {
10185   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
10186                                             nullptr);
10187 }
10188
10189 template<typename Derived>
10190 ExprResult
10191 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10192                                                DependentScopeDeclRefExpr *E,
10193                                                bool IsAddressOfOperand,
10194                                                TypeSourceInfo **RecoveryTSI) {
10195   assert(E->getQualifierLoc());
10196   NestedNameSpecifierLoc QualifierLoc
10197   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10198   if (!QualifierLoc)
10199     return ExprError();
10200   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10201
10202   // TODO: If this is a conversion-function-id, verify that the
10203   // destination type name (if present) resolves the same way after
10204   // instantiation as it did in the local scope.
10205
10206   DeclarationNameInfo NameInfo
10207     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
10208   if (!NameInfo.getName())
10209     return ExprError();
10210
10211   if (!E->hasExplicitTemplateArgs()) {
10212     if (!getDerived().AlwaysRebuild() &&
10213         QualifierLoc == E->getQualifierLoc() &&
10214         // Note: it is sufficient to compare the Name component of NameInfo:
10215         // if name has not changed, DNLoc has not changed either.
10216         NameInfo.getName() == E->getDeclName())
10217       return E;
10218
10219     return getDerived().RebuildDependentScopeDeclRefExpr(
10220         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
10221         IsAddressOfOperand, RecoveryTSI);
10222   }
10223
10224   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10225   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10226                                               E->getNumTemplateArgs(),
10227                                               TransArgs))
10228     return ExprError();
10229
10230   return getDerived().RebuildDependentScopeDeclRefExpr(
10231       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10232       RecoveryTSI);
10233 }
10234
10235 template<typename Derived>
10236 ExprResult
10237 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10238   // CXXConstructExprs other than for list-initialization and
10239   // CXXTemporaryObjectExpr are always implicit, so when we have
10240   // a 1-argument construction we just transform that argument.
10241   if ((E->getNumArgs() == 1 ||
10242        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10243       (!getDerived().DropCallArgument(E->getArg(0))) &&
10244       !E->isListInitialization())
10245     return getDerived().TransformExpr(E->getArg(0));
10246
10247   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
10248
10249   QualType T = getDerived().TransformType(E->getType());
10250   if (T.isNull())
10251     return ExprError();
10252
10253   CXXConstructorDecl *Constructor
10254     = cast_or_null<CXXConstructorDecl>(
10255                                 getDerived().TransformDecl(E->getLocStart(),
10256                                                          E->getConstructor()));
10257   if (!Constructor)
10258     return ExprError();
10259
10260   bool ArgumentChanged = false;
10261   SmallVector<Expr*, 8> Args;
10262   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10263                                   &ArgumentChanged))
10264     return ExprError();
10265
10266   if (!getDerived().AlwaysRebuild() &&
10267       T == E->getType() &&
10268       Constructor == E->getConstructor() &&
10269       !ArgumentChanged) {
10270     // Mark the constructor as referenced.
10271     // FIXME: Instantiation-specific
10272     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10273     return E;
10274   }
10275
10276   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
10277                                               Constructor,
10278                                               E->isElidable(), Args,
10279                                               E->hadMultipleCandidates(),
10280                                               E->isListInitialization(),
10281                                               E->isStdInitListInitialization(),
10282                                               E->requiresZeroInitialization(),
10283                                               E->getConstructionKind(),
10284                                               E->getParenOrBraceRange());
10285 }
10286
10287 template<typename Derived>
10288 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10289     CXXInheritedCtorInitExpr *E) {
10290   QualType T = getDerived().TransformType(E->getType());
10291   if (T.isNull())
10292     return ExprError();
10293
10294   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10295       getDerived().TransformDecl(E->getLocStart(), E->getConstructor()));
10296   if (!Constructor)
10297     return ExprError();
10298
10299   if (!getDerived().AlwaysRebuild() &&
10300       T == E->getType() &&
10301       Constructor == E->getConstructor()) {
10302     // Mark the constructor as referenced.
10303     // FIXME: Instantiation-specific
10304     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10305     return E;
10306   }
10307
10308   return getDerived().RebuildCXXInheritedCtorInitExpr(
10309       T, E->getLocation(), Constructor,
10310       E->constructsVBase(), E->inheritedFromVBase());
10311 }
10312
10313 /// \brief Transform a C++ temporary-binding expression.
10314 ///
10315 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
10316 /// transform the subexpression and return that.
10317 template<typename Derived>
10318 ExprResult
10319 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10320   return getDerived().TransformExpr(E->getSubExpr());
10321 }
10322
10323 /// \brief Transform a C++ expression that contains cleanups that should
10324 /// be run after the expression is evaluated.
10325 ///
10326 /// Since ExprWithCleanups nodes are implicitly generated, we
10327 /// just transform the subexpression and return that.
10328 template<typename Derived>
10329 ExprResult
10330 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
10331   return getDerived().TransformExpr(E->getSubExpr());
10332 }
10333
10334 template<typename Derived>
10335 ExprResult
10336 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
10337                                                     CXXTemporaryObjectExpr *E) {
10338   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10339   if (!T)
10340     return ExprError();
10341
10342   CXXConstructorDecl *Constructor
10343     = cast_or_null<CXXConstructorDecl>(
10344                                   getDerived().TransformDecl(E->getLocStart(),
10345                                                          E->getConstructor()));
10346   if (!Constructor)
10347     return ExprError();
10348
10349   bool ArgumentChanged = false;
10350   SmallVector<Expr*, 8> Args;
10351   Args.reserve(E->getNumArgs());
10352   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10353                      &ArgumentChanged))
10354     return ExprError();
10355
10356   if (!getDerived().AlwaysRebuild() &&
10357       T == E->getTypeSourceInfo() &&
10358       Constructor == E->getConstructor() &&
10359       !ArgumentChanged) {
10360     // FIXME: Instantiation-specific
10361     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10362     return SemaRef.MaybeBindToTemporary(E);
10363   }
10364
10365   // FIXME: Pass in E->isListInitialization().
10366   return getDerived().RebuildCXXTemporaryObjectExpr(T,
10367                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10368                                                     Args,
10369                                                     E->getLocEnd());
10370 }
10371
10372 template<typename Derived>
10373 ExprResult
10374 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
10375   // Transform any init-capture expressions before entering the scope of the
10376   // lambda body, because they are not semantically within that scope.
10377   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
10378   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
10379   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
10380                                   E->explicit_capture_begin());
10381   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10382                                     CEnd = E->capture_end();
10383        C != CEnd; ++C) {
10384     if (!E->isInitCapture(C))
10385       continue;
10386     EnterExpressionEvaluationContext EEEC(getSema(),
10387                                           Sema::PotentiallyEvaluated);
10388     ExprResult NewExprInitResult = getDerived().TransformInitializer(
10389         C->getCapturedVar()->getInit(),
10390         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
10391
10392     if (NewExprInitResult.isInvalid())
10393       return ExprError();
10394     Expr *NewExprInit = NewExprInitResult.get();
10395
10396     VarDecl *OldVD = C->getCapturedVar();
10397     QualType NewInitCaptureType =
10398         getSema().buildLambdaInitCaptureInitialization(
10399             C->getLocation(), OldVD->getType()->isReferenceType(),
10400             OldVD->getIdentifier(),
10401             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
10402     NewExprInitResult = NewExprInit;
10403     InitCaptureExprsAndTypes[C - E->capture_begin()] =
10404         std::make_pair(NewExprInitResult, NewInitCaptureType);
10405   }
10406
10407   // Transform the template parameters, and add them to the current
10408   // instantiation scope. The null case is handled correctly.
10409   auto TPL = getDerived().TransformTemplateParameterList(
10410       E->getTemplateParameterList());
10411
10412   // Transform the type of the original lambda's call operator.
10413   // The transformation MUST be done in the CurrentInstantiationScope since
10414   // it introduces a mapping of the original to the newly created
10415   // transformed parameters.
10416   TypeSourceInfo *NewCallOpTSI = nullptr;
10417   {
10418     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
10419     FunctionProtoTypeLoc OldCallOpFPTL = 
10420         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
10421
10422     TypeLocBuilder NewCallOpTLBuilder;
10423     SmallVector<QualType, 4> ExceptionStorage;
10424     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
10425     QualType NewCallOpType = TransformFunctionProtoType(
10426         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
10427         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
10428           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
10429                                               ExceptionStorage, Changed);
10430         });
10431     if (NewCallOpType.isNull())
10432       return ExprError();
10433     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
10434                                                         NewCallOpType);
10435   }
10436
10437   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
10438   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
10439   LSI->GLTemplateParameterList = TPL;
10440
10441   // Create the local class that will describe the lambda.
10442   CXXRecordDecl *Class
10443     = getSema().createLambdaClosureType(E->getIntroducerRange(),
10444                                         NewCallOpTSI,
10445                                         /*KnownDependent=*/false,
10446                                         E->getCaptureDefault());
10447   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
10448
10449   // Build the call operator.
10450   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
10451       Class, E->getIntroducerRange(), NewCallOpTSI,
10452       E->getCallOperator()->getLocEnd(),
10453       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
10454       E->getCallOperator()->isConstexpr());
10455
10456   LSI->CallOperator = NewCallOperator;
10457
10458   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
10459        I != NumParams; ++I) {
10460     auto *P = NewCallOperator->getParamDecl(I);
10461     if (P->hasUninstantiatedDefaultArg()) {
10462       EnterExpressionEvaluationContext Eval(
10463           getSema(), Sema::PotentiallyEvaluatedIfUsed, P);
10464       ExprResult R = getDerived().TransformExpr(
10465           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
10466       P->setDefaultArg(R.get());
10467     }
10468   }
10469
10470   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
10471   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
10472
10473   // Introduce the context of the call operator.
10474   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
10475                                  /*NewThisContext*/false);
10476
10477   // Enter the scope of the lambda.
10478   getSema().buildLambdaScope(LSI, NewCallOperator,
10479                              E->getIntroducerRange(),
10480                              E->getCaptureDefault(),
10481                              E->getCaptureDefaultLoc(),
10482                              E->hasExplicitParameters(),
10483                              E->hasExplicitResultType(),
10484                              E->isMutable());
10485
10486   bool Invalid = false;
10487
10488   // Transform captures.
10489   bool FinishedExplicitCaptures = false;
10490   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10491                                  CEnd = E->capture_end();
10492        C != CEnd; ++C) {
10493     // When we hit the first implicit capture, tell Sema that we've finished
10494     // the list of explicit captures.
10495     if (!FinishedExplicitCaptures && C->isImplicit()) {
10496       getSema().finishLambdaExplicitCaptures(LSI);
10497       FinishedExplicitCaptures = true;
10498     }
10499
10500     // Capturing 'this' is trivial.
10501     if (C->capturesThis()) {
10502       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
10503                                     /*BuildAndDiagnose*/ true, nullptr,
10504                                     C->getCaptureKind() == LCK_StarThis);
10505       continue;
10506     }
10507     // Captured expression will be recaptured during captured variables
10508     // rebuilding.
10509     if (C->capturesVLAType())
10510       continue;
10511
10512     // Rebuild init-captures, including the implied field declaration.
10513     if (E->isInitCapture(C)) {
10514       InitCaptureInfoTy InitExprTypePair = 
10515           InitCaptureExprsAndTypes[C - E->capture_begin()];
10516       ExprResult Init = InitExprTypePair.first;
10517       QualType InitQualType = InitExprTypePair.second;
10518       if (Init.isInvalid() || InitQualType.isNull()) {
10519         Invalid = true;
10520         continue;
10521       }
10522       VarDecl *OldVD = C->getCapturedVar();
10523       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
10524           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
10525           OldVD->getInitStyle(), Init.get());
10526       if (!NewVD)
10527         Invalid = true;
10528       else {
10529         getDerived().transformedLocalDecl(OldVD, NewVD);
10530       }
10531       getSema().buildInitCaptureField(LSI, NewVD);
10532       continue;
10533     }
10534
10535     assert(C->capturesVariable() && "unexpected kind of lambda capture");
10536
10537     // Determine the capture kind for Sema.
10538     Sema::TryCaptureKind Kind
10539       = C->isImplicit()? Sema::TryCapture_Implicit
10540                        : C->getCaptureKind() == LCK_ByCopy
10541                            ? Sema::TryCapture_ExplicitByVal
10542                            : Sema::TryCapture_ExplicitByRef;
10543     SourceLocation EllipsisLoc;
10544     if (C->isPackExpansion()) {
10545       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
10546       bool ShouldExpand = false;
10547       bool RetainExpansion = false;
10548       Optional<unsigned> NumExpansions;
10549       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
10550                                                C->getLocation(),
10551                                                Unexpanded,
10552                                                ShouldExpand, RetainExpansion,
10553                                                NumExpansions)) {
10554         Invalid = true;
10555         continue;
10556       }
10557
10558       if (ShouldExpand) {
10559         // The transform has determined that we should perform an expansion;
10560         // transform and capture each of the arguments.
10561         // expansion of the pattern. Do so.
10562         VarDecl *Pack = C->getCapturedVar();
10563         for (unsigned I = 0; I != *NumExpansions; ++I) {
10564           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
10565           VarDecl *CapturedVar
10566             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10567                                                                Pack));
10568           if (!CapturedVar) {
10569             Invalid = true;
10570             continue;
10571           }
10572
10573           // Capture the transformed variable.
10574           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
10575         }
10576
10577         // FIXME: Retain a pack expansion if RetainExpansion is true.
10578
10579         continue;
10580       }
10581
10582       EllipsisLoc = C->getEllipsisLoc();
10583     }
10584
10585     // Transform the captured variable.
10586     VarDecl *CapturedVar
10587       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10588                                                          C->getCapturedVar()));
10589     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
10590       Invalid = true;
10591       continue;
10592     }
10593
10594     // Capture the transformed variable.
10595     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
10596                                  EllipsisLoc);
10597   }
10598   if (!FinishedExplicitCaptures)
10599     getSema().finishLambdaExplicitCaptures(LSI);
10600
10601   // Enter a new evaluation context to insulate the lambda from any
10602   // cleanups from the enclosing full-expression.
10603   getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated);
10604
10605   // Instantiate the body of the lambda expression.
10606   StmtResult Body =
10607       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
10608
10609   // ActOnLambda* will pop the function scope for us.
10610   FuncScopeCleanup.disable();
10611
10612   if (Body.isInvalid()) {
10613     SavedContext.pop();
10614     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
10615                                /*IsInstantiation=*/true);
10616     return ExprError();
10617   }
10618
10619   // Copy the LSI before ActOnFinishFunctionBody removes it.
10620   // FIXME: This is dumb. Store the lambda information somewhere that outlives
10621   // the call operator.
10622   auto LSICopy = *LSI;
10623   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
10624                                     /*IsInstantiation*/ true);
10625   SavedContext.pop();
10626
10627   return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(),
10628                                    &LSICopy);
10629 }
10630
10631 template<typename Derived>
10632 ExprResult
10633 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
10634                                                   CXXUnresolvedConstructExpr *E) {
10635   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10636   if (!T)
10637     return ExprError();
10638
10639   bool ArgumentChanged = false;
10640   SmallVector<Expr*, 8> Args;
10641   Args.reserve(E->arg_size());
10642   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
10643                                   &ArgumentChanged))
10644     return ExprError();
10645
10646   if (!getDerived().AlwaysRebuild() &&
10647       T == E->getTypeSourceInfo() &&
10648       !ArgumentChanged)
10649     return E;
10650
10651   // FIXME: we're faking the locations of the commas
10652   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
10653                                                         E->getLParenLoc(),
10654                                                         Args,
10655                                                         E->getRParenLoc());
10656 }
10657
10658 template<typename Derived>
10659 ExprResult
10660 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
10661                                              CXXDependentScopeMemberExpr *E) {
10662   // Transform the base of the expression.
10663   ExprResult Base((Expr*) nullptr);
10664   Expr *OldBase;
10665   QualType BaseType;
10666   QualType ObjectType;
10667   if (!E->isImplicitAccess()) {
10668     OldBase = E->getBase();
10669     Base = getDerived().TransformExpr(OldBase);
10670     if (Base.isInvalid())
10671       return ExprError();
10672
10673     // Start the member reference and compute the object's type.
10674     ParsedType ObjectTy;
10675     bool MayBePseudoDestructor = false;
10676     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10677                                                 E->getOperatorLoc(),
10678                                       E->isArrow()? tok::arrow : tok::period,
10679                                                 ObjectTy,
10680                                                 MayBePseudoDestructor);
10681     if (Base.isInvalid())
10682       return ExprError();
10683
10684     ObjectType = ObjectTy.get();
10685     BaseType = ((Expr*) Base.get())->getType();
10686   } else {
10687     OldBase = nullptr;
10688     BaseType = getDerived().TransformType(E->getBaseType());
10689     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
10690   }
10691
10692   // Transform the first part of the nested-name-specifier that qualifies
10693   // the member name.
10694   NamedDecl *FirstQualifierInScope
10695     = getDerived().TransformFirstQualifierInScope(
10696                                             E->getFirstQualifierFoundInScope(),
10697                                             E->getQualifierLoc().getBeginLoc());
10698
10699   NestedNameSpecifierLoc QualifierLoc;
10700   if (E->getQualifier()) {
10701     QualifierLoc
10702       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
10703                                                      ObjectType,
10704                                                      FirstQualifierInScope);
10705     if (!QualifierLoc)
10706       return ExprError();
10707   }
10708
10709   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10710
10711   // TODO: If this is a conversion-function-id, verify that the
10712   // destination type name (if present) resolves the same way after
10713   // instantiation as it did in the local scope.
10714
10715   DeclarationNameInfo NameInfo
10716     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
10717   if (!NameInfo.getName())
10718     return ExprError();
10719
10720   if (!E->hasExplicitTemplateArgs()) {
10721     // This is a reference to a member without an explicitly-specified
10722     // template argument list. Optimize for this common case.
10723     if (!getDerived().AlwaysRebuild() &&
10724         Base.get() == OldBase &&
10725         BaseType == E->getBaseType() &&
10726         QualifierLoc == E->getQualifierLoc() &&
10727         NameInfo.getName() == E->getMember() &&
10728         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
10729       return E;
10730
10731     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
10732                                                        BaseType,
10733                                                        E->isArrow(),
10734                                                        E->getOperatorLoc(),
10735                                                        QualifierLoc,
10736                                                        TemplateKWLoc,
10737                                                        FirstQualifierInScope,
10738                                                        NameInfo,
10739                                                        /*TemplateArgs*/nullptr);
10740   }
10741
10742   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10743   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10744                                               E->getNumTemplateArgs(),
10745                                               TransArgs))
10746     return ExprError();
10747
10748   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
10749                                                      BaseType,
10750                                                      E->isArrow(),
10751                                                      E->getOperatorLoc(),
10752                                                      QualifierLoc,
10753                                                      TemplateKWLoc,
10754                                                      FirstQualifierInScope,
10755                                                      NameInfo,
10756                                                      &TransArgs);
10757 }
10758
10759 template<typename Derived>
10760 ExprResult
10761 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
10762   // Transform the base of the expression.
10763   ExprResult Base((Expr*) nullptr);
10764   QualType BaseType;
10765   if (!Old->isImplicitAccess()) {
10766     Base = getDerived().TransformExpr(Old->getBase());
10767     if (Base.isInvalid())
10768       return ExprError();
10769     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
10770                                                      Old->isArrow());
10771     if (Base.isInvalid())
10772       return ExprError();
10773     BaseType = Base.get()->getType();
10774   } else {
10775     BaseType = getDerived().TransformType(Old->getBaseType());
10776   }
10777
10778   NestedNameSpecifierLoc QualifierLoc;
10779   if (Old->getQualifierLoc()) {
10780     QualifierLoc
10781     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10782     if (!QualifierLoc)
10783       return ExprError();
10784   }
10785
10786   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10787
10788   LookupResult R(SemaRef, Old->getMemberNameInfo(),
10789                  Sema::LookupOrdinaryName);
10790
10791   // Transform the declaration set.
10792   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
10793     return ExprError();
10794
10795   // Determine the naming class.
10796   if (Old->getNamingClass()) {
10797     CXXRecordDecl *NamingClass
10798       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10799                                                           Old->getMemberLoc(),
10800                                                         Old->getNamingClass()));
10801     if (!NamingClass)
10802       return ExprError();
10803
10804     R.setNamingClass(NamingClass);
10805   }
10806
10807   TemplateArgumentListInfo TransArgs;
10808   if (Old->hasExplicitTemplateArgs()) {
10809     TransArgs.setLAngleLoc(Old->getLAngleLoc());
10810     TransArgs.setRAngleLoc(Old->getRAngleLoc());
10811     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10812                                                 Old->getNumTemplateArgs(),
10813                                                 TransArgs))
10814       return ExprError();
10815   }
10816
10817   // FIXME: to do this check properly, we will need to preserve the
10818   // first-qualifier-in-scope here, just in case we had a dependent
10819   // base (and therefore couldn't do the check) and a
10820   // nested-name-qualifier (and therefore could do the lookup).
10821   NamedDecl *FirstQualifierInScope = nullptr;
10822
10823   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
10824                                                   BaseType,
10825                                                   Old->getOperatorLoc(),
10826                                                   Old->isArrow(),
10827                                                   QualifierLoc,
10828                                                   TemplateKWLoc,
10829                                                   FirstQualifierInScope,
10830                                                   R,
10831                                               (Old->hasExplicitTemplateArgs()
10832                                                   ? &TransArgs : nullptr));
10833 }
10834
10835 template<typename Derived>
10836 ExprResult
10837 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
10838   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10839   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
10840   if (SubExpr.isInvalid())
10841     return ExprError();
10842
10843   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
10844     return E;
10845
10846   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
10847 }
10848
10849 template<typename Derived>
10850 ExprResult
10851 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
10852   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
10853   if (Pattern.isInvalid())
10854     return ExprError();
10855
10856   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
10857     return E;
10858
10859   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
10860                                            E->getNumExpansions());
10861 }
10862
10863 template<typename Derived>
10864 ExprResult
10865 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
10866   // If E is not value-dependent, then nothing will change when we transform it.
10867   // Note: This is an instantiation-centric view.
10868   if (!E->isValueDependent())
10869     return E;
10870
10871   EnterExpressionEvaluationContext Unevaluated(getSema(), Sema::Unevaluated);
10872
10873   ArrayRef<TemplateArgument> PackArgs;
10874   TemplateArgument ArgStorage;
10875
10876   // Find the argument list to transform.
10877   if (E->isPartiallySubstituted()) {
10878     PackArgs = E->getPartialArguments();
10879   } else if (E->isValueDependent()) {
10880     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
10881     bool ShouldExpand = false;
10882     bool RetainExpansion = false;
10883     Optional<unsigned> NumExpansions;
10884     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
10885                                              Unexpanded,
10886                                              ShouldExpand, RetainExpansion,
10887                                              NumExpansions))
10888       return ExprError();
10889
10890     // If we need to expand the pack, build a template argument from it and
10891     // expand that.
10892     if (ShouldExpand) {
10893       auto *Pack = E->getPack();
10894       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
10895         ArgStorage = getSema().Context.getPackExpansionType(
10896             getSema().Context.getTypeDeclType(TTPD), None);
10897       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
10898         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
10899       } else {
10900         auto *VD = cast<ValueDecl>(Pack);
10901         ExprResult DRE = getSema().BuildDeclRefExpr(VD, VD->getType(),
10902                                                     VK_RValue, E->getPackLoc());
10903         if (DRE.isInvalid())
10904           return ExprError();
10905         ArgStorage = new (getSema().Context) PackExpansionExpr(
10906             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
10907       }
10908       PackArgs = ArgStorage;
10909     }
10910   }
10911
10912   // If we're not expanding the pack, just transform the decl.
10913   if (!PackArgs.size()) {
10914     auto *Pack = cast_or_null<NamedDecl>(
10915         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
10916     if (!Pack)
10917       return ExprError();
10918     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
10919                                               E->getPackLoc(),
10920                                               E->getRParenLoc(), None, None);
10921   }
10922
10923   // Try to compute the result without performing a partial substitution.
10924   Optional<unsigned> Result = 0;
10925   for (const TemplateArgument &Arg : PackArgs) {
10926     if (!Arg.isPackExpansion()) {
10927       Result = *Result + 1;
10928       continue;
10929     }
10930
10931     TemplateArgumentLoc ArgLoc;
10932     InventTemplateArgumentLoc(Arg, ArgLoc);
10933
10934     // Find the pattern of the pack expansion.
10935     SourceLocation Ellipsis;
10936     Optional<unsigned> OrigNumExpansions;
10937     TemplateArgumentLoc Pattern =
10938         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
10939                                                           OrigNumExpansions);
10940
10941     // Substitute under the pack expansion. Do not expand the pack (yet).
10942     TemplateArgumentLoc OutPattern;
10943     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10944     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
10945                                                /*Uneval*/ true))
10946       return true;
10947
10948     // See if we can determine the number of arguments from the result.
10949     Optional<unsigned> NumExpansions =
10950         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
10951     if (!NumExpansions) {
10952       // No: we must be in an alias template expansion, and we're going to need
10953       // to actually expand the packs.
10954       Result = None;
10955       break;
10956     }
10957
10958     Result = *Result + *NumExpansions;
10959   }
10960
10961   // Common case: we could determine the number of expansions without
10962   // substituting.
10963   if (Result)
10964     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10965                                               E->getPackLoc(),
10966                                               E->getRParenLoc(), *Result, None);
10967
10968   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
10969                                                E->getPackLoc());
10970   {
10971     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
10972     typedef TemplateArgumentLocInventIterator<
10973         Derived, const TemplateArgument*> PackLocIterator;
10974     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
10975                                    PackLocIterator(*this, PackArgs.end()),
10976                                    TransformedPackArgs, /*Uneval*/true))
10977       return ExprError();
10978   }
10979
10980   // Check whether we managed to fully-expand the pack.
10981   // FIXME: Is it possible for us to do so and not hit the early exit path?
10982   SmallVector<TemplateArgument, 8> Args;
10983   bool PartialSubstitution = false;
10984   for (auto &Loc : TransformedPackArgs.arguments()) {
10985     Args.push_back(Loc.getArgument());
10986     if (Loc.getArgument().isPackExpansion())
10987       PartialSubstitution = true;
10988   }
10989
10990   if (PartialSubstitution)
10991     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10992                                               E->getPackLoc(),
10993                                               E->getRParenLoc(), None, Args);
10994
10995   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10996                                             E->getPackLoc(), E->getRParenLoc(),
10997                                             Args.size(), None);
10998 }
10999
11000 template<typename Derived>
11001 ExprResult
11002 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
11003                                           SubstNonTypeTemplateParmPackExpr *E) {
11004   // Default behavior is to do nothing with this transformation.
11005   return E;
11006 }
11007
11008 template<typename Derived>
11009 ExprResult
11010 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
11011                                           SubstNonTypeTemplateParmExpr *E) {
11012   // Default behavior is to do nothing with this transformation.
11013   return E;
11014 }
11015
11016 template<typename Derived>
11017 ExprResult
11018 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
11019   // Default behavior is to do nothing with this transformation.
11020   return E;
11021 }
11022
11023 template<typename Derived>
11024 ExprResult
11025 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
11026                                                   MaterializeTemporaryExpr *E) {
11027   return getDerived().TransformExpr(E->GetTemporaryExpr());
11028 }
11029
11030 template<typename Derived>
11031 ExprResult
11032 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
11033   Expr *Pattern = E->getPattern();
11034
11035   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11036   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
11037   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11038
11039   // Determine whether the set of unexpanded parameter packs can and should
11040   // be expanded.
11041   bool Expand = true;
11042   bool RetainExpansion = false;
11043   Optional<unsigned> NumExpansions;
11044   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
11045                                            Pattern->getSourceRange(),
11046                                            Unexpanded,
11047                                            Expand, RetainExpansion,
11048                                            NumExpansions))
11049     return true;
11050
11051   if (!Expand) {
11052     // Do not expand any packs here, just transform and rebuild a fold
11053     // expression.
11054     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11055
11056     ExprResult LHS =
11057         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
11058     if (LHS.isInvalid())
11059       return true;
11060
11061     ExprResult RHS =
11062         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
11063     if (RHS.isInvalid())
11064       return true;
11065
11066     if (!getDerived().AlwaysRebuild() &&
11067         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
11068       return E;
11069
11070     return getDerived().RebuildCXXFoldExpr(
11071         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
11072         RHS.get(), E->getLocEnd());
11073   }
11074
11075   // The transform has determined that we should perform an elementwise
11076   // expansion of the pattern. Do so.
11077   ExprResult Result = getDerived().TransformExpr(E->getInit());
11078   if (Result.isInvalid())
11079     return true;
11080   bool LeftFold = E->isLeftFold();
11081
11082   // If we're retaining an expansion for a right fold, it is the innermost
11083   // component and takes the init (if any).
11084   if (!LeftFold && RetainExpansion) {
11085     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11086
11087     ExprResult Out = getDerived().TransformExpr(Pattern);
11088     if (Out.isInvalid())
11089       return true;
11090
11091     Result = getDerived().RebuildCXXFoldExpr(
11092         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
11093         Result.get(), E->getLocEnd());
11094     if (Result.isInvalid())
11095       return true;
11096   }
11097
11098   for (unsigned I = 0; I != *NumExpansions; ++I) {
11099     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
11100         getSema(), LeftFold ? I : *NumExpansions - I - 1);
11101     ExprResult Out = getDerived().TransformExpr(Pattern);
11102     if (Out.isInvalid())
11103       return true;
11104
11105     if (Out.get()->containsUnexpandedParameterPack()) {
11106       // We still have a pack; retain a pack expansion for this slice.
11107       Result = getDerived().RebuildCXXFoldExpr(
11108           E->getLocStart(),
11109           LeftFold ? Result.get() : Out.get(),
11110           E->getOperator(), E->getEllipsisLoc(),
11111           LeftFold ? Out.get() : Result.get(),
11112           E->getLocEnd());
11113     } else if (Result.isUsable()) {
11114       // We've got down to a single element; build a binary operator.
11115       Result = getDerived().RebuildBinaryOperator(
11116           E->getEllipsisLoc(), E->getOperator(),
11117           LeftFold ? Result.get() : Out.get(),
11118           LeftFold ? Out.get() : Result.get());
11119     } else
11120       Result = Out;
11121
11122     if (Result.isInvalid())
11123       return true;
11124   }
11125
11126   // If we're retaining an expansion for a left fold, it is the outermost
11127   // component and takes the complete expansion so far as its init (if any).
11128   if (LeftFold && RetainExpansion) {
11129     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11130
11131     ExprResult Out = getDerived().TransformExpr(Pattern);
11132     if (Out.isInvalid())
11133       return true;
11134
11135     Result = getDerived().RebuildCXXFoldExpr(
11136         E->getLocStart(), Result.get(),
11137         E->getOperator(), E->getEllipsisLoc(),
11138         Out.get(), E->getLocEnd());
11139     if (Result.isInvalid())
11140       return true;
11141   }
11142
11143   // If we had no init and an empty pack, and we're not retaining an expansion,
11144   // then produce a fallback value or error.
11145   if (Result.isUnset())
11146     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
11147                                                 E->getOperator());
11148
11149   return Result;
11150 }
11151
11152 template<typename Derived>
11153 ExprResult
11154 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
11155     CXXStdInitializerListExpr *E) {
11156   return getDerived().TransformExpr(E->getSubExpr());
11157 }
11158
11159 template<typename Derived>
11160 ExprResult
11161 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
11162   return SemaRef.MaybeBindToTemporary(E);
11163 }
11164
11165 template<typename Derived>
11166 ExprResult
11167 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
11168   return E;
11169 }
11170
11171 template<typename Derived>
11172 ExprResult
11173 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
11174   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11175   if (SubExpr.isInvalid())
11176     return ExprError();
11177
11178   if (!getDerived().AlwaysRebuild() &&
11179       SubExpr.get() == E->getSubExpr())
11180     return E;
11181
11182   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
11183 }
11184
11185 template<typename Derived>
11186 ExprResult
11187 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
11188   // Transform each of the elements.
11189   SmallVector<Expr *, 8> Elements;
11190   bool ArgChanged = false;
11191   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
11192                                   /*IsCall=*/false, Elements, &ArgChanged))
11193     return ExprError();
11194
11195   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11196     return SemaRef.MaybeBindToTemporary(E);
11197
11198   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
11199                                               Elements.data(),
11200                                               Elements.size());
11201 }
11202
11203 template<typename Derived>
11204 ExprResult
11205 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
11206                                                     ObjCDictionaryLiteral *E) {
11207   // Transform each of the elements.
11208   SmallVector<ObjCDictionaryElement, 8> Elements;
11209   bool ArgChanged = false;
11210   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
11211     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
11212
11213     if (OrigElement.isPackExpansion()) {
11214       // This key/value element is a pack expansion.
11215       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11216       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
11217       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
11218       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11219
11220       // Determine whether the set of unexpanded parameter packs can
11221       // and should be expanded.
11222       bool Expand = true;
11223       bool RetainExpansion = false;
11224       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
11225       Optional<unsigned> NumExpansions = OrigNumExpansions;
11226       SourceRange PatternRange(OrigElement.Key->getLocStart(),
11227                                OrigElement.Value->getLocEnd());
11228      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
11229                                                PatternRange,
11230                                                Unexpanded,
11231                                                Expand, RetainExpansion,
11232                                                NumExpansions))
11233         return ExprError();
11234
11235       if (!Expand) {
11236         // The transform has determined that we should perform a simple
11237         // transformation on the pack expansion, producing another pack
11238         // expansion.
11239         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11240         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11241         if (Key.isInvalid())
11242           return ExprError();
11243
11244         if (Key.get() != OrigElement.Key)
11245           ArgChanged = true;
11246
11247         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11248         if (Value.isInvalid())
11249           return ExprError();
11250
11251         if (Value.get() != OrigElement.Value)
11252           ArgChanged = true;
11253
11254         ObjCDictionaryElement Expansion = {
11255           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
11256         };
11257         Elements.push_back(Expansion);
11258         continue;
11259       }
11260
11261       // Record right away that the argument was changed.  This needs
11262       // to happen even if the array expands to nothing.
11263       ArgChanged = true;
11264
11265       // The transform has determined that we should perform an elementwise
11266       // expansion of the pattern. Do so.
11267       for (unsigned I = 0; I != *NumExpansions; ++I) {
11268         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11269         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11270         if (Key.isInvalid())
11271           return ExprError();
11272
11273         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11274         if (Value.isInvalid())
11275           return ExprError();
11276
11277         ObjCDictionaryElement Element = {
11278           Key.get(), Value.get(), SourceLocation(), NumExpansions
11279         };
11280
11281         // If any unexpanded parameter packs remain, we still have a
11282         // pack expansion.
11283         // FIXME: Can this really happen?
11284         if (Key.get()->containsUnexpandedParameterPack() ||
11285             Value.get()->containsUnexpandedParameterPack())
11286           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11287
11288         Elements.push_back(Element);
11289       }
11290
11291       // FIXME: Retain a pack expansion if RetainExpansion is true.
11292
11293       // We've finished with this pack expansion.
11294       continue;
11295     }
11296
11297     // Transform and check key.
11298     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11299     if (Key.isInvalid())
11300       return ExprError();
11301
11302     if (Key.get() != OrigElement.Key)
11303       ArgChanged = true;
11304
11305     // Transform and check value.
11306     ExprResult Value
11307       = getDerived().TransformExpr(OrigElement.Value);
11308     if (Value.isInvalid())
11309       return ExprError();
11310
11311     if (Value.get() != OrigElement.Value)
11312       ArgChanged = true;
11313
11314     ObjCDictionaryElement Element = {
11315       Key.get(), Value.get(), SourceLocation(), None
11316     };
11317     Elements.push_back(Element);
11318   }
11319
11320   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11321     return SemaRef.MaybeBindToTemporary(E);
11322
11323   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
11324                                                    Elements);
11325 }
11326
11327 template<typename Derived>
11328 ExprResult
11329 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
11330   TypeSourceInfo *EncodedTypeInfo
11331     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
11332   if (!EncodedTypeInfo)
11333     return ExprError();
11334
11335   if (!getDerived().AlwaysRebuild() &&
11336       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
11337     return E;
11338
11339   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
11340                                             EncodedTypeInfo,
11341                                             E->getRParenLoc());
11342 }
11343
11344 template<typename Derived>
11345 ExprResult TreeTransform<Derived>::
11346 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
11347   // This is a kind of implicit conversion, and it needs to get dropped
11348   // and recomputed for the same general reasons that ImplicitCastExprs
11349   // do, as well a more specific one: this expression is only valid when
11350   // it appears *immediately* as an argument expression.
11351   return getDerived().TransformExpr(E->getSubExpr());
11352 }
11353
11354 template<typename Derived>
11355 ExprResult TreeTransform<Derived>::
11356 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
11357   TypeSourceInfo *TSInfo
11358     = getDerived().TransformType(E->getTypeInfoAsWritten());
11359   if (!TSInfo)
11360     return ExprError();
11361
11362   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
11363   if (Result.isInvalid())
11364     return ExprError();
11365
11366   if (!getDerived().AlwaysRebuild() &&
11367       TSInfo == E->getTypeInfoAsWritten() &&
11368       Result.get() == E->getSubExpr())
11369     return E;
11370
11371   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
11372                                       E->getBridgeKeywordLoc(), TSInfo,
11373                                       Result.get());
11374 }
11375
11376 template <typename Derived>
11377 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
11378     ObjCAvailabilityCheckExpr *E) {
11379   return E;
11380 }
11381
11382 template<typename Derived>
11383 ExprResult
11384 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
11385   // Transform arguments.
11386   bool ArgChanged = false;
11387   SmallVector<Expr*, 8> Args;
11388   Args.reserve(E->getNumArgs());
11389   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
11390                                   &ArgChanged))
11391     return ExprError();
11392
11393   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
11394     // Class message: transform the receiver type.
11395     TypeSourceInfo *ReceiverTypeInfo
11396       = getDerived().TransformType(E->getClassReceiverTypeInfo());
11397     if (!ReceiverTypeInfo)
11398       return ExprError();
11399
11400     // If nothing changed, just retain the existing message send.
11401     if (!getDerived().AlwaysRebuild() &&
11402         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
11403       return SemaRef.MaybeBindToTemporary(E);
11404
11405     // Build a new class message send.
11406     SmallVector<SourceLocation, 16> SelLocs;
11407     E->getSelectorLocs(SelLocs);
11408     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
11409                                                E->getSelector(),
11410                                                SelLocs,
11411                                                E->getMethodDecl(),
11412                                                E->getLeftLoc(),
11413                                                Args,
11414                                                E->getRightLoc());
11415   }
11416   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
11417            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
11418     if (!E->getMethodDecl())
11419       return ExprError();
11420
11421     // Build a new class message send to 'super'.
11422     SmallVector<SourceLocation, 16> SelLocs;
11423     E->getSelectorLocs(SelLocs);
11424     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
11425                                                E->getSelector(),
11426                                                SelLocs,
11427                                                E->getReceiverType(),
11428                                                E->getMethodDecl(),
11429                                                E->getLeftLoc(),
11430                                                Args,
11431                                                E->getRightLoc());
11432   }
11433
11434   // Instance message: transform the receiver
11435   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
11436          "Only class and instance messages may be instantiated");
11437   ExprResult Receiver
11438     = getDerived().TransformExpr(E->getInstanceReceiver());
11439   if (Receiver.isInvalid())
11440     return ExprError();
11441
11442   // If nothing changed, just retain the existing message send.
11443   if (!getDerived().AlwaysRebuild() &&
11444       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
11445     return SemaRef.MaybeBindToTemporary(E);
11446
11447   // Build a new instance message send.
11448   SmallVector<SourceLocation, 16> SelLocs;
11449   E->getSelectorLocs(SelLocs);
11450   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
11451                                              E->getSelector(),
11452                                              SelLocs,
11453                                              E->getMethodDecl(),
11454                                              E->getLeftLoc(),
11455                                              Args,
11456                                              E->getRightLoc());
11457 }
11458
11459 template<typename Derived>
11460 ExprResult
11461 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
11462   return E;
11463 }
11464
11465 template<typename Derived>
11466 ExprResult
11467 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
11468   return E;
11469 }
11470
11471 template<typename Derived>
11472 ExprResult
11473 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
11474   // Transform the base expression.
11475   ExprResult Base = getDerived().TransformExpr(E->getBase());
11476   if (Base.isInvalid())
11477     return ExprError();
11478
11479   // We don't need to transform the ivar; it will never change.
11480
11481   // If nothing changed, just retain the existing expression.
11482   if (!getDerived().AlwaysRebuild() &&
11483       Base.get() == E->getBase())
11484     return E;
11485
11486   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
11487                                              E->getLocation(),
11488                                              E->isArrow(), E->isFreeIvar());
11489 }
11490
11491 template<typename Derived>
11492 ExprResult
11493 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
11494   // 'super' and types never change. Property never changes. Just
11495   // retain the existing expression.
11496   if (!E->isObjectReceiver())
11497     return E;
11498
11499   // Transform the base expression.
11500   ExprResult Base = getDerived().TransformExpr(E->getBase());
11501   if (Base.isInvalid())
11502     return ExprError();
11503
11504   // We don't need to transform the property; it will never change.
11505
11506   // If nothing changed, just retain the existing expression.
11507   if (!getDerived().AlwaysRebuild() &&
11508       Base.get() == E->getBase())
11509     return E;
11510
11511   if (E->isExplicitProperty())
11512     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11513                                                    E->getExplicitProperty(),
11514                                                    E->getLocation());
11515
11516   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11517                                                  SemaRef.Context.PseudoObjectTy,
11518                                                  E->getImplicitPropertyGetter(),
11519                                                  E->getImplicitPropertySetter(),
11520                                                  E->getLocation());
11521 }
11522
11523 template<typename Derived>
11524 ExprResult
11525 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
11526   // Transform the base expression.
11527   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
11528   if (Base.isInvalid())
11529     return ExprError();
11530
11531   // Transform the key expression.
11532   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
11533   if (Key.isInvalid())
11534     return ExprError();
11535
11536   // If nothing changed, just retain the existing expression.
11537   if (!getDerived().AlwaysRebuild() &&
11538       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
11539     return E;
11540
11541   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
11542                                                   Base.get(), Key.get(),
11543                                                   E->getAtIndexMethodDecl(),
11544                                                   E->setAtIndexMethodDecl());
11545 }
11546
11547 template<typename Derived>
11548 ExprResult
11549 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
11550   // Transform the base expression.
11551   ExprResult Base = getDerived().TransformExpr(E->getBase());
11552   if (Base.isInvalid())
11553     return ExprError();
11554
11555   // If nothing changed, just retain the existing expression.
11556   if (!getDerived().AlwaysRebuild() &&
11557       Base.get() == E->getBase())
11558     return E;
11559
11560   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
11561                                          E->getOpLoc(),
11562                                          E->isArrow());
11563 }
11564
11565 template<typename Derived>
11566 ExprResult
11567 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
11568   bool ArgumentChanged = false;
11569   SmallVector<Expr*, 8> SubExprs;
11570   SubExprs.reserve(E->getNumSubExprs());
11571   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
11572                                   SubExprs, &ArgumentChanged))
11573     return ExprError();
11574
11575   if (!getDerived().AlwaysRebuild() &&
11576       !ArgumentChanged)
11577     return E;
11578
11579   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
11580                                                SubExprs,
11581                                                E->getRParenLoc());
11582 }
11583
11584 template<typename Derived>
11585 ExprResult
11586 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
11587   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
11588   if (SrcExpr.isInvalid())
11589     return ExprError();
11590
11591   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
11592   if (!Type)
11593     return ExprError();
11594
11595   if (!getDerived().AlwaysRebuild() &&
11596       Type == E->getTypeSourceInfo() &&
11597       SrcExpr.get() == E->getSrcExpr())
11598     return E;
11599
11600   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
11601                                                SrcExpr.get(), Type,
11602                                                E->getRParenLoc());
11603 }
11604
11605 template<typename Derived>
11606 ExprResult
11607 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
11608   BlockDecl *oldBlock = E->getBlockDecl();
11609
11610   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
11611   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
11612
11613   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
11614   blockScope->TheDecl->setBlockMissingReturnType(
11615                          oldBlock->blockMissingReturnType());
11616
11617   SmallVector<ParmVarDecl*, 4> params;
11618   SmallVector<QualType, 4> paramTypes;
11619
11620   const FunctionProtoType *exprFunctionType = E->getFunctionType();
11621
11622   // Parameter substitution.
11623   Sema::ExtParameterInfoBuilder extParamInfos;
11624   if (getDerived().TransformFunctionTypeParams(
11625           E->getCaretLocation(), oldBlock->parameters(), nullptr,
11626           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
11627           extParamInfos)) {
11628     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11629     return ExprError();
11630   }
11631
11632   QualType exprResultType =
11633       getDerived().TransformType(exprFunctionType->getReturnType());
11634
11635   auto epi = exprFunctionType->getExtProtoInfo();
11636   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
11637
11638   QualType functionType =
11639     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
11640   blockScope->FunctionType = functionType;
11641
11642   // Set the parameters on the block decl.
11643   if (!params.empty())
11644     blockScope->TheDecl->setParams(params);
11645
11646   if (!oldBlock->blockMissingReturnType()) {
11647     blockScope->HasImplicitReturnType = false;
11648     blockScope->ReturnType = exprResultType;
11649   }
11650
11651   // Transform the body
11652   StmtResult body = getDerived().TransformStmt(E->getBody());
11653   if (body.isInvalid()) {
11654     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11655     return ExprError();
11656   }
11657
11658 #ifndef NDEBUG
11659   // In builds with assertions, make sure that we captured everything we
11660   // captured before.
11661   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
11662     for (const auto &I : oldBlock->captures()) {
11663       VarDecl *oldCapture = I.getVariable();
11664
11665       // Ignore parameter packs.
11666       if (isa<ParmVarDecl>(oldCapture) &&
11667           cast<ParmVarDecl>(oldCapture)->isParameterPack())
11668         continue;
11669
11670       VarDecl *newCapture =
11671         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
11672                                                  oldCapture));
11673       assert(blockScope->CaptureMap.count(newCapture));
11674     }
11675     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
11676   }
11677 #endif
11678
11679   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
11680                                     /*Scope=*/nullptr);
11681 }
11682
11683 template<typename Derived>
11684 ExprResult
11685 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
11686   llvm_unreachable("Cannot transform asType expressions yet");
11687 }
11688
11689 template<typename Derived>
11690 ExprResult
11691 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
11692   QualType RetTy = getDerived().TransformType(E->getType());
11693   bool ArgumentChanged = false;
11694   SmallVector<Expr*, 8> SubExprs;
11695   SubExprs.reserve(E->getNumSubExprs());
11696   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
11697                                   SubExprs, &ArgumentChanged))
11698     return ExprError();
11699
11700   if (!getDerived().AlwaysRebuild() &&
11701       !ArgumentChanged)
11702     return E;
11703
11704   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
11705                                         RetTy, E->getOp(), E->getRParenLoc());
11706 }
11707
11708 //===----------------------------------------------------------------------===//
11709 // Type reconstruction
11710 //===----------------------------------------------------------------------===//
11711
11712 template<typename Derived>
11713 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
11714                                                     SourceLocation Star) {
11715   return SemaRef.BuildPointerType(PointeeType, Star,
11716                                   getDerived().getBaseEntity());
11717 }
11718
11719 template<typename Derived>
11720 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
11721                                                          SourceLocation Star) {
11722   return SemaRef.BuildBlockPointerType(PointeeType, Star,
11723                                        getDerived().getBaseEntity());
11724 }
11725
11726 template<typename Derived>
11727 QualType
11728 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
11729                                              bool WrittenAsLValue,
11730                                              SourceLocation Sigil) {
11731   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
11732                                     Sigil, getDerived().getBaseEntity());
11733 }
11734
11735 template<typename Derived>
11736 QualType
11737 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
11738                                                  QualType ClassType,
11739                                                  SourceLocation Sigil) {
11740   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
11741                                         getDerived().getBaseEntity());
11742 }
11743
11744 template<typename Derived>
11745 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
11746            const ObjCTypeParamDecl *Decl,
11747            SourceLocation ProtocolLAngleLoc,
11748            ArrayRef<ObjCProtocolDecl *> Protocols,
11749            ArrayRef<SourceLocation> ProtocolLocs,
11750            SourceLocation ProtocolRAngleLoc) {
11751   return SemaRef.BuildObjCTypeParamType(Decl,
11752                                         ProtocolLAngleLoc, Protocols,
11753                                         ProtocolLocs, ProtocolRAngleLoc,
11754                                         /*FailOnError=*/true);
11755 }
11756
11757 template<typename Derived>
11758 QualType TreeTransform<Derived>::RebuildObjCObjectType(
11759            QualType BaseType,
11760            SourceLocation Loc,
11761            SourceLocation TypeArgsLAngleLoc,
11762            ArrayRef<TypeSourceInfo *> TypeArgs,
11763            SourceLocation TypeArgsRAngleLoc,
11764            SourceLocation ProtocolLAngleLoc,
11765            ArrayRef<ObjCProtocolDecl *> Protocols,
11766            ArrayRef<SourceLocation> ProtocolLocs,
11767            SourceLocation ProtocolRAngleLoc) {
11768   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
11769                                      TypeArgs, TypeArgsRAngleLoc,
11770                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
11771                                      ProtocolRAngleLoc,
11772                                      /*FailOnError=*/true);
11773 }
11774
11775 template<typename Derived>
11776 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
11777            QualType PointeeType,
11778            SourceLocation Star) {
11779   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
11780 }
11781
11782 template<typename Derived>
11783 QualType
11784 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
11785                                          ArrayType::ArraySizeModifier SizeMod,
11786                                          const llvm::APInt *Size,
11787                                          Expr *SizeExpr,
11788                                          unsigned IndexTypeQuals,
11789                                          SourceRange BracketsRange) {
11790   if (SizeExpr || !Size)
11791     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
11792                                   IndexTypeQuals, BracketsRange,
11793                                   getDerived().getBaseEntity());
11794
11795   QualType Types[] = {
11796     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
11797     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
11798     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
11799   };
11800   const unsigned NumTypes = llvm::array_lengthof(Types);
11801   QualType SizeType;
11802   for (unsigned I = 0; I != NumTypes; ++I)
11803     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
11804       SizeType = Types[I];
11805       break;
11806     }
11807
11808   // Note that we can return a VariableArrayType here in the case where
11809   // the element type was a dependent VariableArrayType.
11810   IntegerLiteral *ArraySize
11811       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
11812                                /*FIXME*/BracketsRange.getBegin());
11813   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
11814                                 IndexTypeQuals, BracketsRange,
11815                                 getDerived().getBaseEntity());
11816 }
11817
11818 template<typename Derived>
11819 QualType
11820 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
11821                                                  ArrayType::ArraySizeModifier SizeMod,
11822                                                  const llvm::APInt &Size,
11823                                                  unsigned IndexTypeQuals,
11824                                                  SourceRange BracketsRange) {
11825   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
11826                                         IndexTypeQuals, BracketsRange);
11827 }
11828
11829 template<typename Derived>
11830 QualType
11831 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
11832                                           ArrayType::ArraySizeModifier SizeMod,
11833                                                  unsigned IndexTypeQuals,
11834                                                    SourceRange BracketsRange) {
11835   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
11836                                        IndexTypeQuals, BracketsRange);
11837 }
11838
11839 template<typename Derived>
11840 QualType
11841 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
11842                                           ArrayType::ArraySizeModifier SizeMod,
11843                                                  Expr *SizeExpr,
11844                                                  unsigned IndexTypeQuals,
11845                                                  SourceRange BracketsRange) {
11846   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
11847                                        SizeExpr,
11848                                        IndexTypeQuals, BracketsRange);
11849 }
11850
11851 template<typename Derived>
11852 QualType
11853 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
11854                                           ArrayType::ArraySizeModifier SizeMod,
11855                                                        Expr *SizeExpr,
11856                                                        unsigned IndexTypeQuals,
11857                                                    SourceRange BracketsRange) {
11858   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
11859                                        SizeExpr,
11860                                        IndexTypeQuals, BracketsRange);
11861 }
11862
11863 template<typename Derived>
11864 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
11865                                                unsigned NumElements,
11866                                                VectorType::VectorKind VecKind) {
11867   // FIXME: semantic checking!
11868   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
11869 }
11870
11871 template<typename Derived>
11872 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
11873                                                       unsigned NumElements,
11874                                                  SourceLocation AttributeLoc) {
11875   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
11876                           NumElements, true);
11877   IntegerLiteral *VectorSize
11878     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
11879                              AttributeLoc);
11880   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
11881 }
11882
11883 template<typename Derived>
11884 QualType
11885 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
11886                                                            Expr *SizeExpr,
11887                                                   SourceLocation AttributeLoc) {
11888   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
11889 }
11890
11891 template<typename Derived>
11892 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
11893     QualType T,
11894     MutableArrayRef<QualType> ParamTypes,
11895     const FunctionProtoType::ExtProtoInfo &EPI) {
11896   return SemaRef.BuildFunctionType(T, ParamTypes,
11897                                    getDerived().getBaseLocation(),
11898                                    getDerived().getBaseEntity(),
11899                                    EPI);
11900 }
11901
11902 template<typename Derived>
11903 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
11904   return SemaRef.Context.getFunctionNoProtoType(T);
11905 }
11906
11907 template<typename Derived>
11908 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
11909                                                             Decl *D) {
11910   assert(D && "no decl found");
11911   if (D->isInvalidDecl()) return QualType();
11912
11913   // FIXME: Doesn't account for ObjCInterfaceDecl!
11914   TypeDecl *Ty;
11915   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
11916     // A valid resolved using typename pack expansion decl can have multiple
11917     // UsingDecls, but they must each have exactly one type, and it must be
11918     // the same type in every case. But we must have at least one expansion!
11919     if (UPD->expansions().empty()) {
11920       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
11921           << UPD->isCXXClassMember() << UPD;
11922       return QualType();
11923     }
11924
11925     // We might still have some unresolved types. Try to pick a resolved type
11926     // if we can. The final instantiation will check that the remaining
11927     // unresolved types instantiate to the type we pick.
11928     QualType FallbackT;
11929     QualType T;
11930     for (auto *E : UPD->expansions()) {
11931       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
11932       if (ThisT.isNull())
11933         continue;
11934       else if (ThisT->getAs<UnresolvedUsingType>())
11935         FallbackT = ThisT;
11936       else if (T.isNull())
11937         T = ThisT;
11938       else
11939         assert(getSema().Context.hasSameType(ThisT, T) &&
11940                "mismatched resolved types in using pack expansion");
11941     }
11942     return T.isNull() ? FallbackT : T;
11943   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
11944     assert(Using->hasTypename() &&
11945            "UnresolvedUsingTypenameDecl transformed to non-typename using");
11946
11947     // A valid resolved using typename decl points to exactly one type decl.
11948     assert(++Using->shadow_begin() == Using->shadow_end());
11949     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
11950   } else {
11951     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
11952            "UnresolvedUsingTypenameDecl transformed to non-using decl");
11953     Ty = cast<UnresolvedUsingTypenameDecl>(D);
11954   }
11955
11956   return SemaRef.Context.getTypeDeclType(Ty);
11957 }
11958
11959 template<typename Derived>
11960 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
11961                                                        SourceLocation Loc) {
11962   return SemaRef.BuildTypeofExprType(E, Loc);
11963 }
11964
11965 template<typename Derived>
11966 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
11967   return SemaRef.Context.getTypeOfType(Underlying);
11968 }
11969
11970 template<typename Derived>
11971 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
11972                                                      SourceLocation Loc) {
11973   return SemaRef.BuildDecltypeType(E, Loc);
11974 }
11975
11976 template<typename Derived>
11977 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
11978                                             UnaryTransformType::UTTKind UKind,
11979                                             SourceLocation Loc) {
11980   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
11981 }
11982
11983 template<typename Derived>
11984 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
11985                                                       TemplateName Template,
11986                                              SourceLocation TemplateNameLoc,
11987                                      TemplateArgumentListInfo &TemplateArgs) {
11988   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
11989 }
11990
11991 template<typename Derived>
11992 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
11993                                                    SourceLocation KWLoc) {
11994   return SemaRef.BuildAtomicType(ValueType, KWLoc);
11995 }
11996
11997 template<typename Derived>
11998 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
11999                                                  SourceLocation KWLoc,
12000                                                  bool isReadPipe) {
12001   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
12002                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
12003 }
12004
12005 template<typename Derived>
12006 TemplateName
12007 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12008                                             bool TemplateKW,
12009                                             TemplateDecl *Template) {
12010   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
12011                                                   Template);
12012 }
12013
12014 template<typename Derived>
12015 TemplateName
12016 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12017                                             const IdentifierInfo &Name,
12018                                             SourceLocation NameLoc,
12019                                             QualType ObjectType,
12020                                             NamedDecl *FirstQualifierInScope) {
12021   UnqualifiedId TemplateName;
12022   TemplateName.setIdentifier(&Name, NameLoc);
12023   Sema::TemplateTy Template;
12024   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12025   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12026                                        SS, TemplateKWLoc, TemplateName,
12027                                        ParsedType::make(ObjectType),
12028                                        /*EnteringContext=*/false,
12029                                        Template);
12030   return Template.get();
12031 }
12032
12033 template<typename Derived>
12034 TemplateName
12035 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12036                                             OverloadedOperatorKind Operator,
12037                                             SourceLocation NameLoc,
12038                                             QualType ObjectType) {
12039   UnqualifiedId Name;
12040   // FIXME: Bogus location information.
12041   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
12042   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
12043   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12044   Sema::TemplateTy Template;
12045   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12046                                        SS, TemplateKWLoc, Name,
12047                                        ParsedType::make(ObjectType),
12048                                        /*EnteringContext=*/false,
12049                                        Template);
12050   return Template.get();
12051 }
12052
12053 template<typename Derived>
12054 ExprResult
12055 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
12056                                                    SourceLocation OpLoc,
12057                                                    Expr *OrigCallee,
12058                                                    Expr *First,
12059                                                    Expr *Second) {
12060   Expr *Callee = OrigCallee->IgnoreParenCasts();
12061   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
12062
12063   if (First->getObjectKind() == OK_ObjCProperty) {
12064     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12065     if (BinaryOperator::isAssignmentOp(Opc))
12066       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
12067                                                  First, Second);
12068     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
12069     if (Result.isInvalid())
12070       return ExprError();
12071     First = Result.get();
12072   }
12073
12074   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
12075     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
12076     if (Result.isInvalid())
12077       return ExprError();
12078     Second = Result.get();
12079   }
12080
12081   // Determine whether this should be a builtin operation.
12082   if (Op == OO_Subscript) {
12083     if (!First->getType()->isOverloadableType() &&
12084         !Second->getType()->isOverloadableType())
12085       return getSema().CreateBuiltinArraySubscriptExpr(First,
12086                                                        Callee->getLocStart(),
12087                                                        Second, OpLoc);
12088   } else if (Op == OO_Arrow) {
12089     // -> is never a builtin operation.
12090     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
12091   } else if (Second == nullptr || isPostIncDec) {
12092     if (!First->getType()->isOverloadableType()) {
12093       // The argument is not of overloadable type, so try to create a
12094       // built-in unary operation.
12095       UnaryOperatorKind Opc
12096         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12097
12098       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
12099     }
12100   } else {
12101     if (!First->getType()->isOverloadableType() &&
12102         !Second->getType()->isOverloadableType()) {
12103       // Neither of the arguments is an overloadable type, so try to
12104       // create a built-in binary operation.
12105       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12106       ExprResult Result
12107         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
12108       if (Result.isInvalid())
12109         return ExprError();
12110
12111       return Result;
12112     }
12113   }
12114
12115   // Compute the transformed set of functions (and function templates) to be
12116   // used during overload resolution.
12117   UnresolvedSet<16> Functions;
12118
12119   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12120     assert(ULE->requiresADL());
12121     Functions.append(ULE->decls_begin(), ULE->decls_end());
12122   } else {
12123     // If we've resolved this to a particular non-member function, just call
12124     // that function. If we resolved it to a member function,
12125     // CreateOverloaded* will find that function for us.
12126     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
12127     if (!isa<CXXMethodDecl>(ND))
12128       Functions.addDecl(ND);
12129   }
12130
12131   // Add any functions found via argument-dependent lookup.
12132   Expr *Args[2] = { First, Second };
12133   unsigned NumArgs = 1 + (Second != nullptr);
12134
12135   // Create the overloaded operator invocation for unary operators.
12136   if (NumArgs == 1 || isPostIncDec) {
12137     UnaryOperatorKind Opc
12138       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12139     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
12140   }
12141
12142   if (Op == OO_Subscript) {
12143     SourceLocation LBrace;
12144     SourceLocation RBrace;
12145
12146     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
12147         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
12148         LBrace = SourceLocation::getFromRawEncoding(
12149                     NameLoc.CXXOperatorName.BeginOpNameLoc);
12150         RBrace = SourceLocation::getFromRawEncoding(
12151                     NameLoc.CXXOperatorName.EndOpNameLoc);
12152     } else {
12153         LBrace = Callee->getLocStart();
12154         RBrace = OpLoc;
12155     }
12156
12157     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
12158                                                       First, Second);
12159   }
12160
12161   // Create the overloaded operator invocation for binary operators.
12162   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12163   ExprResult Result
12164     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
12165   if (Result.isInvalid())
12166     return ExprError();
12167
12168   return Result;
12169 }
12170
12171 template<typename Derived>
12172 ExprResult
12173 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
12174                                                      SourceLocation OperatorLoc,
12175                                                        bool isArrow,
12176                                                        CXXScopeSpec &SS,
12177                                                      TypeSourceInfo *ScopeType,
12178                                                        SourceLocation CCLoc,
12179                                                        SourceLocation TildeLoc,
12180                                         PseudoDestructorTypeStorage Destroyed) {
12181   QualType BaseType = Base->getType();
12182   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
12183       (!isArrow && !BaseType->getAs<RecordType>()) ||
12184       (isArrow && BaseType->getAs<PointerType>() &&
12185        !BaseType->getAs<PointerType>()->getPointeeType()
12186                                               ->template getAs<RecordType>())){
12187     // This pseudo-destructor expression is still a pseudo-destructor.
12188     return SemaRef.BuildPseudoDestructorExpr(
12189         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
12190         CCLoc, TildeLoc, Destroyed);
12191   }
12192
12193   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
12194   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
12195                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
12196   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
12197   NameInfo.setNamedTypeInfo(DestroyedType);
12198
12199   // The scope type is now known to be a valid nested name specifier
12200   // component. Tack it on to the end of the nested name specifier.
12201   if (ScopeType) {
12202     if (!ScopeType->getType()->getAs<TagType>()) {
12203       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
12204                      diag::err_expected_class_or_namespace)
12205           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
12206       return ExprError();
12207     }
12208     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
12209               CCLoc);
12210   }
12211
12212   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12213   return getSema().BuildMemberReferenceExpr(Base, BaseType,
12214                                             OperatorLoc, isArrow,
12215                                             SS, TemplateKWLoc,
12216                                             /*FIXME: FirstQualifier*/ nullptr,
12217                                             NameInfo,
12218                                             /*TemplateArgs*/ nullptr,
12219                                             /*S*/nullptr);
12220 }
12221
12222 template<typename Derived>
12223 StmtResult
12224 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
12225   SourceLocation Loc = S->getLocStart();
12226   CapturedDecl *CD = S->getCapturedDecl();
12227   unsigned NumParams = CD->getNumParams();
12228   unsigned ContextParamPos = CD->getContextParamPosition();
12229   SmallVector<Sema::CapturedParamNameType, 4> Params;
12230   for (unsigned I = 0; I < NumParams; ++I) {
12231     if (I != ContextParamPos) {
12232       Params.push_back(
12233              std::make_pair(
12234                   CD->getParam(I)->getName(),
12235                   getDerived().TransformType(CD->getParam(I)->getType())));
12236     } else {
12237       Params.push_back(std::make_pair(StringRef(), QualType()));
12238     }
12239   }
12240   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
12241                                      S->getCapturedRegionKind(), Params);
12242   StmtResult Body;
12243   {
12244     Sema::CompoundScopeRAII CompoundScope(getSema());
12245     Body = getDerived().TransformStmt(S->getCapturedStmt());
12246   }
12247
12248   if (Body.isInvalid()) {
12249     getSema().ActOnCapturedRegionError();
12250     return StmtError();
12251   }
12252
12253   return getSema().ActOnCapturedRegionEnd(Body.get());
12254 }
12255
12256 } // end namespace clang
12257
12258 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H