]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Sema/TreeTransform.h
Merge ^/head r311314 through r311459.
[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.setLocalRangeEnd(TL.getLocalRangeEnd());
5027   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5028     NewTL.setParam(i, ParamDecls[i]);
5029
5030   return Result;
5031 }
5032
5033 template<typename Derived>
5034 bool TreeTransform<Derived>::TransformExceptionSpec(
5035     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5036     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5037   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5038
5039   // Instantiate a dynamic noexcept expression, if any.
5040   if (ESI.Type == EST_ComputedNoexcept) {
5041     EnterExpressionEvaluationContext Unevaluated(getSema(),
5042                                                  Sema::ConstantEvaluated);
5043     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5044     if (NoexceptExpr.isInvalid())
5045       return true;
5046
5047     // FIXME: This is bogus, a noexcept expression is not a condition.
5048     NoexceptExpr = getSema().CheckBooleanCondition(Loc, NoexceptExpr.get());
5049     if (NoexceptExpr.isInvalid())
5050       return true;
5051
5052     if (!NoexceptExpr.get()->isValueDependent()) {
5053       NoexceptExpr = getSema().VerifyIntegerConstantExpression(
5054           NoexceptExpr.get(), nullptr,
5055           diag::err_noexcept_needs_constant_expression,
5056           /*AllowFold*/false);
5057       if (NoexceptExpr.isInvalid())
5058         return true;
5059     }
5060
5061     if (ESI.NoexceptExpr != NoexceptExpr.get())
5062       Changed = true;
5063     ESI.NoexceptExpr = NoexceptExpr.get();
5064   }
5065
5066   if (ESI.Type != EST_Dynamic)
5067     return false;
5068
5069   // Instantiate a dynamic exception specification's type.
5070   for (QualType T : ESI.Exceptions) {
5071     if (const PackExpansionType *PackExpansion =
5072             T->getAs<PackExpansionType>()) {
5073       Changed = true;
5074
5075       // We have a pack expansion. Instantiate it.
5076       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5077       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5078                                               Unexpanded);
5079       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5080
5081       // Determine whether the set of unexpanded parameter packs can and
5082       // should
5083       // be expanded.
5084       bool Expand = false;
5085       bool RetainExpansion = false;
5086       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5087       // FIXME: Track the location of the ellipsis (and track source location
5088       // information for the types in the exception specification in general).
5089       if (getDerived().TryExpandParameterPacks(
5090               Loc, SourceRange(), Unexpanded, Expand,
5091               RetainExpansion, NumExpansions))
5092         return true;
5093
5094       if (!Expand) {
5095         // We can't expand this pack expansion into separate arguments yet;
5096         // just substitute into the pattern and create a new pack expansion
5097         // type.
5098         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5099         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5100         if (U.isNull())
5101           return true;
5102
5103         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5104         Exceptions.push_back(U);
5105         continue;
5106       }
5107
5108       // Substitute into the pack expansion pattern for each slice of the
5109       // pack.
5110       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5111         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5112
5113         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5114         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5115           return true;
5116
5117         Exceptions.push_back(U);
5118       }
5119     } else {
5120       QualType U = getDerived().TransformType(T);
5121       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5122         return true;
5123       if (T != U)
5124         Changed = true;
5125
5126       Exceptions.push_back(U);
5127     }
5128   }
5129
5130   ESI.Exceptions = Exceptions;
5131   if (ESI.Exceptions.empty())
5132     ESI.Type = EST_DynamicNone;
5133   return false;
5134 }
5135
5136 template<typename Derived>
5137 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5138                                                  TypeLocBuilder &TLB,
5139                                                  FunctionNoProtoTypeLoc TL) {
5140   const FunctionNoProtoType *T = TL.getTypePtr();
5141   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5142   if (ResultType.isNull())
5143     return QualType();
5144
5145   QualType Result = TL.getType();
5146   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5147     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5148
5149   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5150   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5151   NewTL.setLParenLoc(TL.getLParenLoc());
5152   NewTL.setRParenLoc(TL.getRParenLoc());
5153   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5154
5155   return Result;
5156 }
5157
5158 template<typename Derived> QualType
5159 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5160                                                  UnresolvedUsingTypeLoc TL) {
5161   const UnresolvedUsingType *T = TL.getTypePtr();
5162   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5163   if (!D)
5164     return QualType();
5165
5166   QualType Result = TL.getType();
5167   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5168     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5169     if (Result.isNull())
5170       return QualType();
5171   }
5172
5173   // We might get an arbitrary type spec type back.  We should at
5174   // least always get a type spec type, though.
5175   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5176   NewTL.setNameLoc(TL.getNameLoc());
5177
5178   return Result;
5179 }
5180
5181 template<typename Derived>
5182 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5183                                                       TypedefTypeLoc TL) {
5184   const TypedefType *T = TL.getTypePtr();
5185   TypedefNameDecl *Typedef
5186     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5187                                                                T->getDecl()));
5188   if (!Typedef)
5189     return QualType();
5190
5191   QualType Result = TL.getType();
5192   if (getDerived().AlwaysRebuild() ||
5193       Typedef != T->getDecl()) {
5194     Result = getDerived().RebuildTypedefType(Typedef);
5195     if (Result.isNull())
5196       return QualType();
5197   }
5198
5199   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5200   NewTL.setNameLoc(TL.getNameLoc());
5201
5202   return Result;
5203 }
5204
5205 template<typename Derived>
5206 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5207                                                       TypeOfExprTypeLoc TL) {
5208   // typeof expressions are not potentially evaluated contexts
5209   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
5210                                                Sema::ReuseLambdaContextDecl);
5211
5212   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5213   if (E.isInvalid())
5214     return QualType();
5215
5216   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5217   if (E.isInvalid())
5218     return QualType();
5219
5220   QualType Result = TL.getType();
5221   if (getDerived().AlwaysRebuild() ||
5222       E.get() != TL.getUnderlyingExpr()) {
5223     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5224     if (Result.isNull())
5225       return QualType();
5226   }
5227   else E.get();
5228
5229   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5230   NewTL.setTypeofLoc(TL.getTypeofLoc());
5231   NewTL.setLParenLoc(TL.getLParenLoc());
5232   NewTL.setRParenLoc(TL.getRParenLoc());
5233
5234   return Result;
5235 }
5236
5237 template<typename Derived>
5238 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5239                                                      TypeOfTypeLoc TL) {
5240   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5241   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5242   if (!New_Under_TI)
5243     return QualType();
5244
5245   QualType Result = TL.getType();
5246   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5247     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5248     if (Result.isNull())
5249       return QualType();
5250   }
5251
5252   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5253   NewTL.setTypeofLoc(TL.getTypeofLoc());
5254   NewTL.setLParenLoc(TL.getLParenLoc());
5255   NewTL.setRParenLoc(TL.getRParenLoc());
5256   NewTL.setUnderlyingTInfo(New_Under_TI);
5257
5258   return Result;
5259 }
5260
5261 template<typename Derived>
5262 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5263                                                        DecltypeTypeLoc TL) {
5264   const DecltypeType *T = TL.getTypePtr();
5265
5266   // decltype expressions are not potentially evaluated contexts
5267   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
5268                                                nullptr, /*IsDecltype=*/ true);
5269
5270   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5271   if (E.isInvalid())
5272     return QualType();
5273
5274   E = getSema().ActOnDecltypeExpression(E.get());
5275   if (E.isInvalid())
5276     return QualType();
5277
5278   QualType Result = TL.getType();
5279   if (getDerived().AlwaysRebuild() ||
5280       E.get() != T->getUnderlyingExpr()) {
5281     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5282     if (Result.isNull())
5283       return QualType();
5284   }
5285   else E.get();
5286
5287   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5288   NewTL.setNameLoc(TL.getNameLoc());
5289
5290   return Result;
5291 }
5292
5293 template<typename Derived>
5294 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5295                                                             TypeLocBuilder &TLB,
5296                                                      UnaryTransformTypeLoc TL) {
5297   QualType Result = TL.getType();
5298   if (Result->isDependentType()) {
5299     const UnaryTransformType *T = TL.getTypePtr();
5300     QualType NewBase =
5301       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5302     Result = getDerived().RebuildUnaryTransformType(NewBase,
5303                                                     T->getUTTKind(),
5304                                                     TL.getKWLoc());
5305     if (Result.isNull())
5306       return QualType();
5307   }
5308
5309   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5310   NewTL.setKWLoc(TL.getKWLoc());
5311   NewTL.setParensRange(TL.getParensRange());
5312   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5313   return Result;
5314 }
5315
5316 template<typename Derived>
5317 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5318                                                    AutoTypeLoc TL) {
5319   const AutoType *T = TL.getTypePtr();
5320   QualType OldDeduced = T->getDeducedType();
5321   QualType NewDeduced;
5322   if (!OldDeduced.isNull()) {
5323     NewDeduced = getDerived().TransformType(OldDeduced);
5324     if (NewDeduced.isNull())
5325       return QualType();
5326   }
5327
5328   QualType Result = TL.getType();
5329   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5330       T->isDependentType()) {
5331     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5332     if (Result.isNull())
5333       return QualType();
5334   }
5335
5336   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5337   NewTL.setNameLoc(TL.getNameLoc());
5338
5339   return Result;
5340 }
5341
5342 template<typename Derived>
5343 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5344                                                      RecordTypeLoc TL) {
5345   const RecordType *T = TL.getTypePtr();
5346   RecordDecl *Record
5347     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5348                                                           T->getDecl()));
5349   if (!Record)
5350     return QualType();
5351
5352   QualType Result = TL.getType();
5353   if (getDerived().AlwaysRebuild() ||
5354       Record != T->getDecl()) {
5355     Result = getDerived().RebuildRecordType(Record);
5356     if (Result.isNull())
5357       return QualType();
5358   }
5359
5360   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5361   NewTL.setNameLoc(TL.getNameLoc());
5362
5363   return Result;
5364 }
5365
5366 template<typename Derived>
5367 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5368                                                    EnumTypeLoc TL) {
5369   const EnumType *T = TL.getTypePtr();
5370   EnumDecl *Enum
5371     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5372                                                         T->getDecl()));
5373   if (!Enum)
5374     return QualType();
5375
5376   QualType Result = TL.getType();
5377   if (getDerived().AlwaysRebuild() ||
5378       Enum != T->getDecl()) {
5379     Result = getDerived().RebuildEnumType(Enum);
5380     if (Result.isNull())
5381       return QualType();
5382   }
5383
5384   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5385   NewTL.setNameLoc(TL.getNameLoc());
5386
5387   return Result;
5388 }
5389
5390 template<typename Derived>
5391 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5392                                          TypeLocBuilder &TLB,
5393                                          InjectedClassNameTypeLoc TL) {
5394   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5395                                        TL.getTypePtr()->getDecl());
5396   if (!D) return QualType();
5397
5398   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5399   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5400   return T;
5401 }
5402
5403 template<typename Derived>
5404 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5405                                                 TypeLocBuilder &TLB,
5406                                                 TemplateTypeParmTypeLoc TL) {
5407   return TransformTypeSpecType(TLB, TL);
5408 }
5409
5410 template<typename Derived>
5411 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5412                                          TypeLocBuilder &TLB,
5413                                          SubstTemplateTypeParmTypeLoc TL) {
5414   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5415
5416   // Substitute into the replacement type, which itself might involve something
5417   // that needs to be transformed. This only tends to occur with default
5418   // template arguments of template template parameters.
5419   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5420   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5421   if (Replacement.isNull())
5422     return QualType();
5423
5424   // Always canonicalize the replacement type.
5425   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5426   QualType Result
5427     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5428                                                    Replacement);
5429
5430   // Propagate type-source information.
5431   SubstTemplateTypeParmTypeLoc NewTL
5432     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5433   NewTL.setNameLoc(TL.getNameLoc());
5434   return Result;
5435
5436 }
5437
5438 template<typename Derived>
5439 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5440                                           TypeLocBuilder &TLB,
5441                                           SubstTemplateTypeParmPackTypeLoc TL) {
5442   return TransformTypeSpecType(TLB, TL);
5443 }
5444
5445 template<typename Derived>
5446 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5447                                                         TypeLocBuilder &TLB,
5448                                            TemplateSpecializationTypeLoc TL) {
5449   const TemplateSpecializationType *T = TL.getTypePtr();
5450
5451   // The nested-name-specifier never matters in a TemplateSpecializationType,
5452   // because we can't have a dependent nested-name-specifier anyway.
5453   CXXScopeSpec SS;
5454   TemplateName Template
5455     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5456                                          TL.getTemplateNameLoc());
5457   if (Template.isNull())
5458     return QualType();
5459
5460   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5461 }
5462
5463 template<typename Derived>
5464 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5465                                                      AtomicTypeLoc TL) {
5466   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5467   if (ValueType.isNull())
5468     return QualType();
5469
5470   QualType Result = TL.getType();
5471   if (getDerived().AlwaysRebuild() ||
5472       ValueType != TL.getValueLoc().getType()) {
5473     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5474     if (Result.isNull())
5475       return QualType();
5476   }
5477
5478   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5479   NewTL.setKWLoc(TL.getKWLoc());
5480   NewTL.setLParenLoc(TL.getLParenLoc());
5481   NewTL.setRParenLoc(TL.getRParenLoc());
5482
5483   return Result;
5484 }
5485
5486 template <typename Derived>
5487 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5488                                                    PipeTypeLoc TL) {
5489   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5490   if (ValueType.isNull())
5491     return QualType();
5492
5493   QualType Result = TL.getType();
5494   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5495     const PipeType *PT = Result->getAs<PipeType>();
5496     bool isReadPipe = PT->isReadOnly();
5497     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
5498     if (Result.isNull())
5499       return QualType();
5500   }
5501
5502   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5503   NewTL.setKWLoc(TL.getKWLoc());
5504
5505   return Result;
5506 }
5507
5508   /// \brief Simple iterator that traverses the template arguments in a
5509   /// container that provides a \c getArgLoc() member function.
5510   ///
5511   /// This iterator is intended to be used with the iterator form of
5512   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5513   template<typename ArgLocContainer>
5514   class TemplateArgumentLocContainerIterator {
5515     ArgLocContainer *Container;
5516     unsigned Index;
5517
5518   public:
5519     typedef TemplateArgumentLoc value_type;
5520     typedef TemplateArgumentLoc reference;
5521     typedef int difference_type;
5522     typedef std::input_iterator_tag iterator_category;
5523
5524     class pointer {
5525       TemplateArgumentLoc Arg;
5526
5527     public:
5528       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5529
5530       const TemplateArgumentLoc *operator->() const {
5531         return &Arg;
5532       }
5533     };
5534
5535
5536     TemplateArgumentLocContainerIterator() {}
5537
5538     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5539                                  unsigned Index)
5540       : Container(&Container), Index(Index) { }
5541
5542     TemplateArgumentLocContainerIterator &operator++() {
5543       ++Index;
5544       return *this;
5545     }
5546
5547     TemplateArgumentLocContainerIterator operator++(int) {
5548       TemplateArgumentLocContainerIterator Old(*this);
5549       ++(*this);
5550       return Old;
5551     }
5552
5553     TemplateArgumentLoc operator*() const {
5554       return Container->getArgLoc(Index);
5555     }
5556
5557     pointer operator->() const {
5558       return pointer(Container->getArgLoc(Index));
5559     }
5560
5561     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5562                            const TemplateArgumentLocContainerIterator &Y) {
5563       return X.Container == Y.Container && X.Index == Y.Index;
5564     }
5565
5566     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5567                            const TemplateArgumentLocContainerIterator &Y) {
5568       return !(X == Y);
5569     }
5570   };
5571
5572
5573 template <typename Derived>
5574 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5575                                                         TypeLocBuilder &TLB,
5576                                            TemplateSpecializationTypeLoc TL,
5577                                                       TemplateName Template) {
5578   TemplateArgumentListInfo NewTemplateArgs;
5579   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5580   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5581   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5582     ArgIterator;
5583   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5584                                               ArgIterator(TL, TL.getNumArgs()),
5585                                               NewTemplateArgs))
5586     return QualType();
5587
5588   // FIXME: maybe don't rebuild if all the template arguments are the same.
5589
5590   QualType Result =
5591     getDerived().RebuildTemplateSpecializationType(Template,
5592                                                    TL.getTemplateNameLoc(),
5593                                                    NewTemplateArgs);
5594
5595   if (!Result.isNull()) {
5596     // Specializations of template template parameters are represented as
5597     // TemplateSpecializationTypes, and substitution of type alias templates
5598     // within a dependent context can transform them into
5599     // DependentTemplateSpecializationTypes.
5600     if (isa<DependentTemplateSpecializationType>(Result)) {
5601       DependentTemplateSpecializationTypeLoc NewTL
5602         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5603       NewTL.setElaboratedKeywordLoc(SourceLocation());
5604       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5605       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5606       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5607       NewTL.setLAngleLoc(TL.getLAngleLoc());
5608       NewTL.setRAngleLoc(TL.getRAngleLoc());
5609       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5610         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5611       return Result;
5612     }
5613
5614     TemplateSpecializationTypeLoc NewTL
5615       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5616     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5617     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5618     NewTL.setLAngleLoc(TL.getLAngleLoc());
5619     NewTL.setRAngleLoc(TL.getRAngleLoc());
5620     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5621       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5622   }
5623
5624   return Result;
5625 }
5626
5627 template <typename Derived>
5628 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5629                                      TypeLocBuilder &TLB,
5630                                      DependentTemplateSpecializationTypeLoc TL,
5631                                      TemplateName Template,
5632                                      CXXScopeSpec &SS) {
5633   TemplateArgumentListInfo NewTemplateArgs;
5634   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5635   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5636   typedef TemplateArgumentLocContainerIterator<
5637             DependentTemplateSpecializationTypeLoc> ArgIterator;
5638   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5639                                               ArgIterator(TL, TL.getNumArgs()),
5640                                               NewTemplateArgs))
5641     return QualType();
5642
5643   // FIXME: maybe don't rebuild if all the template arguments are the same.
5644
5645   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5646     QualType Result
5647       = getSema().Context.getDependentTemplateSpecializationType(
5648                                                 TL.getTypePtr()->getKeyword(),
5649                                                          DTN->getQualifier(),
5650                                                          DTN->getIdentifier(),
5651                                                                NewTemplateArgs);
5652
5653     DependentTemplateSpecializationTypeLoc NewTL
5654       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5655     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5656     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5657     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5658     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5659     NewTL.setLAngleLoc(TL.getLAngleLoc());
5660     NewTL.setRAngleLoc(TL.getRAngleLoc());
5661     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5662       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5663     return Result;
5664   }
5665
5666   QualType Result
5667     = getDerived().RebuildTemplateSpecializationType(Template,
5668                                                      TL.getTemplateNameLoc(),
5669                                                      NewTemplateArgs);
5670
5671   if (!Result.isNull()) {
5672     /// FIXME: Wrap this in an elaborated-type-specifier?
5673     TemplateSpecializationTypeLoc NewTL
5674       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5675     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5676     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5677     NewTL.setLAngleLoc(TL.getLAngleLoc());
5678     NewTL.setRAngleLoc(TL.getRAngleLoc());
5679     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5680       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5681   }
5682
5683   return Result;
5684 }
5685
5686 template<typename Derived>
5687 QualType
5688 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5689                                                 ElaboratedTypeLoc TL) {
5690   const ElaboratedType *T = TL.getTypePtr();
5691
5692   NestedNameSpecifierLoc QualifierLoc;
5693   // NOTE: the qualifier in an ElaboratedType is optional.
5694   if (TL.getQualifierLoc()) {
5695     QualifierLoc
5696       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5697     if (!QualifierLoc)
5698       return QualType();
5699   }
5700
5701   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5702   if (NamedT.isNull())
5703     return QualType();
5704
5705   // C++0x [dcl.type.elab]p2:
5706   //   If the identifier resolves to a typedef-name or the simple-template-id
5707   //   resolves to an alias template specialization, the
5708   //   elaborated-type-specifier is ill-formed.
5709   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5710     if (const TemplateSpecializationType *TST =
5711           NamedT->getAs<TemplateSpecializationType>()) {
5712       TemplateName Template = TST->getTemplateName();
5713       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
5714               Template.getAsTemplateDecl())) {
5715         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5716                      diag::err_tag_reference_non_tag)
5717             << TAT << Sema::NTK_TypeAliasTemplate
5718             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
5719         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5720       }
5721     }
5722   }
5723
5724   QualType Result = TL.getType();
5725   if (getDerived().AlwaysRebuild() ||
5726       QualifierLoc != TL.getQualifierLoc() ||
5727       NamedT != T->getNamedType()) {
5728     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5729                                                 T->getKeyword(),
5730                                                 QualifierLoc, NamedT);
5731     if (Result.isNull())
5732       return QualType();
5733   }
5734
5735   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5736   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5737   NewTL.setQualifierLoc(QualifierLoc);
5738   return Result;
5739 }
5740
5741 template<typename Derived>
5742 QualType TreeTransform<Derived>::TransformAttributedType(
5743                                                 TypeLocBuilder &TLB,
5744                                                 AttributedTypeLoc TL) {
5745   const AttributedType *oldType = TL.getTypePtr();
5746   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
5747   if (modifiedType.isNull())
5748     return QualType();
5749
5750   QualType result = TL.getType();
5751
5752   // FIXME: dependent operand expressions?
5753   if (getDerived().AlwaysRebuild() ||
5754       modifiedType != oldType->getModifiedType()) {
5755     // TODO: this is really lame; we should really be rebuilding the
5756     // equivalent type from first principles.
5757     QualType equivalentType
5758       = getDerived().TransformType(oldType->getEquivalentType());
5759     if (equivalentType.isNull())
5760       return QualType();
5761
5762     // Check whether we can add nullability; it is only represented as
5763     // type sugar, and therefore cannot be diagnosed in any other way.
5764     if (auto nullability = oldType->getImmediateNullability()) {
5765       if (!modifiedType->canHaveNullability()) {
5766         SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer)
5767           << DiagNullabilityKind(*nullability, false) << modifiedType;
5768         return QualType();
5769       }
5770     }
5771
5772     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
5773                                                modifiedType,
5774                                                equivalentType);
5775   }
5776
5777   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
5778   newTL.setAttrNameLoc(TL.getAttrNameLoc());
5779   if (TL.hasAttrOperand())
5780     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5781   if (TL.hasAttrExprOperand())
5782     newTL.setAttrExprOperand(TL.getAttrExprOperand());
5783   else if (TL.hasAttrEnumOperand())
5784     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
5785
5786   return result;
5787 }
5788
5789 template<typename Derived>
5790 QualType
5791 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
5792                                            ParenTypeLoc TL) {
5793   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
5794   if (Inner.isNull())
5795     return QualType();
5796
5797   QualType Result = TL.getType();
5798   if (getDerived().AlwaysRebuild() ||
5799       Inner != TL.getInnerLoc().getType()) {
5800     Result = getDerived().RebuildParenType(Inner);
5801     if (Result.isNull())
5802       return QualType();
5803   }
5804
5805   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
5806   NewTL.setLParenLoc(TL.getLParenLoc());
5807   NewTL.setRParenLoc(TL.getRParenLoc());
5808   return Result;
5809 }
5810
5811 template<typename Derived>
5812 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
5813                                                       DependentNameTypeLoc TL) {
5814   const DependentNameType *T = TL.getTypePtr();
5815
5816   NestedNameSpecifierLoc QualifierLoc
5817     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5818   if (!QualifierLoc)
5819     return QualType();
5820
5821   QualType Result
5822     = getDerived().RebuildDependentNameType(T->getKeyword(),
5823                                             TL.getElaboratedKeywordLoc(),
5824                                             QualifierLoc,
5825                                             T->getIdentifier(),
5826                                             TL.getNameLoc());
5827   if (Result.isNull())
5828     return QualType();
5829
5830   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
5831     QualType NamedT = ElabT->getNamedType();
5832     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
5833
5834     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5835     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5836     NewTL.setQualifierLoc(QualifierLoc);
5837   } else {
5838     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
5839     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5840     NewTL.setQualifierLoc(QualifierLoc);
5841     NewTL.setNameLoc(TL.getNameLoc());
5842   }
5843   return Result;
5844 }
5845
5846 template<typename Derived>
5847 QualType TreeTransform<Derived>::
5848           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5849                                  DependentTemplateSpecializationTypeLoc TL) {
5850   NestedNameSpecifierLoc QualifierLoc;
5851   if (TL.getQualifierLoc()) {
5852     QualifierLoc
5853       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5854     if (!QualifierLoc)
5855       return QualType();
5856   }
5857
5858   return getDerived()
5859            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
5860 }
5861
5862 template<typename Derived>
5863 QualType TreeTransform<Derived>::
5864 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5865                                    DependentTemplateSpecializationTypeLoc TL,
5866                                        NestedNameSpecifierLoc QualifierLoc) {
5867   const DependentTemplateSpecializationType *T = TL.getTypePtr();
5868
5869   TemplateArgumentListInfo NewTemplateArgs;
5870   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5871   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5872
5873   typedef TemplateArgumentLocContainerIterator<
5874   DependentTemplateSpecializationTypeLoc> ArgIterator;
5875   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5876                                               ArgIterator(TL, TL.getNumArgs()),
5877                                               NewTemplateArgs))
5878     return QualType();
5879
5880   QualType Result
5881     = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
5882                                                               QualifierLoc,
5883                                                             T->getIdentifier(),
5884                                                        TL.getTemplateNameLoc(),
5885                                                             NewTemplateArgs);
5886   if (Result.isNull())
5887     return QualType();
5888
5889   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
5890     QualType NamedT = ElabT->getNamedType();
5891
5892     // Copy information relevant to the template specialization.
5893     TemplateSpecializationTypeLoc NamedTL
5894       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
5895     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5896     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5897     NamedTL.setLAngleLoc(TL.getLAngleLoc());
5898     NamedTL.setRAngleLoc(TL.getRAngleLoc());
5899     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5900       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5901
5902     // Copy information relevant to the elaborated type.
5903     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5904     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5905     NewTL.setQualifierLoc(QualifierLoc);
5906   } else if (isa<DependentTemplateSpecializationType>(Result)) {
5907     DependentTemplateSpecializationTypeLoc SpecTL
5908       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5909     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5910     SpecTL.setQualifierLoc(QualifierLoc);
5911     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5912     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5913     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5914     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5915     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5916       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5917   } else {
5918     TemplateSpecializationTypeLoc SpecTL
5919       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5920     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5921     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5922     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5923     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5924     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5925       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5926   }
5927   return Result;
5928 }
5929
5930 template<typename Derived>
5931 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
5932                                                       PackExpansionTypeLoc TL) {
5933   QualType Pattern
5934     = getDerived().TransformType(TLB, TL.getPatternLoc());
5935   if (Pattern.isNull())
5936     return QualType();
5937
5938   QualType Result = TL.getType();
5939   if (getDerived().AlwaysRebuild() ||
5940       Pattern != TL.getPatternLoc().getType()) {
5941     Result = getDerived().RebuildPackExpansionType(Pattern,
5942                                            TL.getPatternLoc().getSourceRange(),
5943                                                    TL.getEllipsisLoc(),
5944                                            TL.getTypePtr()->getNumExpansions());
5945     if (Result.isNull())
5946       return QualType();
5947   }
5948
5949   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
5950   NewT.setEllipsisLoc(TL.getEllipsisLoc());
5951   return Result;
5952 }
5953
5954 template<typename Derived>
5955 QualType
5956 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
5957                                                    ObjCInterfaceTypeLoc TL) {
5958   // ObjCInterfaceType is never dependent.
5959   TLB.pushFullCopy(TL);
5960   return TL.getType();
5961 }
5962
5963 template<typename Derived>
5964 QualType
5965 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
5966                                                    ObjCTypeParamTypeLoc TL) {
5967   const ObjCTypeParamType *T = TL.getTypePtr();
5968   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
5969       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
5970   if (!OTP)
5971     return QualType();
5972
5973   QualType Result = TL.getType();
5974   if (getDerived().AlwaysRebuild() ||
5975       OTP != T->getDecl()) {
5976     Result = getDerived().RebuildObjCTypeParamType(OTP,
5977                  TL.getProtocolLAngleLoc(),
5978                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
5979                                     TL.getNumProtocols()),
5980                  TL.getProtocolLocs(),
5981                  TL.getProtocolRAngleLoc());
5982     if (Result.isNull())
5983       return QualType();
5984   }
5985
5986   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
5987   if (TL.getNumProtocols()) {
5988     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
5989     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
5990       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
5991     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
5992   }
5993   return Result;
5994 }
5995
5996 template<typename Derived>
5997 QualType
5998 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
5999                                                 ObjCObjectTypeLoc TL) {
6000   // Transform base type.
6001   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6002   if (BaseType.isNull())
6003     return QualType();
6004
6005   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6006
6007   // Transform type arguments.
6008   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6009   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6010     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6011     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6012     QualType TypeArg = TypeArgInfo->getType();
6013     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6014       AnyChanged = true;
6015
6016       // We have a pack expansion. Instantiate it.
6017       const auto *PackExpansion = PackExpansionLoc.getType()
6018                                     ->castAs<PackExpansionType>();
6019       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6020       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6021                                               Unexpanded);
6022       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6023
6024       // Determine whether the set of unexpanded parameter packs can
6025       // and should be expanded.
6026       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6027       bool Expand = false;
6028       bool RetainExpansion = false;
6029       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6030       if (getDerived().TryExpandParameterPacks(
6031             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6032             Unexpanded, Expand, RetainExpansion, NumExpansions))
6033         return QualType();
6034
6035       if (!Expand) {
6036         // We can't expand this pack expansion into separate arguments yet;
6037         // just substitute into the pattern and create a new pack expansion
6038         // type.
6039         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6040
6041         TypeLocBuilder TypeArgBuilder;
6042         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6043         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 
6044                                                              PatternLoc);
6045         if (NewPatternType.isNull())
6046           return QualType();
6047
6048         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6049                                       NewPatternType, NumExpansions);
6050         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6051         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6052         NewTypeArgInfos.push_back(
6053           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6054         continue;
6055       }
6056
6057       // Substitute into the pack expansion pattern for each slice of the
6058       // pack.
6059       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6060         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6061
6062         TypeLocBuilder TypeArgBuilder;
6063         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6064
6065         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6066                                                          PatternLoc);
6067         if (NewTypeArg.isNull())
6068           return QualType();
6069
6070         NewTypeArgInfos.push_back(
6071           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6072       }
6073
6074       continue;
6075     }
6076
6077     TypeLocBuilder TypeArgBuilder;
6078     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6079     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6080     if (NewTypeArg.isNull())
6081       return QualType();
6082
6083     // If nothing changed, just keep the old TypeSourceInfo.
6084     if (NewTypeArg == TypeArg) {
6085       NewTypeArgInfos.push_back(TypeArgInfo);
6086       continue;
6087     }
6088
6089     NewTypeArgInfos.push_back(
6090       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6091     AnyChanged = true;
6092   }
6093
6094   QualType Result = TL.getType();
6095   if (getDerived().AlwaysRebuild() || AnyChanged) {
6096     // Rebuild the type.
6097     Result = getDerived().RebuildObjCObjectType(
6098                BaseType,
6099                TL.getLocStart(),
6100                TL.getTypeArgsLAngleLoc(),
6101                NewTypeArgInfos,
6102                TL.getTypeArgsRAngleLoc(),
6103                TL.getProtocolLAngleLoc(),
6104                llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6105                                   TL.getNumProtocols()),
6106                TL.getProtocolLocs(),
6107                TL.getProtocolRAngleLoc());
6108
6109     if (Result.isNull())
6110       return QualType();
6111   }
6112
6113   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6114   NewT.setHasBaseTypeAsWritten(true);
6115   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6116   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6117     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6118   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6119   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6120   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6121     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6122   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6123   return Result;
6124 }
6125
6126 template<typename Derived>
6127 QualType
6128 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6129                                                ObjCObjectPointerTypeLoc TL) {
6130   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6131   if (PointeeType.isNull())
6132     return QualType();
6133
6134   QualType Result = TL.getType();
6135   if (getDerived().AlwaysRebuild() ||
6136       PointeeType != TL.getPointeeLoc().getType()) {
6137     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6138                                                        TL.getStarLoc());
6139     if (Result.isNull())
6140       return QualType();
6141   }
6142
6143   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6144   NewT.setStarLoc(TL.getStarLoc());
6145   return Result;
6146 }
6147
6148 //===----------------------------------------------------------------------===//
6149 // Statement transformation
6150 //===----------------------------------------------------------------------===//
6151 template<typename Derived>
6152 StmtResult
6153 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6154   return S;
6155 }
6156
6157 template<typename Derived>
6158 StmtResult
6159 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6160   return getDerived().TransformCompoundStmt(S, false);
6161 }
6162
6163 template<typename Derived>
6164 StmtResult
6165 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6166                                               bool IsStmtExpr) {
6167   Sema::CompoundScopeRAII CompoundScope(getSema());
6168
6169   bool SubStmtInvalid = false;
6170   bool SubStmtChanged = false;
6171   SmallVector<Stmt*, 8> Statements;
6172   for (auto *B : S->body()) {
6173     StmtResult Result = getDerived().TransformStmt(B);
6174     if (Result.isInvalid()) {
6175       // Immediately fail if this was a DeclStmt, since it's very
6176       // likely that this will cause problems for future statements.
6177       if (isa<DeclStmt>(B))
6178         return StmtError();
6179
6180       // Otherwise, just keep processing substatements and fail later.
6181       SubStmtInvalid = true;
6182       continue;
6183     }
6184
6185     SubStmtChanged = SubStmtChanged || Result.get() != B;
6186     Statements.push_back(Result.getAs<Stmt>());
6187   }
6188
6189   if (SubStmtInvalid)
6190     return StmtError();
6191
6192   if (!getDerived().AlwaysRebuild() &&
6193       !SubStmtChanged)
6194     return S;
6195
6196   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6197                                           Statements,
6198                                           S->getRBracLoc(),
6199                                           IsStmtExpr);
6200 }
6201
6202 template<typename Derived>
6203 StmtResult
6204 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6205   ExprResult LHS, RHS;
6206   {
6207     EnterExpressionEvaluationContext Unevaluated(SemaRef,
6208                                                  Sema::ConstantEvaluated);
6209
6210     // Transform the left-hand case value.
6211     LHS = getDerived().TransformExpr(S->getLHS());
6212     LHS = SemaRef.ActOnConstantExpression(LHS);
6213     if (LHS.isInvalid())
6214       return StmtError();
6215
6216     // Transform the right-hand case value (for the GNU case-range extension).
6217     RHS = getDerived().TransformExpr(S->getRHS());
6218     RHS = SemaRef.ActOnConstantExpression(RHS);
6219     if (RHS.isInvalid())
6220       return StmtError();
6221   }
6222
6223   // Build the case statement.
6224   // Case statements are always rebuilt so that they will attached to their
6225   // transformed switch statement.
6226   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6227                                                        LHS.get(),
6228                                                        S->getEllipsisLoc(),
6229                                                        RHS.get(),
6230                                                        S->getColonLoc());
6231   if (Case.isInvalid())
6232     return StmtError();
6233
6234   // Transform the statement following the case
6235   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6236   if (SubStmt.isInvalid())
6237     return StmtError();
6238
6239   // Attach the body to the case statement
6240   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6241 }
6242
6243 template<typename Derived>
6244 StmtResult
6245 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6246   // Transform the statement following the default case
6247   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6248   if (SubStmt.isInvalid())
6249     return StmtError();
6250
6251   // Default statements are always rebuilt
6252   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6253                                          SubStmt.get());
6254 }
6255
6256 template<typename Derived>
6257 StmtResult
6258 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
6259   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6260   if (SubStmt.isInvalid())
6261     return StmtError();
6262
6263   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6264                                         S->getDecl());
6265   if (!LD)
6266     return StmtError();
6267
6268
6269   // FIXME: Pass the real colon location in.
6270   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6271                                        cast<LabelDecl>(LD), SourceLocation(),
6272                                        SubStmt.get());
6273 }
6274
6275 template <typename Derived>
6276 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6277   if (!R)
6278     return R;
6279
6280   switch (R->getKind()) {
6281 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6282 #define ATTR(X)
6283 #define PRAGMA_SPELLING_ATTR(X)                                                \
6284   case attr::X:                                                                \
6285     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6286 #include "clang/Basic/AttrList.inc"
6287   default:
6288     return R;
6289   }
6290 }
6291
6292 template <typename Derived>
6293 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
6294   bool AttrsChanged = false;
6295   SmallVector<const Attr *, 1> Attrs;
6296
6297   // Visit attributes and keep track if any are transformed.
6298   for (const auto *I : S->getAttrs()) {
6299     const Attr *R = getDerived().TransformAttr(I);
6300     AttrsChanged |= (I != R);
6301     Attrs.push_back(R);
6302   }
6303
6304   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6305   if (SubStmt.isInvalid())
6306     return StmtError();
6307
6308   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6309     return S;
6310
6311   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6312                                             SubStmt.get());
6313 }
6314
6315 template<typename Derived>
6316 StmtResult
6317 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6318   // Transform the initialization statement
6319   StmtResult Init = getDerived().TransformStmt(S->getInit());
6320   if (Init.isInvalid())
6321     return StmtError();
6322
6323   // Transform the condition
6324   Sema::ConditionResult Cond = getDerived().TransformCondition(
6325       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6326       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6327                        : Sema::ConditionKind::Boolean);
6328   if (Cond.isInvalid())
6329     return StmtError();
6330
6331   // If this is a constexpr if, determine which arm we should instantiate.
6332   llvm::Optional<bool> ConstexprConditionValue;
6333   if (S->isConstexpr())
6334     ConstexprConditionValue = Cond.getKnownValue();
6335
6336   // Transform the "then" branch.
6337   StmtResult Then;
6338   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6339     Then = getDerived().TransformStmt(S->getThen());
6340     if (Then.isInvalid())
6341       return StmtError();
6342   } else {
6343     Then = new (getSema().Context) NullStmt(S->getThen()->getLocStart());
6344   }
6345
6346   // Transform the "else" branch.
6347   StmtResult Else;
6348   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6349     Else = getDerived().TransformStmt(S->getElse());
6350     if (Else.isInvalid())
6351       return StmtError();
6352   }
6353
6354   if (!getDerived().AlwaysRebuild() &&
6355       Init.get() == S->getInit() &&
6356       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6357       Then.get() == S->getThen() &&
6358       Else.get() == S->getElse())
6359     return S;
6360
6361   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6362                                     Init.get(), Then.get(), S->getElseLoc(),
6363                                     Else.get());
6364 }
6365
6366 template<typename Derived>
6367 StmtResult
6368 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6369   // Transform the initialization statement
6370   StmtResult Init = getDerived().TransformStmt(S->getInit());
6371   if (Init.isInvalid())
6372     return StmtError();
6373
6374   // Transform the condition.
6375   Sema::ConditionResult Cond = getDerived().TransformCondition(
6376       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6377       Sema::ConditionKind::Switch);
6378   if (Cond.isInvalid())
6379     return StmtError();
6380
6381   // Rebuild the switch statement.
6382   StmtResult Switch
6383     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(),
6384                                           S->getInit(), Cond);
6385   if (Switch.isInvalid())
6386     return StmtError();
6387
6388   // Transform the body of the switch statement.
6389   StmtResult Body = getDerived().TransformStmt(S->getBody());
6390   if (Body.isInvalid())
6391     return StmtError();
6392
6393   // Complete the switch statement.
6394   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6395                                             Body.get());
6396 }
6397
6398 template<typename Derived>
6399 StmtResult
6400 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6401   // Transform the condition
6402   Sema::ConditionResult Cond = getDerived().TransformCondition(
6403       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6404       Sema::ConditionKind::Boolean);
6405   if (Cond.isInvalid())
6406     return StmtError();
6407
6408   // Transform the body
6409   StmtResult Body = getDerived().TransformStmt(S->getBody());
6410   if (Body.isInvalid())
6411     return StmtError();
6412
6413   if (!getDerived().AlwaysRebuild() &&
6414       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6415       Body.get() == S->getBody())
6416     return Owned(S);
6417
6418   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6419 }
6420
6421 template<typename Derived>
6422 StmtResult
6423 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6424   // Transform the body
6425   StmtResult Body = getDerived().TransformStmt(S->getBody());
6426   if (Body.isInvalid())
6427     return StmtError();
6428
6429   // Transform the condition
6430   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6431   if (Cond.isInvalid())
6432     return StmtError();
6433
6434   if (!getDerived().AlwaysRebuild() &&
6435       Cond.get() == S->getCond() &&
6436       Body.get() == S->getBody())
6437     return S;
6438
6439   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6440                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6441                                     S->getRParenLoc());
6442 }
6443
6444 template<typename Derived>
6445 StmtResult
6446 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6447   // Transform the initialization statement
6448   StmtResult Init = getDerived().TransformStmt(S->getInit());
6449   if (Init.isInvalid())
6450     return StmtError();
6451
6452   // In OpenMP loop region loop control variable must be captured and be
6453   // private. Perform analysis of first part (if any).
6454   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6455     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6456
6457   // Transform the condition
6458   Sema::ConditionResult Cond = getDerived().TransformCondition(
6459       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6460       Sema::ConditionKind::Boolean);
6461   if (Cond.isInvalid())
6462     return StmtError();
6463
6464   // Transform the increment
6465   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6466   if (Inc.isInvalid())
6467     return StmtError();
6468
6469   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6470   if (S->getInc() && !FullInc.get())
6471     return StmtError();
6472
6473   // Transform the body
6474   StmtResult Body = getDerived().TransformStmt(S->getBody());
6475   if (Body.isInvalid())
6476     return StmtError();
6477
6478   if (!getDerived().AlwaysRebuild() &&
6479       Init.get() == S->getInit() &&
6480       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6481       Inc.get() == S->getInc() &&
6482       Body.get() == S->getBody())
6483     return S;
6484
6485   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6486                                      Init.get(), Cond, FullInc,
6487                                      S->getRParenLoc(), Body.get());
6488 }
6489
6490 template<typename Derived>
6491 StmtResult
6492 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6493   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6494                                         S->getLabel());
6495   if (!LD)
6496     return StmtError();
6497
6498   // Goto statements must always be rebuilt, to resolve the label.
6499   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6500                                       cast<LabelDecl>(LD));
6501 }
6502
6503 template<typename Derived>
6504 StmtResult
6505 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6506   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6507   if (Target.isInvalid())
6508     return StmtError();
6509   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6510
6511   if (!getDerived().AlwaysRebuild() &&
6512       Target.get() == S->getTarget())
6513     return S;
6514
6515   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6516                                               Target.get());
6517 }
6518
6519 template<typename Derived>
6520 StmtResult
6521 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6522   return S;
6523 }
6524
6525 template<typename Derived>
6526 StmtResult
6527 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6528   return S;
6529 }
6530
6531 template<typename Derived>
6532 StmtResult
6533 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6534   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6535                                                         /*NotCopyInit*/false);
6536   if (Result.isInvalid())
6537     return StmtError();
6538
6539   // FIXME: We always rebuild the return statement because there is no way
6540   // to tell whether the return type of the function has changed.
6541   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6542 }
6543
6544 template<typename Derived>
6545 StmtResult
6546 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6547   bool DeclChanged = false;
6548   SmallVector<Decl *, 4> Decls;
6549   for (auto *D : S->decls()) {
6550     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6551     if (!Transformed)
6552       return StmtError();
6553
6554     if (Transformed != D)
6555       DeclChanged = true;
6556
6557     Decls.push_back(Transformed);
6558   }
6559
6560   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6561     return S;
6562
6563   return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
6564 }
6565
6566 template<typename Derived>
6567 StmtResult
6568 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6569
6570   SmallVector<Expr*, 8> Constraints;
6571   SmallVector<Expr*, 8> Exprs;
6572   SmallVector<IdentifierInfo *, 4> Names;
6573
6574   ExprResult AsmString;
6575   SmallVector<Expr*, 8> Clobbers;
6576
6577   bool ExprsChanged = false;
6578
6579   // Go through the outputs.
6580   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6581     Names.push_back(S->getOutputIdentifier(I));
6582
6583     // No need to transform the constraint literal.
6584     Constraints.push_back(S->getOutputConstraintLiteral(I));
6585
6586     // Transform the output expr.
6587     Expr *OutputExpr = S->getOutputExpr(I);
6588     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6589     if (Result.isInvalid())
6590       return StmtError();
6591
6592     ExprsChanged |= Result.get() != OutputExpr;
6593
6594     Exprs.push_back(Result.get());
6595   }
6596
6597   // Go through the inputs.
6598   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6599     Names.push_back(S->getInputIdentifier(I));
6600
6601     // No need to transform the constraint literal.
6602     Constraints.push_back(S->getInputConstraintLiteral(I));
6603
6604     // Transform the input expr.
6605     Expr *InputExpr = S->getInputExpr(I);
6606     ExprResult Result = getDerived().TransformExpr(InputExpr);
6607     if (Result.isInvalid())
6608       return StmtError();
6609
6610     ExprsChanged |= Result.get() != InputExpr;
6611
6612     Exprs.push_back(Result.get());
6613   }
6614
6615   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6616     return S;
6617
6618   // Go through the clobbers.
6619   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6620     Clobbers.push_back(S->getClobberStringLiteral(I));
6621
6622   // No need to transform the asm string literal.
6623   AsmString = S->getAsmString();
6624   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6625                                         S->isVolatile(), S->getNumOutputs(),
6626                                         S->getNumInputs(), Names.data(),
6627                                         Constraints, Exprs, AsmString.get(),
6628                                         Clobbers, S->getRParenLoc());
6629 }
6630
6631 template<typename Derived>
6632 StmtResult
6633 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6634   ArrayRef<Token> AsmToks =
6635     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6636
6637   bool HadError = false, HadChange = false;
6638
6639   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6640   SmallVector<Expr*, 8> TransformedExprs;
6641   TransformedExprs.reserve(SrcExprs.size());
6642   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6643     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6644     if (!Result.isUsable()) {
6645       HadError = true;
6646     } else {
6647       HadChange |= (Result.get() != SrcExprs[i]);
6648       TransformedExprs.push_back(Result.get());
6649     }
6650   }
6651
6652   if (HadError) return StmtError();
6653   if (!HadChange && !getDerived().AlwaysRebuild())
6654     return Owned(S);
6655
6656   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6657                                        AsmToks, S->getAsmString(),
6658                                        S->getNumOutputs(), S->getNumInputs(),
6659                                        S->getAllConstraints(), S->getClobbers(),
6660                                        TransformedExprs, S->getEndLoc());
6661 }
6662
6663 // C++ Coroutines TS
6664
6665 template<typename Derived>
6666 StmtResult
6667 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
6668   // The coroutine body should be re-formed by the caller if necessary.
6669   // FIXME: The coroutine body is always rebuilt by ActOnFinishFunctionBody
6670   return getDerived().TransformStmt(S->getBody());
6671 }
6672
6673 template<typename Derived>
6674 StmtResult
6675 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
6676   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
6677                                                         /*NotCopyInit*/false);
6678   if (Result.isInvalid())
6679     return StmtError();
6680
6681   // Always rebuild; we don't know if this needs to be injected into a new
6682   // context or if the promise type has changed.
6683   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get());
6684 }
6685
6686 template<typename Derived>
6687 ExprResult
6688 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
6689   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
6690                                                         /*NotCopyInit*/false);
6691   if (Result.isInvalid())
6692     return ExprError();
6693
6694   // Always rebuild; we don't know if this needs to be injected into a new
6695   // context or if the promise type has changed.
6696   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get());
6697 }
6698
6699 template<typename Derived>
6700 ExprResult
6701 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
6702   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
6703                                                         /*NotCopyInit*/false);
6704   if (Result.isInvalid())
6705     return ExprError();
6706
6707   // Always rebuild; we don't know if this needs to be injected into a new
6708   // context or if the promise type has changed.
6709   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
6710 }
6711
6712 // Objective-C Statements.
6713
6714 template<typename Derived>
6715 StmtResult
6716 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
6717   // Transform the body of the @try.
6718   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
6719   if (TryBody.isInvalid())
6720     return StmtError();
6721
6722   // Transform the @catch statements (if present).
6723   bool AnyCatchChanged = false;
6724   SmallVector<Stmt*, 8> CatchStmts;
6725   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
6726     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
6727     if (Catch.isInvalid())
6728       return StmtError();
6729     if (Catch.get() != S->getCatchStmt(I))
6730       AnyCatchChanged = true;
6731     CatchStmts.push_back(Catch.get());
6732   }
6733
6734   // Transform the @finally statement (if present).
6735   StmtResult Finally;
6736   if (S->getFinallyStmt()) {
6737     Finally = getDerived().TransformStmt(S->getFinallyStmt());
6738     if (Finally.isInvalid())
6739       return StmtError();
6740   }
6741
6742   // If nothing changed, just retain this statement.
6743   if (!getDerived().AlwaysRebuild() &&
6744       TryBody.get() == S->getTryBody() &&
6745       !AnyCatchChanged &&
6746       Finally.get() == S->getFinallyStmt())
6747     return S;
6748
6749   // Build a new statement.
6750   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
6751                                            CatchStmts, Finally.get());
6752 }
6753
6754 template<typename Derived>
6755 StmtResult
6756 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
6757   // Transform the @catch parameter, if there is one.
6758   VarDecl *Var = nullptr;
6759   if (VarDecl *FromVar = S->getCatchParamDecl()) {
6760     TypeSourceInfo *TSInfo = nullptr;
6761     if (FromVar->getTypeSourceInfo()) {
6762       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
6763       if (!TSInfo)
6764         return StmtError();
6765     }
6766
6767     QualType T;
6768     if (TSInfo)
6769       T = TSInfo->getType();
6770     else {
6771       T = getDerived().TransformType(FromVar->getType());
6772       if (T.isNull())
6773         return StmtError();
6774     }
6775
6776     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
6777     if (!Var)
6778       return StmtError();
6779   }
6780
6781   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
6782   if (Body.isInvalid())
6783     return StmtError();
6784
6785   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
6786                                              S->getRParenLoc(),
6787                                              Var, Body.get());
6788 }
6789
6790 template<typename Derived>
6791 StmtResult
6792 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
6793   // Transform the body.
6794   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
6795   if (Body.isInvalid())
6796     return StmtError();
6797
6798   // If nothing changed, just retain this statement.
6799   if (!getDerived().AlwaysRebuild() &&
6800       Body.get() == S->getFinallyBody())
6801     return S;
6802
6803   // Build a new statement.
6804   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
6805                                                Body.get());
6806 }
6807
6808 template<typename Derived>
6809 StmtResult
6810 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6811   ExprResult Operand;
6812   if (S->getThrowExpr()) {
6813     Operand = getDerived().TransformExpr(S->getThrowExpr());
6814     if (Operand.isInvalid())
6815       return StmtError();
6816   }
6817
6818   if (!getDerived().AlwaysRebuild() &&
6819       Operand.get() == S->getThrowExpr())
6820     return S;
6821
6822   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
6823 }
6824
6825 template<typename Derived>
6826 StmtResult
6827 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
6828                                                   ObjCAtSynchronizedStmt *S) {
6829   // Transform the object we are locking.
6830   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
6831   if (Object.isInvalid())
6832     return StmtError();
6833   Object =
6834     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
6835                                                   Object.get());
6836   if (Object.isInvalid())
6837     return StmtError();
6838
6839   // Transform the body.
6840   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
6841   if (Body.isInvalid())
6842     return StmtError();
6843
6844   // If nothing change, just retain the current statement.
6845   if (!getDerived().AlwaysRebuild() &&
6846       Object.get() == S->getSynchExpr() &&
6847       Body.get() == S->getSynchBody())
6848     return S;
6849
6850   // Build a new statement.
6851   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
6852                                                     Object.get(), Body.get());
6853 }
6854
6855 template<typename Derived>
6856 StmtResult
6857 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
6858                                               ObjCAutoreleasePoolStmt *S) {
6859   // Transform the body.
6860   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
6861   if (Body.isInvalid())
6862     return StmtError();
6863
6864   // If nothing changed, just retain this statement.
6865   if (!getDerived().AlwaysRebuild() &&
6866       Body.get() == S->getSubStmt())
6867     return S;
6868
6869   // Build a new statement.
6870   return getDerived().RebuildObjCAutoreleasePoolStmt(
6871                         S->getAtLoc(), Body.get());
6872 }
6873
6874 template<typename Derived>
6875 StmtResult
6876 TreeTransform<Derived>::TransformObjCForCollectionStmt(
6877                                                   ObjCForCollectionStmt *S) {
6878   // Transform the element statement.
6879   StmtResult Element = getDerived().TransformStmt(S->getElement());
6880   if (Element.isInvalid())
6881     return StmtError();
6882
6883   // Transform the collection expression.
6884   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
6885   if (Collection.isInvalid())
6886     return StmtError();
6887
6888   // Transform the body.
6889   StmtResult Body = getDerived().TransformStmt(S->getBody());
6890   if (Body.isInvalid())
6891     return StmtError();
6892
6893   // If nothing changed, just retain this statement.
6894   if (!getDerived().AlwaysRebuild() &&
6895       Element.get() == S->getElement() &&
6896       Collection.get() == S->getCollection() &&
6897       Body.get() == S->getBody())
6898     return S;
6899
6900   // Build a new statement.
6901   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
6902                                                    Element.get(),
6903                                                    Collection.get(),
6904                                                    S->getRParenLoc(),
6905                                                    Body.get());
6906 }
6907
6908 template <typename Derived>
6909 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
6910   // Transform the exception declaration, if any.
6911   VarDecl *Var = nullptr;
6912   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
6913     TypeSourceInfo *T =
6914         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
6915     if (!T)
6916       return StmtError();
6917
6918     Var = getDerived().RebuildExceptionDecl(
6919         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
6920         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
6921     if (!Var || Var->isInvalidDecl())
6922       return StmtError();
6923   }
6924
6925   // Transform the actual exception handler.
6926   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
6927   if (Handler.isInvalid())
6928     return StmtError();
6929
6930   if (!getDerived().AlwaysRebuild() && !Var &&
6931       Handler.get() == S->getHandlerBlock())
6932     return S;
6933
6934   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
6935 }
6936
6937 template <typename Derived>
6938 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
6939   // Transform the try block itself.
6940   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6941   if (TryBlock.isInvalid())
6942     return StmtError();
6943
6944   // Transform the handlers.
6945   bool HandlerChanged = false;
6946   SmallVector<Stmt *, 8> Handlers;
6947   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
6948     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
6949     if (Handler.isInvalid())
6950       return StmtError();
6951
6952     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
6953     Handlers.push_back(Handler.getAs<Stmt>());
6954   }
6955
6956   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6957       !HandlerChanged)
6958     return S;
6959
6960   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
6961                                         Handlers);
6962 }
6963
6964 template<typename Derived>
6965 StmtResult
6966 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
6967   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
6968   if (Range.isInvalid())
6969     return StmtError();
6970
6971   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
6972   if (Begin.isInvalid())
6973     return StmtError();
6974   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
6975   if (End.isInvalid())
6976     return StmtError();
6977
6978   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6979   if (Cond.isInvalid())
6980     return StmtError();
6981   if (Cond.get())
6982     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
6983   if (Cond.isInvalid())
6984     return StmtError();
6985   if (Cond.get())
6986     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
6987
6988   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6989   if (Inc.isInvalid())
6990     return StmtError();
6991   if (Inc.get())
6992     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
6993
6994   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
6995   if (LoopVar.isInvalid())
6996     return StmtError();
6997
6998   StmtResult NewStmt = S;
6999   if (getDerived().AlwaysRebuild() ||
7000       Range.get() != S->getRangeStmt() ||
7001       Begin.get() != S->getBeginStmt() ||
7002       End.get() != S->getEndStmt() ||
7003       Cond.get() != S->getCond() ||
7004       Inc.get() != S->getInc() ||
7005       LoopVar.get() != S->getLoopVarStmt()) {
7006     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7007                                                   S->getCoawaitLoc(),
7008                                                   S->getColonLoc(), Range.get(),
7009                                                   Begin.get(), End.get(),
7010                                                   Cond.get(),
7011                                                   Inc.get(), LoopVar.get(),
7012                                                   S->getRParenLoc());
7013     if (NewStmt.isInvalid())
7014       return StmtError();
7015   }
7016
7017   StmtResult Body = getDerived().TransformStmt(S->getBody());
7018   if (Body.isInvalid())
7019     return StmtError();
7020
7021   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7022   // it now so we have a new statement to attach the body to.
7023   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7024     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7025                                                   S->getCoawaitLoc(),
7026                                                   S->getColonLoc(), Range.get(),
7027                                                   Begin.get(), End.get(),
7028                                                   Cond.get(),
7029                                                   Inc.get(), LoopVar.get(),
7030                                                   S->getRParenLoc());
7031     if (NewStmt.isInvalid())
7032       return StmtError();
7033   }
7034
7035   if (NewStmt.get() == S)
7036     return S;
7037
7038   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7039 }
7040
7041 template<typename Derived>
7042 StmtResult
7043 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7044                                                     MSDependentExistsStmt *S) {
7045   // Transform the nested-name-specifier, if any.
7046   NestedNameSpecifierLoc QualifierLoc;
7047   if (S->getQualifierLoc()) {
7048     QualifierLoc
7049       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7050     if (!QualifierLoc)
7051       return StmtError();
7052   }
7053
7054   // Transform the declaration name.
7055   DeclarationNameInfo NameInfo = S->getNameInfo();
7056   if (NameInfo.getName()) {
7057     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7058     if (!NameInfo.getName())
7059       return StmtError();
7060   }
7061
7062   // Check whether anything changed.
7063   if (!getDerived().AlwaysRebuild() &&
7064       QualifierLoc == S->getQualifierLoc() &&
7065       NameInfo.getName() == S->getNameInfo().getName())
7066     return S;
7067
7068   // Determine whether this name exists, if we can.
7069   CXXScopeSpec SS;
7070   SS.Adopt(QualifierLoc);
7071   bool Dependent = false;
7072   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7073   case Sema::IER_Exists:
7074     if (S->isIfExists())
7075       break;
7076
7077     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7078
7079   case Sema::IER_DoesNotExist:
7080     if (S->isIfNotExists())
7081       break;
7082
7083     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7084
7085   case Sema::IER_Dependent:
7086     Dependent = true;
7087     break;
7088
7089   case Sema::IER_Error:
7090     return StmtError();
7091   }
7092
7093   // We need to continue with the instantiation, so do so now.
7094   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7095   if (SubStmt.isInvalid())
7096     return StmtError();
7097
7098   // If we have resolved the name, just transform to the substatement.
7099   if (!Dependent)
7100     return SubStmt;
7101
7102   // The name is still dependent, so build a dependent expression again.
7103   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7104                                                    S->isIfExists(),
7105                                                    QualifierLoc,
7106                                                    NameInfo,
7107                                                    SubStmt.get());
7108 }
7109
7110 template<typename Derived>
7111 ExprResult
7112 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7113   NestedNameSpecifierLoc QualifierLoc;
7114   if (E->getQualifierLoc()) {
7115     QualifierLoc
7116     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7117     if (!QualifierLoc)
7118       return ExprError();
7119   }
7120
7121   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7122     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7123   if (!PD)
7124     return ExprError();
7125
7126   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7127   if (Base.isInvalid())
7128     return ExprError();
7129
7130   return new (SemaRef.getASTContext())
7131       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7132                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7133                         QualifierLoc, E->getMemberLoc());
7134 }
7135
7136 template <typename Derived>
7137 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7138     MSPropertySubscriptExpr *E) {
7139   auto BaseRes = getDerived().TransformExpr(E->getBase());
7140   if (BaseRes.isInvalid())
7141     return ExprError();
7142   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7143   if (IdxRes.isInvalid())
7144     return ExprError();
7145
7146   if (!getDerived().AlwaysRebuild() &&
7147       BaseRes.get() == E->getBase() &&
7148       IdxRes.get() == E->getIdx())
7149     return E;
7150
7151   return getDerived().RebuildArraySubscriptExpr(
7152       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7153 }
7154
7155 template <typename Derived>
7156 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7157   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7158   if (TryBlock.isInvalid())
7159     return StmtError();
7160
7161   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7162   if (Handler.isInvalid())
7163     return StmtError();
7164
7165   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7166       Handler.get() == S->getHandler())
7167     return S;
7168
7169   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7170                                         TryBlock.get(), Handler.get());
7171 }
7172
7173 template <typename Derived>
7174 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7175   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7176   if (Block.isInvalid())
7177     return StmtError();
7178
7179   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7180 }
7181
7182 template <typename Derived>
7183 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7184   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7185   if (FilterExpr.isInvalid())
7186     return StmtError();
7187
7188   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7189   if (Block.isInvalid())
7190     return StmtError();
7191
7192   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7193                                            Block.get());
7194 }
7195
7196 template <typename Derived>
7197 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7198   if (isa<SEHFinallyStmt>(Handler))
7199     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7200   else
7201     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7202 }
7203
7204 template<typename Derived>
7205 StmtResult
7206 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7207   return S;
7208 }
7209
7210 //===----------------------------------------------------------------------===//
7211 // OpenMP directive transformation
7212 //===----------------------------------------------------------------------===//
7213 template <typename Derived>
7214 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7215     OMPExecutableDirective *D) {
7216
7217   // Transform the clauses
7218   llvm::SmallVector<OMPClause *, 16> TClauses;
7219   ArrayRef<OMPClause *> Clauses = D->clauses();
7220   TClauses.reserve(Clauses.size());
7221   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7222        I != E; ++I) {
7223     if (*I) {
7224       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7225       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7226       getDerived().getSema().EndOpenMPClause();
7227       if (Clause)
7228         TClauses.push_back(Clause);
7229     } else {
7230       TClauses.push_back(nullptr);
7231     }
7232   }
7233   StmtResult AssociatedStmt;
7234   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7235     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7236                                                   /*CurScope=*/nullptr);
7237     StmtResult Body;
7238     {
7239       Sema::CompoundScopeRAII CompoundScope(getSema());
7240       Body = getDerived().TransformStmt(
7241           cast<CapturedStmt>(D->getAssociatedStmt())->getCapturedStmt());
7242     }
7243     AssociatedStmt =
7244         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7245     if (AssociatedStmt.isInvalid()) {
7246       return StmtError();
7247     }
7248   }
7249   if (TClauses.size() != Clauses.size()) {
7250     return StmtError();
7251   }
7252
7253   // Transform directive name for 'omp critical' directive.
7254   DeclarationNameInfo DirName;
7255   if (D->getDirectiveKind() == OMPD_critical) {
7256     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7257     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7258   }
7259   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7260   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7261     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7262   } else if (D->getDirectiveKind() == OMPD_cancel) {
7263     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7264   }
7265
7266   return getDerived().RebuildOMPExecutableDirective(
7267       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7268       AssociatedStmt.get(), D->getLocStart(), D->getLocEnd());
7269 }
7270
7271 template <typename Derived>
7272 StmtResult
7273 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7274   DeclarationNameInfo DirName;
7275   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7276                                              D->getLocStart());
7277   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7278   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7279   return Res;
7280 }
7281
7282 template <typename Derived>
7283 StmtResult
7284 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7285   DeclarationNameInfo DirName;
7286   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7287                                              D->getLocStart());
7288   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7289   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7290   return Res;
7291 }
7292
7293 template <typename Derived>
7294 StmtResult
7295 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7296   DeclarationNameInfo DirName;
7297   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7298                                              D->getLocStart());
7299   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7300   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7301   return Res;
7302 }
7303
7304 template <typename Derived>
7305 StmtResult
7306 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7307   DeclarationNameInfo DirName;
7308   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7309                                              D->getLocStart());
7310   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7311   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7312   return Res;
7313 }
7314
7315 template <typename Derived>
7316 StmtResult
7317 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7318   DeclarationNameInfo DirName;
7319   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7320                                              D->getLocStart());
7321   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7322   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7323   return Res;
7324 }
7325
7326 template <typename Derived>
7327 StmtResult
7328 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7329   DeclarationNameInfo DirName;
7330   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7331                                              D->getLocStart());
7332   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7333   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7334   return Res;
7335 }
7336
7337 template <typename Derived>
7338 StmtResult
7339 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7340   DeclarationNameInfo DirName;
7341   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7342                                              D->getLocStart());
7343   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7344   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7345   return Res;
7346 }
7347
7348 template <typename Derived>
7349 StmtResult
7350 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7351   DeclarationNameInfo DirName;
7352   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7353                                              D->getLocStart());
7354   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7355   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7356   return Res;
7357 }
7358
7359 template <typename Derived>
7360 StmtResult
7361 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7362   getDerived().getSema().StartOpenMPDSABlock(
7363       OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart());
7364   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7365   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7366   return Res;
7367 }
7368
7369 template <typename Derived>
7370 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7371     OMPParallelForDirective *D) {
7372   DeclarationNameInfo DirName;
7373   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7374                                              nullptr, D->getLocStart());
7375   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7376   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7377   return Res;
7378 }
7379
7380 template <typename Derived>
7381 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
7382     OMPParallelForSimdDirective *D) {
7383   DeclarationNameInfo DirName;
7384   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
7385                                              nullptr, D->getLocStart());
7386   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7387   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7388   return Res;
7389 }
7390
7391 template <typename Derived>
7392 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
7393     OMPParallelSectionsDirective *D) {
7394   DeclarationNameInfo DirName;
7395   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
7396                                              nullptr, D->getLocStart());
7397   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7398   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7399   return Res;
7400 }
7401
7402 template <typename Derived>
7403 StmtResult
7404 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
7405   DeclarationNameInfo DirName;
7406   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
7407                                              D->getLocStart());
7408   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7409   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7410   return Res;
7411 }
7412
7413 template <typename Derived>
7414 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
7415     OMPTaskyieldDirective *D) {
7416   DeclarationNameInfo DirName;
7417   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
7418                                              D->getLocStart());
7419   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7420   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7421   return Res;
7422 }
7423
7424 template <typename Derived>
7425 StmtResult
7426 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
7427   DeclarationNameInfo DirName;
7428   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
7429                                              D->getLocStart());
7430   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7431   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7432   return Res;
7433 }
7434
7435 template <typename Derived>
7436 StmtResult
7437 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
7438   DeclarationNameInfo DirName;
7439   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
7440                                              D->getLocStart());
7441   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7442   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7443   return Res;
7444 }
7445
7446 template <typename Derived>
7447 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
7448     OMPTaskgroupDirective *D) {
7449   DeclarationNameInfo DirName;
7450   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
7451                                              D->getLocStart());
7452   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7453   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7454   return Res;
7455 }
7456
7457 template <typename Derived>
7458 StmtResult
7459 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
7460   DeclarationNameInfo DirName;
7461   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
7462                                              D->getLocStart());
7463   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7464   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7465   return Res;
7466 }
7467
7468 template <typename Derived>
7469 StmtResult
7470 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
7471   DeclarationNameInfo DirName;
7472   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
7473                                              D->getLocStart());
7474   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7475   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7476   return Res;
7477 }
7478
7479 template <typename Derived>
7480 StmtResult
7481 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
7482   DeclarationNameInfo DirName;
7483   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
7484                                              D->getLocStart());
7485   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7486   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7487   return Res;
7488 }
7489
7490 template <typename Derived>
7491 StmtResult
7492 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
7493   DeclarationNameInfo DirName;
7494   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
7495                                              D->getLocStart());
7496   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7497   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7498   return Res;
7499 }
7500
7501 template <typename Derived>
7502 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
7503     OMPTargetDataDirective *D) {
7504   DeclarationNameInfo DirName;
7505   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
7506                                              D->getLocStart());
7507   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7508   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7509   return Res;
7510 }
7511
7512 template <typename Derived>
7513 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
7514     OMPTargetEnterDataDirective *D) {
7515   DeclarationNameInfo DirName;
7516   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
7517                                              nullptr, D->getLocStart());
7518   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7519   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7520   return Res;
7521 }
7522
7523 template <typename Derived>
7524 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
7525     OMPTargetExitDataDirective *D) {
7526   DeclarationNameInfo DirName;
7527   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
7528                                              nullptr, D->getLocStart());
7529   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7530   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7531   return Res;
7532 }
7533
7534 template <typename Derived>
7535 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
7536     OMPTargetParallelDirective *D) {
7537   DeclarationNameInfo DirName;
7538   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
7539                                              nullptr, D->getLocStart());
7540   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7541   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7542   return Res;
7543 }
7544
7545 template <typename Derived>
7546 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
7547     OMPTargetParallelForDirective *D) {
7548   DeclarationNameInfo DirName;
7549   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
7550                                              nullptr, D->getLocStart());
7551   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7552   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7553   return Res;
7554 }
7555
7556 template <typename Derived>
7557 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
7558     OMPTargetUpdateDirective *D) {
7559   DeclarationNameInfo DirName;
7560   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
7561                                              nullptr, D->getLocStart());
7562   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7563   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7564   return Res;
7565 }
7566
7567 template <typename Derived>
7568 StmtResult
7569 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
7570   DeclarationNameInfo DirName;
7571   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
7572                                              D->getLocStart());
7573   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7574   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7575   return Res;
7576 }
7577
7578 template <typename Derived>
7579 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
7580     OMPCancellationPointDirective *D) {
7581   DeclarationNameInfo DirName;
7582   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
7583                                              nullptr, D->getLocStart());
7584   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7585   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7586   return Res;
7587 }
7588
7589 template <typename Derived>
7590 StmtResult
7591 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
7592   DeclarationNameInfo DirName;
7593   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
7594                                              D->getLocStart());
7595   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7596   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7597   return Res;
7598 }
7599
7600 template <typename Derived>
7601 StmtResult
7602 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
7603   DeclarationNameInfo DirName;
7604   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
7605                                              D->getLocStart());
7606   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7607   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7608   return Res;
7609 }
7610
7611 template <typename Derived>
7612 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
7613     OMPTaskLoopSimdDirective *D) {
7614   DeclarationNameInfo DirName;
7615   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
7616                                              nullptr, D->getLocStart());
7617   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7618   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7619   return Res;
7620 }
7621
7622 template <typename Derived>
7623 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
7624     OMPDistributeDirective *D) {
7625   DeclarationNameInfo DirName;
7626   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
7627                                              D->getLocStart());
7628   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7629   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7630   return Res;
7631 }
7632
7633 template <typename Derived>
7634 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
7635     OMPDistributeParallelForDirective *D) {
7636   DeclarationNameInfo DirName;
7637   getDerived().getSema().StartOpenMPDSABlock(
7638       OMPD_distribute_parallel_for, DirName, nullptr, D->getLocStart());
7639   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7640   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7641   return Res;
7642 }
7643
7644 template <typename Derived>
7645 StmtResult
7646 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
7647     OMPDistributeParallelForSimdDirective *D) {
7648   DeclarationNameInfo DirName;
7649   getDerived().getSema().StartOpenMPDSABlock(
7650       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
7651   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7652   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7653   return Res;
7654 }
7655
7656 template <typename Derived>
7657 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
7658     OMPDistributeSimdDirective *D) {
7659   DeclarationNameInfo DirName;
7660   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
7661                                              nullptr, D->getLocStart());
7662   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7663   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7664   return Res;
7665 }
7666
7667 template <typename Derived>
7668 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
7669     OMPTargetParallelForSimdDirective *D) {
7670   DeclarationNameInfo DirName;
7671   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for_simd,
7672                                              DirName, nullptr,
7673                                              D->getLocStart());
7674   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7675   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7676   return Res;
7677 }
7678
7679 template <typename Derived>
7680 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
7681     OMPTargetSimdDirective *D) {
7682   DeclarationNameInfo DirName;
7683   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
7684                                              D->getLocStart());
7685   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7686   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7687   return Res;
7688 }
7689
7690 template <typename Derived>
7691 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
7692     OMPTeamsDistributeDirective *D) {
7693   DeclarationNameInfo DirName;
7694   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
7695                                              nullptr, D->getLocStart());
7696   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7697   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7698   return Res;
7699 }
7700
7701 template <typename Derived>
7702 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
7703     OMPTeamsDistributeSimdDirective *D) {
7704   DeclarationNameInfo DirName;
7705   getDerived().getSema().StartOpenMPDSABlock(
7706       OMPD_teams_distribute_simd, DirName, nullptr, D->getLocStart());
7707   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7708   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7709   return Res;
7710 }
7711
7712 template <typename Derived>
7713 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
7714     OMPTeamsDistributeParallelForSimdDirective *D) {
7715   DeclarationNameInfo DirName;
7716   getDerived().getSema().StartOpenMPDSABlock(
7717       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
7718   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7719   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7720   return Res;
7721 }
7722
7723 template <typename Derived>
7724 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
7725     OMPTeamsDistributeParallelForDirective *D) {
7726   DeclarationNameInfo DirName;
7727   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute_parallel_for,
7728       DirName, nullptr, D->getLocStart());
7729   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7730   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7731   return Res;
7732 }
7733
7734 template <typename Derived>
7735 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
7736     OMPTargetTeamsDirective *D) {
7737   DeclarationNameInfo DirName;
7738   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
7739                                              nullptr, D->getLocStart());
7740   auto Res = getDerived().TransformOMPExecutableDirective(D);
7741   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7742   return Res;
7743 }
7744
7745 template <typename Derived>
7746 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
7747     OMPTargetTeamsDistributeDirective *D) {
7748   DeclarationNameInfo DirName;
7749   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_distribute,
7750       DirName, nullptr, D->getLocStart());
7751   auto Res = getDerived().TransformOMPExecutableDirective(D);
7752   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7753   return Res;
7754 }
7755
7756 template <typename Derived>
7757 StmtResult
7758 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
7759     OMPTargetTeamsDistributeParallelForDirective *D) {
7760   DeclarationNameInfo DirName;
7761   getDerived().getSema().StartOpenMPDSABlock(
7762       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
7763       D->getLocStart());
7764   auto Res = getDerived().TransformOMPExecutableDirective(D);
7765   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7766   return Res;
7767 }
7768
7769 template <typename Derived>
7770 StmtResult TreeTransform<Derived>::
7771     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
7772         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
7773   DeclarationNameInfo DirName;
7774   getDerived().getSema().StartOpenMPDSABlock(
7775       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
7776       D->getLocStart());
7777   auto Res = getDerived().TransformOMPExecutableDirective(D);
7778   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7779   return Res;
7780 }
7781
7782
7783 //===----------------------------------------------------------------------===//
7784 // OpenMP clause transformation
7785 //===----------------------------------------------------------------------===//
7786 template <typename Derived>
7787 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
7788   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
7789   if (Cond.isInvalid())
7790     return nullptr;
7791   return getDerived().RebuildOMPIfClause(
7792       C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(),
7793       C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd());
7794 }
7795
7796 template <typename Derived>
7797 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
7798   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
7799   if (Cond.isInvalid())
7800     return nullptr;
7801   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(),
7802                                             C->getLParenLoc(), C->getLocEnd());
7803 }
7804
7805 template <typename Derived>
7806 OMPClause *
7807 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
7808   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
7809   if (NumThreads.isInvalid())
7810     return nullptr;
7811   return getDerived().RebuildOMPNumThreadsClause(
7812       NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7813 }
7814
7815 template <typename Derived>
7816 OMPClause *
7817 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
7818   ExprResult E = getDerived().TransformExpr(C->getSafelen());
7819   if (E.isInvalid())
7820     return nullptr;
7821   return getDerived().RebuildOMPSafelenClause(
7822       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7823 }
7824
7825 template <typename Derived>
7826 OMPClause *
7827 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
7828   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
7829   if (E.isInvalid())
7830     return nullptr;
7831   return getDerived().RebuildOMPSimdlenClause(
7832       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7833 }
7834
7835 template <typename Derived>
7836 OMPClause *
7837 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
7838   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
7839   if (E.isInvalid())
7840     return nullptr;
7841   return getDerived().RebuildOMPCollapseClause(
7842       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7843 }
7844
7845 template <typename Derived>
7846 OMPClause *
7847 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
7848   return getDerived().RebuildOMPDefaultClause(
7849       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
7850       C->getLParenLoc(), C->getLocEnd());
7851 }
7852
7853 template <typename Derived>
7854 OMPClause *
7855 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
7856   return getDerived().RebuildOMPProcBindClause(
7857       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
7858       C->getLParenLoc(), C->getLocEnd());
7859 }
7860
7861 template <typename Derived>
7862 OMPClause *
7863 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
7864   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
7865   if (E.isInvalid())
7866     return nullptr;
7867   return getDerived().RebuildOMPScheduleClause(
7868       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
7869       C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
7870       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
7871       C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
7872 }
7873
7874 template <typename Derived>
7875 OMPClause *
7876 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
7877   ExprResult E;
7878   if (auto *Num = C->getNumForLoops()) {
7879     E = getDerived().TransformExpr(Num);
7880     if (E.isInvalid())
7881       return nullptr;
7882   }
7883   return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(),
7884                                               C->getLParenLoc(), E.get());
7885 }
7886
7887 template <typename Derived>
7888 OMPClause *
7889 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
7890   // No need to rebuild this clause, no template-dependent parameters.
7891   return C;
7892 }
7893
7894 template <typename Derived>
7895 OMPClause *
7896 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
7897   // No need to rebuild this clause, no template-dependent parameters.
7898   return C;
7899 }
7900
7901 template <typename Derived>
7902 OMPClause *
7903 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
7904   // No need to rebuild this clause, no template-dependent parameters.
7905   return C;
7906 }
7907
7908 template <typename Derived>
7909 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
7910   // No need to rebuild this clause, no template-dependent parameters.
7911   return C;
7912 }
7913
7914 template <typename Derived>
7915 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
7916   // No need to rebuild this clause, no template-dependent parameters.
7917   return C;
7918 }
7919
7920 template <typename Derived>
7921 OMPClause *
7922 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
7923   // No need to rebuild this clause, no template-dependent parameters.
7924   return C;
7925 }
7926
7927 template <typename Derived>
7928 OMPClause *
7929 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
7930   // No need to rebuild this clause, no template-dependent parameters.
7931   return C;
7932 }
7933
7934 template <typename Derived>
7935 OMPClause *
7936 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
7937   // No need to rebuild this clause, no template-dependent parameters.
7938   return C;
7939 }
7940
7941 template <typename Derived>
7942 OMPClause *
7943 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
7944   // No need to rebuild this clause, no template-dependent parameters.
7945   return C;
7946 }
7947
7948 template <typename Derived>
7949 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *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>::TransformOMPNogroupClause(OMPNogroupClause *C) {
7957   // No need to rebuild this clause, no template-dependent parameters.
7958   return C;
7959 }
7960
7961 template <typename Derived>
7962 OMPClause *
7963 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
7964   llvm::SmallVector<Expr *, 16> Vars;
7965   Vars.reserve(C->varlist_size());
7966   for (auto *VE : C->varlists()) {
7967     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7968     if (EVar.isInvalid())
7969       return nullptr;
7970     Vars.push_back(EVar.get());
7971   }
7972   return getDerived().RebuildOMPPrivateClause(
7973       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7974 }
7975
7976 template <typename Derived>
7977 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
7978     OMPFirstprivateClause *C) {
7979   llvm::SmallVector<Expr *, 16> Vars;
7980   Vars.reserve(C->varlist_size());
7981   for (auto *VE : C->varlists()) {
7982     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7983     if (EVar.isInvalid())
7984       return nullptr;
7985     Vars.push_back(EVar.get());
7986   }
7987   return getDerived().RebuildOMPFirstprivateClause(
7988       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7989 }
7990
7991 template <typename Derived>
7992 OMPClause *
7993 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
7994   llvm::SmallVector<Expr *, 16> Vars;
7995   Vars.reserve(C->varlist_size());
7996   for (auto *VE : C->varlists()) {
7997     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7998     if (EVar.isInvalid())
7999       return nullptr;
8000     Vars.push_back(EVar.get());
8001   }
8002   return getDerived().RebuildOMPLastprivateClause(
8003       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8004 }
8005
8006 template <typename Derived>
8007 OMPClause *
8008 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8009   llvm::SmallVector<Expr *, 16> Vars;
8010   Vars.reserve(C->varlist_size());
8011   for (auto *VE : C->varlists()) {
8012     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8013     if (EVar.isInvalid())
8014       return nullptr;
8015     Vars.push_back(EVar.get());
8016   }
8017   return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
8018                                              C->getLParenLoc(), C->getLocEnd());
8019 }
8020
8021 template <typename Derived>
8022 OMPClause *
8023 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8024   llvm::SmallVector<Expr *, 16> Vars;
8025   Vars.reserve(C->varlist_size());
8026   for (auto *VE : C->varlists()) {
8027     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8028     if (EVar.isInvalid())
8029       return nullptr;
8030     Vars.push_back(EVar.get());
8031   }
8032   CXXScopeSpec ReductionIdScopeSpec;
8033   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8034
8035   DeclarationNameInfo NameInfo = C->getNameInfo();
8036   if (NameInfo.getName()) {
8037     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8038     if (!NameInfo.getName())
8039       return nullptr;
8040   }
8041   // Build a list of all UDR decls with the same names ranged by the Scopes.
8042   // The Scope boundary is a duplication of the previous decl.
8043   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8044   for (auto *E : C->reduction_ops()) {
8045     // Transform all the decls.
8046     if (E) {
8047       auto *ULE = cast<UnresolvedLookupExpr>(E);
8048       UnresolvedSet<8> Decls;
8049       for (auto *D : ULE->decls()) {
8050         NamedDecl *InstD =
8051             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8052         Decls.addDecl(InstD, InstD->getAccess());
8053       }
8054       UnresolvedReductions.push_back(
8055        UnresolvedLookupExpr::Create(
8056           SemaRef.Context, /*NamingClass=*/nullptr,
8057           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8058           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8059           Decls.begin(), Decls.end()));
8060     } else
8061       UnresolvedReductions.push_back(nullptr);
8062   }
8063   return getDerived().RebuildOMPReductionClause(
8064       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8065       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8066 }
8067
8068 template <typename Derived>
8069 OMPClause *
8070 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
8071   llvm::SmallVector<Expr *, 16> Vars;
8072   Vars.reserve(C->varlist_size());
8073   for (auto *VE : C->varlists()) {
8074     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8075     if (EVar.isInvalid())
8076       return nullptr;
8077     Vars.push_back(EVar.get());
8078   }
8079   ExprResult Step = getDerived().TransformExpr(C->getStep());
8080   if (Step.isInvalid())
8081     return nullptr;
8082   return getDerived().RebuildOMPLinearClause(
8083       Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(),
8084       C->getModifierLoc(), C->getColonLoc(), C->getLocEnd());
8085 }
8086
8087 template <typename Derived>
8088 OMPClause *
8089 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
8090   llvm::SmallVector<Expr *, 16> Vars;
8091   Vars.reserve(C->varlist_size());
8092   for (auto *VE : C->varlists()) {
8093     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8094     if (EVar.isInvalid())
8095       return nullptr;
8096     Vars.push_back(EVar.get());
8097   }
8098   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
8099   if (Alignment.isInvalid())
8100     return nullptr;
8101   return getDerived().RebuildOMPAlignedClause(
8102       Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
8103       C->getColonLoc(), C->getLocEnd());
8104 }
8105
8106 template <typename Derived>
8107 OMPClause *
8108 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
8109   llvm::SmallVector<Expr *, 16> Vars;
8110   Vars.reserve(C->varlist_size());
8111   for (auto *VE : C->varlists()) {
8112     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8113     if (EVar.isInvalid())
8114       return nullptr;
8115     Vars.push_back(EVar.get());
8116   }
8117   return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
8118                                              C->getLParenLoc(), C->getLocEnd());
8119 }
8120
8121 template <typename Derived>
8122 OMPClause *
8123 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
8124   llvm::SmallVector<Expr *, 16> Vars;
8125   Vars.reserve(C->varlist_size());
8126   for (auto *VE : C->varlists()) {
8127     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8128     if (EVar.isInvalid())
8129       return nullptr;
8130     Vars.push_back(EVar.get());
8131   }
8132   return getDerived().RebuildOMPCopyprivateClause(
8133       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8134 }
8135
8136 template <typename Derived>
8137 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
8138   llvm::SmallVector<Expr *, 16> Vars;
8139   Vars.reserve(C->varlist_size());
8140   for (auto *VE : C->varlists()) {
8141     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8142     if (EVar.isInvalid())
8143       return nullptr;
8144     Vars.push_back(EVar.get());
8145   }
8146   return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(),
8147                                             C->getLParenLoc(), C->getLocEnd());
8148 }
8149
8150 template <typename Derived>
8151 OMPClause *
8152 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
8153   llvm::SmallVector<Expr *, 16> Vars;
8154   Vars.reserve(C->varlist_size());
8155   for (auto *VE : C->varlists()) {
8156     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8157     if (EVar.isInvalid())
8158       return nullptr;
8159     Vars.push_back(EVar.get());
8160   }
8161   return getDerived().RebuildOMPDependClause(
8162       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8163       C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8164 }
8165
8166 template <typename Derived>
8167 OMPClause *
8168 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8169   ExprResult E = getDerived().TransformExpr(C->getDevice());
8170   if (E.isInvalid())
8171     return nullptr;
8172   return getDerived().RebuildOMPDeviceClause(
8173       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8174 }
8175
8176 template <typename Derived>
8177 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
8178   llvm::SmallVector<Expr *, 16> Vars;
8179   Vars.reserve(C->varlist_size());
8180   for (auto *VE : C->varlists()) {
8181     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8182     if (EVar.isInvalid())
8183       return nullptr;
8184     Vars.push_back(EVar.get());
8185   }
8186   return getDerived().RebuildOMPMapClause(
8187       C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(),
8188       C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(),
8189       C->getLParenLoc(), C->getLocEnd());
8190 }
8191
8192 template <typename Derived>
8193 OMPClause *
8194 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
8195   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
8196   if (E.isInvalid())
8197     return nullptr;
8198   return getDerived().RebuildOMPNumTeamsClause(
8199       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8200 }
8201
8202 template <typename Derived>
8203 OMPClause *
8204 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
8205   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
8206   if (E.isInvalid())
8207     return nullptr;
8208   return getDerived().RebuildOMPThreadLimitClause(
8209       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8210 }
8211
8212 template <typename Derived>
8213 OMPClause *
8214 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
8215   ExprResult E = getDerived().TransformExpr(C->getPriority());
8216   if (E.isInvalid())
8217     return nullptr;
8218   return getDerived().RebuildOMPPriorityClause(
8219       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8220 }
8221
8222 template <typename Derived>
8223 OMPClause *
8224 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
8225   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
8226   if (E.isInvalid())
8227     return nullptr;
8228   return getDerived().RebuildOMPGrainsizeClause(
8229       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8230 }
8231
8232 template <typename Derived>
8233 OMPClause *
8234 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
8235   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
8236   if (E.isInvalid())
8237     return nullptr;
8238   return getDerived().RebuildOMPNumTasksClause(
8239       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8240 }
8241
8242 template <typename Derived>
8243 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
8244   ExprResult E = getDerived().TransformExpr(C->getHint());
8245   if (E.isInvalid())
8246     return nullptr;
8247   return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(),
8248                                            C->getLParenLoc(), C->getLocEnd());
8249 }
8250
8251 template <typename Derived>
8252 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
8253     OMPDistScheduleClause *C) {
8254   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8255   if (E.isInvalid())
8256     return nullptr;
8257   return getDerived().RebuildOMPDistScheduleClause(
8258       C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8259       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8260 }
8261
8262 template <typename Derived>
8263 OMPClause *
8264 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
8265   return C;
8266 }
8267
8268 template <typename Derived>
8269 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
8270   llvm::SmallVector<Expr *, 16> Vars;
8271   Vars.reserve(C->varlist_size());
8272   for (auto *VE : C->varlists()) {
8273     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8274     if (EVar.isInvalid())
8275       return 0;
8276     Vars.push_back(EVar.get());
8277   }
8278   return getDerived().RebuildOMPToClause(Vars, C->getLocStart(),
8279                                          C->getLParenLoc(), C->getLocEnd());
8280 }
8281
8282 template <typename Derived>
8283 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
8284   llvm::SmallVector<Expr *, 16> Vars;
8285   Vars.reserve(C->varlist_size());
8286   for (auto *VE : C->varlists()) {
8287     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8288     if (EVar.isInvalid())
8289       return 0;
8290     Vars.push_back(EVar.get());
8291   }
8292   return getDerived().RebuildOMPFromClause(Vars, C->getLocStart(),
8293                                            C->getLParenLoc(), C->getLocEnd());
8294 }
8295
8296 template <typename Derived>
8297 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
8298     OMPUseDevicePtrClause *C) {
8299   llvm::SmallVector<Expr *, 16> Vars;
8300   Vars.reserve(C->varlist_size());
8301   for (auto *VE : C->varlists()) {
8302     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8303     if (EVar.isInvalid())
8304       return nullptr;
8305     Vars.push_back(EVar.get());
8306   }
8307   return getDerived().RebuildOMPUseDevicePtrClause(
8308       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8309 }
8310
8311 template <typename Derived>
8312 OMPClause *
8313 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
8314   llvm::SmallVector<Expr *, 16> Vars;
8315   Vars.reserve(C->varlist_size());
8316   for (auto *VE : C->varlists()) {
8317     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8318     if (EVar.isInvalid())
8319       return nullptr;
8320     Vars.push_back(EVar.get());
8321   }
8322   return getDerived().RebuildOMPIsDevicePtrClause(
8323       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8324 }
8325
8326 //===----------------------------------------------------------------------===//
8327 // Expression transformation
8328 //===----------------------------------------------------------------------===//
8329 template<typename Derived>
8330 ExprResult
8331 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
8332   if (!E->isTypeDependent())
8333     return E;
8334
8335   return getDerived().RebuildPredefinedExpr(E->getLocation(),
8336                                             E->getIdentType());
8337 }
8338
8339 template<typename Derived>
8340 ExprResult
8341 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
8342   NestedNameSpecifierLoc QualifierLoc;
8343   if (E->getQualifierLoc()) {
8344     QualifierLoc
8345       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8346     if (!QualifierLoc)
8347       return ExprError();
8348   }
8349
8350   ValueDecl *ND
8351     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
8352                                                          E->getDecl()));
8353   if (!ND)
8354     return ExprError();
8355
8356   DeclarationNameInfo NameInfo = E->getNameInfo();
8357   if (NameInfo.getName()) {
8358     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8359     if (!NameInfo.getName())
8360       return ExprError();
8361   }
8362
8363   if (!getDerived().AlwaysRebuild() &&
8364       QualifierLoc == E->getQualifierLoc() &&
8365       ND == E->getDecl() &&
8366       NameInfo.getName() == E->getDecl()->getDeclName() &&
8367       !E->hasExplicitTemplateArgs()) {
8368
8369     // Mark it referenced in the new context regardless.
8370     // FIXME: this is a bit instantiation-specific.
8371     SemaRef.MarkDeclRefReferenced(E);
8372
8373     return E;
8374   }
8375
8376   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
8377   if (E->hasExplicitTemplateArgs()) {
8378     TemplateArgs = &TransArgs;
8379     TransArgs.setLAngleLoc(E->getLAngleLoc());
8380     TransArgs.setRAngleLoc(E->getRAngleLoc());
8381     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8382                                                 E->getNumTemplateArgs(),
8383                                                 TransArgs))
8384       return ExprError();
8385   }
8386
8387   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
8388                                          TemplateArgs);
8389 }
8390
8391 template<typename Derived>
8392 ExprResult
8393 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
8394   return E;
8395 }
8396
8397 template<typename Derived>
8398 ExprResult
8399 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
8400   return E;
8401 }
8402
8403 template<typename Derived>
8404 ExprResult
8405 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
8406   return E;
8407 }
8408
8409 template<typename Derived>
8410 ExprResult
8411 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
8412   return E;
8413 }
8414
8415 template<typename Derived>
8416 ExprResult
8417 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
8418   return E;
8419 }
8420
8421 template<typename Derived>
8422 ExprResult
8423 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
8424   if (FunctionDecl *FD = E->getDirectCallee())
8425     SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
8426   return SemaRef.MaybeBindToTemporary(E);
8427 }
8428
8429 template<typename Derived>
8430 ExprResult
8431 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
8432   ExprResult ControllingExpr =
8433     getDerived().TransformExpr(E->getControllingExpr());
8434   if (ControllingExpr.isInvalid())
8435     return ExprError();
8436
8437   SmallVector<Expr *, 4> AssocExprs;
8438   SmallVector<TypeSourceInfo *, 4> AssocTypes;
8439   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
8440     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
8441     if (TS) {
8442       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
8443       if (!AssocType)
8444         return ExprError();
8445       AssocTypes.push_back(AssocType);
8446     } else {
8447       AssocTypes.push_back(nullptr);
8448     }
8449
8450     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
8451     if (AssocExpr.isInvalid())
8452       return ExprError();
8453     AssocExprs.push_back(AssocExpr.get());
8454   }
8455
8456   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
8457                                                   E->getDefaultLoc(),
8458                                                   E->getRParenLoc(),
8459                                                   ControllingExpr.get(),
8460                                                   AssocTypes,
8461                                                   AssocExprs);
8462 }
8463
8464 template<typename Derived>
8465 ExprResult
8466 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
8467   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8468   if (SubExpr.isInvalid())
8469     return ExprError();
8470
8471   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8472     return E;
8473
8474   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
8475                                        E->getRParen());
8476 }
8477
8478 /// \brief The operand of a unary address-of operator has special rules: it's
8479 /// allowed to refer to a non-static member of a class even if there's no 'this'
8480 /// object available.
8481 template<typename Derived>
8482 ExprResult
8483 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
8484   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
8485     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
8486   else
8487     return getDerived().TransformExpr(E);
8488 }
8489
8490 template<typename Derived>
8491 ExprResult
8492 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
8493   ExprResult SubExpr;
8494   if (E->getOpcode() == UO_AddrOf)
8495     SubExpr = TransformAddressOfOperand(E->getSubExpr());
8496   else
8497     SubExpr = TransformExpr(E->getSubExpr());
8498   if (SubExpr.isInvalid())
8499     return ExprError();
8500
8501   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8502     return E;
8503
8504   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
8505                                            E->getOpcode(),
8506                                            SubExpr.get());
8507 }
8508
8509 template<typename Derived>
8510 ExprResult
8511 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
8512   // Transform the type.
8513   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
8514   if (!Type)
8515     return ExprError();
8516
8517   // Transform all of the components into components similar to what the
8518   // parser uses.
8519   // FIXME: It would be slightly more efficient in the non-dependent case to
8520   // just map FieldDecls, rather than requiring the rebuilder to look for
8521   // the fields again. However, __builtin_offsetof is rare enough in
8522   // template code that we don't care.
8523   bool ExprChanged = false;
8524   typedef Sema::OffsetOfComponent Component;
8525   SmallVector<Component, 4> Components;
8526   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
8527     const OffsetOfNode &ON = E->getComponent(I);
8528     Component Comp;
8529     Comp.isBrackets = true;
8530     Comp.LocStart = ON.getSourceRange().getBegin();
8531     Comp.LocEnd = ON.getSourceRange().getEnd();
8532     switch (ON.getKind()) {
8533     case OffsetOfNode::Array: {
8534       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
8535       ExprResult Index = getDerived().TransformExpr(FromIndex);
8536       if (Index.isInvalid())
8537         return ExprError();
8538
8539       ExprChanged = ExprChanged || Index.get() != FromIndex;
8540       Comp.isBrackets = true;
8541       Comp.U.E = Index.get();
8542       break;
8543     }
8544
8545     case OffsetOfNode::Field:
8546     case OffsetOfNode::Identifier:
8547       Comp.isBrackets = false;
8548       Comp.U.IdentInfo = ON.getFieldName();
8549       if (!Comp.U.IdentInfo)
8550         continue;
8551
8552       break;
8553
8554     case OffsetOfNode::Base:
8555       // Will be recomputed during the rebuild.
8556       continue;
8557     }
8558
8559     Components.push_back(Comp);
8560   }
8561
8562   // If nothing changed, retain the existing expression.
8563   if (!getDerived().AlwaysRebuild() &&
8564       Type == E->getTypeSourceInfo() &&
8565       !ExprChanged)
8566     return E;
8567
8568   // Build a new offsetof expression.
8569   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
8570                                           Components, E->getRParenLoc());
8571 }
8572
8573 template<typename Derived>
8574 ExprResult
8575 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
8576   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
8577          "opaque value expression requires transformation");
8578   return E;
8579 }
8580
8581 template<typename Derived>
8582 ExprResult
8583 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
8584   return E;
8585 }
8586
8587 template<typename Derived>
8588 ExprResult
8589 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
8590   // Rebuild the syntactic form.  The original syntactic form has
8591   // opaque-value expressions in it, so strip those away and rebuild
8592   // the result.  This is a really awful way of doing this, but the
8593   // better solution (rebuilding the semantic expressions and
8594   // rebinding OVEs as necessary) doesn't work; we'd need
8595   // TreeTransform to not strip away implicit conversions.
8596   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
8597   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
8598   if (result.isInvalid()) return ExprError();
8599
8600   // If that gives us a pseudo-object result back, the pseudo-object
8601   // expression must have been an lvalue-to-rvalue conversion which we
8602   // should reapply.
8603   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
8604     result = SemaRef.checkPseudoObjectRValue(result.get());
8605
8606   return result;
8607 }
8608
8609 template<typename Derived>
8610 ExprResult
8611 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
8612                                                 UnaryExprOrTypeTraitExpr *E) {
8613   if (E->isArgumentType()) {
8614     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
8615
8616     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
8617     if (!NewT)
8618       return ExprError();
8619
8620     if (!getDerived().AlwaysRebuild() && OldT == NewT)
8621       return E;
8622
8623     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
8624                                                     E->getKind(),
8625                                                     E->getSourceRange());
8626   }
8627
8628   // C++0x [expr.sizeof]p1:
8629   //   The operand is either an expression, which is an unevaluated operand
8630   //   [...]
8631   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
8632                                                Sema::ReuseLambdaContextDecl);
8633
8634   // Try to recover if we have something like sizeof(T::X) where X is a type.
8635   // Notably, there must be *exactly* one set of parens if X is a type.
8636   TypeSourceInfo *RecoveryTSI = nullptr;
8637   ExprResult SubExpr;
8638   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
8639   if (auto *DRE =
8640           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
8641     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
8642         PE, DRE, false, &RecoveryTSI);
8643   else
8644     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
8645
8646   if (RecoveryTSI) {
8647     return getDerived().RebuildUnaryExprOrTypeTrait(
8648         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
8649   } else if (SubExpr.isInvalid())
8650     return ExprError();
8651
8652   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
8653     return E;
8654
8655   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
8656                                                   E->getOperatorLoc(),
8657                                                   E->getKind(),
8658                                                   E->getSourceRange());
8659 }
8660
8661 template<typename Derived>
8662 ExprResult
8663 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
8664   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8665   if (LHS.isInvalid())
8666     return ExprError();
8667
8668   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8669   if (RHS.isInvalid())
8670     return ExprError();
8671
8672
8673   if (!getDerived().AlwaysRebuild() &&
8674       LHS.get() == E->getLHS() &&
8675       RHS.get() == E->getRHS())
8676     return E;
8677
8678   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
8679                                            /*FIXME:*/E->getLHS()->getLocStart(),
8680                                                 RHS.get(),
8681                                                 E->getRBracketLoc());
8682 }
8683
8684 template <typename Derived>
8685 ExprResult
8686 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
8687   ExprResult Base = getDerived().TransformExpr(E->getBase());
8688   if (Base.isInvalid())
8689     return ExprError();
8690
8691   ExprResult LowerBound;
8692   if (E->getLowerBound()) {
8693     LowerBound = getDerived().TransformExpr(E->getLowerBound());
8694     if (LowerBound.isInvalid())
8695       return ExprError();
8696   }
8697
8698   ExprResult Length;
8699   if (E->getLength()) {
8700     Length = getDerived().TransformExpr(E->getLength());
8701     if (Length.isInvalid())
8702       return ExprError();
8703   }
8704
8705   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
8706       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
8707     return E;
8708
8709   return getDerived().RebuildOMPArraySectionExpr(
8710       Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(),
8711       Length.get(), E->getRBracketLoc());
8712 }
8713
8714 template<typename Derived>
8715 ExprResult
8716 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
8717   // Transform the callee.
8718   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8719   if (Callee.isInvalid())
8720     return ExprError();
8721
8722   // Transform arguments.
8723   bool ArgChanged = false;
8724   SmallVector<Expr*, 8> Args;
8725   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
8726                                   &ArgChanged))
8727     return ExprError();
8728
8729   if (!getDerived().AlwaysRebuild() &&
8730       Callee.get() == E->getCallee() &&
8731       !ArgChanged)
8732     return SemaRef.MaybeBindToTemporary(E);
8733
8734   // FIXME: Wrong source location information for the '('.
8735   SourceLocation FakeLParenLoc
8736     = ((Expr *)Callee.get())->getSourceRange().getBegin();
8737   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
8738                                       Args,
8739                                       E->getRParenLoc());
8740 }
8741
8742 template<typename Derived>
8743 ExprResult
8744 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
8745   ExprResult Base = getDerived().TransformExpr(E->getBase());
8746   if (Base.isInvalid())
8747     return ExprError();
8748
8749   NestedNameSpecifierLoc QualifierLoc;
8750   if (E->hasQualifier()) {
8751     QualifierLoc
8752       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8753
8754     if (!QualifierLoc)
8755       return ExprError();
8756   }
8757   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
8758
8759   ValueDecl *Member
8760     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
8761                                                          E->getMemberDecl()));
8762   if (!Member)
8763     return ExprError();
8764
8765   NamedDecl *FoundDecl = E->getFoundDecl();
8766   if (FoundDecl == E->getMemberDecl()) {
8767     FoundDecl = Member;
8768   } else {
8769     FoundDecl = cast_or_null<NamedDecl>(
8770                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
8771     if (!FoundDecl)
8772       return ExprError();
8773   }
8774
8775   if (!getDerived().AlwaysRebuild() &&
8776       Base.get() == E->getBase() &&
8777       QualifierLoc == E->getQualifierLoc() &&
8778       Member == E->getMemberDecl() &&
8779       FoundDecl == E->getFoundDecl() &&
8780       !E->hasExplicitTemplateArgs()) {
8781
8782     // Mark it referenced in the new context regardless.
8783     // FIXME: this is a bit instantiation-specific.
8784     SemaRef.MarkMemberReferenced(E);
8785
8786     return E;
8787   }
8788
8789   TemplateArgumentListInfo TransArgs;
8790   if (E->hasExplicitTemplateArgs()) {
8791     TransArgs.setLAngleLoc(E->getLAngleLoc());
8792     TransArgs.setRAngleLoc(E->getRAngleLoc());
8793     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8794                                                 E->getNumTemplateArgs(),
8795                                                 TransArgs))
8796       return ExprError();
8797   }
8798
8799   // FIXME: Bogus source location for the operator
8800   SourceLocation FakeOperatorLoc =
8801       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
8802
8803   // FIXME: to do this check properly, we will need to preserve the
8804   // first-qualifier-in-scope here, just in case we had a dependent
8805   // base (and therefore couldn't do the check) and a
8806   // nested-name-qualifier (and therefore could do the lookup).
8807   NamedDecl *FirstQualifierInScope = nullptr;
8808
8809   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
8810                                         E->isArrow(),
8811                                         QualifierLoc,
8812                                         TemplateKWLoc,
8813                                         E->getMemberNameInfo(),
8814                                         Member,
8815                                         FoundDecl,
8816                                         (E->hasExplicitTemplateArgs()
8817                                            ? &TransArgs : nullptr),
8818                                         FirstQualifierInScope);
8819 }
8820
8821 template<typename Derived>
8822 ExprResult
8823 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
8824   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8825   if (LHS.isInvalid())
8826     return ExprError();
8827
8828   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8829   if (RHS.isInvalid())
8830     return ExprError();
8831
8832   if (!getDerived().AlwaysRebuild() &&
8833       LHS.get() == E->getLHS() &&
8834       RHS.get() == E->getRHS())
8835     return E;
8836
8837   Sema::FPContractStateRAII FPContractState(getSema());
8838   getSema().FPFeatures.fp_contract = E->isFPContractable();
8839
8840   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
8841                                             LHS.get(), RHS.get());
8842 }
8843
8844 template<typename Derived>
8845 ExprResult
8846 TreeTransform<Derived>::TransformCompoundAssignOperator(
8847                                                       CompoundAssignOperator *E) {
8848   return getDerived().TransformBinaryOperator(E);
8849 }
8850
8851 template<typename Derived>
8852 ExprResult TreeTransform<Derived>::
8853 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
8854   // Just rebuild the common and RHS expressions and see whether we
8855   // get any changes.
8856
8857   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
8858   if (commonExpr.isInvalid())
8859     return ExprError();
8860
8861   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
8862   if (rhs.isInvalid())
8863     return ExprError();
8864
8865   if (!getDerived().AlwaysRebuild() &&
8866       commonExpr.get() == e->getCommon() &&
8867       rhs.get() == e->getFalseExpr())
8868     return e;
8869
8870   return getDerived().RebuildConditionalOperator(commonExpr.get(),
8871                                                  e->getQuestionLoc(),
8872                                                  nullptr,
8873                                                  e->getColonLoc(),
8874                                                  rhs.get());
8875 }
8876
8877 template<typename Derived>
8878 ExprResult
8879 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
8880   ExprResult Cond = getDerived().TransformExpr(E->getCond());
8881   if (Cond.isInvalid())
8882     return ExprError();
8883
8884   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8885   if (LHS.isInvalid())
8886     return ExprError();
8887
8888   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8889   if (RHS.isInvalid())
8890     return ExprError();
8891
8892   if (!getDerived().AlwaysRebuild() &&
8893       Cond.get() == E->getCond() &&
8894       LHS.get() == E->getLHS() &&
8895       RHS.get() == E->getRHS())
8896     return E;
8897
8898   return getDerived().RebuildConditionalOperator(Cond.get(),
8899                                                  E->getQuestionLoc(),
8900                                                  LHS.get(),
8901                                                  E->getColonLoc(),
8902                                                  RHS.get());
8903 }
8904
8905 template<typename Derived>
8906 ExprResult
8907 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
8908   // Implicit casts are eliminated during transformation, since they
8909   // will be recomputed by semantic analysis after transformation.
8910   return getDerived().TransformExpr(E->getSubExprAsWritten());
8911 }
8912
8913 template<typename Derived>
8914 ExprResult
8915 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
8916   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8917   if (!Type)
8918     return ExprError();
8919
8920   ExprResult SubExpr
8921     = getDerived().TransformExpr(E->getSubExprAsWritten());
8922   if (SubExpr.isInvalid())
8923     return ExprError();
8924
8925   if (!getDerived().AlwaysRebuild() &&
8926       Type == E->getTypeInfoAsWritten() &&
8927       SubExpr.get() == E->getSubExpr())
8928     return E;
8929
8930   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
8931                                             Type,
8932                                             E->getRParenLoc(),
8933                                             SubExpr.get());
8934 }
8935
8936 template<typename Derived>
8937 ExprResult
8938 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
8939   TypeSourceInfo *OldT = E->getTypeSourceInfo();
8940   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
8941   if (!NewT)
8942     return ExprError();
8943
8944   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
8945   if (Init.isInvalid())
8946     return ExprError();
8947
8948   if (!getDerived().AlwaysRebuild() &&
8949       OldT == NewT &&
8950       Init.get() == E->getInitializer())
8951     return SemaRef.MaybeBindToTemporary(E);
8952
8953   // Note: the expression type doesn't necessarily match the
8954   // type-as-written, but that's okay, because it should always be
8955   // derivable from the initializer.
8956
8957   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
8958                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
8959                                                  Init.get());
8960 }
8961
8962 template<typename Derived>
8963 ExprResult
8964 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
8965   ExprResult Base = getDerived().TransformExpr(E->getBase());
8966   if (Base.isInvalid())
8967     return ExprError();
8968
8969   if (!getDerived().AlwaysRebuild() &&
8970       Base.get() == E->getBase())
8971     return E;
8972
8973   // FIXME: Bad source location
8974   SourceLocation FakeOperatorLoc =
8975       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
8976   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
8977                                                   E->getAccessorLoc(),
8978                                                   E->getAccessor());
8979 }
8980
8981 template<typename Derived>
8982 ExprResult
8983 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
8984   if (InitListExpr *Syntactic = E->getSyntacticForm())
8985     E = Syntactic;
8986
8987   bool InitChanged = false;
8988
8989   SmallVector<Expr*, 4> Inits;
8990   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
8991                                   Inits, &InitChanged))
8992     return ExprError();
8993
8994   if (!getDerived().AlwaysRebuild() && !InitChanged) {
8995     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
8996     // in some cases. We can't reuse it in general, because the syntactic and
8997     // semantic forms are linked, and we can't know that semantic form will
8998     // match even if the syntactic form does.
8999   }
9000
9001   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
9002                                       E->getRBraceLoc(), E->getType());
9003 }
9004
9005 template<typename Derived>
9006 ExprResult
9007 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
9008   Designation Desig;
9009
9010   // transform the initializer value
9011   ExprResult Init = getDerived().TransformExpr(E->getInit());
9012   if (Init.isInvalid())
9013     return ExprError();
9014
9015   // transform the designators.
9016   SmallVector<Expr*, 4> ArrayExprs;
9017   bool ExprChanged = false;
9018   for (const DesignatedInitExpr::Designator &D : E->designators()) {
9019     if (D.isFieldDesignator()) {
9020       Desig.AddDesignator(Designator::getField(D.getFieldName(),
9021                                                D.getDotLoc(),
9022                                                D.getFieldLoc()));
9023       if (D.getField()) {
9024         FieldDecl *Field = cast_or_null<FieldDecl>(
9025             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
9026         if (Field != D.getField())
9027           // Rebuild the expression when the transformed FieldDecl is
9028           // different to the already assigned FieldDecl.
9029           ExprChanged = true;
9030       } else {
9031         // Ensure that the designator expression is rebuilt when there isn't
9032         // a resolved FieldDecl in the designator as we don't want to assign
9033         // a FieldDecl to a pattern designator that will be instantiated again.
9034         ExprChanged = true;
9035       }
9036       continue;
9037     }
9038
9039     if (D.isArrayDesignator()) {
9040       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
9041       if (Index.isInvalid())
9042         return ExprError();
9043
9044       Desig.AddDesignator(
9045           Designator::getArray(Index.get(), D.getLBracketLoc()));
9046
9047       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
9048       ArrayExprs.push_back(Index.get());
9049       continue;
9050     }
9051
9052     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9053     ExprResult Start
9054       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9055     if (Start.isInvalid())
9056       return ExprError();
9057
9058     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9059     if (End.isInvalid())
9060       return ExprError();
9061
9062     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9063                                                   End.get(),
9064                                                   D.getLBracketLoc(),
9065                                                   D.getEllipsisLoc()));
9066
9067     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9068                   End.get() != E->getArrayRangeEnd(D);
9069
9070     ArrayExprs.push_back(Start.get());
9071     ArrayExprs.push_back(End.get());
9072   }
9073
9074   if (!getDerived().AlwaysRebuild() &&
9075       Init.get() == E->getInit() &&
9076       !ExprChanged)
9077     return E;
9078
9079   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9080                                                 E->getEqualOrColonLoc(),
9081                                                 E->usesGNUSyntax(), Init.get());
9082 }
9083
9084 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9085 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9086 template<typename Derived>
9087 ExprResult
9088 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9089     DesignatedInitUpdateExpr *E) {
9090   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9091                    "initializer");
9092   return ExprError();
9093 }
9094
9095 template<typename Derived>
9096 ExprResult
9097 TreeTransform<Derived>::TransformNoInitExpr(
9098     NoInitExpr *E) {
9099   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9100   return ExprError();
9101 }
9102
9103 template<typename Derived>
9104 ExprResult
9105 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9106   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9107   return ExprError();
9108 }
9109
9110 template<typename Derived>
9111 ExprResult
9112 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9113   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9114   return ExprError();
9115 }
9116
9117 template<typename Derived>
9118 ExprResult
9119 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9120                                                      ImplicitValueInitExpr *E) {
9121   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
9122
9123   // FIXME: Will we ever have proper type location here? Will we actually
9124   // need to transform the type?
9125   QualType T = getDerived().TransformType(E->getType());
9126   if (T.isNull())
9127     return ExprError();
9128
9129   if (!getDerived().AlwaysRebuild() &&
9130       T == E->getType())
9131     return E;
9132
9133   return getDerived().RebuildImplicitValueInitExpr(T);
9134 }
9135
9136 template<typename Derived>
9137 ExprResult
9138 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
9139   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
9140   if (!TInfo)
9141     return ExprError();
9142
9143   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9144   if (SubExpr.isInvalid())
9145     return ExprError();
9146
9147   if (!getDerived().AlwaysRebuild() &&
9148       TInfo == E->getWrittenTypeInfo() &&
9149       SubExpr.get() == E->getSubExpr())
9150     return E;
9151
9152   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
9153                                        TInfo, E->getRParenLoc());
9154 }
9155
9156 template<typename Derived>
9157 ExprResult
9158 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
9159   bool ArgumentChanged = false;
9160   SmallVector<Expr*, 4> Inits;
9161   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
9162                      &ArgumentChanged))
9163     return ExprError();
9164
9165   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
9166                                            Inits,
9167                                            E->getRParenLoc());
9168 }
9169
9170 /// \brief Transform an address-of-label expression.
9171 ///
9172 /// By default, the transformation of an address-of-label expression always
9173 /// rebuilds the expression, so that the label identifier can be resolved to
9174 /// the corresponding label statement by semantic analysis.
9175 template<typename Derived>
9176 ExprResult
9177 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
9178   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
9179                                         E->getLabel());
9180   if (!LD)
9181     return ExprError();
9182
9183   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9184                                            cast<LabelDecl>(LD));
9185 }
9186
9187 template<typename Derived>
9188 ExprResult
9189 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9190   SemaRef.ActOnStartStmtExpr();
9191   StmtResult SubStmt
9192     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9193   if (SubStmt.isInvalid()) {
9194     SemaRef.ActOnStmtExprError();
9195     return ExprError();
9196   }
9197
9198   if (!getDerived().AlwaysRebuild() &&
9199       SubStmt.get() == E->getSubStmt()) {
9200     // Calling this an 'error' is unintuitive, but it does the right thing.
9201     SemaRef.ActOnStmtExprError();
9202     return SemaRef.MaybeBindToTemporary(E);
9203   }
9204
9205   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9206                                       SubStmt.get(),
9207                                       E->getRParenLoc());
9208 }
9209
9210 template<typename Derived>
9211 ExprResult
9212 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9213   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9214   if (Cond.isInvalid())
9215     return ExprError();
9216
9217   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9218   if (LHS.isInvalid())
9219     return ExprError();
9220
9221   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9222   if (RHS.isInvalid())
9223     return ExprError();
9224
9225   if (!getDerived().AlwaysRebuild() &&
9226       Cond.get() == E->getCond() &&
9227       LHS.get() == E->getLHS() &&
9228       RHS.get() == E->getRHS())
9229     return E;
9230
9231   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9232                                         Cond.get(), LHS.get(), RHS.get(),
9233                                         E->getRParenLoc());
9234 }
9235
9236 template<typename Derived>
9237 ExprResult
9238 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9239   return E;
9240 }
9241
9242 template<typename Derived>
9243 ExprResult
9244 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9245   switch (E->getOperator()) {
9246   case OO_New:
9247   case OO_Delete:
9248   case OO_Array_New:
9249   case OO_Array_Delete:
9250     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9251
9252   case OO_Call: {
9253     // This is a call to an object's operator().
9254     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9255
9256     // Transform the object itself.
9257     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9258     if (Object.isInvalid())
9259       return ExprError();
9260
9261     // FIXME: Poor location information
9262     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
9263         static_cast<Expr *>(Object.get())->getLocEnd());
9264
9265     // Transform the call arguments.
9266     SmallVector<Expr*, 8> Args;
9267     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
9268                                     Args))
9269       return ExprError();
9270
9271     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
9272                                         Args,
9273                                         E->getLocEnd());
9274   }
9275
9276 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
9277   case OO_##Name:
9278 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
9279 #include "clang/Basic/OperatorKinds.def"
9280   case OO_Subscript:
9281     // Handled below.
9282     break;
9283
9284   case OO_Conditional:
9285     llvm_unreachable("conditional operator is not actually overloadable");
9286
9287   case OO_None:
9288   case NUM_OVERLOADED_OPERATORS:
9289     llvm_unreachable("not an overloaded operator?");
9290   }
9291
9292   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9293   if (Callee.isInvalid())
9294     return ExprError();
9295
9296   ExprResult First;
9297   if (E->getOperator() == OO_Amp)
9298     First = getDerived().TransformAddressOfOperand(E->getArg(0));
9299   else
9300     First = getDerived().TransformExpr(E->getArg(0));
9301   if (First.isInvalid())
9302     return ExprError();
9303
9304   ExprResult Second;
9305   if (E->getNumArgs() == 2) {
9306     Second = getDerived().TransformExpr(E->getArg(1));
9307     if (Second.isInvalid())
9308       return ExprError();
9309   }
9310
9311   if (!getDerived().AlwaysRebuild() &&
9312       Callee.get() == E->getCallee() &&
9313       First.get() == E->getArg(0) &&
9314       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
9315     return SemaRef.MaybeBindToTemporary(E);
9316
9317   Sema::FPContractStateRAII FPContractState(getSema());
9318   getSema().FPFeatures.fp_contract = E->isFPContractable();
9319
9320   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
9321                                                  E->getOperatorLoc(),
9322                                                  Callee.get(),
9323                                                  First.get(),
9324                                                  Second.get());
9325 }
9326
9327 template<typename Derived>
9328 ExprResult
9329 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
9330   return getDerived().TransformCallExpr(E);
9331 }
9332
9333 template<typename Derived>
9334 ExprResult
9335 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
9336   // Transform the callee.
9337   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9338   if (Callee.isInvalid())
9339     return ExprError();
9340
9341   // Transform exec config.
9342   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
9343   if (EC.isInvalid())
9344     return ExprError();
9345
9346   // Transform arguments.
9347   bool ArgChanged = false;
9348   SmallVector<Expr*, 8> Args;
9349   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9350                                   &ArgChanged))
9351     return ExprError();
9352
9353   if (!getDerived().AlwaysRebuild() &&
9354       Callee.get() == E->getCallee() &&
9355       !ArgChanged)
9356     return SemaRef.MaybeBindToTemporary(E);
9357
9358   // FIXME: Wrong source location information for the '('.
9359   SourceLocation FakeLParenLoc
9360     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9361   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9362                                       Args,
9363                                       E->getRParenLoc(), EC.get());
9364 }
9365
9366 template<typename Derived>
9367 ExprResult
9368 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
9369   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9370   if (!Type)
9371     return ExprError();
9372
9373   ExprResult SubExpr
9374     = getDerived().TransformExpr(E->getSubExprAsWritten());
9375   if (SubExpr.isInvalid())
9376     return ExprError();
9377
9378   if (!getDerived().AlwaysRebuild() &&
9379       Type == E->getTypeInfoAsWritten() &&
9380       SubExpr.get() == E->getSubExpr())
9381     return E;
9382   return getDerived().RebuildCXXNamedCastExpr(
9383       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
9384       Type, E->getAngleBrackets().getEnd(),
9385       // FIXME. this should be '(' location
9386       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
9387 }
9388
9389 template<typename Derived>
9390 ExprResult
9391 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
9392   return getDerived().TransformCXXNamedCastExpr(E);
9393 }
9394
9395 template<typename Derived>
9396 ExprResult
9397 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
9398   return getDerived().TransformCXXNamedCastExpr(E);
9399 }
9400
9401 template<typename Derived>
9402 ExprResult
9403 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
9404                                                       CXXReinterpretCastExpr *E) {
9405   return getDerived().TransformCXXNamedCastExpr(E);
9406 }
9407
9408 template<typename Derived>
9409 ExprResult
9410 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
9411   return getDerived().TransformCXXNamedCastExpr(E);
9412 }
9413
9414 template<typename Derived>
9415 ExprResult
9416 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
9417                                                      CXXFunctionalCastExpr *E) {
9418   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9419   if (!Type)
9420     return ExprError();
9421
9422   ExprResult SubExpr
9423     = getDerived().TransformExpr(E->getSubExprAsWritten());
9424   if (SubExpr.isInvalid())
9425     return ExprError();
9426
9427   if (!getDerived().AlwaysRebuild() &&
9428       Type == E->getTypeInfoAsWritten() &&
9429       SubExpr.get() == E->getSubExpr())
9430     return E;
9431
9432   return getDerived().RebuildCXXFunctionalCastExpr(Type,
9433                                                    E->getLParenLoc(),
9434                                                    SubExpr.get(),
9435                                                    E->getRParenLoc());
9436 }
9437
9438 template<typename Derived>
9439 ExprResult
9440 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
9441   if (E->isTypeOperand()) {
9442     TypeSourceInfo *TInfo
9443       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9444     if (!TInfo)
9445       return ExprError();
9446
9447     if (!getDerived().AlwaysRebuild() &&
9448         TInfo == E->getTypeOperandSourceInfo())
9449       return E;
9450
9451     return getDerived().RebuildCXXTypeidExpr(E->getType(),
9452                                              E->getLocStart(),
9453                                              TInfo,
9454                                              E->getLocEnd());
9455   }
9456
9457   // We don't know whether the subexpression is potentially evaluated until
9458   // after we perform semantic analysis.  We speculatively assume it is
9459   // unevaluated; it will get fixed later if the subexpression is in fact
9460   // potentially evaluated.
9461   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
9462                                                Sema::ReuseLambdaContextDecl);
9463
9464   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9465   if (SubExpr.isInvalid())
9466     return ExprError();
9467
9468   if (!getDerived().AlwaysRebuild() &&
9469       SubExpr.get() == E->getExprOperand())
9470     return E;
9471
9472   return getDerived().RebuildCXXTypeidExpr(E->getType(),
9473                                            E->getLocStart(),
9474                                            SubExpr.get(),
9475                                            E->getLocEnd());
9476 }
9477
9478 template<typename Derived>
9479 ExprResult
9480 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
9481   if (E->isTypeOperand()) {
9482     TypeSourceInfo *TInfo
9483       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9484     if (!TInfo)
9485       return ExprError();
9486
9487     if (!getDerived().AlwaysRebuild() &&
9488         TInfo == E->getTypeOperandSourceInfo())
9489       return E;
9490
9491     return getDerived().RebuildCXXUuidofExpr(E->getType(),
9492                                              E->getLocStart(),
9493                                              TInfo,
9494                                              E->getLocEnd());
9495   }
9496
9497   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9498
9499   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9500   if (SubExpr.isInvalid())
9501     return ExprError();
9502
9503   if (!getDerived().AlwaysRebuild() &&
9504       SubExpr.get() == E->getExprOperand())
9505     return E;
9506
9507   return getDerived().RebuildCXXUuidofExpr(E->getType(),
9508                                            E->getLocStart(),
9509                                            SubExpr.get(),
9510                                            E->getLocEnd());
9511 }
9512
9513 template<typename Derived>
9514 ExprResult
9515 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
9516   return E;
9517 }
9518
9519 template<typename Derived>
9520 ExprResult
9521 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
9522                                                      CXXNullPtrLiteralExpr *E) {
9523   return E;
9524 }
9525
9526 template<typename Derived>
9527 ExprResult
9528 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
9529   QualType T = getSema().getCurrentThisType();
9530
9531   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
9532     // Make sure that we capture 'this'.
9533     getSema().CheckCXXThisCapture(E->getLocStart());
9534     return E;
9535   }
9536
9537   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
9538 }
9539
9540 template<typename Derived>
9541 ExprResult
9542 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
9543   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9544   if (SubExpr.isInvalid())
9545     return ExprError();
9546
9547   if (!getDerived().AlwaysRebuild() &&
9548       SubExpr.get() == E->getSubExpr())
9549     return E;
9550
9551   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
9552                                           E->isThrownVariableInScope());
9553 }
9554
9555 template<typename Derived>
9556 ExprResult
9557 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
9558   ParmVarDecl *Param
9559     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
9560                                                            E->getParam()));
9561   if (!Param)
9562     return ExprError();
9563
9564   if (!getDerived().AlwaysRebuild() &&
9565       Param == E->getParam())
9566     return E;
9567
9568   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
9569 }
9570
9571 template<typename Derived>
9572 ExprResult
9573 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
9574   FieldDecl *Field
9575     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
9576                                                          E->getField()));
9577   if (!Field)
9578     return ExprError();
9579
9580   if (!getDerived().AlwaysRebuild() && Field == E->getField())
9581     return E;
9582
9583   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
9584 }
9585
9586 template<typename Derived>
9587 ExprResult
9588 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
9589                                                     CXXScalarValueInitExpr *E) {
9590   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9591   if (!T)
9592     return ExprError();
9593
9594   if (!getDerived().AlwaysRebuild() &&
9595       T == E->getTypeSourceInfo())
9596     return E;
9597
9598   return getDerived().RebuildCXXScalarValueInitExpr(T,
9599                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
9600                                                     E->getRParenLoc());
9601 }
9602
9603 template<typename Derived>
9604 ExprResult
9605 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
9606   // Transform the type that we're allocating
9607   TypeSourceInfo *AllocTypeInfo
9608     = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
9609   if (!AllocTypeInfo)
9610     return ExprError();
9611
9612   // Transform the size of the array we're allocating (if any).
9613   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
9614   if (ArraySize.isInvalid())
9615     return ExprError();
9616
9617   // Transform the placement arguments (if any).
9618   bool ArgumentChanged = false;
9619   SmallVector<Expr*, 8> PlacementArgs;
9620   if (getDerived().TransformExprs(E->getPlacementArgs(),
9621                                   E->getNumPlacementArgs(), true,
9622                                   PlacementArgs, &ArgumentChanged))
9623     return ExprError();
9624
9625   // Transform the initializer (if any).
9626   Expr *OldInit = E->getInitializer();
9627   ExprResult NewInit;
9628   if (OldInit)
9629     NewInit = getDerived().TransformInitializer(OldInit, true);
9630   if (NewInit.isInvalid())
9631     return ExprError();
9632
9633   // Transform new operator and delete operator.
9634   FunctionDecl *OperatorNew = nullptr;
9635   if (E->getOperatorNew()) {
9636     OperatorNew = cast_or_null<FunctionDecl>(
9637                                  getDerived().TransformDecl(E->getLocStart(),
9638                                                          E->getOperatorNew()));
9639     if (!OperatorNew)
9640       return ExprError();
9641   }
9642
9643   FunctionDecl *OperatorDelete = nullptr;
9644   if (E->getOperatorDelete()) {
9645     OperatorDelete = cast_or_null<FunctionDecl>(
9646                                    getDerived().TransformDecl(E->getLocStart(),
9647                                                        E->getOperatorDelete()));
9648     if (!OperatorDelete)
9649       return ExprError();
9650   }
9651
9652   if (!getDerived().AlwaysRebuild() &&
9653       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
9654       ArraySize.get() == E->getArraySize() &&
9655       NewInit.get() == OldInit &&
9656       OperatorNew == E->getOperatorNew() &&
9657       OperatorDelete == E->getOperatorDelete() &&
9658       !ArgumentChanged) {
9659     // Mark any declarations we need as referenced.
9660     // FIXME: instantiation-specific.
9661     if (OperatorNew)
9662       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
9663     if (OperatorDelete)
9664       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
9665
9666     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
9667       QualType ElementType
9668         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
9669       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
9670         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
9671         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
9672           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
9673         }
9674       }
9675     }
9676
9677     return E;
9678   }
9679
9680   QualType AllocType = AllocTypeInfo->getType();
9681   if (!ArraySize.get()) {
9682     // If no array size was specified, but the new expression was
9683     // instantiated with an array type (e.g., "new T" where T is
9684     // instantiated with "int[4]"), extract the outer bound from the
9685     // array type as our array size. We do this with constant and
9686     // dependently-sized array types.
9687     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
9688     if (!ArrayT) {
9689       // Do nothing
9690     } else if (const ConstantArrayType *ConsArrayT
9691                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
9692       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
9693                                          SemaRef.Context.getSizeType(),
9694                                          /*FIXME:*/ E->getLocStart());
9695       AllocType = ConsArrayT->getElementType();
9696     } else if (const DependentSizedArrayType *DepArrayT
9697                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
9698       if (DepArrayT->getSizeExpr()) {
9699         ArraySize = DepArrayT->getSizeExpr();
9700         AllocType = DepArrayT->getElementType();
9701       }
9702     }
9703   }
9704
9705   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
9706                                         E->isGlobalNew(),
9707                                         /*FIXME:*/E->getLocStart(),
9708                                         PlacementArgs,
9709                                         /*FIXME:*/E->getLocStart(),
9710                                         E->getTypeIdParens(),
9711                                         AllocType,
9712                                         AllocTypeInfo,
9713                                         ArraySize.get(),
9714                                         E->getDirectInitRange(),
9715                                         NewInit.get());
9716 }
9717
9718 template<typename Derived>
9719 ExprResult
9720 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
9721   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
9722   if (Operand.isInvalid())
9723     return ExprError();
9724
9725   // Transform the delete operator, if known.
9726   FunctionDecl *OperatorDelete = nullptr;
9727   if (E->getOperatorDelete()) {
9728     OperatorDelete = cast_or_null<FunctionDecl>(
9729                                    getDerived().TransformDecl(E->getLocStart(),
9730                                                        E->getOperatorDelete()));
9731     if (!OperatorDelete)
9732       return ExprError();
9733   }
9734
9735   if (!getDerived().AlwaysRebuild() &&
9736       Operand.get() == E->getArgument() &&
9737       OperatorDelete == E->getOperatorDelete()) {
9738     // Mark any declarations we need as referenced.
9739     // FIXME: instantiation-specific.
9740     if (OperatorDelete)
9741       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
9742
9743     if (!E->getArgument()->isTypeDependent()) {
9744       QualType Destroyed = SemaRef.Context.getBaseElementType(
9745                                                          E->getDestroyedType());
9746       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
9747         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
9748         SemaRef.MarkFunctionReferenced(E->getLocStart(),
9749                                        SemaRef.LookupDestructor(Record));
9750       }
9751     }
9752
9753     return E;
9754   }
9755
9756   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
9757                                            E->isGlobalDelete(),
9758                                            E->isArrayForm(),
9759                                            Operand.get());
9760 }
9761
9762 template<typename Derived>
9763 ExprResult
9764 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
9765                                                      CXXPseudoDestructorExpr *E) {
9766   ExprResult Base = getDerived().TransformExpr(E->getBase());
9767   if (Base.isInvalid())
9768     return ExprError();
9769
9770   ParsedType ObjectTypePtr;
9771   bool MayBePseudoDestructor = false;
9772   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
9773                                               E->getOperatorLoc(),
9774                                         E->isArrow()? tok::arrow : tok::period,
9775                                               ObjectTypePtr,
9776                                               MayBePseudoDestructor);
9777   if (Base.isInvalid())
9778     return ExprError();
9779
9780   QualType ObjectType = ObjectTypePtr.get();
9781   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
9782   if (QualifierLoc) {
9783     QualifierLoc
9784       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
9785     if (!QualifierLoc)
9786       return ExprError();
9787   }
9788   CXXScopeSpec SS;
9789   SS.Adopt(QualifierLoc);
9790
9791   PseudoDestructorTypeStorage Destroyed;
9792   if (E->getDestroyedTypeInfo()) {
9793     TypeSourceInfo *DestroyedTypeInfo
9794       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
9795                                                 ObjectType, nullptr, SS);
9796     if (!DestroyedTypeInfo)
9797       return ExprError();
9798     Destroyed = DestroyedTypeInfo;
9799   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
9800     // We aren't likely to be able to resolve the identifier down to a type
9801     // now anyway, so just retain the identifier.
9802     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
9803                                             E->getDestroyedTypeLoc());
9804   } else {
9805     // Look for a destructor known with the given name.
9806     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
9807                                               *E->getDestroyedTypeIdentifier(),
9808                                                 E->getDestroyedTypeLoc(),
9809                                                 /*Scope=*/nullptr,
9810                                                 SS, ObjectTypePtr,
9811                                                 false);
9812     if (!T)
9813       return ExprError();
9814
9815     Destroyed
9816       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
9817                                                  E->getDestroyedTypeLoc());
9818   }
9819
9820   TypeSourceInfo *ScopeTypeInfo = nullptr;
9821   if (E->getScopeTypeInfo()) {
9822     CXXScopeSpec EmptySS;
9823     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
9824                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
9825     if (!ScopeTypeInfo)
9826       return ExprError();
9827   }
9828
9829   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
9830                                                      E->getOperatorLoc(),
9831                                                      E->isArrow(),
9832                                                      SS,
9833                                                      ScopeTypeInfo,
9834                                                      E->getColonColonLoc(),
9835                                                      E->getTildeLoc(),
9836                                                      Destroyed);
9837 }
9838
9839 template <typename Derived>
9840 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
9841                                                         bool RequiresADL,
9842                                                         LookupResult &R) {
9843   // Transform all the decls.
9844   bool AllEmptyPacks = true;
9845   for (auto *OldD : Old->decls()) {
9846     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
9847     if (!InstD) {
9848       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
9849       // This can happen because of dependent hiding.
9850       if (isa<UsingShadowDecl>(OldD))
9851         continue;
9852       else {
9853         R.clear();
9854         return true;
9855       }
9856     }
9857
9858     // Expand using pack declarations.
9859     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
9860     ArrayRef<NamedDecl*> Decls = SingleDecl;
9861     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
9862       Decls = UPD->expansions();
9863
9864     // Expand using declarations.
9865     for (auto *D : Decls) {
9866       if (auto *UD = dyn_cast<UsingDecl>(D)) {
9867         for (auto *SD : UD->shadows())
9868           R.addDecl(SD);
9869       } else {
9870         R.addDecl(D);
9871       }
9872     }
9873
9874     AllEmptyPacks &= Decls.empty();
9875   };
9876
9877   // C++ [temp.res]/8.4.2:
9878   //   The program is ill-formed, no diagnostic required, if [...] lookup for
9879   //   a name in the template definition found a using-declaration, but the
9880   //   lookup in the corresponding scope in the instantiation odoes not find
9881   //   any declarations because the using-declaration was a pack expansion and
9882   //   the corresponding pack is empty
9883   if (AllEmptyPacks && !RequiresADL) {
9884     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
9885         << isa<UnresolvedMemberExpr>(Old) << Old->getNameInfo().getName();
9886     return true;
9887   }
9888
9889   // Resolve a kind, but don't do any further analysis.  If it's
9890   // ambiguous, the callee needs to deal with it.
9891   R.resolveKind();
9892   return false;
9893 }
9894
9895 template<typename Derived>
9896 ExprResult
9897 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
9898                                                   UnresolvedLookupExpr *Old) {
9899   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
9900                  Sema::LookupOrdinaryName);
9901
9902   // Transform the declaration set.
9903   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
9904     return ExprError();
9905
9906   // Rebuild the nested-name qualifier, if present.
9907   CXXScopeSpec SS;
9908   if (Old->getQualifierLoc()) {
9909     NestedNameSpecifierLoc QualifierLoc
9910       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
9911     if (!QualifierLoc)
9912       return ExprError();
9913
9914     SS.Adopt(QualifierLoc);
9915   }
9916
9917   if (Old->getNamingClass()) {
9918     CXXRecordDecl *NamingClass
9919       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
9920                                                             Old->getNameLoc(),
9921                                                         Old->getNamingClass()));
9922     if (!NamingClass) {
9923       R.clear();
9924       return ExprError();
9925     }
9926
9927     R.setNamingClass(NamingClass);
9928   }
9929
9930   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
9931
9932   // If we have neither explicit template arguments, nor the template keyword,
9933   // it's a normal declaration name or member reference.
9934   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
9935     NamedDecl *D = R.getAsSingle<NamedDecl>();
9936     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
9937     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
9938     // give a good diagnostic.
9939     if (D && D->isCXXInstanceMember()) {
9940       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
9941                                                      /*TemplateArgs=*/nullptr,
9942                                                      /*Scope=*/nullptr);
9943     }
9944
9945     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
9946   }
9947
9948   // If we have template arguments, rebuild them, then rebuild the
9949   // templateid expression.
9950   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
9951   if (Old->hasExplicitTemplateArgs() &&
9952       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
9953                                               Old->getNumTemplateArgs(),
9954                                               TransArgs)) {
9955     R.clear();
9956     return ExprError();
9957   }
9958
9959   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
9960                                             Old->requiresADL(), &TransArgs);
9961 }
9962
9963 template<typename Derived>
9964 ExprResult
9965 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
9966   bool ArgChanged = false;
9967   SmallVector<TypeSourceInfo *, 4> Args;
9968   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
9969     TypeSourceInfo *From = E->getArg(I);
9970     TypeLoc FromTL = From->getTypeLoc();
9971     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
9972       TypeLocBuilder TLB;
9973       TLB.reserve(FromTL.getFullDataSize());
9974       QualType To = getDerived().TransformType(TLB, FromTL);
9975       if (To.isNull())
9976         return ExprError();
9977
9978       if (To == From->getType())
9979         Args.push_back(From);
9980       else {
9981         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
9982         ArgChanged = true;
9983       }
9984       continue;
9985     }
9986
9987     ArgChanged = true;
9988
9989     // We have a pack expansion. Instantiate it.
9990     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
9991     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
9992     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9993     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
9994
9995     // Determine whether the set of unexpanded parameter packs can and should
9996     // be expanded.
9997     bool Expand = true;
9998     bool RetainExpansion = false;
9999     Optional<unsigned> OrigNumExpansions =
10000         ExpansionTL.getTypePtr()->getNumExpansions();
10001     Optional<unsigned> NumExpansions = OrigNumExpansions;
10002     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
10003                                              PatternTL.getSourceRange(),
10004                                              Unexpanded,
10005                                              Expand, RetainExpansion,
10006                                              NumExpansions))
10007       return ExprError();
10008
10009     if (!Expand) {
10010       // The transform has determined that we should perform a simple
10011       // transformation on the pack expansion, producing another pack
10012       // expansion.
10013       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10014
10015       TypeLocBuilder TLB;
10016       TLB.reserve(From->getTypeLoc().getFullDataSize());
10017
10018       QualType To = getDerived().TransformType(TLB, PatternTL);
10019       if (To.isNull())
10020         return ExprError();
10021
10022       To = getDerived().RebuildPackExpansionType(To,
10023                                                  PatternTL.getSourceRange(),
10024                                                  ExpansionTL.getEllipsisLoc(),
10025                                                  NumExpansions);
10026       if (To.isNull())
10027         return ExprError();
10028
10029       PackExpansionTypeLoc ToExpansionTL
10030         = TLB.push<PackExpansionTypeLoc>(To);
10031       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10032       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10033       continue;
10034     }
10035
10036     // Expand the pack expansion by substituting for each argument in the
10037     // pack(s).
10038     for (unsigned I = 0; I != *NumExpansions; ++I) {
10039       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
10040       TypeLocBuilder TLB;
10041       TLB.reserve(PatternTL.getFullDataSize());
10042       QualType To = getDerived().TransformType(TLB, PatternTL);
10043       if (To.isNull())
10044         return ExprError();
10045
10046       if (To->containsUnexpandedParameterPack()) {
10047         To = getDerived().RebuildPackExpansionType(To,
10048                                                    PatternTL.getSourceRange(),
10049                                                    ExpansionTL.getEllipsisLoc(),
10050                                                    NumExpansions);
10051         if (To.isNull())
10052           return ExprError();
10053
10054         PackExpansionTypeLoc ToExpansionTL
10055           = TLB.push<PackExpansionTypeLoc>(To);
10056         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10057       }
10058
10059       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10060     }
10061
10062     if (!RetainExpansion)
10063       continue;
10064
10065     // If we're supposed to retain a pack expansion, do so by temporarily
10066     // forgetting the partially-substituted parameter pack.
10067     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10068
10069     TypeLocBuilder TLB;
10070     TLB.reserve(From->getTypeLoc().getFullDataSize());
10071
10072     QualType To = getDerived().TransformType(TLB, PatternTL);
10073     if (To.isNull())
10074       return ExprError();
10075
10076     To = getDerived().RebuildPackExpansionType(To,
10077                                                PatternTL.getSourceRange(),
10078                                                ExpansionTL.getEllipsisLoc(),
10079                                                NumExpansions);
10080     if (To.isNull())
10081       return ExprError();
10082
10083     PackExpansionTypeLoc ToExpansionTL
10084       = TLB.push<PackExpansionTypeLoc>(To);
10085     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10086     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10087   }
10088
10089   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10090     return E;
10091
10092   return getDerived().RebuildTypeTrait(E->getTrait(),
10093                                        E->getLocStart(),
10094                                        Args,
10095                                        E->getLocEnd());
10096 }
10097
10098 template<typename Derived>
10099 ExprResult
10100 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10101   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10102   if (!T)
10103     return ExprError();
10104
10105   if (!getDerived().AlwaysRebuild() &&
10106       T == E->getQueriedTypeSourceInfo())
10107     return E;
10108
10109   ExprResult SubExpr;
10110   {
10111     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10112     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10113     if (SubExpr.isInvalid())
10114       return ExprError();
10115
10116     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
10117       return E;
10118   }
10119
10120   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
10121                                             E->getLocStart(),
10122                                             T,
10123                                             SubExpr.get(),
10124                                             E->getLocEnd());
10125 }
10126
10127 template<typename Derived>
10128 ExprResult
10129 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
10130   ExprResult SubExpr;
10131   {
10132     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10133     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
10134     if (SubExpr.isInvalid())
10135       return ExprError();
10136
10137     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
10138       return E;
10139   }
10140
10141   return getDerived().RebuildExpressionTrait(
10142       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
10143 }
10144
10145 template <typename Derived>
10146 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
10147     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
10148     TypeSourceInfo **RecoveryTSI) {
10149   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
10150       DRE, AddrTaken, RecoveryTSI);
10151
10152   // Propagate both errors and recovered types, which return ExprEmpty.
10153   if (!NewDRE.isUsable())
10154     return NewDRE;
10155
10156   // We got an expr, wrap it up in parens.
10157   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
10158     return PE;
10159   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
10160                                        PE->getRParen());
10161 }
10162
10163 template <typename Derived>
10164 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10165     DependentScopeDeclRefExpr *E) {
10166   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
10167                                             nullptr);
10168 }
10169
10170 template<typename Derived>
10171 ExprResult
10172 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10173                                                DependentScopeDeclRefExpr *E,
10174                                                bool IsAddressOfOperand,
10175                                                TypeSourceInfo **RecoveryTSI) {
10176   assert(E->getQualifierLoc());
10177   NestedNameSpecifierLoc QualifierLoc
10178   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10179   if (!QualifierLoc)
10180     return ExprError();
10181   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10182
10183   // TODO: If this is a conversion-function-id, verify that the
10184   // destination type name (if present) resolves the same way after
10185   // instantiation as it did in the local scope.
10186
10187   DeclarationNameInfo NameInfo
10188     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
10189   if (!NameInfo.getName())
10190     return ExprError();
10191
10192   if (!E->hasExplicitTemplateArgs()) {
10193     if (!getDerived().AlwaysRebuild() &&
10194         QualifierLoc == E->getQualifierLoc() &&
10195         // Note: it is sufficient to compare the Name component of NameInfo:
10196         // if name has not changed, DNLoc has not changed either.
10197         NameInfo.getName() == E->getDeclName())
10198       return E;
10199
10200     return getDerived().RebuildDependentScopeDeclRefExpr(
10201         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
10202         IsAddressOfOperand, RecoveryTSI);
10203   }
10204
10205   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10206   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10207                                               E->getNumTemplateArgs(),
10208                                               TransArgs))
10209     return ExprError();
10210
10211   return getDerived().RebuildDependentScopeDeclRefExpr(
10212       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10213       RecoveryTSI);
10214 }
10215
10216 template<typename Derived>
10217 ExprResult
10218 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10219   // CXXConstructExprs other than for list-initialization and
10220   // CXXTemporaryObjectExpr are always implicit, so when we have
10221   // a 1-argument construction we just transform that argument.
10222   if ((E->getNumArgs() == 1 ||
10223        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10224       (!getDerived().DropCallArgument(E->getArg(0))) &&
10225       !E->isListInitialization())
10226     return getDerived().TransformExpr(E->getArg(0));
10227
10228   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
10229
10230   QualType T = getDerived().TransformType(E->getType());
10231   if (T.isNull())
10232     return ExprError();
10233
10234   CXXConstructorDecl *Constructor
10235     = cast_or_null<CXXConstructorDecl>(
10236                                 getDerived().TransformDecl(E->getLocStart(),
10237                                                          E->getConstructor()));
10238   if (!Constructor)
10239     return ExprError();
10240
10241   bool ArgumentChanged = false;
10242   SmallVector<Expr*, 8> Args;
10243   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10244                                   &ArgumentChanged))
10245     return ExprError();
10246
10247   if (!getDerived().AlwaysRebuild() &&
10248       T == E->getType() &&
10249       Constructor == E->getConstructor() &&
10250       !ArgumentChanged) {
10251     // Mark the constructor as referenced.
10252     // FIXME: Instantiation-specific
10253     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10254     return E;
10255   }
10256
10257   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
10258                                               Constructor,
10259                                               E->isElidable(), Args,
10260                                               E->hadMultipleCandidates(),
10261                                               E->isListInitialization(),
10262                                               E->isStdInitListInitialization(),
10263                                               E->requiresZeroInitialization(),
10264                                               E->getConstructionKind(),
10265                                               E->getParenOrBraceRange());
10266 }
10267
10268 template<typename Derived>
10269 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10270     CXXInheritedCtorInitExpr *E) {
10271   QualType T = getDerived().TransformType(E->getType());
10272   if (T.isNull())
10273     return ExprError();
10274
10275   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10276       getDerived().TransformDecl(E->getLocStart(), E->getConstructor()));
10277   if (!Constructor)
10278     return ExprError();
10279
10280   if (!getDerived().AlwaysRebuild() &&
10281       T == E->getType() &&
10282       Constructor == E->getConstructor()) {
10283     // Mark the constructor as referenced.
10284     // FIXME: Instantiation-specific
10285     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10286     return E;
10287   }
10288
10289   return getDerived().RebuildCXXInheritedCtorInitExpr(
10290       T, E->getLocation(), Constructor,
10291       E->constructsVBase(), E->inheritedFromVBase());
10292 }
10293
10294 /// \brief Transform a C++ temporary-binding expression.
10295 ///
10296 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
10297 /// transform the subexpression and return that.
10298 template<typename Derived>
10299 ExprResult
10300 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10301   return getDerived().TransformExpr(E->getSubExpr());
10302 }
10303
10304 /// \brief Transform a C++ expression that contains cleanups that should
10305 /// be run after the expression is evaluated.
10306 ///
10307 /// Since ExprWithCleanups nodes are implicitly generated, we
10308 /// just transform the subexpression and return that.
10309 template<typename Derived>
10310 ExprResult
10311 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
10312   return getDerived().TransformExpr(E->getSubExpr());
10313 }
10314
10315 template<typename Derived>
10316 ExprResult
10317 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
10318                                                     CXXTemporaryObjectExpr *E) {
10319   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10320   if (!T)
10321     return ExprError();
10322
10323   CXXConstructorDecl *Constructor
10324     = cast_or_null<CXXConstructorDecl>(
10325                                   getDerived().TransformDecl(E->getLocStart(),
10326                                                          E->getConstructor()));
10327   if (!Constructor)
10328     return ExprError();
10329
10330   bool ArgumentChanged = false;
10331   SmallVector<Expr*, 8> Args;
10332   Args.reserve(E->getNumArgs());
10333   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10334                      &ArgumentChanged))
10335     return ExprError();
10336
10337   if (!getDerived().AlwaysRebuild() &&
10338       T == E->getTypeSourceInfo() &&
10339       Constructor == E->getConstructor() &&
10340       !ArgumentChanged) {
10341     // FIXME: Instantiation-specific
10342     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10343     return SemaRef.MaybeBindToTemporary(E);
10344   }
10345
10346   // FIXME: Pass in E->isListInitialization().
10347   return getDerived().RebuildCXXTemporaryObjectExpr(T,
10348                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10349                                                     Args,
10350                                                     E->getLocEnd());
10351 }
10352
10353 template<typename Derived>
10354 ExprResult
10355 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
10356   // Transform any init-capture expressions before entering the scope of the
10357   // lambda body, because they are not semantically within that scope.
10358   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
10359   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
10360   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
10361                                   E->explicit_capture_begin());
10362   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10363                                     CEnd = E->capture_end();
10364        C != CEnd; ++C) {
10365     if (!E->isInitCapture(C))
10366       continue;
10367     EnterExpressionEvaluationContext EEEC(getSema(),
10368                                           Sema::PotentiallyEvaluated);
10369     ExprResult NewExprInitResult = getDerived().TransformInitializer(
10370         C->getCapturedVar()->getInit(),
10371         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
10372
10373     if (NewExprInitResult.isInvalid())
10374       return ExprError();
10375     Expr *NewExprInit = NewExprInitResult.get();
10376
10377     VarDecl *OldVD = C->getCapturedVar();
10378     QualType NewInitCaptureType =
10379         getSema().buildLambdaInitCaptureInitialization(
10380             C->getLocation(), OldVD->getType()->isReferenceType(),
10381             OldVD->getIdentifier(),
10382             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
10383     NewExprInitResult = NewExprInit;
10384     InitCaptureExprsAndTypes[C - E->capture_begin()] =
10385         std::make_pair(NewExprInitResult, NewInitCaptureType);
10386   }
10387
10388   // Transform the template parameters, and add them to the current
10389   // instantiation scope. The null case is handled correctly.
10390   auto TPL = getDerived().TransformTemplateParameterList(
10391       E->getTemplateParameterList());
10392
10393   // Transform the type of the original lambda's call operator.
10394   // The transformation MUST be done in the CurrentInstantiationScope since
10395   // it introduces a mapping of the original to the newly created
10396   // transformed parameters.
10397   TypeSourceInfo *NewCallOpTSI = nullptr;
10398   {
10399     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
10400     FunctionProtoTypeLoc OldCallOpFPTL = 
10401         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
10402
10403     TypeLocBuilder NewCallOpTLBuilder;
10404     SmallVector<QualType, 4> ExceptionStorage;
10405     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
10406     QualType NewCallOpType = TransformFunctionProtoType(
10407         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
10408         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
10409           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
10410                                               ExceptionStorage, Changed);
10411         });
10412     if (NewCallOpType.isNull())
10413       return ExprError();
10414     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
10415                                                         NewCallOpType);
10416   }
10417
10418   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
10419   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
10420   LSI->GLTemplateParameterList = TPL;
10421
10422   // Create the local class that will describe the lambda.
10423   CXXRecordDecl *Class
10424     = getSema().createLambdaClosureType(E->getIntroducerRange(),
10425                                         NewCallOpTSI,
10426                                         /*KnownDependent=*/false,
10427                                         E->getCaptureDefault());
10428   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
10429
10430   // Build the call operator.
10431   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
10432       Class, E->getIntroducerRange(), NewCallOpTSI,
10433       E->getCallOperator()->getLocEnd(),
10434       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
10435       E->getCallOperator()->isConstexpr());
10436
10437   LSI->CallOperator = NewCallOperator;
10438
10439   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
10440        I != NumParams; ++I) {
10441     auto *P = NewCallOperator->getParamDecl(I);
10442     if (P->hasUninstantiatedDefaultArg()) {
10443       EnterExpressionEvaluationContext Eval(
10444           getSema(), Sema::PotentiallyEvaluatedIfUsed, P);
10445       ExprResult R = getDerived().TransformExpr(
10446           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
10447       P->setDefaultArg(R.get());
10448     }
10449   }
10450
10451   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
10452   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
10453
10454   // Introduce the context of the call operator.
10455   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
10456                                  /*NewThisContext*/false);
10457
10458   // Enter the scope of the lambda.
10459   getSema().buildLambdaScope(LSI, NewCallOperator,
10460                              E->getIntroducerRange(),
10461                              E->getCaptureDefault(),
10462                              E->getCaptureDefaultLoc(),
10463                              E->hasExplicitParameters(),
10464                              E->hasExplicitResultType(),
10465                              E->isMutable());
10466
10467   bool Invalid = false;
10468
10469   // Transform captures.
10470   bool FinishedExplicitCaptures = false;
10471   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10472                                  CEnd = E->capture_end();
10473        C != CEnd; ++C) {
10474     // When we hit the first implicit capture, tell Sema that we've finished
10475     // the list of explicit captures.
10476     if (!FinishedExplicitCaptures && C->isImplicit()) {
10477       getSema().finishLambdaExplicitCaptures(LSI);
10478       FinishedExplicitCaptures = true;
10479     }
10480
10481     // Capturing 'this' is trivial.
10482     if (C->capturesThis()) {
10483       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
10484                                     /*BuildAndDiagnose*/ true, nullptr,
10485                                     C->getCaptureKind() == LCK_StarThis);
10486       continue;
10487     }
10488     // Captured expression will be recaptured during captured variables
10489     // rebuilding.
10490     if (C->capturesVLAType())
10491       continue;
10492
10493     // Rebuild init-captures, including the implied field declaration.
10494     if (E->isInitCapture(C)) {
10495       InitCaptureInfoTy InitExprTypePair = 
10496           InitCaptureExprsAndTypes[C - E->capture_begin()];
10497       ExprResult Init = InitExprTypePair.first;
10498       QualType InitQualType = InitExprTypePair.second;
10499       if (Init.isInvalid() || InitQualType.isNull()) {
10500         Invalid = true;
10501         continue;
10502       }
10503       VarDecl *OldVD = C->getCapturedVar();
10504       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
10505           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
10506           OldVD->getInitStyle(), Init.get());
10507       if (!NewVD)
10508         Invalid = true;
10509       else {
10510         getDerived().transformedLocalDecl(OldVD, NewVD);
10511       }
10512       getSema().buildInitCaptureField(LSI, NewVD);
10513       continue;
10514     }
10515
10516     assert(C->capturesVariable() && "unexpected kind of lambda capture");
10517
10518     // Determine the capture kind for Sema.
10519     Sema::TryCaptureKind Kind
10520       = C->isImplicit()? Sema::TryCapture_Implicit
10521                        : C->getCaptureKind() == LCK_ByCopy
10522                            ? Sema::TryCapture_ExplicitByVal
10523                            : Sema::TryCapture_ExplicitByRef;
10524     SourceLocation EllipsisLoc;
10525     if (C->isPackExpansion()) {
10526       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
10527       bool ShouldExpand = false;
10528       bool RetainExpansion = false;
10529       Optional<unsigned> NumExpansions;
10530       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
10531                                                C->getLocation(),
10532                                                Unexpanded,
10533                                                ShouldExpand, RetainExpansion,
10534                                                NumExpansions)) {
10535         Invalid = true;
10536         continue;
10537       }
10538
10539       if (ShouldExpand) {
10540         // The transform has determined that we should perform an expansion;
10541         // transform and capture each of the arguments.
10542         // expansion of the pattern. Do so.
10543         VarDecl *Pack = C->getCapturedVar();
10544         for (unsigned I = 0; I != *NumExpansions; ++I) {
10545           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
10546           VarDecl *CapturedVar
10547             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10548                                                                Pack));
10549           if (!CapturedVar) {
10550             Invalid = true;
10551             continue;
10552           }
10553
10554           // Capture the transformed variable.
10555           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
10556         }
10557
10558         // FIXME: Retain a pack expansion if RetainExpansion is true.
10559
10560         continue;
10561       }
10562
10563       EllipsisLoc = C->getEllipsisLoc();
10564     }
10565
10566     // Transform the captured variable.
10567     VarDecl *CapturedVar
10568       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10569                                                          C->getCapturedVar()));
10570     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
10571       Invalid = true;
10572       continue;
10573     }
10574
10575     // Capture the transformed variable.
10576     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
10577                                  EllipsisLoc);
10578   }
10579   if (!FinishedExplicitCaptures)
10580     getSema().finishLambdaExplicitCaptures(LSI);
10581
10582   // Enter a new evaluation context to insulate the lambda from any
10583   // cleanups from the enclosing full-expression.
10584   getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated);
10585
10586   // Instantiate the body of the lambda expression.
10587   StmtResult Body =
10588       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
10589
10590   // ActOnLambda* will pop the function scope for us.
10591   FuncScopeCleanup.disable();
10592
10593   if (Body.isInvalid()) {
10594     SavedContext.pop();
10595     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
10596                                /*IsInstantiation=*/true);
10597     return ExprError();
10598   }
10599
10600   // Copy the LSI before ActOnFinishFunctionBody removes it.
10601   // FIXME: This is dumb. Store the lambda information somewhere that outlives
10602   // the call operator.
10603   auto LSICopy = *LSI;
10604   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
10605                                     /*IsInstantiation*/ true);
10606   SavedContext.pop();
10607
10608   return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(),
10609                                    &LSICopy);
10610 }
10611
10612 template<typename Derived>
10613 ExprResult
10614 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
10615                                                   CXXUnresolvedConstructExpr *E) {
10616   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10617   if (!T)
10618     return ExprError();
10619
10620   bool ArgumentChanged = false;
10621   SmallVector<Expr*, 8> Args;
10622   Args.reserve(E->arg_size());
10623   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
10624                                   &ArgumentChanged))
10625     return ExprError();
10626
10627   if (!getDerived().AlwaysRebuild() &&
10628       T == E->getTypeSourceInfo() &&
10629       !ArgumentChanged)
10630     return E;
10631
10632   // FIXME: we're faking the locations of the commas
10633   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
10634                                                         E->getLParenLoc(),
10635                                                         Args,
10636                                                         E->getRParenLoc());
10637 }
10638
10639 template<typename Derived>
10640 ExprResult
10641 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
10642                                              CXXDependentScopeMemberExpr *E) {
10643   // Transform the base of the expression.
10644   ExprResult Base((Expr*) nullptr);
10645   Expr *OldBase;
10646   QualType BaseType;
10647   QualType ObjectType;
10648   if (!E->isImplicitAccess()) {
10649     OldBase = E->getBase();
10650     Base = getDerived().TransformExpr(OldBase);
10651     if (Base.isInvalid())
10652       return ExprError();
10653
10654     // Start the member reference and compute the object's type.
10655     ParsedType ObjectTy;
10656     bool MayBePseudoDestructor = false;
10657     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10658                                                 E->getOperatorLoc(),
10659                                       E->isArrow()? tok::arrow : tok::period,
10660                                                 ObjectTy,
10661                                                 MayBePseudoDestructor);
10662     if (Base.isInvalid())
10663       return ExprError();
10664
10665     ObjectType = ObjectTy.get();
10666     BaseType = ((Expr*) Base.get())->getType();
10667   } else {
10668     OldBase = nullptr;
10669     BaseType = getDerived().TransformType(E->getBaseType());
10670     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
10671   }
10672
10673   // Transform the first part of the nested-name-specifier that qualifies
10674   // the member name.
10675   NamedDecl *FirstQualifierInScope
10676     = getDerived().TransformFirstQualifierInScope(
10677                                             E->getFirstQualifierFoundInScope(),
10678                                             E->getQualifierLoc().getBeginLoc());
10679
10680   NestedNameSpecifierLoc QualifierLoc;
10681   if (E->getQualifier()) {
10682     QualifierLoc
10683       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
10684                                                      ObjectType,
10685                                                      FirstQualifierInScope);
10686     if (!QualifierLoc)
10687       return ExprError();
10688   }
10689
10690   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10691
10692   // TODO: If this is a conversion-function-id, verify that the
10693   // destination type name (if present) resolves the same way after
10694   // instantiation as it did in the local scope.
10695
10696   DeclarationNameInfo NameInfo
10697     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
10698   if (!NameInfo.getName())
10699     return ExprError();
10700
10701   if (!E->hasExplicitTemplateArgs()) {
10702     // This is a reference to a member without an explicitly-specified
10703     // template argument list. Optimize for this common case.
10704     if (!getDerived().AlwaysRebuild() &&
10705         Base.get() == OldBase &&
10706         BaseType == E->getBaseType() &&
10707         QualifierLoc == E->getQualifierLoc() &&
10708         NameInfo.getName() == E->getMember() &&
10709         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
10710       return E;
10711
10712     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
10713                                                        BaseType,
10714                                                        E->isArrow(),
10715                                                        E->getOperatorLoc(),
10716                                                        QualifierLoc,
10717                                                        TemplateKWLoc,
10718                                                        FirstQualifierInScope,
10719                                                        NameInfo,
10720                                                        /*TemplateArgs*/nullptr);
10721   }
10722
10723   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10724   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10725                                               E->getNumTemplateArgs(),
10726                                               TransArgs))
10727     return ExprError();
10728
10729   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
10730                                                      BaseType,
10731                                                      E->isArrow(),
10732                                                      E->getOperatorLoc(),
10733                                                      QualifierLoc,
10734                                                      TemplateKWLoc,
10735                                                      FirstQualifierInScope,
10736                                                      NameInfo,
10737                                                      &TransArgs);
10738 }
10739
10740 template<typename Derived>
10741 ExprResult
10742 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
10743   // Transform the base of the expression.
10744   ExprResult Base((Expr*) nullptr);
10745   QualType BaseType;
10746   if (!Old->isImplicitAccess()) {
10747     Base = getDerived().TransformExpr(Old->getBase());
10748     if (Base.isInvalid())
10749       return ExprError();
10750     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
10751                                                      Old->isArrow());
10752     if (Base.isInvalid())
10753       return ExprError();
10754     BaseType = Base.get()->getType();
10755   } else {
10756     BaseType = getDerived().TransformType(Old->getBaseType());
10757   }
10758
10759   NestedNameSpecifierLoc QualifierLoc;
10760   if (Old->getQualifierLoc()) {
10761     QualifierLoc
10762     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10763     if (!QualifierLoc)
10764       return ExprError();
10765   }
10766
10767   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10768
10769   LookupResult R(SemaRef, Old->getMemberNameInfo(),
10770                  Sema::LookupOrdinaryName);
10771
10772   // Transform the declaration set.
10773   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
10774     return ExprError();
10775
10776   // Determine the naming class.
10777   if (Old->getNamingClass()) {
10778     CXXRecordDecl *NamingClass
10779       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10780                                                           Old->getMemberLoc(),
10781                                                         Old->getNamingClass()));
10782     if (!NamingClass)
10783       return ExprError();
10784
10785     R.setNamingClass(NamingClass);
10786   }
10787
10788   TemplateArgumentListInfo TransArgs;
10789   if (Old->hasExplicitTemplateArgs()) {
10790     TransArgs.setLAngleLoc(Old->getLAngleLoc());
10791     TransArgs.setRAngleLoc(Old->getRAngleLoc());
10792     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10793                                                 Old->getNumTemplateArgs(),
10794                                                 TransArgs))
10795       return ExprError();
10796   }
10797
10798   // FIXME: to do this check properly, we will need to preserve the
10799   // first-qualifier-in-scope here, just in case we had a dependent
10800   // base (and therefore couldn't do the check) and a
10801   // nested-name-qualifier (and therefore could do the lookup).
10802   NamedDecl *FirstQualifierInScope = nullptr;
10803
10804   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
10805                                                   BaseType,
10806                                                   Old->getOperatorLoc(),
10807                                                   Old->isArrow(),
10808                                                   QualifierLoc,
10809                                                   TemplateKWLoc,
10810                                                   FirstQualifierInScope,
10811                                                   R,
10812                                               (Old->hasExplicitTemplateArgs()
10813                                                   ? &TransArgs : nullptr));
10814 }
10815
10816 template<typename Derived>
10817 ExprResult
10818 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
10819   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10820   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
10821   if (SubExpr.isInvalid())
10822     return ExprError();
10823
10824   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
10825     return E;
10826
10827   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
10828 }
10829
10830 template<typename Derived>
10831 ExprResult
10832 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
10833   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
10834   if (Pattern.isInvalid())
10835     return ExprError();
10836
10837   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
10838     return E;
10839
10840   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
10841                                            E->getNumExpansions());
10842 }
10843
10844 template<typename Derived>
10845 ExprResult
10846 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
10847   // If E is not value-dependent, then nothing will change when we transform it.
10848   // Note: This is an instantiation-centric view.
10849   if (!E->isValueDependent())
10850     return E;
10851
10852   EnterExpressionEvaluationContext Unevaluated(getSema(), Sema::Unevaluated);
10853
10854   ArrayRef<TemplateArgument> PackArgs;
10855   TemplateArgument ArgStorage;
10856
10857   // Find the argument list to transform.
10858   if (E->isPartiallySubstituted()) {
10859     PackArgs = E->getPartialArguments();
10860   } else if (E->isValueDependent()) {
10861     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
10862     bool ShouldExpand = false;
10863     bool RetainExpansion = false;
10864     Optional<unsigned> NumExpansions;
10865     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
10866                                              Unexpanded,
10867                                              ShouldExpand, RetainExpansion,
10868                                              NumExpansions))
10869       return ExprError();
10870
10871     // If we need to expand the pack, build a template argument from it and
10872     // expand that.
10873     if (ShouldExpand) {
10874       auto *Pack = E->getPack();
10875       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
10876         ArgStorage = getSema().Context.getPackExpansionType(
10877             getSema().Context.getTypeDeclType(TTPD), None);
10878       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
10879         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
10880       } else {
10881         auto *VD = cast<ValueDecl>(Pack);
10882         ExprResult DRE = getSema().BuildDeclRefExpr(VD, VD->getType(),
10883                                                     VK_RValue, E->getPackLoc());
10884         if (DRE.isInvalid())
10885           return ExprError();
10886         ArgStorage = new (getSema().Context) PackExpansionExpr(
10887             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
10888       }
10889       PackArgs = ArgStorage;
10890     }
10891   }
10892
10893   // If we're not expanding the pack, just transform the decl.
10894   if (!PackArgs.size()) {
10895     auto *Pack = cast_or_null<NamedDecl>(
10896         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
10897     if (!Pack)
10898       return ExprError();
10899     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
10900                                               E->getPackLoc(),
10901                                               E->getRParenLoc(), None, None);
10902   }
10903
10904   // Try to compute the result without performing a partial substitution.
10905   Optional<unsigned> Result = 0;
10906   for (const TemplateArgument &Arg : PackArgs) {
10907     if (!Arg.isPackExpansion()) {
10908       Result = *Result + 1;
10909       continue;
10910     }
10911
10912     TemplateArgumentLoc ArgLoc;
10913     InventTemplateArgumentLoc(Arg, ArgLoc);
10914
10915     // Find the pattern of the pack expansion.
10916     SourceLocation Ellipsis;
10917     Optional<unsigned> OrigNumExpansions;
10918     TemplateArgumentLoc Pattern =
10919         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
10920                                                           OrigNumExpansions);
10921
10922     // Substitute under the pack expansion. Do not expand the pack (yet).
10923     TemplateArgumentLoc OutPattern;
10924     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10925     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
10926                                                /*Uneval*/ true))
10927       return true;
10928
10929     // See if we can determine the number of arguments from the result.
10930     Optional<unsigned> NumExpansions =
10931         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
10932     if (!NumExpansions) {
10933       // No: we must be in an alias template expansion, and we're going to need
10934       // to actually expand the packs.
10935       Result = None;
10936       break;
10937     }
10938
10939     Result = *Result + *NumExpansions;
10940   }
10941
10942   // Common case: we could determine the number of expansions without
10943   // substituting.
10944   if (Result)
10945     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10946                                               E->getPackLoc(),
10947                                               E->getRParenLoc(), *Result, None);
10948
10949   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
10950                                                E->getPackLoc());
10951   {
10952     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
10953     typedef TemplateArgumentLocInventIterator<
10954         Derived, const TemplateArgument*> PackLocIterator;
10955     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
10956                                    PackLocIterator(*this, PackArgs.end()),
10957                                    TransformedPackArgs, /*Uneval*/true))
10958       return ExprError();
10959   }
10960
10961   // Check whether we managed to fully-expand the pack.
10962   // FIXME: Is it possible for us to do so and not hit the early exit path?
10963   SmallVector<TemplateArgument, 8> Args;
10964   bool PartialSubstitution = false;
10965   for (auto &Loc : TransformedPackArgs.arguments()) {
10966     Args.push_back(Loc.getArgument());
10967     if (Loc.getArgument().isPackExpansion())
10968       PartialSubstitution = true;
10969   }
10970
10971   if (PartialSubstitution)
10972     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10973                                               E->getPackLoc(),
10974                                               E->getRParenLoc(), None, Args);
10975
10976   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10977                                             E->getPackLoc(), E->getRParenLoc(),
10978                                             Args.size(), None);
10979 }
10980
10981 template<typename Derived>
10982 ExprResult
10983 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
10984                                           SubstNonTypeTemplateParmPackExpr *E) {
10985   // Default behavior is to do nothing with this transformation.
10986   return E;
10987 }
10988
10989 template<typename Derived>
10990 ExprResult
10991 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
10992                                           SubstNonTypeTemplateParmExpr *E) {
10993   // Default behavior is to do nothing with this transformation.
10994   return E;
10995 }
10996
10997 template<typename Derived>
10998 ExprResult
10999 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
11000   // Default behavior is to do nothing with this transformation.
11001   return E;
11002 }
11003
11004 template<typename Derived>
11005 ExprResult
11006 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
11007                                                   MaterializeTemporaryExpr *E) {
11008   return getDerived().TransformExpr(E->GetTemporaryExpr());
11009 }
11010
11011 template<typename Derived>
11012 ExprResult
11013 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
11014   Expr *Pattern = E->getPattern();
11015
11016   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11017   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
11018   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11019
11020   // Determine whether the set of unexpanded parameter packs can and should
11021   // be expanded.
11022   bool Expand = true;
11023   bool RetainExpansion = false;
11024   Optional<unsigned> NumExpansions;
11025   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
11026                                            Pattern->getSourceRange(),
11027                                            Unexpanded,
11028                                            Expand, RetainExpansion,
11029                                            NumExpansions))
11030     return true;
11031
11032   if (!Expand) {
11033     // Do not expand any packs here, just transform and rebuild a fold
11034     // expression.
11035     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11036
11037     ExprResult LHS =
11038         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
11039     if (LHS.isInvalid())
11040       return true;
11041
11042     ExprResult RHS =
11043         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
11044     if (RHS.isInvalid())
11045       return true;
11046
11047     if (!getDerived().AlwaysRebuild() &&
11048         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
11049       return E;
11050
11051     return getDerived().RebuildCXXFoldExpr(
11052         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
11053         RHS.get(), E->getLocEnd());
11054   }
11055
11056   // The transform has determined that we should perform an elementwise
11057   // expansion of the pattern. Do so.
11058   ExprResult Result = getDerived().TransformExpr(E->getInit());
11059   if (Result.isInvalid())
11060     return true;
11061   bool LeftFold = E->isLeftFold();
11062
11063   // If we're retaining an expansion for a right fold, it is the innermost
11064   // component and takes the init (if any).
11065   if (!LeftFold && RetainExpansion) {
11066     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11067
11068     ExprResult Out = getDerived().TransformExpr(Pattern);
11069     if (Out.isInvalid())
11070       return true;
11071
11072     Result = getDerived().RebuildCXXFoldExpr(
11073         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
11074         Result.get(), E->getLocEnd());
11075     if (Result.isInvalid())
11076       return true;
11077   }
11078
11079   for (unsigned I = 0; I != *NumExpansions; ++I) {
11080     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
11081         getSema(), LeftFold ? I : *NumExpansions - I - 1);
11082     ExprResult Out = getDerived().TransformExpr(Pattern);
11083     if (Out.isInvalid())
11084       return true;
11085
11086     if (Out.get()->containsUnexpandedParameterPack()) {
11087       // We still have a pack; retain a pack expansion for this slice.
11088       Result = getDerived().RebuildCXXFoldExpr(
11089           E->getLocStart(),
11090           LeftFold ? Result.get() : Out.get(),
11091           E->getOperator(), E->getEllipsisLoc(),
11092           LeftFold ? Out.get() : Result.get(),
11093           E->getLocEnd());
11094     } else if (Result.isUsable()) {
11095       // We've got down to a single element; build a binary operator.
11096       Result = getDerived().RebuildBinaryOperator(
11097           E->getEllipsisLoc(), E->getOperator(),
11098           LeftFold ? Result.get() : Out.get(),
11099           LeftFold ? Out.get() : Result.get());
11100     } else
11101       Result = Out;
11102
11103     if (Result.isInvalid())
11104       return true;
11105   }
11106
11107   // If we're retaining an expansion for a left fold, it is the outermost
11108   // component and takes the complete expansion so far as its init (if any).
11109   if (LeftFold && RetainExpansion) {
11110     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11111
11112     ExprResult Out = getDerived().TransformExpr(Pattern);
11113     if (Out.isInvalid())
11114       return true;
11115
11116     Result = getDerived().RebuildCXXFoldExpr(
11117         E->getLocStart(), Result.get(),
11118         E->getOperator(), E->getEllipsisLoc(),
11119         Out.get(), E->getLocEnd());
11120     if (Result.isInvalid())
11121       return true;
11122   }
11123
11124   // If we had no init and an empty pack, and we're not retaining an expansion,
11125   // then produce a fallback value or error.
11126   if (Result.isUnset())
11127     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
11128                                                 E->getOperator());
11129
11130   return Result;
11131 }
11132
11133 template<typename Derived>
11134 ExprResult
11135 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
11136     CXXStdInitializerListExpr *E) {
11137   return getDerived().TransformExpr(E->getSubExpr());
11138 }
11139
11140 template<typename Derived>
11141 ExprResult
11142 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
11143   return SemaRef.MaybeBindToTemporary(E);
11144 }
11145
11146 template<typename Derived>
11147 ExprResult
11148 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
11149   return E;
11150 }
11151
11152 template<typename Derived>
11153 ExprResult
11154 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
11155   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11156   if (SubExpr.isInvalid())
11157     return ExprError();
11158
11159   if (!getDerived().AlwaysRebuild() &&
11160       SubExpr.get() == E->getSubExpr())
11161     return E;
11162
11163   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
11164 }
11165
11166 template<typename Derived>
11167 ExprResult
11168 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
11169   // Transform each of the elements.
11170   SmallVector<Expr *, 8> Elements;
11171   bool ArgChanged = false;
11172   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
11173                                   /*IsCall=*/false, Elements, &ArgChanged))
11174     return ExprError();
11175
11176   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11177     return SemaRef.MaybeBindToTemporary(E);
11178
11179   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
11180                                               Elements.data(),
11181                                               Elements.size());
11182 }
11183
11184 template<typename Derived>
11185 ExprResult
11186 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
11187                                                     ObjCDictionaryLiteral *E) {
11188   // Transform each of the elements.
11189   SmallVector<ObjCDictionaryElement, 8> Elements;
11190   bool ArgChanged = false;
11191   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
11192     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
11193
11194     if (OrigElement.isPackExpansion()) {
11195       // This key/value element is a pack expansion.
11196       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11197       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
11198       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
11199       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11200
11201       // Determine whether the set of unexpanded parameter packs can
11202       // and should be expanded.
11203       bool Expand = true;
11204       bool RetainExpansion = false;
11205       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
11206       Optional<unsigned> NumExpansions = OrigNumExpansions;
11207       SourceRange PatternRange(OrigElement.Key->getLocStart(),
11208                                OrigElement.Value->getLocEnd());
11209      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
11210                                                PatternRange,
11211                                                Unexpanded,
11212                                                Expand, RetainExpansion,
11213                                                NumExpansions))
11214         return ExprError();
11215
11216       if (!Expand) {
11217         // The transform has determined that we should perform a simple
11218         // transformation on the pack expansion, producing another pack
11219         // expansion.
11220         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11221         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11222         if (Key.isInvalid())
11223           return ExprError();
11224
11225         if (Key.get() != OrigElement.Key)
11226           ArgChanged = true;
11227
11228         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11229         if (Value.isInvalid())
11230           return ExprError();
11231
11232         if (Value.get() != OrigElement.Value)
11233           ArgChanged = true;
11234
11235         ObjCDictionaryElement Expansion = {
11236           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
11237         };
11238         Elements.push_back(Expansion);
11239         continue;
11240       }
11241
11242       // Record right away that the argument was changed.  This needs
11243       // to happen even if the array expands to nothing.
11244       ArgChanged = true;
11245
11246       // The transform has determined that we should perform an elementwise
11247       // expansion of the pattern. Do so.
11248       for (unsigned I = 0; I != *NumExpansions; ++I) {
11249         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11250         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11251         if (Key.isInvalid())
11252           return ExprError();
11253
11254         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11255         if (Value.isInvalid())
11256           return ExprError();
11257
11258         ObjCDictionaryElement Element = {
11259           Key.get(), Value.get(), SourceLocation(), NumExpansions
11260         };
11261
11262         // If any unexpanded parameter packs remain, we still have a
11263         // pack expansion.
11264         // FIXME: Can this really happen?
11265         if (Key.get()->containsUnexpandedParameterPack() ||
11266             Value.get()->containsUnexpandedParameterPack())
11267           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11268
11269         Elements.push_back(Element);
11270       }
11271
11272       // FIXME: Retain a pack expansion if RetainExpansion is true.
11273
11274       // We've finished with this pack expansion.
11275       continue;
11276     }
11277
11278     // Transform and check key.
11279     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11280     if (Key.isInvalid())
11281       return ExprError();
11282
11283     if (Key.get() != OrigElement.Key)
11284       ArgChanged = true;
11285
11286     // Transform and check value.
11287     ExprResult Value
11288       = getDerived().TransformExpr(OrigElement.Value);
11289     if (Value.isInvalid())
11290       return ExprError();
11291
11292     if (Value.get() != OrigElement.Value)
11293       ArgChanged = true;
11294
11295     ObjCDictionaryElement Element = {
11296       Key.get(), Value.get(), SourceLocation(), None
11297     };
11298     Elements.push_back(Element);
11299   }
11300
11301   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11302     return SemaRef.MaybeBindToTemporary(E);
11303
11304   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
11305                                                    Elements);
11306 }
11307
11308 template<typename Derived>
11309 ExprResult
11310 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
11311   TypeSourceInfo *EncodedTypeInfo
11312     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
11313   if (!EncodedTypeInfo)
11314     return ExprError();
11315
11316   if (!getDerived().AlwaysRebuild() &&
11317       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
11318     return E;
11319
11320   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
11321                                             EncodedTypeInfo,
11322                                             E->getRParenLoc());
11323 }
11324
11325 template<typename Derived>
11326 ExprResult TreeTransform<Derived>::
11327 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
11328   // This is a kind of implicit conversion, and it needs to get dropped
11329   // and recomputed for the same general reasons that ImplicitCastExprs
11330   // do, as well a more specific one: this expression is only valid when
11331   // it appears *immediately* as an argument expression.
11332   return getDerived().TransformExpr(E->getSubExpr());
11333 }
11334
11335 template<typename Derived>
11336 ExprResult TreeTransform<Derived>::
11337 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
11338   TypeSourceInfo *TSInfo
11339     = getDerived().TransformType(E->getTypeInfoAsWritten());
11340   if (!TSInfo)
11341     return ExprError();
11342
11343   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
11344   if (Result.isInvalid())
11345     return ExprError();
11346
11347   if (!getDerived().AlwaysRebuild() &&
11348       TSInfo == E->getTypeInfoAsWritten() &&
11349       Result.get() == E->getSubExpr())
11350     return E;
11351
11352   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
11353                                       E->getBridgeKeywordLoc(), TSInfo,
11354                                       Result.get());
11355 }
11356
11357 template <typename Derived>
11358 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
11359     ObjCAvailabilityCheckExpr *E) {
11360   return E;
11361 }
11362
11363 template<typename Derived>
11364 ExprResult
11365 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
11366   // Transform arguments.
11367   bool ArgChanged = false;
11368   SmallVector<Expr*, 8> Args;
11369   Args.reserve(E->getNumArgs());
11370   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
11371                                   &ArgChanged))
11372     return ExprError();
11373
11374   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
11375     // Class message: transform the receiver type.
11376     TypeSourceInfo *ReceiverTypeInfo
11377       = getDerived().TransformType(E->getClassReceiverTypeInfo());
11378     if (!ReceiverTypeInfo)
11379       return ExprError();
11380
11381     // If nothing changed, just retain the existing message send.
11382     if (!getDerived().AlwaysRebuild() &&
11383         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
11384       return SemaRef.MaybeBindToTemporary(E);
11385
11386     // Build a new class message send.
11387     SmallVector<SourceLocation, 16> SelLocs;
11388     E->getSelectorLocs(SelLocs);
11389     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
11390                                                E->getSelector(),
11391                                                SelLocs,
11392                                                E->getMethodDecl(),
11393                                                E->getLeftLoc(),
11394                                                Args,
11395                                                E->getRightLoc());
11396   }
11397   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
11398            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
11399     if (!E->getMethodDecl())
11400       return ExprError();
11401
11402     // Build a new class message send to 'super'.
11403     SmallVector<SourceLocation, 16> SelLocs;
11404     E->getSelectorLocs(SelLocs);
11405     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
11406                                                E->getSelector(),
11407                                                SelLocs,
11408                                                E->getReceiverType(),
11409                                                E->getMethodDecl(),
11410                                                E->getLeftLoc(),
11411                                                Args,
11412                                                E->getRightLoc());
11413   }
11414
11415   // Instance message: transform the receiver
11416   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
11417          "Only class and instance messages may be instantiated");
11418   ExprResult Receiver
11419     = getDerived().TransformExpr(E->getInstanceReceiver());
11420   if (Receiver.isInvalid())
11421     return ExprError();
11422
11423   // If nothing changed, just retain the existing message send.
11424   if (!getDerived().AlwaysRebuild() &&
11425       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
11426     return SemaRef.MaybeBindToTemporary(E);
11427
11428   // Build a new instance message send.
11429   SmallVector<SourceLocation, 16> SelLocs;
11430   E->getSelectorLocs(SelLocs);
11431   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
11432                                              E->getSelector(),
11433                                              SelLocs,
11434                                              E->getMethodDecl(),
11435                                              E->getLeftLoc(),
11436                                              Args,
11437                                              E->getRightLoc());
11438 }
11439
11440 template<typename Derived>
11441 ExprResult
11442 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
11443   return E;
11444 }
11445
11446 template<typename Derived>
11447 ExprResult
11448 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
11449   return E;
11450 }
11451
11452 template<typename Derived>
11453 ExprResult
11454 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
11455   // Transform the base expression.
11456   ExprResult Base = getDerived().TransformExpr(E->getBase());
11457   if (Base.isInvalid())
11458     return ExprError();
11459
11460   // We don't need to transform the ivar; it will never change.
11461
11462   // If nothing changed, just retain the existing expression.
11463   if (!getDerived().AlwaysRebuild() &&
11464       Base.get() == E->getBase())
11465     return E;
11466
11467   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
11468                                              E->getLocation(),
11469                                              E->isArrow(), E->isFreeIvar());
11470 }
11471
11472 template<typename Derived>
11473 ExprResult
11474 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
11475   // 'super' and types never change. Property never changes. Just
11476   // retain the existing expression.
11477   if (!E->isObjectReceiver())
11478     return E;
11479
11480   // Transform the base expression.
11481   ExprResult Base = getDerived().TransformExpr(E->getBase());
11482   if (Base.isInvalid())
11483     return ExprError();
11484
11485   // We don't need to transform the property; it will never change.
11486
11487   // If nothing changed, just retain the existing expression.
11488   if (!getDerived().AlwaysRebuild() &&
11489       Base.get() == E->getBase())
11490     return E;
11491
11492   if (E->isExplicitProperty())
11493     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11494                                                    E->getExplicitProperty(),
11495                                                    E->getLocation());
11496
11497   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11498                                                  SemaRef.Context.PseudoObjectTy,
11499                                                  E->getImplicitPropertyGetter(),
11500                                                  E->getImplicitPropertySetter(),
11501                                                  E->getLocation());
11502 }
11503
11504 template<typename Derived>
11505 ExprResult
11506 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
11507   // Transform the base expression.
11508   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
11509   if (Base.isInvalid())
11510     return ExprError();
11511
11512   // Transform the key expression.
11513   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
11514   if (Key.isInvalid())
11515     return ExprError();
11516
11517   // If nothing changed, just retain the existing expression.
11518   if (!getDerived().AlwaysRebuild() &&
11519       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
11520     return E;
11521
11522   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
11523                                                   Base.get(), Key.get(),
11524                                                   E->getAtIndexMethodDecl(),
11525                                                   E->setAtIndexMethodDecl());
11526 }
11527
11528 template<typename Derived>
11529 ExprResult
11530 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
11531   // Transform the base expression.
11532   ExprResult Base = getDerived().TransformExpr(E->getBase());
11533   if (Base.isInvalid())
11534     return ExprError();
11535
11536   // If nothing changed, just retain the existing expression.
11537   if (!getDerived().AlwaysRebuild() &&
11538       Base.get() == E->getBase())
11539     return E;
11540
11541   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
11542                                          E->getOpLoc(),
11543                                          E->isArrow());
11544 }
11545
11546 template<typename Derived>
11547 ExprResult
11548 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
11549   bool ArgumentChanged = false;
11550   SmallVector<Expr*, 8> SubExprs;
11551   SubExprs.reserve(E->getNumSubExprs());
11552   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
11553                                   SubExprs, &ArgumentChanged))
11554     return ExprError();
11555
11556   if (!getDerived().AlwaysRebuild() &&
11557       !ArgumentChanged)
11558     return E;
11559
11560   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
11561                                                SubExprs,
11562                                                E->getRParenLoc());
11563 }
11564
11565 template<typename Derived>
11566 ExprResult
11567 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
11568   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
11569   if (SrcExpr.isInvalid())
11570     return ExprError();
11571
11572   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
11573   if (!Type)
11574     return ExprError();
11575
11576   if (!getDerived().AlwaysRebuild() &&
11577       Type == E->getTypeSourceInfo() &&
11578       SrcExpr.get() == E->getSrcExpr())
11579     return E;
11580
11581   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
11582                                                SrcExpr.get(), Type,
11583                                                E->getRParenLoc());
11584 }
11585
11586 template<typename Derived>
11587 ExprResult
11588 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
11589   BlockDecl *oldBlock = E->getBlockDecl();
11590
11591   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
11592   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
11593
11594   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
11595   blockScope->TheDecl->setBlockMissingReturnType(
11596                          oldBlock->blockMissingReturnType());
11597
11598   SmallVector<ParmVarDecl*, 4> params;
11599   SmallVector<QualType, 4> paramTypes;
11600
11601   const FunctionProtoType *exprFunctionType = E->getFunctionType();
11602
11603   // Parameter substitution.
11604   Sema::ExtParameterInfoBuilder extParamInfos;
11605   if (getDerived().TransformFunctionTypeParams(
11606           E->getCaretLocation(), oldBlock->parameters(), nullptr,
11607           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
11608           extParamInfos)) {
11609     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11610     return ExprError();
11611   }
11612
11613   QualType exprResultType =
11614       getDerived().TransformType(exprFunctionType->getReturnType());
11615
11616   auto epi = exprFunctionType->getExtProtoInfo();
11617   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
11618
11619   QualType functionType =
11620     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
11621   blockScope->FunctionType = functionType;
11622
11623   // Set the parameters on the block decl.
11624   if (!params.empty())
11625     blockScope->TheDecl->setParams(params);
11626
11627   if (!oldBlock->blockMissingReturnType()) {
11628     blockScope->HasImplicitReturnType = false;
11629     blockScope->ReturnType = exprResultType;
11630   }
11631
11632   // Transform the body
11633   StmtResult body = getDerived().TransformStmt(E->getBody());
11634   if (body.isInvalid()) {
11635     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11636     return ExprError();
11637   }
11638
11639 #ifndef NDEBUG
11640   // In builds with assertions, make sure that we captured everything we
11641   // captured before.
11642   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
11643     for (const auto &I : oldBlock->captures()) {
11644       VarDecl *oldCapture = I.getVariable();
11645
11646       // Ignore parameter packs.
11647       if (isa<ParmVarDecl>(oldCapture) &&
11648           cast<ParmVarDecl>(oldCapture)->isParameterPack())
11649         continue;
11650
11651       VarDecl *newCapture =
11652         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
11653                                                  oldCapture));
11654       assert(blockScope->CaptureMap.count(newCapture));
11655     }
11656     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
11657   }
11658 #endif
11659
11660   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
11661                                     /*Scope=*/nullptr);
11662 }
11663
11664 template<typename Derived>
11665 ExprResult
11666 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
11667   llvm_unreachable("Cannot transform asType expressions yet");
11668 }
11669
11670 template<typename Derived>
11671 ExprResult
11672 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
11673   QualType RetTy = getDerived().TransformType(E->getType());
11674   bool ArgumentChanged = false;
11675   SmallVector<Expr*, 8> SubExprs;
11676   SubExprs.reserve(E->getNumSubExprs());
11677   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
11678                                   SubExprs, &ArgumentChanged))
11679     return ExprError();
11680
11681   if (!getDerived().AlwaysRebuild() &&
11682       !ArgumentChanged)
11683     return E;
11684
11685   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
11686                                         RetTy, E->getOp(), E->getRParenLoc());
11687 }
11688
11689 //===----------------------------------------------------------------------===//
11690 // Type reconstruction
11691 //===----------------------------------------------------------------------===//
11692
11693 template<typename Derived>
11694 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
11695                                                     SourceLocation Star) {
11696   return SemaRef.BuildPointerType(PointeeType, Star,
11697                                   getDerived().getBaseEntity());
11698 }
11699
11700 template<typename Derived>
11701 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
11702                                                          SourceLocation Star) {
11703   return SemaRef.BuildBlockPointerType(PointeeType, Star,
11704                                        getDerived().getBaseEntity());
11705 }
11706
11707 template<typename Derived>
11708 QualType
11709 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
11710                                              bool WrittenAsLValue,
11711                                              SourceLocation Sigil) {
11712   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
11713                                     Sigil, getDerived().getBaseEntity());
11714 }
11715
11716 template<typename Derived>
11717 QualType
11718 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
11719                                                  QualType ClassType,
11720                                                  SourceLocation Sigil) {
11721   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
11722                                         getDerived().getBaseEntity());
11723 }
11724
11725 template<typename Derived>
11726 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
11727            const ObjCTypeParamDecl *Decl,
11728            SourceLocation ProtocolLAngleLoc,
11729            ArrayRef<ObjCProtocolDecl *> Protocols,
11730            ArrayRef<SourceLocation> ProtocolLocs,
11731            SourceLocation ProtocolRAngleLoc) {
11732   return SemaRef.BuildObjCTypeParamType(Decl,
11733                                         ProtocolLAngleLoc, Protocols,
11734                                         ProtocolLocs, ProtocolRAngleLoc,
11735                                         /*FailOnError=*/true);
11736 }
11737
11738 template<typename Derived>
11739 QualType TreeTransform<Derived>::RebuildObjCObjectType(
11740            QualType BaseType,
11741            SourceLocation Loc,
11742            SourceLocation TypeArgsLAngleLoc,
11743            ArrayRef<TypeSourceInfo *> TypeArgs,
11744            SourceLocation TypeArgsRAngleLoc,
11745            SourceLocation ProtocolLAngleLoc,
11746            ArrayRef<ObjCProtocolDecl *> Protocols,
11747            ArrayRef<SourceLocation> ProtocolLocs,
11748            SourceLocation ProtocolRAngleLoc) {
11749   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
11750                                      TypeArgs, TypeArgsRAngleLoc,
11751                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
11752                                      ProtocolRAngleLoc,
11753                                      /*FailOnError=*/true);
11754 }
11755
11756 template<typename Derived>
11757 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
11758            QualType PointeeType,
11759            SourceLocation Star) {
11760   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
11761 }
11762
11763 template<typename Derived>
11764 QualType
11765 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
11766                                          ArrayType::ArraySizeModifier SizeMod,
11767                                          const llvm::APInt *Size,
11768                                          Expr *SizeExpr,
11769                                          unsigned IndexTypeQuals,
11770                                          SourceRange BracketsRange) {
11771   if (SizeExpr || !Size)
11772     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
11773                                   IndexTypeQuals, BracketsRange,
11774                                   getDerived().getBaseEntity());
11775
11776   QualType Types[] = {
11777     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
11778     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
11779     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
11780   };
11781   const unsigned NumTypes = llvm::array_lengthof(Types);
11782   QualType SizeType;
11783   for (unsigned I = 0; I != NumTypes; ++I)
11784     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
11785       SizeType = Types[I];
11786       break;
11787     }
11788
11789   // Note that we can return a VariableArrayType here in the case where
11790   // the element type was a dependent VariableArrayType.
11791   IntegerLiteral *ArraySize
11792       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
11793                                /*FIXME*/BracketsRange.getBegin());
11794   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
11795                                 IndexTypeQuals, BracketsRange,
11796                                 getDerived().getBaseEntity());
11797 }
11798
11799 template<typename Derived>
11800 QualType
11801 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
11802                                                  ArrayType::ArraySizeModifier SizeMod,
11803                                                  const llvm::APInt &Size,
11804                                                  unsigned IndexTypeQuals,
11805                                                  SourceRange BracketsRange) {
11806   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
11807                                         IndexTypeQuals, BracketsRange);
11808 }
11809
11810 template<typename Derived>
11811 QualType
11812 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
11813                                           ArrayType::ArraySizeModifier SizeMod,
11814                                                  unsigned IndexTypeQuals,
11815                                                    SourceRange BracketsRange) {
11816   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
11817                                        IndexTypeQuals, BracketsRange);
11818 }
11819
11820 template<typename Derived>
11821 QualType
11822 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
11823                                           ArrayType::ArraySizeModifier SizeMod,
11824                                                  Expr *SizeExpr,
11825                                                  unsigned IndexTypeQuals,
11826                                                  SourceRange BracketsRange) {
11827   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
11828                                        SizeExpr,
11829                                        IndexTypeQuals, BracketsRange);
11830 }
11831
11832 template<typename Derived>
11833 QualType
11834 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
11835                                           ArrayType::ArraySizeModifier SizeMod,
11836                                                        Expr *SizeExpr,
11837                                                        unsigned IndexTypeQuals,
11838                                                    SourceRange BracketsRange) {
11839   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
11840                                        SizeExpr,
11841                                        IndexTypeQuals, BracketsRange);
11842 }
11843
11844 template<typename Derived>
11845 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
11846                                                unsigned NumElements,
11847                                                VectorType::VectorKind VecKind) {
11848   // FIXME: semantic checking!
11849   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
11850 }
11851
11852 template<typename Derived>
11853 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
11854                                                       unsigned NumElements,
11855                                                  SourceLocation AttributeLoc) {
11856   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
11857                           NumElements, true);
11858   IntegerLiteral *VectorSize
11859     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
11860                              AttributeLoc);
11861   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
11862 }
11863
11864 template<typename Derived>
11865 QualType
11866 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
11867                                                            Expr *SizeExpr,
11868                                                   SourceLocation AttributeLoc) {
11869   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
11870 }
11871
11872 template<typename Derived>
11873 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
11874     QualType T,
11875     MutableArrayRef<QualType> ParamTypes,
11876     const FunctionProtoType::ExtProtoInfo &EPI) {
11877   return SemaRef.BuildFunctionType(T, ParamTypes,
11878                                    getDerived().getBaseLocation(),
11879                                    getDerived().getBaseEntity(),
11880                                    EPI);
11881 }
11882
11883 template<typename Derived>
11884 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
11885   return SemaRef.Context.getFunctionNoProtoType(T);
11886 }
11887
11888 template<typename Derived>
11889 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
11890                                                             Decl *D) {
11891   assert(D && "no decl found");
11892   if (D->isInvalidDecl()) return QualType();
11893
11894   // FIXME: Doesn't account for ObjCInterfaceDecl!
11895   TypeDecl *Ty;
11896   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
11897     // A valid resolved using typename pack expansion decl can have multiple
11898     // UsingDecls, but they must each have exactly one type, and it must be
11899     // the same type in every case. But we must have at least one expansion!
11900     if (UPD->expansions().empty()) {
11901       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
11902           << UPD->isCXXClassMember() << UPD;
11903       return QualType();
11904     }
11905
11906     // We might still have some unresolved types. Try to pick a resolved type
11907     // if we can. The final instantiation will check that the remaining
11908     // unresolved types instantiate to the type we pick.
11909     QualType FallbackT;
11910     QualType T;
11911     for (auto *E : UPD->expansions()) {
11912       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
11913       if (ThisT.isNull())
11914         continue;
11915       else if (ThisT->getAs<UnresolvedUsingType>())
11916         FallbackT = ThisT;
11917       else if (T.isNull())
11918         T = ThisT;
11919       else
11920         assert(getSema().Context.hasSameType(ThisT, T) &&
11921                "mismatched resolved types in using pack expansion");
11922     }
11923     return T.isNull() ? FallbackT : T;
11924   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
11925     assert(Using->hasTypename() &&
11926            "UnresolvedUsingTypenameDecl transformed to non-typename using");
11927
11928     // A valid resolved using typename decl points to exactly one type decl.
11929     assert(++Using->shadow_begin() == Using->shadow_end());
11930     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
11931   } else {
11932     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
11933            "UnresolvedUsingTypenameDecl transformed to non-using decl");
11934     Ty = cast<UnresolvedUsingTypenameDecl>(D);
11935   }
11936
11937   return SemaRef.Context.getTypeDeclType(Ty);
11938 }
11939
11940 template<typename Derived>
11941 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
11942                                                        SourceLocation Loc) {
11943   return SemaRef.BuildTypeofExprType(E, Loc);
11944 }
11945
11946 template<typename Derived>
11947 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
11948   return SemaRef.Context.getTypeOfType(Underlying);
11949 }
11950
11951 template<typename Derived>
11952 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
11953                                                      SourceLocation Loc) {
11954   return SemaRef.BuildDecltypeType(E, Loc);
11955 }
11956
11957 template<typename Derived>
11958 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
11959                                             UnaryTransformType::UTTKind UKind,
11960                                             SourceLocation Loc) {
11961   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
11962 }
11963
11964 template<typename Derived>
11965 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
11966                                                       TemplateName Template,
11967                                              SourceLocation TemplateNameLoc,
11968                                      TemplateArgumentListInfo &TemplateArgs) {
11969   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
11970 }
11971
11972 template<typename Derived>
11973 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
11974                                                    SourceLocation KWLoc) {
11975   return SemaRef.BuildAtomicType(ValueType, KWLoc);
11976 }
11977
11978 template<typename Derived>
11979 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
11980                                                  SourceLocation KWLoc,
11981                                                  bool isReadPipe) {
11982   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
11983                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
11984 }
11985
11986 template<typename Derived>
11987 TemplateName
11988 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
11989                                             bool TemplateKW,
11990                                             TemplateDecl *Template) {
11991   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
11992                                                   Template);
11993 }
11994
11995 template<typename Derived>
11996 TemplateName
11997 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
11998                                             const IdentifierInfo &Name,
11999                                             SourceLocation NameLoc,
12000                                             QualType ObjectType,
12001                                             NamedDecl *FirstQualifierInScope) {
12002   UnqualifiedId TemplateName;
12003   TemplateName.setIdentifier(&Name, NameLoc);
12004   Sema::TemplateTy Template;
12005   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12006   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12007                                        SS, TemplateKWLoc, TemplateName,
12008                                        ParsedType::make(ObjectType),
12009                                        /*EnteringContext=*/false,
12010                                        Template);
12011   return Template.get();
12012 }
12013
12014 template<typename Derived>
12015 TemplateName
12016 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12017                                             OverloadedOperatorKind Operator,
12018                                             SourceLocation NameLoc,
12019                                             QualType ObjectType) {
12020   UnqualifiedId Name;
12021   // FIXME: Bogus location information.
12022   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
12023   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
12024   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12025   Sema::TemplateTy Template;
12026   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12027                                        SS, TemplateKWLoc, Name,
12028                                        ParsedType::make(ObjectType),
12029                                        /*EnteringContext=*/false,
12030                                        Template);
12031   return Template.get();
12032 }
12033
12034 template<typename Derived>
12035 ExprResult
12036 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
12037                                                    SourceLocation OpLoc,
12038                                                    Expr *OrigCallee,
12039                                                    Expr *First,
12040                                                    Expr *Second) {
12041   Expr *Callee = OrigCallee->IgnoreParenCasts();
12042   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
12043
12044   if (First->getObjectKind() == OK_ObjCProperty) {
12045     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12046     if (BinaryOperator::isAssignmentOp(Opc))
12047       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
12048                                                  First, Second);
12049     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
12050     if (Result.isInvalid())
12051       return ExprError();
12052     First = Result.get();
12053   }
12054
12055   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
12056     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
12057     if (Result.isInvalid())
12058       return ExprError();
12059     Second = Result.get();
12060   }
12061
12062   // Determine whether this should be a builtin operation.
12063   if (Op == OO_Subscript) {
12064     if (!First->getType()->isOverloadableType() &&
12065         !Second->getType()->isOverloadableType())
12066       return getSema().CreateBuiltinArraySubscriptExpr(First,
12067                                                        Callee->getLocStart(),
12068                                                        Second, OpLoc);
12069   } else if (Op == OO_Arrow) {
12070     // -> is never a builtin operation.
12071     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
12072   } else if (Second == nullptr || isPostIncDec) {
12073     if (!First->getType()->isOverloadableType()) {
12074       // The argument is not of overloadable type, so try to create a
12075       // built-in unary operation.
12076       UnaryOperatorKind Opc
12077         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12078
12079       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
12080     }
12081   } else {
12082     if (!First->getType()->isOverloadableType() &&
12083         !Second->getType()->isOverloadableType()) {
12084       // Neither of the arguments is an overloadable type, so try to
12085       // create a built-in binary operation.
12086       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12087       ExprResult Result
12088         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
12089       if (Result.isInvalid())
12090         return ExprError();
12091
12092       return Result;
12093     }
12094   }
12095
12096   // Compute the transformed set of functions (and function templates) to be
12097   // used during overload resolution.
12098   UnresolvedSet<16> Functions;
12099
12100   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12101     assert(ULE->requiresADL());
12102     Functions.append(ULE->decls_begin(), ULE->decls_end());
12103   } else {
12104     // If we've resolved this to a particular non-member function, just call
12105     // that function. If we resolved it to a member function,
12106     // CreateOverloaded* will find that function for us.
12107     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
12108     if (!isa<CXXMethodDecl>(ND))
12109       Functions.addDecl(ND);
12110   }
12111
12112   // Add any functions found via argument-dependent lookup.
12113   Expr *Args[2] = { First, Second };
12114   unsigned NumArgs = 1 + (Second != nullptr);
12115
12116   // Create the overloaded operator invocation for unary operators.
12117   if (NumArgs == 1 || isPostIncDec) {
12118     UnaryOperatorKind Opc
12119       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12120     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
12121   }
12122
12123   if (Op == OO_Subscript) {
12124     SourceLocation LBrace;
12125     SourceLocation RBrace;
12126
12127     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
12128         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
12129         LBrace = SourceLocation::getFromRawEncoding(
12130                     NameLoc.CXXOperatorName.BeginOpNameLoc);
12131         RBrace = SourceLocation::getFromRawEncoding(
12132                     NameLoc.CXXOperatorName.EndOpNameLoc);
12133     } else {
12134         LBrace = Callee->getLocStart();
12135         RBrace = OpLoc;
12136     }
12137
12138     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
12139                                                       First, Second);
12140   }
12141
12142   // Create the overloaded operator invocation for binary operators.
12143   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12144   ExprResult Result
12145     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
12146   if (Result.isInvalid())
12147     return ExprError();
12148
12149   return Result;
12150 }
12151
12152 template<typename Derived>
12153 ExprResult
12154 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
12155                                                      SourceLocation OperatorLoc,
12156                                                        bool isArrow,
12157                                                        CXXScopeSpec &SS,
12158                                                      TypeSourceInfo *ScopeType,
12159                                                        SourceLocation CCLoc,
12160                                                        SourceLocation TildeLoc,
12161                                         PseudoDestructorTypeStorage Destroyed) {
12162   QualType BaseType = Base->getType();
12163   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
12164       (!isArrow && !BaseType->getAs<RecordType>()) ||
12165       (isArrow && BaseType->getAs<PointerType>() &&
12166        !BaseType->getAs<PointerType>()->getPointeeType()
12167                                               ->template getAs<RecordType>())){
12168     // This pseudo-destructor expression is still a pseudo-destructor.
12169     return SemaRef.BuildPseudoDestructorExpr(
12170         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
12171         CCLoc, TildeLoc, Destroyed);
12172   }
12173
12174   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
12175   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
12176                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
12177   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
12178   NameInfo.setNamedTypeInfo(DestroyedType);
12179
12180   // The scope type is now known to be a valid nested name specifier
12181   // component. Tack it on to the end of the nested name specifier.
12182   if (ScopeType) {
12183     if (!ScopeType->getType()->getAs<TagType>()) {
12184       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
12185                      diag::err_expected_class_or_namespace)
12186           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
12187       return ExprError();
12188     }
12189     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
12190               CCLoc);
12191   }
12192
12193   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12194   return getSema().BuildMemberReferenceExpr(Base, BaseType,
12195                                             OperatorLoc, isArrow,
12196                                             SS, TemplateKWLoc,
12197                                             /*FIXME: FirstQualifier*/ nullptr,
12198                                             NameInfo,
12199                                             /*TemplateArgs*/ nullptr,
12200                                             /*S*/nullptr);
12201 }
12202
12203 template<typename Derived>
12204 StmtResult
12205 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
12206   SourceLocation Loc = S->getLocStart();
12207   CapturedDecl *CD = S->getCapturedDecl();
12208   unsigned NumParams = CD->getNumParams();
12209   unsigned ContextParamPos = CD->getContextParamPosition();
12210   SmallVector<Sema::CapturedParamNameType, 4> Params;
12211   for (unsigned I = 0; I < NumParams; ++I) {
12212     if (I != ContextParamPos) {
12213       Params.push_back(
12214              std::make_pair(
12215                   CD->getParam(I)->getName(),
12216                   getDerived().TransformType(CD->getParam(I)->getType())));
12217     } else {
12218       Params.push_back(std::make_pair(StringRef(), QualType()));
12219     }
12220   }
12221   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
12222                                      S->getCapturedRegionKind(), Params);
12223   StmtResult Body;
12224   {
12225     Sema::CompoundScopeRAII CompoundScope(getSema());
12226     Body = getDerived().TransformStmt(S->getCapturedStmt());
12227   }
12228
12229   if (Body.isInvalid()) {
12230     getSema().ActOnCapturedRegionError();
12231     return StmtError();
12232   }
12233
12234   return getSema().ActOnCapturedRegionEnd(Body.get());
12235 }
12236
12237 } // end namespace clang
12238
12239 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H