]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Sema/TreeTransform.h
Merge ^/head r285924 through r286421.
[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/Stmt.h"
25 #include "clang/AST/StmtCXX.h"
26 #include "clang/AST/StmtObjC.h"
27 #include "clang/AST/StmtOpenMP.h"
28 #include "clang/Sema/Designator.h"
29 #include "clang/Sema/Lookup.h"
30 #include "clang/Sema/Ownership.h"
31 #include "clang/Sema/ParsedTemplate.h"
32 #include "clang/Sema/ScopeInfo.h"
33 #include "clang/Sema/SemaDiagnostic.h"
34 #include "clang/Sema/SemaInternal.h"
35 #include "llvm/ADT/ArrayRef.h"
36 #include "llvm/Support/ErrorHandling.h"
37 #include <algorithm>
38
39 namespace clang {
40 using namespace sema;
41
42 /// \brief A semantic tree transformation that allows one to transform one
43 /// abstract syntax tree into another.
44 ///
45 /// A new tree transformation is defined by creating a new subclass \c X of
46 /// \c TreeTransform<X> and then overriding certain operations to provide
47 /// behavior specific to that transformation. For example, template
48 /// instantiation is implemented as a tree transformation where the
49 /// transformation of TemplateTypeParmType nodes involves substituting the
50 /// template arguments for their corresponding template parameters; a similar
51 /// transformation is performed for non-type template parameters and
52 /// template template parameters.
53 ///
54 /// This tree-transformation template uses static polymorphism to allow
55 /// subclasses to customize any of its operations. Thus, a subclass can
56 /// override any of the transformation or rebuild operators by providing an
57 /// operation with the same signature as the default implementation. The
58 /// overridding function should not be virtual.
59 ///
60 /// Semantic tree transformations are split into two stages, either of which
61 /// can be replaced by a subclass. The "transform" step transforms an AST node
62 /// or the parts of an AST node using the various transformation functions,
63 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
64 /// node of the appropriate kind from the pieces. The default transformation
65 /// routines recursively transform the operands to composite AST nodes (e.g.,
66 /// the pointee type of a PointerType node) and, if any of those operand nodes
67 /// were changed by the transformation, invokes the rebuild operation to create
68 /// a new AST node.
69 ///
70 /// Subclasses can customize the transformation at various levels. The
71 /// most coarse-grained transformations involve replacing TransformType(),
72 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
73 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
74 /// new implementations.
75 ///
76 /// For more fine-grained transformations, subclasses can replace any of the
77 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
78 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
79 /// replacing TransformTemplateTypeParmType() allows template instantiation
80 /// to substitute template arguments for their corresponding template
81 /// parameters. Additionally, subclasses can override the \c RebuildXXX
82 /// functions to control how AST nodes are rebuilt when their operands change.
83 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
84 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
85 /// be able to use more efficient rebuild steps.
86 ///
87 /// There are a handful of other functions that can be overridden, allowing one
88 /// to avoid traversing nodes that don't need any transformation
89 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
90 /// operands have not changed (\c AlwaysRebuild()), and customize the
91 /// default locations and entity names used for type-checking
92 /// (\c getBaseLocation(), \c getBaseEntity()).
93 template<typename Derived>
94 class TreeTransform {
95   /// \brief Private RAII object that helps us forget and then re-remember
96   /// the template argument corresponding to a partially-substituted parameter
97   /// pack.
98   class ForgetPartiallySubstitutedPackRAII {
99     Derived &Self;
100     TemplateArgument Old;
101
102   public:
103     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
104       Old = Self.ForgetPartiallySubstitutedPack();
105     }
106
107     ~ForgetPartiallySubstitutedPackRAII() {
108       Self.RememberPartiallySubstitutedPack(Old);
109     }
110   };
111
112 protected:
113   Sema &SemaRef;
114
115   /// \brief The set of local declarations that have been transformed, for
116   /// cases where we are forced to build new declarations within the transformer
117   /// rather than in the subclass (e.g., lambda closure types).
118   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
119
120 public:
121   /// \brief Initializes a new tree transformer.
122   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
123
124   /// \brief Retrieves a reference to the derived class.
125   Derived &getDerived() { return static_cast<Derived&>(*this); }
126
127   /// \brief Retrieves a reference to the derived class.
128   const Derived &getDerived() const {
129     return static_cast<const Derived&>(*this);
130   }
131
132   static inline ExprResult Owned(Expr *E) { return E; }
133   static inline StmtResult Owned(Stmt *S) { return S; }
134
135   /// \brief Retrieves a reference to the semantic analysis object used for
136   /// this tree transform.
137   Sema &getSema() const { return SemaRef; }
138
139   /// \brief Whether the transformation should always rebuild AST nodes, even
140   /// if none of the children have changed.
141   ///
142   /// Subclasses may override this function to specify when the transformation
143   /// should rebuild all AST nodes.
144   ///
145   /// We must always rebuild all AST nodes when performing variadic template
146   /// pack expansion, in order to avoid violating the AST invariant that each
147   /// statement node appears at most once in its containing declaration.
148   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
149
150   /// \brief Returns the location of the entity being transformed, if that
151   /// information was not available elsewhere in the AST.
152   ///
153   /// By default, returns no source-location information. Subclasses can
154   /// provide an alternative implementation that provides better location
155   /// information.
156   SourceLocation getBaseLocation() { return SourceLocation(); }
157
158   /// \brief Returns the name of the entity being transformed, if that
159   /// information was not available elsewhere in the AST.
160   ///
161   /// By default, returns an empty name. Subclasses can provide an alternative
162   /// implementation with a more precise name.
163   DeclarationName getBaseEntity() { return DeclarationName(); }
164
165   /// \brief Sets the "base" location and entity when that
166   /// information is known based on another transformation.
167   ///
168   /// By default, the source location and entity are ignored. Subclasses can
169   /// override this function to provide a customized implementation.
170   void setBase(SourceLocation Loc, DeclarationName Entity) { }
171
172   /// \brief RAII object that temporarily sets the base location and entity
173   /// used for reporting diagnostics in types.
174   class TemporaryBase {
175     TreeTransform &Self;
176     SourceLocation OldLocation;
177     DeclarationName OldEntity;
178
179   public:
180     TemporaryBase(TreeTransform &Self, SourceLocation Location,
181                   DeclarationName Entity) : Self(Self) {
182       OldLocation = Self.getDerived().getBaseLocation();
183       OldEntity = Self.getDerived().getBaseEntity();
184
185       if (Location.isValid())
186         Self.getDerived().setBase(Location, Entity);
187     }
188
189     ~TemporaryBase() {
190       Self.getDerived().setBase(OldLocation, OldEntity);
191     }
192   };
193
194   /// \brief Determine whether the given type \p T has already been
195   /// transformed.
196   ///
197   /// Subclasses can provide an alternative implementation of this routine
198   /// to short-circuit evaluation when it is known that a given type will
199   /// not change. For example, template instantiation need not traverse
200   /// non-dependent types.
201   bool AlreadyTransformed(QualType T) {
202     return T.isNull();
203   }
204
205   /// \brief Determine whether the given call argument should be dropped, e.g.,
206   /// because it is a default argument.
207   ///
208   /// Subclasses can provide an alternative implementation of this routine to
209   /// determine which kinds of call arguments get dropped. By default,
210   /// CXXDefaultArgument nodes are dropped (prior to transformation).
211   bool DropCallArgument(Expr *E) {
212     return E->isDefaultArgument();
213   }
214
215   /// \brief Determine whether we should expand a pack expansion with the
216   /// given set of parameter packs into separate arguments by repeatedly
217   /// transforming the pattern.
218   ///
219   /// By default, the transformer never tries to expand pack expansions.
220   /// Subclasses can override this routine to provide different behavior.
221   ///
222   /// \param EllipsisLoc The location of the ellipsis that identifies the
223   /// pack expansion.
224   ///
225   /// \param PatternRange The source range that covers the entire pattern of
226   /// the pack expansion.
227   ///
228   /// \param Unexpanded The set of unexpanded parameter packs within the
229   /// pattern.
230   ///
231   /// \param ShouldExpand Will be set to \c true if the transformer should
232   /// expand the corresponding pack expansions into separate arguments. When
233   /// set, \c NumExpansions must also be set.
234   ///
235   /// \param RetainExpansion Whether the caller should add an unexpanded
236   /// pack expansion after all of the expanded arguments. This is used
237   /// when extending explicitly-specified template argument packs per
238   /// C++0x [temp.arg.explicit]p9.
239   ///
240   /// \param NumExpansions The number of separate arguments that will be in
241   /// the expanded form of the corresponding pack expansion. This is both an
242   /// input and an output parameter, which can be set by the caller if the
243   /// number of expansions is known a priori (e.g., due to a prior substitution)
244   /// and will be set by the callee when the number of expansions is known.
245   /// The callee must set this value when \c ShouldExpand is \c true; it may
246   /// set this value in other cases.
247   ///
248   /// \returns true if an error occurred (e.g., because the parameter packs
249   /// are to be instantiated with arguments of different lengths), false
250   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
251   /// must be set.
252   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
253                                SourceRange PatternRange,
254                                ArrayRef<UnexpandedParameterPack> Unexpanded,
255                                bool &ShouldExpand,
256                                bool &RetainExpansion,
257                                Optional<unsigned> &NumExpansions) {
258     ShouldExpand = false;
259     return false;
260   }
261
262   /// \brief "Forget" about the partially-substituted pack template argument,
263   /// when performing an instantiation that must preserve the parameter pack
264   /// use.
265   ///
266   /// This routine is meant to be overridden by the template instantiator.
267   TemplateArgument ForgetPartiallySubstitutedPack() {
268     return TemplateArgument();
269   }
270
271   /// \brief "Remember" the partially-substituted pack template argument
272   /// after performing an instantiation that must preserve the parameter pack
273   /// use.
274   ///
275   /// This routine is meant to be overridden by the template instantiator.
276   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
277
278   /// \brief Note to the derived class when a function parameter pack is
279   /// being expanded.
280   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
281
282   /// \brief Transforms the given type into another type.
283   ///
284   /// By default, this routine transforms a type by creating a
285   /// TypeSourceInfo for it and delegating to the appropriate
286   /// function.  This is expensive, but we don't mind, because
287   /// this method is deprecated anyway;  all users should be
288   /// switched to storing TypeSourceInfos.
289   ///
290   /// \returns the transformed type.
291   QualType TransformType(QualType T);
292
293   /// \brief Transforms the given type-with-location into a new
294   /// type-with-location.
295   ///
296   /// By default, this routine transforms a type by delegating to the
297   /// appropriate TransformXXXType to build a new type.  Subclasses
298   /// may override this function (to take over all type
299   /// transformations) or some set of the TransformXXXType functions
300   /// to alter the transformation.
301   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
302
303   /// \brief Transform the given type-with-location into a new
304   /// type, collecting location information in the given builder
305   /// as necessary.
306   ///
307   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
308
309   /// \brief Transform the given statement.
310   ///
311   /// By default, this routine transforms a statement by delegating to the
312   /// appropriate TransformXXXStmt function to transform a specific kind of
313   /// statement or the TransformExpr() function to transform an expression.
314   /// Subclasses may override this function to transform statements using some
315   /// other mechanism.
316   ///
317   /// \returns the transformed statement.
318   StmtResult TransformStmt(Stmt *S);
319
320   /// \brief Transform the given statement.
321   ///
322   /// By default, this routine transforms a statement by delegating to the
323   /// appropriate TransformOMPXXXClause function to transform a specific kind
324   /// of clause. Subclasses may override this function to transform statements
325   /// using some other mechanism.
326   ///
327   /// \returns the transformed OpenMP clause.
328   OMPClause *TransformOMPClause(OMPClause *S);
329
330   /// \brief Transform the given attribute.
331   ///
332   /// By default, this routine transforms a statement by delegating to the
333   /// appropriate TransformXXXAttr function to transform a specific kind
334   /// of attribute. Subclasses may override this function to transform
335   /// attributed statements using some other mechanism.
336   ///
337   /// \returns the transformed attribute
338   const Attr *TransformAttr(const Attr *S);
339
340 /// \brief Transform the specified attribute.
341 ///
342 /// Subclasses should override the transformation of attributes with a pragma
343 /// spelling to transform expressions stored within the attribute.
344 ///
345 /// \returns the transformed attribute.
346 #define ATTR(X)
347 #define PRAGMA_SPELLING_ATTR(X)                                                \
348   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
349 #include "clang/Basic/AttrList.inc"
350
351   /// \brief Transform the given expression.
352   ///
353   /// By default, this routine transforms an expression by delegating to the
354   /// appropriate TransformXXXExpr function to build a new expression.
355   /// Subclasses may override this function to transform expressions using some
356   /// other mechanism.
357   ///
358   /// \returns the transformed expression.
359   ExprResult TransformExpr(Expr *E);
360
361   /// \brief Transform the given initializer.
362   ///
363   /// By default, this routine transforms an initializer by stripping off the
364   /// semantic nodes added by initialization, then passing the result to
365   /// TransformExpr or TransformExprs.
366   ///
367   /// \returns the transformed initializer.
368   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
369
370   /// \brief Transform the given list of expressions.
371   ///
372   /// This routine transforms a list of expressions by invoking
373   /// \c TransformExpr() for each subexpression. However, it also provides
374   /// support for variadic templates by expanding any pack expansions (if the
375   /// derived class permits such expansion) along the way. When pack expansions
376   /// are present, the number of outputs may not equal the number of inputs.
377   ///
378   /// \param Inputs The set of expressions to be transformed.
379   ///
380   /// \param NumInputs The number of expressions in \c Inputs.
381   ///
382   /// \param IsCall If \c true, then this transform is being performed on
383   /// function-call arguments, and any arguments that should be dropped, will
384   /// be.
385   ///
386   /// \param Outputs The transformed input expressions will be added to this
387   /// vector.
388   ///
389   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
390   /// due to transformation.
391   ///
392   /// \returns true if an error occurred, false otherwise.
393   bool TransformExprs(Expr **Inputs, unsigned NumInputs, bool IsCall,
394                       SmallVectorImpl<Expr *> &Outputs,
395                       bool *ArgChanged = nullptr);
396
397   /// \brief Transform the given declaration, which is referenced from a type
398   /// or expression.
399   ///
400   /// By default, acts as the identity function on declarations, unless the
401   /// transformer has had to transform the declaration itself. Subclasses
402   /// may override this function to provide alternate behavior.
403   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
404     llvm::DenseMap<Decl *, Decl *>::iterator Known
405       = TransformedLocalDecls.find(D);
406     if (Known != TransformedLocalDecls.end())
407       return Known->second;
408
409     return D;
410   }
411
412   /// \brief Transform the attributes associated with the given declaration and
413   /// place them on the new declaration.
414   ///
415   /// By default, this operation does nothing. Subclasses may override this
416   /// behavior to transform attributes.
417   void transformAttrs(Decl *Old, Decl *New) { }
418
419   /// \brief Note that a local declaration has been transformed by this
420   /// transformer.
421   ///
422   /// Local declarations are typically transformed via a call to
423   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
424   /// the transformer itself has to transform the declarations. This routine
425   /// can be overridden by a subclass that keeps track of such mappings.
426   void transformedLocalDecl(Decl *Old, Decl *New) {
427     TransformedLocalDecls[Old] = New;
428   }
429
430   /// \brief Transform the definition of the given declaration.
431   ///
432   /// By default, invokes TransformDecl() to transform the declaration.
433   /// Subclasses may override this function to provide alternate behavior.
434   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
435     return getDerived().TransformDecl(Loc, D);
436   }
437
438   /// \brief Transform the given declaration, which was the first part of a
439   /// nested-name-specifier in a member access expression.
440   ///
441   /// This specific declaration transformation only applies to the first
442   /// identifier in a nested-name-specifier of a member access expression, e.g.,
443   /// the \c T in \c x->T::member
444   ///
445   /// By default, invokes TransformDecl() to transform the declaration.
446   /// Subclasses may override this function to provide alternate behavior.
447   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
448     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
449   }
450
451   /// \brief Transform the given nested-name-specifier with source-location
452   /// information.
453   ///
454   /// By default, transforms all of the types and declarations within the
455   /// nested-name-specifier. Subclasses may override this function to provide
456   /// alternate behavior.
457   NestedNameSpecifierLoc
458   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
459                                   QualType ObjectType = QualType(),
460                                   NamedDecl *FirstQualifierInScope = nullptr);
461
462   /// \brief Transform the given declaration name.
463   ///
464   /// By default, transforms the types of conversion function, constructor,
465   /// and destructor names and then (if needed) rebuilds the declaration name.
466   /// Identifiers and selectors are returned unmodified. Sublcasses may
467   /// override this function to provide alternate behavior.
468   DeclarationNameInfo
469   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
470
471   /// \brief Transform the given template name.
472   ///
473   /// \param SS The nested-name-specifier that qualifies the template
474   /// name. This nested-name-specifier must already have been transformed.
475   ///
476   /// \param Name The template name to transform.
477   ///
478   /// \param NameLoc The source location of the template name.
479   ///
480   /// \param ObjectType If we're translating a template name within a member
481   /// access expression, this is the type of the object whose member template
482   /// is being referenced.
483   ///
484   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
485   /// also refers to a name within the current (lexical) scope, this is the
486   /// declaration it refers to.
487   ///
488   /// By default, transforms the template name by transforming the declarations
489   /// and nested-name-specifiers that occur within the template name.
490   /// Subclasses may override this function to provide alternate behavior.
491   TemplateName
492   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
493                         SourceLocation NameLoc,
494                         QualType ObjectType = QualType(),
495                         NamedDecl *FirstQualifierInScope = nullptr);
496
497   /// \brief Transform the given template argument.
498   ///
499   /// By default, this operation transforms the type, expression, or
500   /// declaration stored within the template argument and constructs a
501   /// new template argument from the transformed result. Subclasses may
502   /// override this function to provide alternate behavior.
503   ///
504   /// Returns true if there was an error.
505   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
506                                  TemplateArgumentLoc &Output);
507
508   /// \brief Transform the given set of template arguments.
509   ///
510   /// By default, this operation transforms all of the template arguments
511   /// in the input set using \c TransformTemplateArgument(), and appends
512   /// the transformed arguments to the output list.
513   ///
514   /// Note that this overload of \c TransformTemplateArguments() is merely
515   /// a convenience function. Subclasses that wish to override this behavior
516   /// should override the iterator-based member template version.
517   ///
518   /// \param Inputs The set of template arguments to be transformed.
519   ///
520   /// \param NumInputs The number of template arguments in \p Inputs.
521   ///
522   /// \param Outputs The set of transformed template arguments output by this
523   /// routine.
524   ///
525   /// Returns true if an error occurred.
526   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
527                                   unsigned NumInputs,
528                                   TemplateArgumentListInfo &Outputs) {
529     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs);
530   }
531
532   /// \brief Transform the given set of template arguments.
533   ///
534   /// By default, this operation transforms all of the template arguments
535   /// in the input set using \c TransformTemplateArgument(), and appends
536   /// the transformed arguments to the output list.
537   ///
538   /// \param First An iterator to the first template argument.
539   ///
540   /// \param Last An iterator one step past the last template argument.
541   ///
542   /// \param Outputs The set of transformed template arguments output by this
543   /// routine.
544   ///
545   /// Returns true if an error occurred.
546   template<typename InputIterator>
547   bool TransformTemplateArguments(InputIterator First,
548                                   InputIterator Last,
549                                   TemplateArgumentListInfo &Outputs);
550
551   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
552   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
553                                  TemplateArgumentLoc &ArgLoc);
554
555   /// \brief Fakes up a TypeSourceInfo for a type.
556   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
557     return SemaRef.Context.getTrivialTypeSourceInfo(T,
558                        getDerived().getBaseLocation());
559   }
560
561 #define ABSTRACT_TYPELOC(CLASS, PARENT)
562 #define TYPELOC(CLASS, PARENT)                                   \
563   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
564 #include "clang/AST/TypeLocNodes.def"
565
566   template<typename Fn>
567   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
568                                       FunctionProtoTypeLoc TL,
569                                       CXXRecordDecl *ThisContext,
570                                       unsigned ThisTypeQuals,
571                                       Fn TransformExceptionSpec);
572
573   bool TransformExceptionSpec(SourceLocation Loc,
574                               FunctionProtoType::ExceptionSpecInfo &ESI,
575                               SmallVectorImpl<QualType> &Exceptions,
576                               bool &Changed);
577
578   StmtResult TransformSEHHandler(Stmt *Handler);
579
580   QualType
581   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
582                                       TemplateSpecializationTypeLoc TL,
583                                       TemplateName Template);
584
585   QualType
586   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
587                                       DependentTemplateSpecializationTypeLoc TL,
588                                                TemplateName Template,
589                                                CXXScopeSpec &SS);
590
591   QualType TransformDependentTemplateSpecializationType(
592       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
593       NestedNameSpecifierLoc QualifierLoc);
594
595   /// \brief Transforms the parameters of a function type into the
596   /// given vectors.
597   ///
598   /// The result vectors should be kept in sync; null entries in the
599   /// variables vector are acceptable.
600   ///
601   /// Return true on error.
602   bool TransformFunctionTypeParams(SourceLocation Loc,
603                                    ParmVarDecl **Params, unsigned NumParams,
604                                    const QualType *ParamTypes,
605                                    SmallVectorImpl<QualType> &PTypes,
606                                    SmallVectorImpl<ParmVarDecl*> *PVars);
607
608   /// \brief Transforms a single function-type parameter.  Return null
609   /// on error.
610   ///
611   /// \param indexAdjustment - A number to add to the parameter's
612   ///   scope index;  can be negative
613   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
614                                           int indexAdjustment,
615                                           Optional<unsigned> NumExpansions,
616                                           bool ExpectParameterPack);
617
618   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
619
620   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
621   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
622
623   TemplateParameterList *TransformTemplateParameterList(
624         TemplateParameterList *TPL) {
625     return TPL;
626   }
627
628   ExprResult TransformAddressOfOperand(Expr *E);
629
630   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
631                                                 bool IsAddressOfOperand,
632                                                 TypeSourceInfo **RecoveryTSI);
633
634   ExprResult TransformParenDependentScopeDeclRefExpr(
635       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
636       TypeSourceInfo **RecoveryTSI);
637
638   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
639
640 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
641 // amount of stack usage with clang.
642 #define STMT(Node, Parent)                        \
643   LLVM_ATTRIBUTE_NOINLINE \
644   StmtResult Transform##Node(Node *S);
645 #define EXPR(Node, Parent)                        \
646   LLVM_ATTRIBUTE_NOINLINE \
647   ExprResult Transform##Node(Node *E);
648 #define ABSTRACT_STMT(Stmt)
649 #include "clang/AST/StmtNodes.inc"
650
651 #define OPENMP_CLAUSE(Name, Class)                        \
652   LLVM_ATTRIBUTE_NOINLINE \
653   OMPClause *Transform ## Class(Class *S);
654 #include "clang/Basic/OpenMPKinds.def"
655
656   /// \brief Build a new pointer type given its pointee type.
657   ///
658   /// By default, performs semantic analysis when building the pointer type.
659   /// Subclasses may override this routine to provide different behavior.
660   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
661
662   /// \brief Build a new block pointer type given its pointee type.
663   ///
664   /// By default, performs semantic analysis when building the block pointer
665   /// type. Subclasses may override this routine to provide different behavior.
666   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
667
668   /// \brief Build a new reference type given the type it references.
669   ///
670   /// By default, performs semantic analysis when building the
671   /// reference type. Subclasses may override this routine to provide
672   /// different behavior.
673   ///
674   /// \param LValue whether the type was written with an lvalue sigil
675   /// or an rvalue sigil.
676   QualType RebuildReferenceType(QualType ReferentType,
677                                 bool LValue,
678                                 SourceLocation Sigil);
679
680   /// \brief Build a new member pointer type given the pointee type and the
681   /// class type it refers into.
682   ///
683   /// By default, performs semantic analysis when building the member pointer
684   /// type. Subclasses may override this routine to provide different behavior.
685   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
686                                     SourceLocation Sigil);
687
688   /// \brief Build a new array type given the element type, size
689   /// modifier, size of the array (if known), size expression, and index type
690   /// qualifiers.
691   ///
692   /// By default, performs semantic analysis when building the array type.
693   /// Subclasses may override this routine to provide different behavior.
694   /// Also by default, all of the other Rebuild*Array
695   QualType RebuildArrayType(QualType ElementType,
696                             ArrayType::ArraySizeModifier SizeMod,
697                             const llvm::APInt *Size,
698                             Expr *SizeExpr,
699                             unsigned IndexTypeQuals,
700                             SourceRange BracketsRange);
701
702   /// \brief Build a new constant array type given the element type, size
703   /// modifier, (known) size of the array, and index type qualifiers.
704   ///
705   /// By default, performs semantic analysis when building the array type.
706   /// Subclasses may override this routine to provide different behavior.
707   QualType RebuildConstantArrayType(QualType ElementType,
708                                     ArrayType::ArraySizeModifier SizeMod,
709                                     const llvm::APInt &Size,
710                                     unsigned IndexTypeQuals,
711                                     SourceRange BracketsRange);
712
713   /// \brief Build a new incomplete array type given the element type, size
714   /// modifier, and index type qualifiers.
715   ///
716   /// By default, performs semantic analysis when building the array type.
717   /// Subclasses may override this routine to provide different behavior.
718   QualType RebuildIncompleteArrayType(QualType ElementType,
719                                       ArrayType::ArraySizeModifier SizeMod,
720                                       unsigned IndexTypeQuals,
721                                       SourceRange BracketsRange);
722
723   /// \brief Build a new variable-length array type given the element type,
724   /// size modifier, size expression, and index type qualifiers.
725   ///
726   /// By default, performs semantic analysis when building the array type.
727   /// Subclasses may override this routine to provide different behavior.
728   QualType RebuildVariableArrayType(QualType ElementType,
729                                     ArrayType::ArraySizeModifier SizeMod,
730                                     Expr *SizeExpr,
731                                     unsigned IndexTypeQuals,
732                                     SourceRange BracketsRange);
733
734   /// \brief Build a new dependent-sized array type given the element type,
735   /// size modifier, size expression, and index type qualifiers.
736   ///
737   /// By default, performs semantic analysis when building the array type.
738   /// Subclasses may override this routine to provide different behavior.
739   QualType RebuildDependentSizedArrayType(QualType ElementType,
740                                           ArrayType::ArraySizeModifier SizeMod,
741                                           Expr *SizeExpr,
742                                           unsigned IndexTypeQuals,
743                                           SourceRange BracketsRange);
744
745   /// \brief Build a new vector type given the element type and
746   /// number of elements.
747   ///
748   /// By default, performs semantic analysis when building the vector type.
749   /// Subclasses may override this routine to provide different behavior.
750   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
751                              VectorType::VectorKind VecKind);
752
753   /// \brief Build a new extended vector type given the element type and
754   /// number of elements.
755   ///
756   /// By default, performs semantic analysis when building the vector type.
757   /// Subclasses may override this routine to provide different behavior.
758   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
759                                 SourceLocation AttributeLoc);
760
761   /// \brief Build a new potentially dependently-sized extended vector type
762   /// given the element type and number of elements.
763   ///
764   /// By default, performs semantic analysis when building the vector type.
765   /// Subclasses may override this routine to provide different behavior.
766   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
767                                               Expr *SizeExpr,
768                                               SourceLocation AttributeLoc);
769
770   /// \brief Build a new function type.
771   ///
772   /// By default, performs semantic analysis when building the function type.
773   /// Subclasses may override this routine to provide different behavior.
774   QualType RebuildFunctionProtoType(QualType T,
775                                     MutableArrayRef<QualType> ParamTypes,
776                                     const FunctionProtoType::ExtProtoInfo &EPI);
777
778   /// \brief Build a new unprototyped function type.
779   QualType RebuildFunctionNoProtoType(QualType ResultType);
780
781   /// \brief Rebuild an unresolved typename type, given the decl that
782   /// the UnresolvedUsingTypenameDecl was transformed to.
783   QualType RebuildUnresolvedUsingType(Decl *D);
784
785   /// \brief Build a new typedef type.
786   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
787     return SemaRef.Context.getTypeDeclType(Typedef);
788   }
789
790   /// \brief Build a new class/struct/union type.
791   QualType RebuildRecordType(RecordDecl *Record) {
792     return SemaRef.Context.getTypeDeclType(Record);
793   }
794
795   /// \brief Build a new Enum type.
796   QualType RebuildEnumType(EnumDecl *Enum) {
797     return SemaRef.Context.getTypeDeclType(Enum);
798   }
799
800   /// \brief Build a new typeof(expr) type.
801   ///
802   /// By default, performs semantic analysis when building the typeof type.
803   /// Subclasses may override this routine to provide different behavior.
804   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
805
806   /// \brief Build a new typeof(type) type.
807   ///
808   /// By default, builds a new TypeOfType with the given underlying type.
809   QualType RebuildTypeOfType(QualType Underlying);
810
811   /// \brief Build a new unary transform type.
812   QualType RebuildUnaryTransformType(QualType BaseType,
813                                      UnaryTransformType::UTTKind UKind,
814                                      SourceLocation Loc);
815
816   /// \brief Build a new C++11 decltype type.
817   ///
818   /// By default, performs semantic analysis when building the decltype type.
819   /// Subclasses may override this routine to provide different behavior.
820   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
821
822   /// \brief Build a new C++11 auto type.
823   ///
824   /// By default, builds a new AutoType with the given deduced type.
825   QualType RebuildAutoType(QualType Deduced, bool IsDecltypeAuto) {
826     // Note, IsDependent is always false here: we implicitly convert an 'auto'
827     // which has been deduced to a dependent type into an undeduced 'auto', so
828     // that we'll retry deduction after the transformation.
829     return SemaRef.Context.getAutoType(Deduced, IsDecltypeAuto, 
830                                        /*IsDependent*/ false);
831   }
832
833   /// \brief Build a new template specialization type.
834   ///
835   /// By default, performs semantic analysis when building the template
836   /// specialization type. Subclasses may override this routine to provide
837   /// different behavior.
838   QualType RebuildTemplateSpecializationType(TemplateName Template,
839                                              SourceLocation TemplateLoc,
840                                              TemplateArgumentListInfo &Args);
841
842   /// \brief Build a new parenthesized type.
843   ///
844   /// By default, builds a new ParenType type from the inner type.
845   /// Subclasses may override this routine to provide different behavior.
846   QualType RebuildParenType(QualType InnerType) {
847     return SemaRef.Context.getParenType(InnerType);
848   }
849
850   /// \brief Build a new qualified name type.
851   ///
852   /// By default, builds a new ElaboratedType type from the keyword,
853   /// the nested-name-specifier and the named type.
854   /// Subclasses may override this routine to provide different behavior.
855   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
856                                  ElaboratedTypeKeyword Keyword,
857                                  NestedNameSpecifierLoc QualifierLoc,
858                                  QualType Named) {
859     return SemaRef.Context.getElaboratedType(Keyword,
860                                          QualifierLoc.getNestedNameSpecifier(),
861                                              Named);
862   }
863
864   /// \brief Build a new typename type that refers to a template-id.
865   ///
866   /// By default, builds a new DependentNameType type from the
867   /// nested-name-specifier and the given type. Subclasses may override
868   /// this routine to provide different behavior.
869   QualType RebuildDependentTemplateSpecializationType(
870                                           ElaboratedTypeKeyword Keyword,
871                                           NestedNameSpecifierLoc QualifierLoc,
872                                           const IdentifierInfo *Name,
873                                           SourceLocation NameLoc,
874                                           TemplateArgumentListInfo &Args) {
875     // Rebuild the template name.
876     // TODO: avoid TemplateName abstraction
877     CXXScopeSpec SS;
878     SS.Adopt(QualifierLoc);
879     TemplateName InstName
880       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(),
881                                          nullptr);
882
883     if (InstName.isNull())
884       return QualType();
885
886     // If it's still dependent, make a dependent specialization.
887     if (InstName.getAsDependentTemplateName())
888       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
889                                           QualifierLoc.getNestedNameSpecifier(),
890                                                                     Name,
891                                                                     Args);
892
893     // Otherwise, make an elaborated type wrapping a non-dependent
894     // specialization.
895     QualType T =
896     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
897     if (T.isNull()) return QualType();
898
899     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
900       return T;
901
902     return SemaRef.Context.getElaboratedType(Keyword,
903                                        QualifierLoc.getNestedNameSpecifier(),
904                                              T);
905   }
906
907   /// \brief Build a new typename type that refers to an identifier.
908   ///
909   /// By default, performs semantic analysis when building the typename type
910   /// (or elaborated type). Subclasses may override this routine to provide
911   /// different behavior.
912   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
913                                     SourceLocation KeywordLoc,
914                                     NestedNameSpecifierLoc QualifierLoc,
915                                     const IdentifierInfo *Id,
916                                     SourceLocation IdLoc) {
917     CXXScopeSpec SS;
918     SS.Adopt(QualifierLoc);
919
920     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
921       // If the name is still dependent, just build a new dependent name type.
922       if (!SemaRef.computeDeclContext(SS))
923         return SemaRef.Context.getDependentNameType(Keyword,
924                                           QualifierLoc.getNestedNameSpecifier(),
925                                                     Id);
926     }
927
928     if (Keyword == ETK_None || Keyword == ETK_Typename)
929       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
930                                        *Id, IdLoc);
931
932     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
933
934     // We had a dependent elaborated-type-specifier that has been transformed
935     // into a non-dependent elaborated-type-specifier. Find the tag we're
936     // referring to.
937     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
938     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
939     if (!DC)
940       return QualType();
941
942     if (SemaRef.RequireCompleteDeclContext(SS, DC))
943       return QualType();
944
945     TagDecl *Tag = nullptr;
946     SemaRef.LookupQualifiedName(Result, DC);
947     switch (Result.getResultKind()) {
948       case LookupResult::NotFound:
949       case LookupResult::NotFoundInCurrentInstantiation:
950         break;
951
952       case LookupResult::Found:
953         Tag = Result.getAsSingle<TagDecl>();
954         break;
955
956       case LookupResult::FoundOverloaded:
957       case LookupResult::FoundUnresolvedValue:
958         llvm_unreachable("Tag lookup cannot find non-tags");
959
960       case LookupResult::Ambiguous:
961         // Let the LookupResult structure handle ambiguities.
962         return QualType();
963     }
964
965     if (!Tag) {
966       // Check where the name exists but isn't a tag type and use that to emit
967       // better diagnostics.
968       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
969       SemaRef.LookupQualifiedName(Result, DC);
970       switch (Result.getResultKind()) {
971         case LookupResult::Found:
972         case LookupResult::FoundOverloaded:
973         case LookupResult::FoundUnresolvedValue: {
974           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
975           unsigned Kind = 0;
976           if (isa<TypedefDecl>(SomeDecl)) Kind = 1;
977           else if (isa<TypeAliasDecl>(SomeDecl)) Kind = 2;
978           else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 3;
979           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind;
980           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
981           break;
982         }
983         default:
984           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
985               << Kind << Id << DC << QualifierLoc.getSourceRange();
986           break;
987       }
988       return QualType();
989     }
990
991     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
992                                               IdLoc, *Id)) {
993       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
994       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
995       return QualType();
996     }
997
998     // Build the elaborated-type-specifier type.
999     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1000     return SemaRef.Context.getElaboratedType(Keyword,
1001                                          QualifierLoc.getNestedNameSpecifier(),
1002                                              T);
1003   }
1004
1005   /// \brief Build a new pack expansion type.
1006   ///
1007   /// By default, builds a new PackExpansionType type from the given pattern.
1008   /// Subclasses may override this routine to provide different behavior.
1009   QualType RebuildPackExpansionType(QualType Pattern,
1010                                     SourceRange PatternRange,
1011                                     SourceLocation EllipsisLoc,
1012                                     Optional<unsigned> NumExpansions) {
1013     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1014                                         NumExpansions);
1015   }
1016
1017   /// \brief Build a new atomic type given its value type.
1018   ///
1019   /// By default, performs semantic analysis when building the atomic type.
1020   /// Subclasses may override this routine to provide different behavior.
1021   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1022
1023   /// \brief Build a new template name given a nested name specifier, a flag
1024   /// indicating whether the "template" keyword was provided, and the template
1025   /// that the template name refers to.
1026   ///
1027   /// By default, builds the new template name directly. Subclasses may override
1028   /// this routine to provide different behavior.
1029   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1030                                    bool TemplateKW,
1031                                    TemplateDecl *Template);
1032
1033   /// \brief Build a new template name given a nested name specifier and the
1034   /// name that is referred to as a template.
1035   ///
1036   /// By default, performs semantic analysis to determine whether the name can
1037   /// be resolved to a specific template, then builds the appropriate kind of
1038   /// template name. Subclasses may override this routine to provide different
1039   /// behavior.
1040   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1041                                    const IdentifierInfo &Name,
1042                                    SourceLocation NameLoc,
1043                                    QualType ObjectType,
1044                                    NamedDecl *FirstQualifierInScope);
1045
1046   /// \brief Build a new template name given a nested name specifier and the
1047   /// overloaded operator name that is referred to as a template.
1048   ///
1049   /// By default, performs semantic analysis to determine whether the name can
1050   /// be resolved to a specific template, then builds the appropriate kind of
1051   /// template name. Subclasses may override this routine to provide different
1052   /// behavior.
1053   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1054                                    OverloadedOperatorKind Operator,
1055                                    SourceLocation NameLoc,
1056                                    QualType ObjectType);
1057
1058   /// \brief Build a new template name given a template template parameter pack
1059   /// and the
1060   ///
1061   /// By default, performs semantic analysis to determine whether the name can
1062   /// be resolved to a specific template, then builds the appropriate kind of
1063   /// template name. Subclasses may override this routine to provide different
1064   /// behavior.
1065   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1066                                    const TemplateArgument &ArgPack) {
1067     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1068   }
1069
1070   /// \brief Build a new compound statement.
1071   ///
1072   /// By default, performs semantic analysis to build the new statement.
1073   /// Subclasses may override this routine to provide different behavior.
1074   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1075                                        MultiStmtArg Statements,
1076                                        SourceLocation RBraceLoc,
1077                                        bool IsStmtExpr) {
1078     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1079                                        IsStmtExpr);
1080   }
1081
1082   /// \brief Build a new case statement.
1083   ///
1084   /// By default, performs semantic analysis to build the new statement.
1085   /// Subclasses may override this routine to provide different behavior.
1086   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1087                                    Expr *LHS,
1088                                    SourceLocation EllipsisLoc,
1089                                    Expr *RHS,
1090                                    SourceLocation ColonLoc) {
1091     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1092                                    ColonLoc);
1093   }
1094
1095   /// \brief Attach the body to a new case statement.
1096   ///
1097   /// By default, performs semantic analysis to build the new statement.
1098   /// Subclasses may override this routine to provide different behavior.
1099   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1100     getSema().ActOnCaseStmtBody(S, Body);
1101     return S;
1102   }
1103
1104   /// \brief Build a new default statement.
1105   ///
1106   /// By default, performs semantic analysis to build the new statement.
1107   /// Subclasses may override this routine to provide different behavior.
1108   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1109                                       SourceLocation ColonLoc,
1110                                       Stmt *SubStmt) {
1111     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1112                                       /*CurScope=*/nullptr);
1113   }
1114
1115   /// \brief Build a new label statement.
1116   ///
1117   /// By default, performs semantic analysis to build the new statement.
1118   /// Subclasses may override this routine to provide different behavior.
1119   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1120                               SourceLocation ColonLoc, Stmt *SubStmt) {
1121     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1122   }
1123
1124   /// \brief Build a new label statement.
1125   ///
1126   /// By default, performs semantic analysis to build the new statement.
1127   /// Subclasses may override this routine to provide different behavior.
1128   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1129                                    ArrayRef<const Attr*> Attrs,
1130                                    Stmt *SubStmt) {
1131     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1132   }
1133
1134   /// \brief Build a new "if" statement.
1135   ///
1136   /// By default, performs semantic analysis to build the new statement.
1137   /// Subclasses may override this routine to provide different behavior.
1138   StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
1139                            VarDecl *CondVar, Stmt *Then,
1140                            SourceLocation ElseLoc, Stmt *Else) {
1141     return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else);
1142   }
1143
1144   /// \brief Start building a new switch statement.
1145   ///
1146   /// By default, performs semantic analysis to build the new statement.
1147   /// Subclasses may override this routine to provide different behavior.
1148   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1149                                     Expr *Cond, VarDecl *CondVar) {
1150     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond,
1151                                             CondVar);
1152   }
1153
1154   /// \brief Attach the body to the switch statement.
1155   ///
1156   /// By default, performs semantic analysis to build the new statement.
1157   /// Subclasses may override this routine to provide different behavior.
1158   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1159                                    Stmt *Switch, Stmt *Body) {
1160     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1161   }
1162
1163   /// \brief Build a new while statement.
1164   ///
1165   /// By default, performs semantic analysis to build the new statement.
1166   /// Subclasses may override this routine to provide different behavior.
1167   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond,
1168                               VarDecl *CondVar, Stmt *Body) {
1169     return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body);
1170   }
1171
1172   /// \brief Build a new do-while statement.
1173   ///
1174   /// By default, performs semantic analysis to build the new statement.
1175   /// Subclasses may override this routine to provide different behavior.
1176   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1177                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1178                            Expr *Cond, SourceLocation RParenLoc) {
1179     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1180                                  Cond, RParenLoc);
1181   }
1182
1183   /// \brief Build a new for statement.
1184   ///
1185   /// By default, performs semantic analysis to build the new statement.
1186   /// Subclasses may override this routine to provide different behavior.
1187   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1188                             Stmt *Init, Sema::FullExprArg Cond,
1189                             VarDecl *CondVar, Sema::FullExprArg Inc,
1190                             SourceLocation RParenLoc, Stmt *Body) {
1191     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1192                                   CondVar, Inc, RParenLoc, Body);
1193   }
1194
1195   /// \brief Build a new goto statement.
1196   ///
1197   /// By default, performs semantic analysis to build the new statement.
1198   /// Subclasses may override this routine to provide different behavior.
1199   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1200                              LabelDecl *Label) {
1201     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1202   }
1203
1204   /// \brief Build a new indirect goto statement.
1205   ///
1206   /// By default, performs semantic analysis to build the new statement.
1207   /// Subclasses may override this routine to provide different behavior.
1208   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1209                                      SourceLocation StarLoc,
1210                                      Expr *Target) {
1211     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1212   }
1213
1214   /// \brief Build a new return statement.
1215   ///
1216   /// By default, performs semantic analysis to build the new statement.
1217   /// Subclasses may override this routine to provide different behavior.
1218   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1219     return getSema().BuildReturnStmt(ReturnLoc, Result);
1220   }
1221
1222   /// \brief Build a new declaration statement.
1223   ///
1224   /// By default, performs semantic analysis to build the new statement.
1225   /// Subclasses may override this routine to provide different behavior.
1226   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1227                              SourceLocation StartLoc, SourceLocation EndLoc) {
1228     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1229     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1230   }
1231
1232   /// \brief Build a new inline asm statement.
1233   ///
1234   /// By default, performs semantic analysis to build the new statement.
1235   /// Subclasses may override this routine to provide different behavior.
1236   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1237                                bool IsVolatile, unsigned NumOutputs,
1238                                unsigned NumInputs, IdentifierInfo **Names,
1239                                MultiExprArg Constraints, MultiExprArg Exprs,
1240                                Expr *AsmString, MultiExprArg Clobbers,
1241                                SourceLocation RParenLoc) {
1242     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1243                                      NumInputs, Names, Constraints, Exprs,
1244                                      AsmString, Clobbers, RParenLoc);
1245   }
1246
1247   /// \brief Build a new MS style inline asm statement.
1248   ///
1249   /// By default, performs semantic analysis to build the new statement.
1250   /// Subclasses may override this routine to provide different behavior.
1251   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1252                               ArrayRef<Token> AsmToks,
1253                               StringRef AsmString,
1254                               unsigned NumOutputs, unsigned NumInputs,
1255                               ArrayRef<StringRef> Constraints,
1256                               ArrayRef<StringRef> Clobbers,
1257                               ArrayRef<Expr*> Exprs,
1258                               SourceLocation EndLoc) {
1259     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1260                                     NumOutputs, NumInputs,
1261                                     Constraints, Clobbers, Exprs, EndLoc);
1262   }
1263
1264   /// \brief Build a new Objective-C \@try statement.
1265   ///
1266   /// By default, performs semantic analysis to build the new statement.
1267   /// Subclasses may override this routine to provide different behavior.
1268   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1269                                         Stmt *TryBody,
1270                                         MultiStmtArg CatchStmts,
1271                                         Stmt *Finally) {
1272     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1273                                         Finally);
1274   }
1275
1276   /// \brief Rebuild an Objective-C exception declaration.
1277   ///
1278   /// By default, performs semantic analysis to build the new declaration.
1279   /// Subclasses may override this routine to provide different behavior.
1280   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1281                                     TypeSourceInfo *TInfo, QualType T) {
1282     return getSema().BuildObjCExceptionDecl(TInfo, T,
1283                                             ExceptionDecl->getInnerLocStart(),
1284                                             ExceptionDecl->getLocation(),
1285                                             ExceptionDecl->getIdentifier());
1286   }
1287
1288   /// \brief Build a new Objective-C \@catch statement.
1289   ///
1290   /// By default, performs semantic analysis to build the new statement.
1291   /// Subclasses may override this routine to provide different behavior.
1292   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1293                                           SourceLocation RParenLoc,
1294                                           VarDecl *Var,
1295                                           Stmt *Body) {
1296     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1297                                           Var, Body);
1298   }
1299
1300   /// \brief Build a new Objective-C \@finally statement.
1301   ///
1302   /// By default, performs semantic analysis to build the new statement.
1303   /// Subclasses may override this routine to provide different behavior.
1304   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1305                                             Stmt *Body) {
1306     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1307   }
1308
1309   /// \brief Build a new Objective-C \@throw statement.
1310   ///
1311   /// By default, performs semantic analysis to build the new statement.
1312   /// Subclasses may override this routine to provide different behavior.
1313   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1314                                           Expr *Operand) {
1315     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1316   }
1317
1318   /// \brief Build a new OpenMP executable directive.
1319   ///
1320   /// By default, performs semantic analysis to build the new statement.
1321   /// Subclasses may override this routine to provide different behavior.
1322   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1323                                            DeclarationNameInfo DirName,
1324                                            OpenMPDirectiveKind CancelRegion,
1325                                            ArrayRef<OMPClause *> Clauses,
1326                                            Stmt *AStmt, SourceLocation StartLoc,
1327                                            SourceLocation EndLoc) {
1328     return getSema().ActOnOpenMPExecutableDirective(
1329         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1330   }
1331
1332   /// \brief Build a new OpenMP 'if' clause.
1333   ///
1334   /// By default, performs semantic analysis to build the new OpenMP clause.
1335   /// Subclasses may override this routine to provide different behavior.
1336   OMPClause *RebuildOMPIfClause(Expr *Condition,
1337                                 SourceLocation StartLoc,
1338                                 SourceLocation LParenLoc,
1339                                 SourceLocation EndLoc) {
1340     return getSema().ActOnOpenMPIfClause(Condition, StartLoc,
1341                                          LParenLoc, EndLoc);
1342   }
1343
1344   /// \brief Build a new OpenMP 'final' clause.
1345   ///
1346   /// By default, performs semantic analysis to build the new OpenMP clause.
1347   /// Subclasses may override this routine to provide different behavior.
1348   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1349                                    SourceLocation LParenLoc,
1350                                    SourceLocation EndLoc) {
1351     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1352                                             EndLoc);
1353   }
1354
1355   /// \brief Build a new OpenMP 'num_threads' clause.
1356   ///
1357   /// By default, performs semantic analysis to build the new OpenMP clause.
1358   /// Subclasses may override this routine to provide different behavior.
1359   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1360                                         SourceLocation StartLoc,
1361                                         SourceLocation LParenLoc,
1362                                         SourceLocation EndLoc) {
1363     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1364                                                  LParenLoc, EndLoc);
1365   }
1366
1367   /// \brief Build a new OpenMP 'safelen' clause.
1368   ///
1369   /// By default, performs semantic analysis to build the new OpenMP clause.
1370   /// Subclasses may override this routine to provide different behavior.
1371   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1372                                      SourceLocation LParenLoc,
1373                                      SourceLocation EndLoc) {
1374     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1375   }
1376
1377   /// \brief Build a new OpenMP 'collapse' clause.
1378   ///
1379   /// By default, performs semantic analysis to build the new OpenMP clause.
1380   /// Subclasses may override this routine to provide different behavior.
1381   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1382                                       SourceLocation LParenLoc,
1383                                       SourceLocation EndLoc) {
1384     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1385                                                EndLoc);
1386   }
1387
1388   /// \brief Build a new OpenMP 'default' clause.
1389   ///
1390   /// By default, performs semantic analysis to build the new OpenMP clause.
1391   /// Subclasses may override this routine to provide different behavior.
1392   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1393                                      SourceLocation KindKwLoc,
1394                                      SourceLocation StartLoc,
1395                                      SourceLocation LParenLoc,
1396                                      SourceLocation EndLoc) {
1397     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1398                                               StartLoc, LParenLoc, EndLoc);
1399   }
1400
1401   /// \brief Build a new OpenMP 'proc_bind' clause.
1402   ///
1403   /// By default, performs semantic analysis to build the new OpenMP clause.
1404   /// Subclasses may override this routine to provide different behavior.
1405   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1406                                       SourceLocation KindKwLoc,
1407                                       SourceLocation StartLoc,
1408                                       SourceLocation LParenLoc,
1409                                       SourceLocation EndLoc) {
1410     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1411                                                StartLoc, LParenLoc, EndLoc);
1412   }
1413
1414   /// \brief Build a new OpenMP 'schedule' clause.
1415   ///
1416   /// By default, performs semantic analysis to build the new OpenMP clause.
1417   /// Subclasses may override this routine to provide different behavior.
1418   OMPClause *RebuildOMPScheduleClause(OpenMPScheduleClauseKind Kind,
1419                                       Expr *ChunkSize,
1420                                       SourceLocation StartLoc,
1421                                       SourceLocation LParenLoc,
1422                                       SourceLocation KindLoc,
1423                                       SourceLocation CommaLoc,
1424                                       SourceLocation EndLoc) {
1425     return getSema().ActOnOpenMPScheduleClause(
1426         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1427   }
1428
1429   /// \brief Build a new OpenMP 'private' 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 *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1434                                      SourceLocation StartLoc,
1435                                      SourceLocation LParenLoc,
1436                                      SourceLocation EndLoc) {
1437     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1438                                               EndLoc);
1439   }
1440
1441   /// \brief Build a new OpenMP 'firstprivate' 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 *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1446                                           SourceLocation StartLoc,
1447                                           SourceLocation LParenLoc,
1448                                           SourceLocation EndLoc) {
1449     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1450                                                    EndLoc);
1451   }
1452
1453   /// \brief Build a new OpenMP 'lastprivate' clause.
1454   ///
1455   /// By default, performs semantic analysis to build the new OpenMP clause.
1456   /// Subclasses may override this routine to provide different behavior.
1457   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1458                                          SourceLocation StartLoc,
1459                                          SourceLocation LParenLoc,
1460                                          SourceLocation EndLoc) {
1461     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1462                                                   EndLoc);
1463   }
1464
1465   /// \brief Build a new OpenMP 'shared' clause.
1466   ///
1467   /// By default, performs semantic analysis to build the new OpenMP clause.
1468   /// Subclasses may override this routine to provide different behavior.
1469   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1470                                     SourceLocation StartLoc,
1471                                     SourceLocation LParenLoc,
1472                                     SourceLocation EndLoc) {
1473     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1474                                              EndLoc);
1475   }
1476
1477   /// \brief Build a new OpenMP 'reduction' clause.
1478   ///
1479   /// By default, performs semantic analysis to build the new statement.
1480   /// Subclasses may override this routine to provide different behavior.
1481   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1482                                        SourceLocation StartLoc,
1483                                        SourceLocation LParenLoc,
1484                                        SourceLocation ColonLoc,
1485                                        SourceLocation EndLoc,
1486                                        CXXScopeSpec &ReductionIdScopeSpec,
1487                                        const DeclarationNameInfo &ReductionId) {
1488     return getSema().ActOnOpenMPReductionClause(
1489         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1490         ReductionId);
1491   }
1492
1493   /// \brief Build a new OpenMP 'linear' clause.
1494   ///
1495   /// By default, performs semantic analysis to build the new OpenMP clause.
1496   /// Subclasses may override this routine to provide different behavior.
1497   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1498                                     SourceLocation StartLoc,
1499                                     SourceLocation LParenLoc,
1500                                     SourceLocation ColonLoc,
1501                                     SourceLocation EndLoc) {
1502     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1503                                              ColonLoc, EndLoc);
1504   }
1505
1506   /// \brief Build a new OpenMP 'aligned' clause.
1507   ///
1508   /// By default, performs semantic analysis to build the new OpenMP clause.
1509   /// Subclasses may override this routine to provide different behavior.
1510   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1511                                      SourceLocation StartLoc,
1512                                      SourceLocation LParenLoc,
1513                                      SourceLocation ColonLoc,
1514                                      SourceLocation EndLoc) {
1515     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1516                                               LParenLoc, ColonLoc, EndLoc);
1517   }
1518
1519   /// \brief Build a new OpenMP 'copyin' clause.
1520   ///
1521   /// By default, performs semantic analysis to build the new OpenMP clause.
1522   /// Subclasses may override this routine to provide different behavior.
1523   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1524                                     SourceLocation StartLoc,
1525                                     SourceLocation LParenLoc,
1526                                     SourceLocation EndLoc) {
1527     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1528                                              EndLoc);
1529   }
1530
1531   /// \brief Build a new OpenMP 'copyprivate' clause.
1532   ///
1533   /// By default, performs semantic analysis to build the new OpenMP clause.
1534   /// Subclasses may override this routine to provide different behavior.
1535   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1536                                          SourceLocation StartLoc,
1537                                          SourceLocation LParenLoc,
1538                                          SourceLocation EndLoc) {
1539     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1540                                                   EndLoc);
1541   }
1542
1543   /// \brief Build a new OpenMP 'flush' pseudo clause.
1544   ///
1545   /// By default, performs semantic analysis to build the new OpenMP clause.
1546   /// Subclasses may override this routine to provide different behavior.
1547   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1548                                    SourceLocation StartLoc,
1549                                    SourceLocation LParenLoc,
1550                                    SourceLocation EndLoc) {
1551     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1552                                             EndLoc);
1553   }
1554
1555   /// \brief Build a new OpenMP 'depend' pseudo clause.
1556   ///
1557   /// By default, performs semantic analysis to build the new OpenMP clause.
1558   /// Subclasses may override this routine to provide different behavior.
1559   OMPClause *
1560   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1561                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1562                          SourceLocation StartLoc, SourceLocation LParenLoc,
1563                          SourceLocation EndLoc) {
1564     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1565                                              StartLoc, LParenLoc, EndLoc);
1566   }
1567
1568   /// \brief Rebuild the operand to an Objective-C \@synchronized statement.
1569   ///
1570   /// By default, performs semantic analysis to build the new statement.
1571   /// Subclasses may override this routine to provide different behavior.
1572   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1573                                               Expr *object) {
1574     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1575   }
1576
1577   /// \brief Build a new Objective-C \@synchronized statement.
1578   ///
1579   /// By default, performs semantic analysis to build the new statement.
1580   /// Subclasses may override this routine to provide different behavior.
1581   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1582                                            Expr *Object, Stmt *Body) {
1583     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1584   }
1585
1586   /// \brief Build a new Objective-C \@autoreleasepool statement.
1587   ///
1588   /// By default, performs semantic analysis to build the new statement.
1589   /// Subclasses may override this routine to provide different behavior.
1590   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1591                                             Stmt *Body) {
1592     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1593   }
1594
1595   /// \brief Build a new Objective-C fast enumeration statement.
1596   ///
1597   /// By default, performs semantic analysis to build the new statement.
1598   /// Subclasses may override this routine to provide different behavior.
1599   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1600                                           Stmt *Element,
1601                                           Expr *Collection,
1602                                           SourceLocation RParenLoc,
1603                                           Stmt *Body) {
1604     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1605                                                 Element,
1606                                                 Collection,
1607                                                 RParenLoc);
1608     if (ForEachStmt.isInvalid())
1609       return StmtError();
1610
1611     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1612   }
1613
1614   /// \brief Build a new C++ exception declaration.
1615   ///
1616   /// By default, performs semantic analysis to build the new decaration.
1617   /// Subclasses may override this routine to provide different behavior.
1618   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1619                                 TypeSourceInfo *Declarator,
1620                                 SourceLocation StartLoc,
1621                                 SourceLocation IdLoc,
1622                                 IdentifierInfo *Id) {
1623     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1624                                                        StartLoc, IdLoc, Id);
1625     if (Var)
1626       getSema().CurContext->addDecl(Var);
1627     return Var;
1628   }
1629
1630   /// \brief Build a new C++ catch statement.
1631   ///
1632   /// By default, performs semantic analysis to build the new statement.
1633   /// Subclasses may override this routine to provide different behavior.
1634   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1635                                  VarDecl *ExceptionDecl,
1636                                  Stmt *Handler) {
1637     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1638                                                       Handler));
1639   }
1640
1641   /// \brief Build a new C++ try statement.
1642   ///
1643   /// By default, performs semantic analysis to build the new statement.
1644   /// Subclasses may override this routine to provide different behavior.
1645   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
1646                                ArrayRef<Stmt *> Handlers) {
1647     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
1648   }
1649
1650   /// \brief Build a new C++0x range-based for statement.
1651   ///
1652   /// By default, performs semantic analysis to build the new statement.
1653   /// Subclasses may override this routine to provide different behavior.
1654   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
1655                                     SourceLocation ColonLoc,
1656                                     Stmt *Range, Stmt *BeginEnd,
1657                                     Expr *Cond, Expr *Inc,
1658                                     Stmt *LoopVar,
1659                                     SourceLocation RParenLoc) {
1660     // If we've just learned that the range is actually an Objective-C
1661     // collection, treat this as an Objective-C fast enumeration loop.
1662     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
1663       if (RangeStmt->isSingleDecl()) {
1664         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
1665           if (RangeVar->isInvalidDecl())
1666             return StmtError();
1667
1668           Expr *RangeExpr = RangeVar->getInit();
1669           if (!RangeExpr->isTypeDependent() &&
1670               RangeExpr->getType()->isObjCObjectPointerType())
1671             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
1672                                                         RParenLoc);
1673         }
1674       }
1675     }
1676
1677     return getSema().BuildCXXForRangeStmt(ForLoc, ColonLoc, Range, BeginEnd,
1678                                           Cond, Inc, LoopVar, RParenLoc,
1679                                           Sema::BFRK_Rebuild);
1680   }
1681
1682   /// \brief Build a new C++0x range-based for statement.
1683   ///
1684   /// By default, performs semantic analysis to build the new statement.
1685   /// Subclasses may override this routine to provide different behavior.
1686   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
1687                                           bool IsIfExists,
1688                                           NestedNameSpecifierLoc QualifierLoc,
1689                                           DeclarationNameInfo NameInfo,
1690                                           Stmt *Nested) {
1691     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
1692                                                 QualifierLoc, NameInfo, Nested);
1693   }
1694
1695   /// \brief Attach body to a C++0x range-based for statement.
1696   ///
1697   /// By default, performs semantic analysis to finish the new statement.
1698   /// Subclasses may override this routine to provide different behavior.
1699   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
1700     return getSema().FinishCXXForRangeStmt(ForRange, Body);
1701   }
1702
1703   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
1704                                Stmt *TryBlock, Stmt *Handler) {
1705     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
1706   }
1707
1708   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
1709                                   Stmt *Block) {
1710     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
1711   }
1712
1713   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
1714     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
1715   }
1716
1717   /// \brief Build a new predefined expression.
1718   ///
1719   /// By default, performs semantic analysis to build the new expression.
1720   /// Subclasses may override this routine to provide different behavior.
1721   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
1722                                    PredefinedExpr::IdentType IT) {
1723     return getSema().BuildPredefinedExpr(Loc, IT);
1724   }
1725
1726   /// \brief Build a new expression that references a declaration.
1727   ///
1728   /// By default, performs semantic analysis to build the new expression.
1729   /// Subclasses may override this routine to provide different behavior.
1730   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1731                                         LookupResult &R,
1732                                         bool RequiresADL) {
1733     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1734   }
1735
1736
1737   /// \brief Build a new expression that references a declaration.
1738   ///
1739   /// By default, performs semantic analysis to build the new expression.
1740   /// Subclasses may override this routine to provide different behavior.
1741   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
1742                                 ValueDecl *VD,
1743                                 const DeclarationNameInfo &NameInfo,
1744                                 TemplateArgumentListInfo *TemplateArgs) {
1745     CXXScopeSpec SS;
1746     SS.Adopt(QualifierLoc);
1747
1748     // FIXME: loses template args.
1749
1750     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1751   }
1752
1753   /// \brief Build a new expression in parentheses.
1754   ///
1755   /// By default, performs semantic analysis to build the new expression.
1756   /// Subclasses may override this routine to provide different behavior.
1757   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
1758                                     SourceLocation RParen) {
1759     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
1760   }
1761
1762   /// \brief Build a new pseudo-destructor expression.
1763   ///
1764   /// By default, performs semantic analysis to build the new expression.
1765   /// Subclasses may override this routine to provide different behavior.
1766   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
1767                                             SourceLocation OperatorLoc,
1768                                             bool isArrow,
1769                                             CXXScopeSpec &SS,
1770                                             TypeSourceInfo *ScopeType,
1771                                             SourceLocation CCLoc,
1772                                             SourceLocation TildeLoc,
1773                                         PseudoDestructorTypeStorage Destroyed);
1774
1775   /// \brief Build a new unary operator expression.
1776   ///
1777   /// By default, performs semantic analysis to build the new expression.
1778   /// Subclasses may override this routine to provide different behavior.
1779   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
1780                                         UnaryOperatorKind Opc,
1781                                         Expr *SubExpr) {
1782     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
1783   }
1784
1785   /// \brief Build a new builtin offsetof expression.
1786   ///
1787   /// By default, performs semantic analysis to build the new expression.
1788   /// Subclasses may override this routine to provide different behavior.
1789   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
1790                                        TypeSourceInfo *Type,
1791                                        Sema::OffsetOfComponent *Components,
1792                                        unsigned NumComponents,
1793                                        SourceLocation RParenLoc) {
1794     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
1795                                           NumComponents, RParenLoc);
1796   }
1797
1798   /// \brief Build a new sizeof, alignof or vec_step expression with a
1799   /// type argument.
1800   ///
1801   /// By default, performs semantic analysis to build the new expression.
1802   /// Subclasses may override this routine to provide different behavior.
1803   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
1804                                          SourceLocation OpLoc,
1805                                          UnaryExprOrTypeTrait ExprKind,
1806                                          SourceRange R) {
1807     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
1808   }
1809
1810   /// \brief Build a new sizeof, alignof or vec step expression with an
1811   /// expression argument.
1812   ///
1813   /// By default, performs semantic analysis to build the new expression.
1814   /// Subclasses may override this routine to provide different behavior.
1815   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
1816                                          UnaryExprOrTypeTrait ExprKind,
1817                                          SourceRange R) {
1818     ExprResult Result
1819       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
1820     if (Result.isInvalid())
1821       return ExprError();
1822
1823     return Result;
1824   }
1825
1826   /// \brief Build a new array subscript expression.
1827   ///
1828   /// By default, performs semantic analysis to build the new expression.
1829   /// Subclasses may override this routine to provide different behavior.
1830   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
1831                                              SourceLocation LBracketLoc,
1832                                              Expr *RHS,
1833                                              SourceLocation RBracketLoc) {
1834     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
1835                                              LBracketLoc, RHS,
1836                                              RBracketLoc);
1837   }
1838
1839   /// \brief Build a new call expression.
1840   ///
1841   /// By default, performs semantic analysis to build the new expression.
1842   /// Subclasses may override this routine to provide different behavior.
1843   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
1844                                    MultiExprArg Args,
1845                                    SourceLocation RParenLoc,
1846                                    Expr *ExecConfig = nullptr) {
1847     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
1848                                    Args, RParenLoc, ExecConfig);
1849   }
1850
1851   /// \brief Build a new member access expression.
1852   ///
1853   /// By default, performs semantic analysis to build the new expression.
1854   /// Subclasses may override this routine to provide different behavior.
1855   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
1856                                bool isArrow,
1857                                NestedNameSpecifierLoc QualifierLoc,
1858                                SourceLocation TemplateKWLoc,
1859                                const DeclarationNameInfo &MemberNameInfo,
1860                                ValueDecl *Member,
1861                                NamedDecl *FoundDecl,
1862                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
1863                                NamedDecl *FirstQualifierInScope) {
1864     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
1865                                                                       isArrow);
1866     if (!Member->getDeclName()) {
1867       // We have a reference to an unnamed field.  This is always the
1868       // base of an anonymous struct/union member access, i.e. the
1869       // field is always of record type.
1870       assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
1871       assert(Member->getType()->isRecordType() &&
1872              "unnamed member not of record type?");
1873
1874       BaseResult =
1875         getSema().PerformObjectMemberConversion(BaseResult.get(),
1876                                                 QualifierLoc.getNestedNameSpecifier(),
1877                                                 FoundDecl, Member);
1878       if (BaseResult.isInvalid())
1879         return ExprError();
1880       Base = BaseResult.get();
1881       ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
1882       MemberExpr *ME = new (getSema().Context)
1883           MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo,
1884                      cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary);
1885       return ME;
1886     }
1887
1888     CXXScopeSpec SS;
1889     SS.Adopt(QualifierLoc);
1890
1891     Base = BaseResult.get();
1892     QualType BaseType = Base->getType();
1893
1894     // FIXME: this involves duplicating earlier analysis in a lot of
1895     // cases; we should avoid this when possible.
1896     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
1897     R.addDecl(FoundDecl);
1898     R.resolveKind();
1899
1900     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
1901                                               SS, TemplateKWLoc,
1902                                               FirstQualifierInScope,
1903                                               R, ExplicitTemplateArgs);
1904   }
1905
1906   /// \brief Build a new binary operator expression.
1907   ///
1908   /// By default, performs semantic analysis to build the new expression.
1909   /// Subclasses may override this routine to provide different behavior.
1910   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1911                                          BinaryOperatorKind Opc,
1912                                          Expr *LHS, Expr *RHS) {
1913     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
1914   }
1915
1916   /// \brief Build a new conditional operator expression.
1917   ///
1918   /// By default, performs semantic analysis to build the new expression.
1919   /// Subclasses may override this routine to provide different behavior.
1920   ExprResult RebuildConditionalOperator(Expr *Cond,
1921                                         SourceLocation QuestionLoc,
1922                                         Expr *LHS,
1923                                         SourceLocation ColonLoc,
1924                                         Expr *RHS) {
1925     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
1926                                         LHS, RHS);
1927   }
1928
1929   /// \brief Build a new C-style cast expression.
1930   ///
1931   /// By default, performs semantic analysis to build the new expression.
1932   /// Subclasses may override this routine to provide different behavior.
1933   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
1934                                          TypeSourceInfo *TInfo,
1935                                          SourceLocation RParenLoc,
1936                                          Expr *SubExpr) {
1937     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
1938                                          SubExpr);
1939   }
1940
1941   /// \brief Build a new compound literal expression.
1942   ///
1943   /// By default, performs semantic analysis to build the new expression.
1944   /// Subclasses may override this routine to provide different behavior.
1945   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1946                                               TypeSourceInfo *TInfo,
1947                                               SourceLocation RParenLoc,
1948                                               Expr *Init) {
1949     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
1950                                               Init);
1951   }
1952
1953   /// \brief Build a new extended vector element access expression.
1954   ///
1955   /// By default, performs semantic analysis to build the new expression.
1956   /// Subclasses may override this routine to provide different behavior.
1957   ExprResult RebuildExtVectorElementExpr(Expr *Base,
1958                                                SourceLocation OpLoc,
1959                                                SourceLocation AccessorLoc,
1960                                                IdentifierInfo &Accessor) {
1961
1962     CXXScopeSpec SS;
1963     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
1964     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1965                                               OpLoc, /*IsArrow*/ false,
1966                                               SS, SourceLocation(),
1967                                               /*FirstQualifierInScope*/ nullptr,
1968                                               NameInfo,
1969                                               /* TemplateArgs */ nullptr);
1970   }
1971
1972   /// \brief Build a new initializer list expression.
1973   ///
1974   /// By default, performs semantic analysis to build the new expression.
1975   /// Subclasses may override this routine to provide different behavior.
1976   ExprResult RebuildInitList(SourceLocation LBraceLoc,
1977                              MultiExprArg Inits,
1978                              SourceLocation RBraceLoc,
1979                              QualType ResultTy) {
1980     ExprResult Result
1981       = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
1982     if (Result.isInvalid() || ResultTy->isDependentType())
1983       return Result;
1984
1985     // Patch in the result type we were given, which may have been computed
1986     // when the initial InitListExpr was built.
1987     InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1988     ILE->setType(ResultTy);
1989     return Result;
1990   }
1991
1992   /// \brief Build a new designated initializer expression.
1993   ///
1994   /// By default, performs semantic analysis to build the new expression.
1995   /// Subclasses may override this routine to provide different behavior.
1996   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
1997                                              MultiExprArg ArrayExprs,
1998                                              SourceLocation EqualOrColonLoc,
1999                                              bool GNUSyntax,
2000                                              Expr *Init) {
2001     ExprResult Result
2002       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2003                                            Init);
2004     if (Result.isInvalid())
2005       return ExprError();
2006
2007     return Result;
2008   }
2009
2010   /// \brief Build a new value-initialized expression.
2011   ///
2012   /// By default, builds the implicit value initialization without performing
2013   /// any semantic analysis. Subclasses may override this routine to provide
2014   /// different behavior.
2015   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2016     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2017   }
2018
2019   /// \brief Build a new \c va_arg expression.
2020   ///
2021   /// By default, performs semantic analysis to build the new expression.
2022   /// Subclasses may override this routine to provide different behavior.
2023   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2024                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2025                                     SourceLocation RParenLoc) {
2026     return getSema().BuildVAArgExpr(BuiltinLoc,
2027                                     SubExpr, TInfo,
2028                                     RParenLoc);
2029   }
2030
2031   /// \brief Build a new expression list in parentheses.
2032   ///
2033   /// By default, performs semantic analysis to build the new expression.
2034   /// Subclasses may override this routine to provide different behavior.
2035   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2036                                   MultiExprArg SubExprs,
2037                                   SourceLocation RParenLoc) {
2038     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2039   }
2040
2041   /// \brief Build a new address-of-label expression.
2042   ///
2043   /// By default, performs semantic analysis, using the name of the label
2044   /// rather than attempting to map the label statement itself.
2045   /// Subclasses may override this routine to provide different behavior.
2046   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2047                                   SourceLocation LabelLoc, LabelDecl *Label) {
2048     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2049   }
2050
2051   /// \brief Build a new GNU statement expression.
2052   ///
2053   /// By default, performs semantic analysis to build the new expression.
2054   /// Subclasses may override this routine to provide different behavior.
2055   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2056                                    Stmt *SubStmt,
2057                                    SourceLocation RParenLoc) {
2058     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2059   }
2060
2061   /// \brief Build a new __builtin_choose_expr expression.
2062   ///
2063   /// By default, performs semantic analysis to build the new expression.
2064   /// Subclasses may override this routine to provide different behavior.
2065   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2066                                      Expr *Cond, Expr *LHS, Expr *RHS,
2067                                      SourceLocation RParenLoc) {
2068     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2069                                    Cond, LHS, RHS,
2070                                    RParenLoc);
2071   }
2072
2073   /// \brief Build a new generic selection expression.
2074   ///
2075   /// By default, performs semantic analysis to build the new expression.
2076   /// Subclasses may override this routine to provide different behavior.
2077   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2078                                          SourceLocation DefaultLoc,
2079                                          SourceLocation RParenLoc,
2080                                          Expr *ControllingExpr,
2081                                          ArrayRef<TypeSourceInfo *> Types,
2082                                          ArrayRef<Expr *> Exprs) {
2083     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2084                                                 ControllingExpr, Types, Exprs);
2085   }
2086
2087   /// \brief Build a new overloaded operator call expression.
2088   ///
2089   /// By default, performs semantic analysis to build the new expression.
2090   /// The semantic analysis provides the behavior of template instantiation,
2091   /// copying with transformations that turn what looks like an overloaded
2092   /// operator call into a use of a builtin operator, performing
2093   /// argument-dependent lookup, etc. Subclasses may override this routine to
2094   /// provide different behavior.
2095   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2096                                               SourceLocation OpLoc,
2097                                               Expr *Callee,
2098                                               Expr *First,
2099                                               Expr *Second);
2100
2101   /// \brief Build a new C++ "named" cast expression, such as static_cast or
2102   /// reinterpret_cast.
2103   ///
2104   /// By default, this routine dispatches to one of the more-specific routines
2105   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2106   /// Subclasses may override this routine to provide different behavior.
2107   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2108                                            Stmt::StmtClass Class,
2109                                            SourceLocation LAngleLoc,
2110                                            TypeSourceInfo *TInfo,
2111                                            SourceLocation RAngleLoc,
2112                                            SourceLocation LParenLoc,
2113                                            Expr *SubExpr,
2114                                            SourceLocation RParenLoc) {
2115     switch (Class) {
2116     case Stmt::CXXStaticCastExprClass:
2117       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2118                                                    RAngleLoc, LParenLoc,
2119                                                    SubExpr, RParenLoc);
2120
2121     case Stmt::CXXDynamicCastExprClass:
2122       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2123                                                     RAngleLoc, LParenLoc,
2124                                                     SubExpr, RParenLoc);
2125
2126     case Stmt::CXXReinterpretCastExprClass:
2127       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2128                                                         RAngleLoc, LParenLoc,
2129                                                         SubExpr,
2130                                                         RParenLoc);
2131
2132     case Stmt::CXXConstCastExprClass:
2133       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2134                                                    RAngleLoc, LParenLoc,
2135                                                    SubExpr, RParenLoc);
2136
2137     default:
2138       llvm_unreachable("Invalid C++ named cast");
2139     }
2140   }
2141
2142   /// \brief Build a new C++ static_cast expression.
2143   ///
2144   /// By default, performs semantic analysis to build the new expression.
2145   /// Subclasses may override this routine to provide different behavior.
2146   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2147                                             SourceLocation LAngleLoc,
2148                                             TypeSourceInfo *TInfo,
2149                                             SourceLocation RAngleLoc,
2150                                             SourceLocation LParenLoc,
2151                                             Expr *SubExpr,
2152                                             SourceLocation RParenLoc) {
2153     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2154                                        TInfo, SubExpr,
2155                                        SourceRange(LAngleLoc, RAngleLoc),
2156                                        SourceRange(LParenLoc, RParenLoc));
2157   }
2158
2159   /// \brief Build a new C++ dynamic_cast expression.
2160   ///
2161   /// By default, performs semantic analysis to build the new expression.
2162   /// Subclasses may override this routine to provide different behavior.
2163   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2164                                              SourceLocation LAngleLoc,
2165                                              TypeSourceInfo *TInfo,
2166                                              SourceLocation RAngleLoc,
2167                                              SourceLocation LParenLoc,
2168                                              Expr *SubExpr,
2169                                              SourceLocation RParenLoc) {
2170     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2171                                        TInfo, SubExpr,
2172                                        SourceRange(LAngleLoc, RAngleLoc),
2173                                        SourceRange(LParenLoc, RParenLoc));
2174   }
2175
2176   /// \brief Build a new C++ reinterpret_cast expression.
2177   ///
2178   /// By default, performs semantic analysis to build the new expression.
2179   /// Subclasses may override this routine to provide different behavior.
2180   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2181                                                  SourceLocation LAngleLoc,
2182                                                  TypeSourceInfo *TInfo,
2183                                                  SourceLocation RAngleLoc,
2184                                                  SourceLocation LParenLoc,
2185                                                  Expr *SubExpr,
2186                                                  SourceLocation RParenLoc) {
2187     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2188                                        TInfo, SubExpr,
2189                                        SourceRange(LAngleLoc, RAngleLoc),
2190                                        SourceRange(LParenLoc, RParenLoc));
2191   }
2192
2193   /// \brief Build a new C++ const_cast expression.
2194   ///
2195   /// By default, performs semantic analysis to build the new expression.
2196   /// Subclasses may override this routine to provide different behavior.
2197   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2198                                            SourceLocation LAngleLoc,
2199                                            TypeSourceInfo *TInfo,
2200                                            SourceLocation RAngleLoc,
2201                                            SourceLocation LParenLoc,
2202                                            Expr *SubExpr,
2203                                            SourceLocation RParenLoc) {
2204     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2205                                        TInfo, SubExpr,
2206                                        SourceRange(LAngleLoc, RAngleLoc),
2207                                        SourceRange(LParenLoc, RParenLoc));
2208   }
2209
2210   /// \brief Build a new C++ functional-style cast expression.
2211   ///
2212   /// By default, performs semantic analysis to build the new expression.
2213   /// Subclasses may override this routine to provide different behavior.
2214   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2215                                           SourceLocation LParenLoc,
2216                                           Expr *Sub,
2217                                           SourceLocation RParenLoc) {
2218     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2219                                                MultiExprArg(&Sub, 1),
2220                                                RParenLoc);
2221   }
2222
2223   /// \brief Build a new C++ typeid(type) expression.
2224   ///
2225   /// By default, performs semantic analysis to build the new expression.
2226   /// Subclasses may override this routine to provide different behavior.
2227   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2228                                         SourceLocation TypeidLoc,
2229                                         TypeSourceInfo *Operand,
2230                                         SourceLocation RParenLoc) {
2231     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2232                                     RParenLoc);
2233   }
2234
2235
2236   /// \brief Build a new C++ typeid(expr) 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 RebuildCXXTypeidExpr(QualType TypeInfoType,
2241                                         SourceLocation TypeidLoc,
2242                                         Expr *Operand,
2243                                         SourceLocation RParenLoc) {
2244     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2245                                     RParenLoc);
2246   }
2247
2248   /// \brief Build a new C++ __uuidof(type) expression.
2249   ///
2250   /// By default, performs semantic analysis to build the new expression.
2251   /// Subclasses may override this routine to provide different behavior.
2252   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2253                                         SourceLocation TypeidLoc,
2254                                         TypeSourceInfo *Operand,
2255                                         SourceLocation RParenLoc) {
2256     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2257                                     RParenLoc);
2258   }
2259
2260   /// \brief Build a new C++ __uuidof(expr) expression.
2261   ///
2262   /// By default, performs semantic analysis to build the new expression.
2263   /// Subclasses may override this routine to provide different behavior.
2264   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2265                                         SourceLocation TypeidLoc,
2266                                         Expr *Operand,
2267                                         SourceLocation RParenLoc) {
2268     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2269                                     RParenLoc);
2270   }
2271
2272   /// \brief Build a new C++ "this" expression.
2273   ///
2274   /// By default, builds a new "this" expression without performing any
2275   /// semantic analysis. Subclasses may override this routine to provide
2276   /// different behavior.
2277   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2278                                 QualType ThisType,
2279                                 bool isImplicit) {
2280     getSema().CheckCXXThisCapture(ThisLoc);
2281     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2282   }
2283
2284   /// \brief Build a new C++ throw expression.
2285   ///
2286   /// By default, performs semantic analysis to build the new expression.
2287   /// Subclasses may override this routine to provide different behavior.
2288   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2289                                  bool IsThrownVariableInScope) {
2290     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2291   }
2292
2293   /// \brief Build a new C++ default-argument expression.
2294   ///
2295   /// By default, builds a new default-argument expression, which does not
2296   /// require any semantic analysis. Subclasses may override this routine to
2297   /// provide different behavior.
2298   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2299                                             ParmVarDecl *Param) {
2300     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2301   }
2302
2303   /// \brief Build a new C++11 default-initialization expression.
2304   ///
2305   /// By default, builds a new default field initialization expression, which
2306   /// does not require any semantic analysis. Subclasses may override this
2307   /// routine to provide different behavior.
2308   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2309                                        FieldDecl *Field) {
2310     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2311   }
2312
2313   /// \brief Build a new C++ zero-initialization expression.
2314   ///
2315   /// By default, performs semantic analysis to build the new expression.
2316   /// Subclasses may override this routine to provide different behavior.
2317   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2318                                            SourceLocation LParenLoc,
2319                                            SourceLocation RParenLoc) {
2320     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
2321                                                None, RParenLoc);
2322   }
2323
2324   /// \brief Build a new C++ "new" expression.
2325   ///
2326   /// By default, performs semantic analysis to build the new expression.
2327   /// Subclasses may override this routine to provide different behavior.
2328   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2329                                bool UseGlobal,
2330                                SourceLocation PlacementLParen,
2331                                MultiExprArg PlacementArgs,
2332                                SourceLocation PlacementRParen,
2333                                SourceRange TypeIdParens,
2334                                QualType AllocatedType,
2335                                TypeSourceInfo *AllocatedTypeInfo,
2336                                Expr *ArraySize,
2337                                SourceRange DirectInitRange,
2338                                Expr *Initializer) {
2339     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2340                                  PlacementLParen,
2341                                  PlacementArgs,
2342                                  PlacementRParen,
2343                                  TypeIdParens,
2344                                  AllocatedType,
2345                                  AllocatedTypeInfo,
2346                                  ArraySize,
2347                                  DirectInitRange,
2348                                  Initializer);
2349   }
2350
2351   /// \brief Build a new C++ "delete" expression.
2352   ///
2353   /// By default, performs semantic analysis to build the new expression.
2354   /// Subclasses may override this routine to provide different behavior.
2355   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2356                                         bool IsGlobalDelete,
2357                                         bool IsArrayForm,
2358                                         Expr *Operand) {
2359     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2360                                     Operand);
2361   }
2362
2363   /// \brief Build a new type trait expression.
2364   ///
2365   /// By default, performs semantic analysis to build the new expression.
2366   /// Subclasses may override this routine to provide different behavior.
2367   ExprResult RebuildTypeTrait(TypeTrait Trait,
2368                               SourceLocation StartLoc,
2369                               ArrayRef<TypeSourceInfo *> Args,
2370                               SourceLocation RParenLoc) {
2371     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2372   }
2373
2374   /// \brief Build a new array type trait expression.
2375   ///
2376   /// By default, performs semantic analysis to build the new expression.
2377   /// Subclasses may override this routine to provide different behavior.
2378   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2379                                    SourceLocation StartLoc,
2380                                    TypeSourceInfo *TSInfo,
2381                                    Expr *DimExpr,
2382                                    SourceLocation RParenLoc) {
2383     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2384   }
2385
2386   /// \brief Build a new expression trait expression.
2387   ///
2388   /// By default, performs semantic analysis to build the new expression.
2389   /// Subclasses may override this routine to provide different behavior.
2390   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2391                                    SourceLocation StartLoc,
2392                                    Expr *Queried,
2393                                    SourceLocation RParenLoc) {
2394     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2395   }
2396
2397   /// \brief Build a new (previously unresolved) declaration reference
2398   /// expression.
2399   ///
2400   /// By default, performs semantic analysis to build the new expression.
2401   /// Subclasses may override this routine to provide different behavior.
2402   ExprResult RebuildDependentScopeDeclRefExpr(
2403                                           NestedNameSpecifierLoc QualifierLoc,
2404                                           SourceLocation TemplateKWLoc,
2405                                        const DeclarationNameInfo &NameInfo,
2406                               const TemplateArgumentListInfo *TemplateArgs,
2407                                           bool IsAddressOfOperand,
2408                                           TypeSourceInfo **RecoveryTSI) {
2409     CXXScopeSpec SS;
2410     SS.Adopt(QualifierLoc);
2411
2412     if (TemplateArgs || TemplateKWLoc.isValid())
2413       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2414                                                     TemplateArgs);
2415
2416     return getSema().BuildQualifiedDeclarationNameExpr(
2417         SS, NameInfo, IsAddressOfOperand, RecoveryTSI);
2418   }
2419
2420   /// \brief Build a new template-id expression.
2421   ///
2422   /// By default, performs semantic analysis to build the new expression.
2423   /// Subclasses may override this routine to provide different behavior.
2424   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2425                                    SourceLocation TemplateKWLoc,
2426                                    LookupResult &R,
2427                                    bool RequiresADL,
2428                               const TemplateArgumentListInfo *TemplateArgs) {
2429     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2430                                          TemplateArgs);
2431   }
2432
2433   /// \brief Build a new object-construction expression.
2434   ///
2435   /// By default, performs semantic analysis to build the new expression.
2436   /// Subclasses may override this routine to provide different behavior.
2437   ExprResult RebuildCXXConstructExpr(QualType T,
2438                                      SourceLocation Loc,
2439                                      CXXConstructorDecl *Constructor,
2440                                      bool IsElidable,
2441                                      MultiExprArg Args,
2442                                      bool HadMultipleCandidates,
2443                                      bool ListInitialization,
2444                                      bool StdInitListInitialization,
2445                                      bool RequiresZeroInit,
2446                              CXXConstructExpr::ConstructionKind ConstructKind,
2447                                      SourceRange ParenRange) {
2448     SmallVector<Expr*, 8> ConvertedArgs;
2449     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2450                                           ConvertedArgs))
2451       return ExprError();
2452
2453     return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
2454                                            ConvertedArgs,
2455                                            HadMultipleCandidates,
2456                                            ListInitialization,
2457                                            StdInitListInitialization,
2458                                            RequiresZeroInit, ConstructKind,
2459                                            ParenRange);
2460   }
2461
2462   /// \brief Build a new object-construction expression.
2463   ///
2464   /// By default, performs semantic analysis to build the new expression.
2465   /// Subclasses may override this routine to provide different behavior.
2466   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2467                                            SourceLocation LParenLoc,
2468                                            MultiExprArg Args,
2469                                            SourceLocation RParenLoc) {
2470     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2471                                                LParenLoc,
2472                                                Args,
2473                                                RParenLoc);
2474   }
2475
2476   /// \brief Build a new object-construction expression.
2477   ///
2478   /// By default, performs semantic analysis to build the new expression.
2479   /// Subclasses may override this routine to provide different behavior.
2480   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2481                                                SourceLocation LParenLoc,
2482                                                MultiExprArg Args,
2483                                                SourceLocation RParenLoc) {
2484     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2485                                                LParenLoc,
2486                                                Args,
2487                                                RParenLoc);
2488   }
2489
2490   /// \brief Build a new member reference expression.
2491   ///
2492   /// By default, performs semantic analysis to build the new expression.
2493   /// Subclasses may override this routine to provide different behavior.
2494   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2495                                                 QualType BaseType,
2496                                                 bool IsArrow,
2497                                                 SourceLocation OperatorLoc,
2498                                           NestedNameSpecifierLoc QualifierLoc,
2499                                                 SourceLocation TemplateKWLoc,
2500                                             NamedDecl *FirstQualifierInScope,
2501                                    const DeclarationNameInfo &MemberNameInfo,
2502                               const TemplateArgumentListInfo *TemplateArgs) {
2503     CXXScopeSpec SS;
2504     SS.Adopt(QualifierLoc);
2505
2506     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2507                                             OperatorLoc, IsArrow,
2508                                             SS, TemplateKWLoc,
2509                                             FirstQualifierInScope,
2510                                             MemberNameInfo,
2511                                             TemplateArgs);
2512   }
2513
2514   /// \brief Build a new member reference expression.
2515   ///
2516   /// By default, performs semantic analysis to build the new expression.
2517   /// Subclasses may override this routine to provide different behavior.
2518   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2519                                          SourceLocation OperatorLoc,
2520                                          bool IsArrow,
2521                                          NestedNameSpecifierLoc QualifierLoc,
2522                                          SourceLocation TemplateKWLoc,
2523                                          NamedDecl *FirstQualifierInScope,
2524                                          LookupResult &R,
2525                                 const TemplateArgumentListInfo *TemplateArgs) {
2526     CXXScopeSpec SS;
2527     SS.Adopt(QualifierLoc);
2528
2529     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2530                                             OperatorLoc, IsArrow,
2531                                             SS, TemplateKWLoc,
2532                                             FirstQualifierInScope,
2533                                             R, TemplateArgs);
2534   }
2535
2536   /// \brief Build a new noexcept expression.
2537   ///
2538   /// By default, performs semantic analysis to build the new expression.
2539   /// Subclasses may override this routine to provide different behavior.
2540   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2541     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2542   }
2543
2544   /// \brief Build a new expression to compute the length of a parameter pack.
2545   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
2546                                    SourceLocation PackLoc,
2547                                    SourceLocation RParenLoc,
2548                                    Optional<unsigned> Length) {
2549     if (Length)
2550       return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(),
2551                                                   OperatorLoc, Pack, PackLoc,
2552                                                   RParenLoc, *Length);
2553
2554     return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(),
2555                                                 OperatorLoc, Pack, PackLoc,
2556                                                 RParenLoc);
2557   }
2558
2559   /// \brief Build a new Objective-C boxed expression.
2560   ///
2561   /// By default, performs semantic analysis to build the new expression.
2562   /// Subclasses may override this routine to provide different behavior.
2563   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2564     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2565   }
2566
2567   /// \brief Build a new Objective-C array literal.
2568   ///
2569   /// By default, performs semantic analysis to build the new expression.
2570   /// Subclasses may override this routine to provide different behavior.
2571   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2572                                      Expr **Elements, unsigned NumElements) {
2573     return getSema().BuildObjCArrayLiteral(Range,
2574                                            MultiExprArg(Elements, NumElements));
2575   }
2576
2577   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2578                                          Expr *Base, Expr *Key,
2579                                          ObjCMethodDecl *getterMethod,
2580                                          ObjCMethodDecl *setterMethod) {
2581     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2582                                                    getterMethod, setterMethod);
2583   }
2584
2585   /// \brief Build a new Objective-C dictionary literal.
2586   ///
2587   /// By default, performs semantic analysis to build the new expression.
2588   /// Subclasses may override this routine to provide different behavior.
2589   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2590                                           ObjCDictionaryElement *Elements,
2591                                           unsigned NumElements) {
2592     return getSema().BuildObjCDictionaryLiteral(Range, Elements, NumElements);
2593   }
2594
2595   /// \brief Build a new Objective-C \@encode expression.
2596   ///
2597   /// By default, performs semantic analysis to build the new expression.
2598   /// Subclasses may override this routine to provide different behavior.
2599   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2600                                          TypeSourceInfo *EncodeTypeInfo,
2601                                          SourceLocation RParenLoc) {
2602     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2603   }
2604
2605   /// \brief Build a new Objective-C class message.
2606   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2607                                           Selector Sel,
2608                                           ArrayRef<SourceLocation> SelectorLocs,
2609                                           ObjCMethodDecl *Method,
2610                                           SourceLocation LBracLoc,
2611                                           MultiExprArg Args,
2612                                           SourceLocation RBracLoc) {
2613     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2614                                      ReceiverTypeInfo->getType(),
2615                                      /*SuperLoc=*/SourceLocation(),
2616                                      Sel, Method, LBracLoc, SelectorLocs,
2617                                      RBracLoc, Args);
2618   }
2619
2620   /// \brief Build a new Objective-C instance message.
2621   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2622                                           Selector Sel,
2623                                           ArrayRef<SourceLocation> SelectorLocs,
2624                                           ObjCMethodDecl *Method,
2625                                           SourceLocation LBracLoc,
2626                                           MultiExprArg Args,
2627                                           SourceLocation RBracLoc) {
2628     return SemaRef.BuildInstanceMessage(Receiver,
2629                                         Receiver->getType(),
2630                                         /*SuperLoc=*/SourceLocation(),
2631                                         Sel, Method, LBracLoc, SelectorLocs,
2632                                         RBracLoc, Args);
2633   }
2634
2635   /// \brief Build a new Objective-C instance/class message to 'super'.
2636   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
2637                                     Selector Sel,
2638                                     ArrayRef<SourceLocation> SelectorLocs,
2639                                     ObjCMethodDecl *Method,
2640                                     SourceLocation LBracLoc,
2641                                     MultiExprArg Args,
2642                                     SourceLocation RBracLoc) {
2643     ObjCInterfaceDecl *Class = Method->getClassInterface();
2644     QualType ReceiverTy = SemaRef.Context.getObjCInterfaceType(Class);
2645     
2646     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
2647                                           ReceiverTy,
2648                                           SuperLoc,
2649                                           Sel, Method, LBracLoc, SelectorLocs,
2650                                           RBracLoc, Args)
2651                                       : SemaRef.BuildClassMessage(nullptr,
2652                                           ReceiverTy,
2653                                           SuperLoc,
2654                                           Sel, Method, LBracLoc, SelectorLocs,
2655                                           RBracLoc, Args);
2656
2657       
2658   }
2659
2660   /// \brief Build a new Objective-C ivar reference expression.
2661   ///
2662   /// By default, performs semantic analysis to build the new expression.
2663   /// Subclasses may override this routine to provide different behavior.
2664   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
2665                                           SourceLocation IvarLoc,
2666                                           bool IsArrow, bool IsFreeIvar) {
2667     // FIXME: We lose track of the IsFreeIvar bit.
2668     CXXScopeSpec SS;
2669     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
2670     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2671                                               /*FIXME:*/IvarLoc, IsArrow,
2672                                               SS, SourceLocation(),
2673                                               /*FirstQualifierInScope=*/nullptr,
2674                                               NameInfo,
2675                                               /*TemplateArgs=*/nullptr);
2676   }
2677
2678   /// \brief Build a new Objective-C property reference expression.
2679   ///
2680   /// By default, performs semantic analysis to build the new expression.
2681   /// Subclasses may override this routine to provide different behavior.
2682   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
2683                                         ObjCPropertyDecl *Property,
2684                                         SourceLocation PropertyLoc) {
2685     CXXScopeSpec SS;
2686     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
2687     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2688                                               /*FIXME:*/PropertyLoc,
2689                                               /*IsArrow=*/false,
2690                                               SS, SourceLocation(),
2691                                               /*FirstQualifierInScope=*/nullptr,
2692                                               NameInfo,
2693                                               /*TemplateArgs=*/nullptr);
2694   }
2695
2696   /// \brief Build a new Objective-C property reference expression.
2697   ///
2698   /// By default, performs semantic analysis to build the new expression.
2699   /// Subclasses may override this routine to provide different behavior.
2700   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
2701                                         ObjCMethodDecl *Getter,
2702                                         ObjCMethodDecl *Setter,
2703                                         SourceLocation PropertyLoc) {
2704     // Since these expressions can only be value-dependent, we do not
2705     // need to perform semantic analysis again.
2706     return Owned(
2707       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
2708                                                   VK_LValue, OK_ObjCProperty,
2709                                                   PropertyLoc, Base));
2710   }
2711
2712   /// \brief Build a new Objective-C "isa" expression.
2713   ///
2714   /// By default, performs semantic analysis to build the new expression.
2715   /// Subclasses may override this routine to provide different behavior.
2716   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
2717                                 SourceLocation OpLoc, bool IsArrow) {
2718     CXXScopeSpec SS;
2719     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
2720     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2721                                               OpLoc, IsArrow,
2722                                               SS, SourceLocation(),
2723                                               /*FirstQualifierInScope=*/nullptr,
2724                                               NameInfo,
2725                                               /*TemplateArgs=*/nullptr);
2726   }
2727
2728   /// \brief Build a new shuffle vector expression.
2729   ///
2730   /// By default, performs semantic analysis to build the new expression.
2731   /// Subclasses may override this routine to provide different behavior.
2732   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
2733                                       MultiExprArg SubExprs,
2734                                       SourceLocation RParenLoc) {
2735     // Find the declaration for __builtin_shufflevector
2736     const IdentifierInfo &Name
2737       = SemaRef.Context.Idents.get("__builtin_shufflevector");
2738     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
2739     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
2740     assert(!Lookup.empty() && "No __builtin_shufflevector?");
2741
2742     // Build a reference to the __builtin_shufflevector builtin
2743     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
2744     Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
2745                                                   SemaRef.Context.BuiltinFnTy,
2746                                                   VK_RValue, BuiltinLoc);
2747     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
2748     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
2749                                        CK_BuiltinFnToFnPtr).get();
2750
2751     // Build the CallExpr
2752     ExprResult TheCall = new (SemaRef.Context) CallExpr(
2753         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
2754         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
2755
2756     // Type-check the __builtin_shufflevector expression.
2757     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
2758   }
2759
2760   /// \brief Build a new convert vector expression.
2761   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
2762                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
2763                                       SourceLocation RParenLoc) {
2764     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
2765                                          BuiltinLoc, RParenLoc);
2766   }
2767
2768   /// \brief Build a new template argument pack expansion.
2769   ///
2770   /// By default, performs semantic analysis to build a new pack expansion
2771   /// for a template argument. Subclasses may override this routine to provide
2772   /// different behavior.
2773   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
2774                                            SourceLocation EllipsisLoc,
2775                                            Optional<unsigned> NumExpansions) {
2776     switch (Pattern.getArgument().getKind()) {
2777     case TemplateArgument::Expression: {
2778       ExprResult Result
2779         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
2780                                        EllipsisLoc, NumExpansions);
2781       if (Result.isInvalid())
2782         return TemplateArgumentLoc();
2783
2784       return TemplateArgumentLoc(Result.get(), Result.get());
2785     }
2786
2787     case TemplateArgument::Template:
2788       return TemplateArgumentLoc(TemplateArgument(
2789                                           Pattern.getArgument().getAsTemplate(),
2790                                                   NumExpansions),
2791                                  Pattern.getTemplateQualifierLoc(),
2792                                  Pattern.getTemplateNameLoc(),
2793                                  EllipsisLoc);
2794
2795     case TemplateArgument::Null:
2796     case TemplateArgument::Integral:
2797     case TemplateArgument::Declaration:
2798     case TemplateArgument::Pack:
2799     case TemplateArgument::TemplateExpansion:
2800     case TemplateArgument::NullPtr:
2801       llvm_unreachable("Pack expansion pattern has no parameter packs");
2802
2803     case TemplateArgument::Type:
2804       if (TypeSourceInfo *Expansion
2805             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
2806                                            EllipsisLoc,
2807                                            NumExpansions))
2808         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
2809                                    Expansion);
2810       break;
2811     }
2812
2813     return TemplateArgumentLoc();
2814   }
2815
2816   /// \brief Build a new expression pack expansion.
2817   ///
2818   /// By default, performs semantic analysis to build a new pack expansion
2819   /// for an expression. Subclasses may override this routine to provide
2820   /// different behavior.
2821   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
2822                                   Optional<unsigned> NumExpansions) {
2823     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
2824   }
2825
2826   /// \brief Build a new C++1z fold-expression.
2827   ///
2828   /// By default, performs semantic analysis in order to build a new fold
2829   /// expression.
2830   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
2831                                 BinaryOperatorKind Operator,
2832                                 SourceLocation EllipsisLoc, Expr *RHS,
2833                                 SourceLocation RParenLoc) {
2834     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
2835                                       RHS, RParenLoc);
2836   }
2837
2838   /// \brief Build an empty C++1z fold-expression with the given operator.
2839   ///
2840   /// By default, produces the fallback value for the fold-expression, or
2841   /// produce an error if there is no fallback value.
2842   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
2843                                      BinaryOperatorKind Operator) {
2844     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
2845   }
2846
2847   /// \brief Build a new atomic operation expression.
2848   ///
2849   /// By default, performs semantic analysis to build the new expression.
2850   /// Subclasses may override this routine to provide different behavior.
2851   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
2852                                MultiExprArg SubExprs,
2853                                QualType RetTy,
2854                                AtomicExpr::AtomicOp Op,
2855                                SourceLocation RParenLoc) {
2856     // Just create the expression; there is not any interesting semantic
2857     // analysis here because we can't actually build an AtomicExpr until
2858     // we are sure it is semantically sound.
2859     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
2860                                             RParenLoc);
2861   }
2862
2863 private:
2864   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
2865                                      QualType ObjectType,
2866                                      NamedDecl *FirstQualifierInScope,
2867                                      CXXScopeSpec &SS);
2868
2869   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
2870                                              QualType ObjectType,
2871                                              NamedDecl *FirstQualifierInScope,
2872                                              CXXScopeSpec &SS);
2873
2874   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
2875                                             NamedDecl *FirstQualifierInScope,
2876                                             CXXScopeSpec &SS);
2877 };
2878
2879 template<typename Derived>
2880 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
2881   if (!S)
2882     return S;
2883
2884   switch (S->getStmtClass()) {
2885   case Stmt::NoStmtClass: break;
2886
2887   // Transform individual statement nodes
2888 #define STMT(Node, Parent)                                              \
2889   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
2890 #define ABSTRACT_STMT(Node)
2891 #define EXPR(Node, Parent)
2892 #include "clang/AST/StmtNodes.inc"
2893
2894   // Transform expressions by calling TransformExpr.
2895 #define STMT(Node, Parent)
2896 #define ABSTRACT_STMT(Stmt)
2897 #define EXPR(Node, Parent) case Stmt::Node##Class:
2898 #include "clang/AST/StmtNodes.inc"
2899     {
2900       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
2901       if (E.isInvalid())
2902         return StmtError();
2903
2904       return getSema().ActOnExprStmt(E);
2905     }
2906   }
2907
2908   return S;
2909 }
2910
2911 template<typename Derived>
2912 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
2913   if (!S)
2914     return S;
2915
2916   switch (S->getClauseKind()) {
2917   default: break;
2918   // Transform individual clause nodes
2919 #define OPENMP_CLAUSE(Name, Class)                                             \
2920   case OMPC_ ## Name :                                                         \
2921     return getDerived().Transform ## Class(cast<Class>(S));
2922 #include "clang/Basic/OpenMPKinds.def"
2923   }
2924
2925   return S;
2926 }
2927
2928
2929 template<typename Derived>
2930 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
2931   if (!E)
2932     return E;
2933
2934   switch (E->getStmtClass()) {
2935     case Stmt::NoStmtClass: break;
2936 #define STMT(Node, Parent) case Stmt::Node##Class: break;
2937 #define ABSTRACT_STMT(Stmt)
2938 #define EXPR(Node, Parent)                                              \
2939     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
2940 #include "clang/AST/StmtNodes.inc"
2941   }
2942
2943   return E;
2944 }
2945
2946 template<typename Derived>
2947 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
2948                                                         bool NotCopyInit) {
2949   // Initializers are instantiated like expressions, except that various outer
2950   // layers are stripped.
2951   if (!Init)
2952     return Init;
2953
2954   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
2955     Init = ExprTemp->getSubExpr();
2956
2957   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
2958     Init = MTE->GetTemporaryExpr();
2959
2960   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
2961     Init = Binder->getSubExpr();
2962
2963   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
2964     Init = ICE->getSubExprAsWritten();
2965
2966   if (CXXStdInitializerListExpr *ILE =
2967           dyn_cast<CXXStdInitializerListExpr>(Init))
2968     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
2969
2970   // If this is copy-initialization, we only need to reconstruct
2971   // InitListExprs. Other forms of copy-initialization will be a no-op if
2972   // the initializer is already the right type.
2973   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
2974   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
2975     return getDerived().TransformExpr(Init);
2976
2977   // Revert value-initialization back to empty parens.
2978   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
2979     SourceRange Parens = VIE->getSourceRange();
2980     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
2981                                              Parens.getEnd());
2982   }
2983
2984   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
2985   if (isa<ImplicitValueInitExpr>(Init))
2986     return getDerived().RebuildParenListExpr(SourceLocation(), None,
2987                                              SourceLocation());
2988
2989   // Revert initialization by constructor back to a parenthesized or braced list
2990   // of expressions. Any other form of initializer can just be reused directly.
2991   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
2992     return getDerived().TransformExpr(Init);
2993
2994   // If the initialization implicitly converted an initializer list to a
2995   // std::initializer_list object, unwrap the std::initializer_list too.
2996   if (Construct && Construct->isStdInitListInitialization())
2997     return TransformInitializer(Construct->getArg(0), NotCopyInit);
2998
2999   SmallVector<Expr*, 8> NewArgs;
3000   bool ArgChanged = false;
3001   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3002                                   /*IsCall*/true, NewArgs, &ArgChanged))
3003     return ExprError();
3004
3005   // If this was list initialization, revert to list form.
3006   if (Construct->isListInitialization())
3007     return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs,
3008                                         Construct->getLocEnd(),
3009                                         Construct->getType());
3010
3011   // Build a ParenListExpr to represent anything else.
3012   SourceRange Parens = Construct->getParenOrBraceRange();
3013   if (Parens.isInvalid()) {
3014     // This was a variable declaration's initialization for which no initializer
3015     // was specified.
3016     assert(NewArgs.empty() &&
3017            "no parens or braces but have direct init with arguments?");
3018     return ExprEmpty();
3019   }
3020   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3021                                            Parens.getEnd());
3022 }
3023
3024 template<typename Derived>
3025 bool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
3026                                             unsigned NumInputs,
3027                                             bool IsCall,
3028                                       SmallVectorImpl<Expr *> &Outputs,
3029                                             bool *ArgChanged) {
3030   for (unsigned I = 0; I != NumInputs; ++I) {
3031     // If requested, drop call arguments that need to be dropped.
3032     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3033       if (ArgChanged)
3034         *ArgChanged = true;
3035
3036       break;
3037     }
3038
3039     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3040       Expr *Pattern = Expansion->getPattern();
3041
3042       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3043       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3044       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3045
3046       // Determine whether the set of unexpanded parameter packs can and should
3047       // be expanded.
3048       bool Expand = true;
3049       bool RetainExpansion = false;
3050       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3051       Optional<unsigned> NumExpansions = OrigNumExpansions;
3052       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3053                                                Pattern->getSourceRange(),
3054                                                Unexpanded,
3055                                                Expand, RetainExpansion,
3056                                                NumExpansions))
3057         return true;
3058
3059       if (!Expand) {
3060         // The transform has determined that we should perform a simple
3061         // transformation on the pack expansion, producing another pack
3062         // expansion.
3063         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3064         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3065         if (OutPattern.isInvalid())
3066           return true;
3067
3068         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3069                                                 Expansion->getEllipsisLoc(),
3070                                                            NumExpansions);
3071         if (Out.isInvalid())
3072           return true;
3073
3074         if (ArgChanged)
3075           *ArgChanged = true;
3076         Outputs.push_back(Out.get());
3077         continue;
3078       }
3079
3080       // Record right away that the argument was changed.  This needs
3081       // to happen even if the array expands to nothing.
3082       if (ArgChanged) *ArgChanged = true;
3083
3084       // The transform has determined that we should perform an elementwise
3085       // expansion of the pattern. Do so.
3086       for (unsigned I = 0; I != *NumExpansions; ++I) {
3087         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3088         ExprResult Out = getDerived().TransformExpr(Pattern);
3089         if (Out.isInvalid())
3090           return true;
3091
3092         // FIXME: Can this happen? We should not try to expand the pack
3093         // in this case.
3094         if (Out.get()->containsUnexpandedParameterPack()) {
3095           Out = getDerived().RebuildPackExpansion(
3096               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3097           if (Out.isInvalid())
3098             return true;
3099         }
3100
3101         Outputs.push_back(Out.get());
3102       }
3103
3104       // If we're supposed to retain a pack expansion, do so by temporarily
3105       // forgetting the partially-substituted parameter pack.
3106       if (RetainExpansion) {
3107         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3108
3109         ExprResult Out = getDerived().TransformExpr(Pattern);
3110         if (Out.isInvalid())
3111           return true;
3112
3113         Out = getDerived().RebuildPackExpansion(
3114             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3115         if (Out.isInvalid())
3116           return true;
3117
3118         Outputs.push_back(Out.get());
3119       }
3120
3121       continue;
3122     }
3123
3124     ExprResult Result =
3125       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3126              : getDerived().TransformExpr(Inputs[I]);
3127     if (Result.isInvalid())
3128       return true;
3129
3130     if (Result.get() != Inputs[I] && ArgChanged)
3131       *ArgChanged = true;
3132
3133     Outputs.push_back(Result.get());
3134   }
3135
3136   return false;
3137 }
3138
3139 template<typename Derived>
3140 NestedNameSpecifierLoc
3141 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3142                                                     NestedNameSpecifierLoc NNS,
3143                                                      QualType ObjectType,
3144                                              NamedDecl *FirstQualifierInScope) {
3145   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3146   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3147        Qualifier = Qualifier.getPrefix())
3148     Qualifiers.push_back(Qualifier);
3149
3150   CXXScopeSpec SS;
3151   while (!Qualifiers.empty()) {
3152     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3153     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3154
3155     switch (QNNS->getKind()) {
3156     case NestedNameSpecifier::Identifier:
3157       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr,
3158                                               *QNNS->getAsIdentifier(),
3159                                               Q.getLocalBeginLoc(),
3160                                               Q.getLocalEndLoc(),
3161                                               ObjectType, false, SS,
3162                                               FirstQualifierInScope, false))
3163         return NestedNameSpecifierLoc();
3164
3165       break;
3166
3167     case NestedNameSpecifier::Namespace: {
3168       NamespaceDecl *NS
3169         = cast_or_null<NamespaceDecl>(
3170                                     getDerived().TransformDecl(
3171                                                           Q.getLocalBeginLoc(),
3172                                                        QNNS->getAsNamespace()));
3173       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3174       break;
3175     }
3176
3177     case NestedNameSpecifier::NamespaceAlias: {
3178       NamespaceAliasDecl *Alias
3179         = cast_or_null<NamespaceAliasDecl>(
3180                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3181                                                  QNNS->getAsNamespaceAlias()));
3182       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3183                 Q.getLocalEndLoc());
3184       break;
3185     }
3186
3187     case NestedNameSpecifier::Global:
3188       // There is no meaningful transformation that one could perform on the
3189       // global scope.
3190       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3191       break;
3192
3193     case NestedNameSpecifier::Super: {
3194       CXXRecordDecl *RD =
3195           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3196               SourceLocation(), QNNS->getAsRecordDecl()));
3197       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3198       break;
3199     }
3200
3201     case NestedNameSpecifier::TypeSpecWithTemplate:
3202     case NestedNameSpecifier::TypeSpec: {
3203       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3204                                               FirstQualifierInScope, SS);
3205
3206       if (!TL)
3207         return NestedNameSpecifierLoc();
3208
3209       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3210           (SemaRef.getLangOpts().CPlusPlus11 &&
3211            TL.getType()->isEnumeralType())) {
3212         assert(!TL.getType().hasLocalQualifiers() &&
3213                "Can't get cv-qualifiers here");
3214         if (TL.getType()->isEnumeralType())
3215           SemaRef.Diag(TL.getBeginLoc(),
3216                        diag::warn_cxx98_compat_enum_nested_name_spec);
3217         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3218                   Q.getLocalEndLoc());
3219         break;
3220       }
3221       // If the nested-name-specifier is an invalid type def, don't emit an
3222       // error because a previous error should have already been emitted.
3223       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3224       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3225         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3226           << TL.getType() << SS.getRange();
3227       }
3228       return NestedNameSpecifierLoc();
3229     }
3230     }
3231
3232     // The qualifier-in-scope and object type only apply to the leftmost entity.
3233     FirstQualifierInScope = nullptr;
3234     ObjectType = QualType();
3235   }
3236
3237   // Don't rebuild the nested-name-specifier if we don't have to.
3238   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3239       !getDerived().AlwaysRebuild())
3240     return NNS;
3241
3242   // If we can re-use the source-location data from the original
3243   // nested-name-specifier, do so.
3244   if (SS.location_size() == NNS.getDataLength() &&
3245       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3246     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3247
3248   // Allocate new nested-name-specifier location information.
3249   return SS.getWithLocInContext(SemaRef.Context);
3250 }
3251
3252 template<typename Derived>
3253 DeclarationNameInfo
3254 TreeTransform<Derived>
3255 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3256   DeclarationName Name = NameInfo.getName();
3257   if (!Name)
3258     return DeclarationNameInfo();
3259
3260   switch (Name.getNameKind()) {
3261   case DeclarationName::Identifier:
3262   case DeclarationName::ObjCZeroArgSelector:
3263   case DeclarationName::ObjCOneArgSelector:
3264   case DeclarationName::ObjCMultiArgSelector:
3265   case DeclarationName::CXXOperatorName:
3266   case DeclarationName::CXXLiteralOperatorName:
3267   case DeclarationName::CXXUsingDirective:
3268     return NameInfo;
3269
3270   case DeclarationName::CXXConstructorName:
3271   case DeclarationName::CXXDestructorName:
3272   case DeclarationName::CXXConversionFunctionName: {
3273     TypeSourceInfo *NewTInfo;
3274     CanQualType NewCanTy;
3275     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3276       NewTInfo = getDerived().TransformType(OldTInfo);
3277       if (!NewTInfo)
3278         return DeclarationNameInfo();
3279       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3280     }
3281     else {
3282       NewTInfo = nullptr;
3283       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3284       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3285       if (NewT.isNull())
3286         return DeclarationNameInfo();
3287       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3288     }
3289
3290     DeclarationName NewName
3291       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3292                                                            NewCanTy);
3293     DeclarationNameInfo NewNameInfo(NameInfo);
3294     NewNameInfo.setName(NewName);
3295     NewNameInfo.setNamedTypeInfo(NewTInfo);
3296     return NewNameInfo;
3297   }
3298   }
3299
3300   llvm_unreachable("Unknown name kind.");
3301 }
3302
3303 template<typename Derived>
3304 TemplateName
3305 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3306                                               TemplateName Name,
3307                                               SourceLocation NameLoc,
3308                                               QualType ObjectType,
3309                                               NamedDecl *FirstQualifierInScope) {
3310   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3311     TemplateDecl *Template = QTN->getTemplateDecl();
3312     assert(Template && "qualified template name must refer to a template");
3313
3314     TemplateDecl *TransTemplate
3315       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3316                                                               Template));
3317     if (!TransTemplate)
3318       return TemplateName();
3319
3320     if (!getDerived().AlwaysRebuild() &&
3321         SS.getScopeRep() == QTN->getQualifier() &&
3322         TransTemplate == Template)
3323       return Name;
3324
3325     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3326                                             TransTemplate);
3327   }
3328
3329   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3330     if (SS.getScopeRep()) {
3331       // These apply to the scope specifier, not the template.
3332       ObjectType = QualType();
3333       FirstQualifierInScope = nullptr;
3334     }
3335
3336     if (!getDerived().AlwaysRebuild() &&
3337         SS.getScopeRep() == DTN->getQualifier() &&
3338         ObjectType.isNull())
3339       return Name;
3340
3341     if (DTN->isIdentifier()) {
3342       return getDerived().RebuildTemplateName(SS,
3343                                               *DTN->getIdentifier(),
3344                                               NameLoc,
3345                                               ObjectType,
3346                                               FirstQualifierInScope);
3347     }
3348
3349     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
3350                                             ObjectType);
3351   }
3352
3353   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3354     TemplateDecl *TransTemplate
3355       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3356                                                               Template));
3357     if (!TransTemplate)
3358       return TemplateName();
3359
3360     if (!getDerived().AlwaysRebuild() &&
3361         TransTemplate == Template)
3362       return Name;
3363
3364     return TemplateName(TransTemplate);
3365   }
3366
3367   if (SubstTemplateTemplateParmPackStorage *SubstPack
3368       = Name.getAsSubstTemplateTemplateParmPack()) {
3369     TemplateTemplateParmDecl *TransParam
3370     = cast_or_null<TemplateTemplateParmDecl>(
3371             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3372     if (!TransParam)
3373       return TemplateName();
3374
3375     if (!getDerived().AlwaysRebuild() &&
3376         TransParam == SubstPack->getParameterPack())
3377       return Name;
3378
3379     return getDerived().RebuildTemplateName(TransParam,
3380                                             SubstPack->getArgumentPack());
3381   }
3382
3383   // These should be getting filtered out before they reach the AST.
3384   llvm_unreachable("overloaded function decl survived to here");
3385 }
3386
3387 template<typename Derived>
3388 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3389                                          const TemplateArgument &Arg,
3390                                          TemplateArgumentLoc &Output) {
3391   SourceLocation Loc = getDerived().getBaseLocation();
3392   switch (Arg.getKind()) {
3393   case TemplateArgument::Null:
3394     llvm_unreachable("null template argument in TreeTransform");
3395     break;
3396
3397   case TemplateArgument::Type:
3398     Output = TemplateArgumentLoc(Arg,
3399                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3400
3401     break;
3402
3403   case TemplateArgument::Template:
3404   case TemplateArgument::TemplateExpansion: {
3405     NestedNameSpecifierLocBuilder Builder;
3406     TemplateName Template = Arg.getAsTemplate();
3407     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3408       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3409     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3410       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3411
3412     if (Arg.getKind() == TemplateArgument::Template)
3413       Output = TemplateArgumentLoc(Arg,
3414                                    Builder.getWithLocInContext(SemaRef.Context),
3415                                    Loc);
3416     else
3417       Output = TemplateArgumentLoc(Arg,
3418                                    Builder.getWithLocInContext(SemaRef.Context),
3419                                    Loc, Loc);
3420
3421     break;
3422   }
3423
3424   case TemplateArgument::Expression:
3425     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3426     break;
3427
3428   case TemplateArgument::Declaration:
3429   case TemplateArgument::Integral:
3430   case TemplateArgument::Pack:
3431   case TemplateArgument::NullPtr:
3432     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3433     break;
3434   }
3435 }
3436
3437 template<typename Derived>
3438 bool TreeTransform<Derived>::TransformTemplateArgument(
3439                                          const TemplateArgumentLoc &Input,
3440                                          TemplateArgumentLoc &Output) {
3441   const TemplateArgument &Arg = Input.getArgument();
3442   switch (Arg.getKind()) {
3443   case TemplateArgument::Null:
3444   case TemplateArgument::Integral:
3445   case TemplateArgument::Pack:
3446   case TemplateArgument::Declaration:
3447   case TemplateArgument::NullPtr:
3448     llvm_unreachable("Unexpected TemplateArgument");
3449
3450   case TemplateArgument::Type: {
3451     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3452     if (!DI)
3453       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3454
3455     DI = getDerived().TransformType(DI);
3456     if (!DI) return true;
3457
3458     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3459     return false;
3460   }
3461
3462   case TemplateArgument::Template: {
3463     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3464     if (QualifierLoc) {
3465       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3466       if (!QualifierLoc)
3467         return true;
3468     }
3469
3470     CXXScopeSpec SS;
3471     SS.Adopt(QualifierLoc);
3472     TemplateName Template
3473       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3474                                            Input.getTemplateNameLoc());
3475     if (Template.isNull())
3476       return true;
3477
3478     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3479                                  Input.getTemplateNameLoc());
3480     return false;
3481   }
3482
3483   case TemplateArgument::TemplateExpansion:
3484     llvm_unreachable("Caller should expand pack expansions");
3485
3486   case TemplateArgument::Expression: {
3487     // Template argument expressions are constant expressions.
3488     EnterExpressionEvaluationContext Unevaluated(getSema(),
3489                                                  Sema::ConstantEvaluated);
3490
3491     Expr *InputExpr = Input.getSourceExpression();
3492     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3493
3494     ExprResult E = getDerived().TransformExpr(InputExpr);
3495     E = SemaRef.ActOnConstantExpression(E);
3496     if (E.isInvalid()) return true;
3497     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3498     return false;
3499   }
3500   }
3501
3502   // Work around bogus GCC warning
3503   return true;
3504 }
3505
3506 /// \brief Iterator adaptor that invents template argument location information
3507 /// for each of the template arguments in its underlying iterator.
3508 template<typename Derived, typename InputIterator>
3509 class TemplateArgumentLocInventIterator {
3510   TreeTransform<Derived> &Self;
3511   InputIterator Iter;
3512
3513 public:
3514   typedef TemplateArgumentLoc value_type;
3515   typedef TemplateArgumentLoc reference;
3516   typedef typename std::iterator_traits<InputIterator>::difference_type
3517     difference_type;
3518   typedef std::input_iterator_tag iterator_category;
3519
3520   class pointer {
3521     TemplateArgumentLoc Arg;
3522
3523   public:
3524     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3525
3526     const TemplateArgumentLoc *operator->() const { return &Arg; }
3527   };
3528
3529   TemplateArgumentLocInventIterator() { }
3530
3531   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3532                                              InputIterator Iter)
3533     : Self(Self), Iter(Iter) { }
3534
3535   TemplateArgumentLocInventIterator &operator++() {
3536     ++Iter;
3537     return *this;
3538   }
3539
3540   TemplateArgumentLocInventIterator operator++(int) {
3541     TemplateArgumentLocInventIterator Old(*this);
3542     ++(*this);
3543     return Old;
3544   }
3545
3546   reference operator*() const {
3547     TemplateArgumentLoc Result;
3548     Self.InventTemplateArgumentLoc(*Iter, Result);
3549     return Result;
3550   }
3551
3552   pointer operator->() const { return pointer(**this); }
3553
3554   friend bool operator==(const TemplateArgumentLocInventIterator &X,
3555                          const TemplateArgumentLocInventIterator &Y) {
3556     return X.Iter == Y.Iter;
3557   }
3558
3559   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3560                          const TemplateArgumentLocInventIterator &Y) {
3561     return X.Iter != Y.Iter;
3562   }
3563 };
3564
3565 template<typename Derived>
3566 template<typename InputIterator>
3567 bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First,
3568                                                         InputIterator Last,
3569                                             TemplateArgumentListInfo &Outputs) {
3570   for (; First != Last; ++First) {
3571     TemplateArgumentLoc Out;
3572     TemplateArgumentLoc In = *First;
3573
3574     if (In.getArgument().getKind() == TemplateArgument::Pack) {
3575       // Unpack argument packs, which we translate them into separate
3576       // arguments.
3577       // FIXME: We could do much better if we could guarantee that the
3578       // TemplateArgumentLocInfo for the pack expansion would be usable for
3579       // all of the template arguments in the argument pack.
3580       typedef TemplateArgumentLocInventIterator<Derived,
3581                                                 TemplateArgument::pack_iterator>
3582         PackLocIterator;
3583       if (TransformTemplateArguments(PackLocIterator(*this,
3584                                                  In.getArgument().pack_begin()),
3585                                      PackLocIterator(*this,
3586                                                    In.getArgument().pack_end()),
3587                                      Outputs))
3588         return true;
3589
3590       continue;
3591     }
3592
3593     if (In.getArgument().isPackExpansion()) {
3594       // We have a pack expansion, for which we will be substituting into
3595       // the pattern.
3596       SourceLocation Ellipsis;
3597       Optional<unsigned> OrigNumExpansions;
3598       TemplateArgumentLoc Pattern
3599         = getSema().getTemplateArgumentPackExpansionPattern(
3600               In, Ellipsis, OrigNumExpansions);
3601
3602       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3603       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3604       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3605
3606       // Determine whether the set of unexpanded parameter packs can and should
3607       // be expanded.
3608       bool Expand = true;
3609       bool RetainExpansion = false;
3610       Optional<unsigned> NumExpansions = OrigNumExpansions;
3611       if (getDerived().TryExpandParameterPacks(Ellipsis,
3612                                                Pattern.getSourceRange(),
3613                                                Unexpanded,
3614                                                Expand,
3615                                                RetainExpansion,
3616                                                NumExpansions))
3617         return true;
3618
3619       if (!Expand) {
3620         // The transform has determined that we should perform a simple
3621         // transformation on the pack expansion, producing another pack
3622         // expansion.
3623         TemplateArgumentLoc OutPattern;
3624         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3625         if (getDerived().TransformTemplateArgument(Pattern, OutPattern))
3626           return true;
3627
3628         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
3629                                                 NumExpansions);
3630         if (Out.getArgument().isNull())
3631           return true;
3632
3633         Outputs.addArgument(Out);
3634         continue;
3635       }
3636
3637       // The transform has determined that we should perform an elementwise
3638       // expansion of the pattern. Do so.
3639       for (unsigned I = 0; I != *NumExpansions; ++I) {
3640         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3641
3642         if (getDerived().TransformTemplateArgument(Pattern, Out))
3643           return true;
3644
3645         if (Out.getArgument().containsUnexpandedParameterPack()) {
3646           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3647                                                   OrigNumExpansions);
3648           if (Out.getArgument().isNull())
3649             return true;
3650         }
3651
3652         Outputs.addArgument(Out);
3653       }
3654
3655       // If we're supposed to retain a pack expansion, do so by temporarily
3656       // forgetting the partially-substituted parameter pack.
3657       if (RetainExpansion) {
3658         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3659
3660         if (getDerived().TransformTemplateArgument(Pattern, Out))
3661           return true;
3662
3663         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3664                                                 OrigNumExpansions);
3665         if (Out.getArgument().isNull())
3666           return true;
3667
3668         Outputs.addArgument(Out);
3669       }
3670
3671       continue;
3672     }
3673
3674     // The simple case:
3675     if (getDerived().TransformTemplateArgument(In, Out))
3676       return true;
3677
3678     Outputs.addArgument(Out);
3679   }
3680
3681   return false;
3682
3683 }
3684
3685 //===----------------------------------------------------------------------===//
3686 // Type transformation
3687 //===----------------------------------------------------------------------===//
3688
3689 template<typename Derived>
3690 QualType TreeTransform<Derived>::TransformType(QualType T) {
3691   if (getDerived().AlreadyTransformed(T))
3692     return T;
3693
3694   // Temporary workaround.  All of these transformations should
3695   // eventually turn into transformations on TypeLocs.
3696   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
3697                                                 getDerived().getBaseLocation());
3698
3699   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
3700
3701   if (!NewDI)
3702     return QualType();
3703
3704   return NewDI->getType();
3705 }
3706
3707 template<typename Derived>
3708 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
3709   // Refine the base location to the type's location.
3710   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
3711                        getDerived().getBaseEntity());
3712   if (getDerived().AlreadyTransformed(DI->getType()))
3713     return DI;
3714
3715   TypeLocBuilder TLB;
3716
3717   TypeLoc TL = DI->getTypeLoc();
3718   TLB.reserve(TL.getFullDataSize());
3719
3720   QualType Result = getDerived().TransformType(TLB, TL);
3721   if (Result.isNull())
3722     return nullptr;
3723
3724   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3725 }
3726
3727 template<typename Derived>
3728 QualType
3729 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
3730   switch (T.getTypeLocClass()) {
3731 #define ABSTRACT_TYPELOC(CLASS, PARENT)
3732 #define TYPELOC(CLASS, PARENT)                                                 \
3733   case TypeLoc::CLASS:                                                         \
3734     return getDerived().Transform##CLASS##Type(TLB,                            \
3735                                                T.castAs<CLASS##TypeLoc>());
3736 #include "clang/AST/TypeLocNodes.def"
3737   }
3738
3739   llvm_unreachable("unhandled type loc!");
3740 }
3741
3742 /// FIXME: By default, this routine adds type qualifiers only to types
3743 /// that can have qualifiers, and silently suppresses those qualifiers
3744 /// that are not permitted (e.g., qualifiers on reference or function
3745 /// types). This is the right thing for template instantiation, but
3746 /// probably not for other clients.
3747 template<typename Derived>
3748 QualType
3749 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
3750                                                QualifiedTypeLoc T) {
3751   Qualifiers Quals = T.getType().getLocalQualifiers();
3752
3753   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
3754   if (Result.isNull())
3755     return QualType();
3756
3757   // Silently suppress qualifiers if the result type can't be qualified.
3758   // FIXME: this is the right thing for template instantiation, but
3759   // probably not for other clients.
3760   if (Result->isFunctionType() || Result->isReferenceType())
3761     return Result;
3762
3763   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
3764   // resulting type.
3765   if (Quals.hasObjCLifetime()) {
3766     if (!Result->isObjCLifetimeType() && !Result->isDependentType())
3767       Quals.removeObjCLifetime();
3768     else if (Result.getObjCLifetime()) {
3769       // Objective-C ARC:
3770       //   A lifetime qualifier applied to a substituted template parameter
3771       //   overrides the lifetime qualifier from the template argument.
3772       const AutoType *AutoTy;
3773       if (const SubstTemplateTypeParmType *SubstTypeParam
3774                                 = dyn_cast<SubstTemplateTypeParmType>(Result)) {
3775         QualType Replacement = SubstTypeParam->getReplacementType();
3776         Qualifiers Qs = Replacement.getQualifiers();
3777         Qs.removeObjCLifetime();
3778         Replacement
3779           = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(),
3780                                              Qs);
3781         Result = SemaRef.Context.getSubstTemplateTypeParmType(
3782                                         SubstTypeParam->getReplacedParameter(),
3783                                                               Replacement);
3784         TLB.TypeWasModifiedSafely(Result);
3785       } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) {
3786         // 'auto' types behave the same way as template parameters.
3787         QualType Deduced = AutoTy->getDeducedType();
3788         Qualifiers Qs = Deduced.getQualifiers();
3789         Qs.removeObjCLifetime();
3790         Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(),
3791                                                    Qs);
3792         Result = SemaRef.Context.getAutoType(Deduced, AutoTy->isDecltypeAuto(), 
3793                                 AutoTy->isDependentType());
3794         TLB.TypeWasModifiedSafely(Result);
3795       } else {
3796         // Otherwise, complain about the addition of a qualifier to an
3797         // already-qualified type.
3798         SourceRange R = T.getUnqualifiedLoc().getSourceRange();
3799         SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant)
3800           << Result << R;
3801
3802         Quals.removeObjCLifetime();
3803       }
3804     }
3805   }
3806   if (!Quals.empty()) {
3807     Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
3808     // BuildQualifiedType might not add qualifiers if they are invalid.
3809     if (Result.hasLocalQualifiers())
3810       TLB.push<QualifiedTypeLoc>(Result);
3811     // No location information to preserve.
3812   }
3813
3814   return Result;
3815 }
3816
3817 template<typename Derived>
3818 TypeLoc
3819 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
3820                                                    QualType ObjectType,
3821                                                    NamedDecl *UnqualLookup,
3822                                                    CXXScopeSpec &SS) {
3823   if (getDerived().AlreadyTransformed(TL.getType()))
3824     return TL;
3825
3826   TypeSourceInfo *TSI =
3827       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
3828   if (TSI)
3829     return TSI->getTypeLoc();
3830   return TypeLoc();
3831 }
3832
3833 template<typename Derived>
3834 TypeSourceInfo *
3835 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3836                                                    QualType ObjectType,
3837                                                    NamedDecl *UnqualLookup,
3838                                                    CXXScopeSpec &SS) {
3839   if (getDerived().AlreadyTransformed(TSInfo->getType()))
3840     return TSInfo;
3841
3842   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
3843                                    UnqualLookup, SS);
3844 }
3845
3846 template <typename Derived>
3847 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
3848     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
3849     CXXScopeSpec &SS) {
3850   QualType T = TL.getType();
3851   assert(!getDerived().AlreadyTransformed(T));
3852
3853   TypeLocBuilder TLB;
3854   QualType Result;
3855
3856   if (isa<TemplateSpecializationType>(T)) {
3857     TemplateSpecializationTypeLoc SpecTL =
3858         TL.castAs<TemplateSpecializationTypeLoc>();
3859
3860     TemplateName Template
3861     = getDerived().TransformTemplateName(SS,
3862                                          SpecTL.getTypePtr()->getTemplateName(),
3863                                          SpecTL.getTemplateNameLoc(),
3864                                          ObjectType, UnqualLookup);
3865     if (Template.isNull())
3866       return nullptr;
3867
3868     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
3869                                                               Template);
3870   } else if (isa<DependentTemplateSpecializationType>(T)) {
3871     DependentTemplateSpecializationTypeLoc SpecTL =
3872         TL.castAs<DependentTemplateSpecializationTypeLoc>();
3873
3874     TemplateName Template
3875       = getDerived().RebuildTemplateName(SS,
3876                                          *SpecTL.getTypePtr()->getIdentifier(),
3877                                          SpecTL.getTemplateNameLoc(),
3878                                          ObjectType, UnqualLookup);
3879     if (Template.isNull())
3880       return nullptr;
3881
3882     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
3883                                                                        SpecTL,
3884                                                                        Template,
3885                                                                        SS);
3886   } else {
3887     // Nothing special needs to be done for these.
3888     Result = getDerived().TransformType(TLB, TL);
3889   }
3890
3891   if (Result.isNull())
3892     return nullptr;
3893
3894   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3895 }
3896
3897 template <class TyLoc> static inline
3898 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
3899   TyLoc NewT = TLB.push<TyLoc>(T.getType());
3900   NewT.setNameLoc(T.getNameLoc());
3901   return T.getType();
3902 }
3903
3904 template<typename Derived>
3905 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
3906                                                       BuiltinTypeLoc T) {
3907   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
3908   NewT.setBuiltinLoc(T.getBuiltinLoc());
3909   if (T.needsExtraLocalData())
3910     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
3911   return T.getType();
3912 }
3913
3914 template<typename Derived>
3915 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
3916                                                       ComplexTypeLoc T) {
3917   // FIXME: recurse?
3918   return TransformTypeSpecType(TLB, T);
3919 }
3920
3921 template <typename Derived>
3922 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
3923                                                        AdjustedTypeLoc TL) {
3924   // Adjustments applied during transformation are handled elsewhere.
3925   return getDerived().TransformType(TLB, TL.getOriginalLoc());
3926 }
3927
3928 template<typename Derived>
3929 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
3930                                                       DecayedTypeLoc TL) {
3931   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
3932   if (OriginalType.isNull())
3933     return QualType();
3934
3935   QualType Result = TL.getType();
3936   if (getDerived().AlwaysRebuild() ||
3937       OriginalType != TL.getOriginalLoc().getType())
3938     Result = SemaRef.Context.getDecayedType(OriginalType);
3939   TLB.push<DecayedTypeLoc>(Result);
3940   // Nothing to set for DecayedTypeLoc.
3941   return Result;
3942 }
3943
3944 template<typename Derived>
3945 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
3946                                                       PointerTypeLoc TL) {
3947   QualType PointeeType
3948     = getDerived().TransformType(TLB, TL.getPointeeLoc());
3949   if (PointeeType.isNull())
3950     return QualType();
3951
3952   QualType Result = TL.getType();
3953   if (PointeeType->getAs<ObjCObjectType>()) {
3954     // A dependent pointer type 'T *' has is being transformed such
3955     // that an Objective-C class type is being replaced for 'T'. The
3956     // resulting pointer type is an ObjCObjectPointerType, not a
3957     // PointerType.
3958     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
3959
3960     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
3961     NewT.setStarLoc(TL.getStarLoc());
3962     return Result;
3963   }
3964
3965   if (getDerived().AlwaysRebuild() ||
3966       PointeeType != TL.getPointeeLoc().getType()) {
3967     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
3968     if (Result.isNull())
3969       return QualType();
3970   }
3971
3972   // Objective-C ARC can add lifetime qualifiers to the type that we're
3973   // pointing to.
3974   TLB.TypeWasModifiedSafely(Result->getPointeeType());
3975
3976   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
3977   NewT.setSigilLoc(TL.getSigilLoc());
3978   return Result;
3979 }
3980
3981 template<typename Derived>
3982 QualType
3983 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
3984                                                   BlockPointerTypeLoc TL) {
3985   QualType PointeeType
3986     = getDerived().TransformType(TLB, TL.getPointeeLoc());
3987   if (PointeeType.isNull())
3988     return QualType();
3989
3990   QualType Result = TL.getType();
3991   if (getDerived().AlwaysRebuild() ||
3992       PointeeType != TL.getPointeeLoc().getType()) {
3993     Result = getDerived().RebuildBlockPointerType(PointeeType,
3994                                                   TL.getSigilLoc());
3995     if (Result.isNull())
3996       return QualType();
3997   }
3998
3999   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4000   NewT.setSigilLoc(TL.getSigilLoc());
4001   return Result;
4002 }
4003
4004 /// Transforms a reference type.  Note that somewhat paradoxically we
4005 /// don't care whether the type itself is an l-value type or an r-value
4006 /// type;  we only care if the type was *written* as an l-value type
4007 /// or an r-value type.
4008 template<typename Derived>
4009 QualType
4010 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4011                                                ReferenceTypeLoc TL) {
4012   const ReferenceType *T = TL.getTypePtr();
4013
4014   // Note that this works with the pointee-as-written.
4015   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4016   if (PointeeType.isNull())
4017     return QualType();
4018
4019   QualType Result = TL.getType();
4020   if (getDerived().AlwaysRebuild() ||
4021       PointeeType != T->getPointeeTypeAsWritten()) {
4022     Result = getDerived().RebuildReferenceType(PointeeType,
4023                                                T->isSpelledAsLValue(),
4024                                                TL.getSigilLoc());
4025     if (Result.isNull())
4026       return QualType();
4027   }
4028
4029   // Objective-C ARC can add lifetime qualifiers to the type that we're
4030   // referring to.
4031   TLB.TypeWasModifiedSafely(
4032                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4033
4034   // r-value references can be rebuilt as l-value references.
4035   ReferenceTypeLoc NewTL;
4036   if (isa<LValueReferenceType>(Result))
4037     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4038   else
4039     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4040   NewTL.setSigilLoc(TL.getSigilLoc());
4041
4042   return Result;
4043 }
4044
4045 template<typename Derived>
4046 QualType
4047 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4048                                                  LValueReferenceTypeLoc TL) {
4049   return TransformReferenceType(TLB, TL);
4050 }
4051
4052 template<typename Derived>
4053 QualType
4054 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4055                                                  RValueReferenceTypeLoc TL) {
4056   return TransformReferenceType(TLB, TL);
4057 }
4058
4059 template<typename Derived>
4060 QualType
4061 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4062                                                    MemberPointerTypeLoc TL) {
4063   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4064   if (PointeeType.isNull())
4065     return QualType();
4066
4067   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4068   TypeSourceInfo *NewClsTInfo = nullptr;
4069   if (OldClsTInfo) {
4070     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4071     if (!NewClsTInfo)
4072       return QualType();
4073   }
4074
4075   const MemberPointerType *T = TL.getTypePtr();
4076   QualType OldClsType = QualType(T->getClass(), 0);
4077   QualType NewClsType;
4078   if (NewClsTInfo)
4079     NewClsType = NewClsTInfo->getType();
4080   else {
4081     NewClsType = getDerived().TransformType(OldClsType);
4082     if (NewClsType.isNull())
4083       return QualType();
4084   }
4085
4086   QualType Result = TL.getType();
4087   if (getDerived().AlwaysRebuild() ||
4088       PointeeType != T->getPointeeType() ||
4089       NewClsType != OldClsType) {
4090     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4091                                                    TL.getStarLoc());
4092     if (Result.isNull())
4093       return QualType();
4094   }
4095
4096   // If we had to adjust the pointee type when building a member pointer, make
4097   // sure to push TypeLoc info for it.
4098   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4099   if (MPT && PointeeType != MPT->getPointeeType()) {
4100     assert(isa<AdjustedType>(MPT->getPointeeType()));
4101     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4102   }
4103
4104   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4105   NewTL.setSigilLoc(TL.getSigilLoc());
4106   NewTL.setClassTInfo(NewClsTInfo);
4107
4108   return Result;
4109 }
4110
4111 template<typename Derived>
4112 QualType
4113 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4114                                                    ConstantArrayTypeLoc TL) {
4115   const ConstantArrayType *T = TL.getTypePtr();
4116   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4117   if (ElementType.isNull())
4118     return QualType();
4119
4120   QualType Result = TL.getType();
4121   if (getDerived().AlwaysRebuild() ||
4122       ElementType != T->getElementType()) {
4123     Result = getDerived().RebuildConstantArrayType(ElementType,
4124                                                    T->getSizeModifier(),
4125                                                    T->getSize(),
4126                                              T->getIndexTypeCVRQualifiers(),
4127                                                    TL.getBracketsRange());
4128     if (Result.isNull())
4129       return QualType();
4130   }
4131
4132   // We might have either a ConstantArrayType or a VariableArrayType now:
4133   // a ConstantArrayType is allowed to have an element type which is a
4134   // VariableArrayType if the type is dependent.  Fortunately, all array
4135   // types have the same location layout.
4136   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4137   NewTL.setLBracketLoc(TL.getLBracketLoc());
4138   NewTL.setRBracketLoc(TL.getRBracketLoc());
4139
4140   Expr *Size = TL.getSizeExpr();
4141   if (Size) {
4142     EnterExpressionEvaluationContext Unevaluated(SemaRef,
4143                                                  Sema::ConstantEvaluated);
4144     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4145     Size = SemaRef.ActOnConstantExpression(Size).get();
4146   }
4147   NewTL.setSizeExpr(Size);
4148
4149   return Result;
4150 }
4151
4152 template<typename Derived>
4153 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4154                                               TypeLocBuilder &TLB,
4155                                               IncompleteArrayTypeLoc TL) {
4156   const IncompleteArrayType *T = TL.getTypePtr();
4157   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4158   if (ElementType.isNull())
4159     return QualType();
4160
4161   QualType Result = TL.getType();
4162   if (getDerived().AlwaysRebuild() ||
4163       ElementType != T->getElementType()) {
4164     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4165                                                      T->getSizeModifier(),
4166                                            T->getIndexTypeCVRQualifiers(),
4167                                                      TL.getBracketsRange());
4168     if (Result.isNull())
4169       return QualType();
4170   }
4171
4172   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4173   NewTL.setLBracketLoc(TL.getLBracketLoc());
4174   NewTL.setRBracketLoc(TL.getRBracketLoc());
4175   NewTL.setSizeExpr(nullptr);
4176
4177   return Result;
4178 }
4179
4180 template<typename Derived>
4181 QualType
4182 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4183                                                    VariableArrayTypeLoc TL) {
4184   const VariableArrayType *T = TL.getTypePtr();
4185   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4186   if (ElementType.isNull())
4187     return QualType();
4188
4189   ExprResult SizeResult
4190     = getDerived().TransformExpr(T->getSizeExpr());
4191   if (SizeResult.isInvalid())
4192     return QualType();
4193
4194   Expr *Size = SizeResult.get();
4195
4196   QualType Result = TL.getType();
4197   if (getDerived().AlwaysRebuild() ||
4198       ElementType != T->getElementType() ||
4199       Size != T->getSizeExpr()) {
4200     Result = getDerived().RebuildVariableArrayType(ElementType,
4201                                                    T->getSizeModifier(),
4202                                                    Size,
4203                                              T->getIndexTypeCVRQualifiers(),
4204                                                    TL.getBracketsRange());
4205     if (Result.isNull())
4206       return QualType();
4207   }
4208
4209   // We might have constant size array now, but fortunately it has the same
4210   // location layout.
4211   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4212   NewTL.setLBracketLoc(TL.getLBracketLoc());
4213   NewTL.setRBracketLoc(TL.getRBracketLoc());
4214   NewTL.setSizeExpr(Size);
4215
4216   return Result;
4217 }
4218
4219 template<typename Derived>
4220 QualType
4221 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4222                                              DependentSizedArrayTypeLoc TL) {
4223   const DependentSizedArrayType *T = TL.getTypePtr();
4224   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4225   if (ElementType.isNull())
4226     return QualType();
4227
4228   // Array bounds are constant expressions.
4229   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4230                                                Sema::ConstantEvaluated);
4231
4232   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4233   Expr *origSize = TL.getSizeExpr();
4234   if (!origSize) origSize = T->getSizeExpr();
4235
4236   ExprResult sizeResult
4237     = getDerived().TransformExpr(origSize);
4238   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4239   if (sizeResult.isInvalid())
4240     return QualType();
4241
4242   Expr *size = sizeResult.get();
4243
4244   QualType Result = TL.getType();
4245   if (getDerived().AlwaysRebuild() ||
4246       ElementType != T->getElementType() ||
4247       size != origSize) {
4248     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4249                                                          T->getSizeModifier(),
4250                                                          size,
4251                                                 T->getIndexTypeCVRQualifiers(),
4252                                                         TL.getBracketsRange());
4253     if (Result.isNull())
4254       return QualType();
4255   }
4256
4257   // We might have any sort of array type now, but fortunately they
4258   // all have the same location layout.
4259   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4260   NewTL.setLBracketLoc(TL.getLBracketLoc());
4261   NewTL.setRBracketLoc(TL.getRBracketLoc());
4262   NewTL.setSizeExpr(size);
4263
4264   return Result;
4265 }
4266
4267 template<typename Derived>
4268 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4269                                       TypeLocBuilder &TLB,
4270                                       DependentSizedExtVectorTypeLoc TL) {
4271   const DependentSizedExtVectorType *T = TL.getTypePtr();
4272
4273   // FIXME: ext vector locs should be nested
4274   QualType ElementType = getDerived().TransformType(T->getElementType());
4275   if (ElementType.isNull())
4276     return QualType();
4277
4278   // Vector sizes are constant expressions.
4279   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4280                                                Sema::ConstantEvaluated);
4281
4282   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4283   Size = SemaRef.ActOnConstantExpression(Size);
4284   if (Size.isInvalid())
4285     return QualType();
4286
4287   QualType Result = TL.getType();
4288   if (getDerived().AlwaysRebuild() ||
4289       ElementType != T->getElementType() ||
4290       Size.get() != T->getSizeExpr()) {
4291     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4292                                                              Size.get(),
4293                                                          T->getAttributeLoc());
4294     if (Result.isNull())
4295       return QualType();
4296   }
4297
4298   // Result might be dependent or not.
4299   if (isa<DependentSizedExtVectorType>(Result)) {
4300     DependentSizedExtVectorTypeLoc NewTL
4301       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4302     NewTL.setNameLoc(TL.getNameLoc());
4303   } else {
4304     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4305     NewTL.setNameLoc(TL.getNameLoc());
4306   }
4307
4308   return Result;
4309 }
4310
4311 template<typename Derived>
4312 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4313                                                      VectorTypeLoc TL) {
4314   const VectorType *T = TL.getTypePtr();
4315   QualType ElementType = getDerived().TransformType(T->getElementType());
4316   if (ElementType.isNull())
4317     return QualType();
4318
4319   QualType Result = TL.getType();
4320   if (getDerived().AlwaysRebuild() ||
4321       ElementType != T->getElementType()) {
4322     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4323                                             T->getVectorKind());
4324     if (Result.isNull())
4325       return QualType();
4326   }
4327
4328   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4329   NewTL.setNameLoc(TL.getNameLoc());
4330
4331   return Result;
4332 }
4333
4334 template<typename Derived>
4335 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4336                                                         ExtVectorTypeLoc TL) {
4337   const VectorType *T = TL.getTypePtr();
4338   QualType ElementType = getDerived().TransformType(T->getElementType());
4339   if (ElementType.isNull())
4340     return QualType();
4341
4342   QualType Result = TL.getType();
4343   if (getDerived().AlwaysRebuild() ||
4344       ElementType != T->getElementType()) {
4345     Result = getDerived().RebuildExtVectorType(ElementType,
4346                                                T->getNumElements(),
4347                                                /*FIXME*/ SourceLocation());
4348     if (Result.isNull())
4349       return QualType();
4350   }
4351
4352   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4353   NewTL.setNameLoc(TL.getNameLoc());
4354
4355   return Result;
4356 }
4357
4358 template <typename Derived>
4359 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4360     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4361     bool ExpectParameterPack) {
4362   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4363   TypeSourceInfo *NewDI = nullptr;
4364
4365   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4366     // If we're substituting into a pack expansion type and we know the
4367     // length we want to expand to, just substitute for the pattern.
4368     TypeLoc OldTL = OldDI->getTypeLoc();
4369     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4370
4371     TypeLocBuilder TLB;
4372     TypeLoc NewTL = OldDI->getTypeLoc();
4373     TLB.reserve(NewTL.getFullDataSize());
4374
4375     QualType Result = getDerived().TransformType(TLB,
4376                                                OldExpansionTL.getPatternLoc());
4377     if (Result.isNull())
4378       return nullptr;
4379
4380     Result = RebuildPackExpansionType(Result,
4381                                 OldExpansionTL.getPatternLoc().getSourceRange(),
4382                                       OldExpansionTL.getEllipsisLoc(),
4383                                       NumExpansions);
4384     if (Result.isNull())
4385       return nullptr;
4386
4387     PackExpansionTypeLoc NewExpansionTL
4388       = TLB.push<PackExpansionTypeLoc>(Result);
4389     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4390     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4391   } else
4392     NewDI = getDerived().TransformType(OldDI);
4393   if (!NewDI)
4394     return nullptr;
4395
4396   if (NewDI == OldDI && indexAdjustment == 0)
4397     return OldParm;
4398
4399   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4400                                              OldParm->getDeclContext(),
4401                                              OldParm->getInnerLocStart(),
4402                                              OldParm->getLocation(),
4403                                              OldParm->getIdentifier(),
4404                                              NewDI->getType(),
4405                                              NewDI,
4406                                              OldParm->getStorageClass(),
4407                                              /* DefArg */ nullptr);
4408   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4409                         OldParm->getFunctionScopeIndex() + indexAdjustment);
4410   return newParm;
4411 }
4412
4413 template<typename Derived>
4414 bool TreeTransform<Derived>::
4415   TransformFunctionTypeParams(SourceLocation Loc,
4416                               ParmVarDecl **Params, unsigned NumParams,
4417                               const QualType *ParamTypes,
4418                               SmallVectorImpl<QualType> &OutParamTypes,
4419                               SmallVectorImpl<ParmVarDecl*> *PVars) {
4420   int indexAdjustment = 0;
4421
4422   for (unsigned i = 0; i != NumParams; ++i) {
4423     if (ParmVarDecl *OldParm = Params[i]) {
4424       assert(OldParm->getFunctionScopeIndex() == i);
4425
4426       Optional<unsigned> NumExpansions;
4427       ParmVarDecl *NewParm = nullptr;
4428       if (OldParm->isParameterPack()) {
4429         // We have a function parameter pack that may need to be expanded.
4430         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4431
4432         // Find the parameter packs that could be expanded.
4433         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
4434         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
4435         TypeLoc Pattern = ExpansionTL.getPatternLoc();
4436         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
4437         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
4438
4439         // Determine whether we should expand the parameter packs.
4440         bool ShouldExpand = false;
4441         bool RetainExpansion = false;
4442         Optional<unsigned> OrigNumExpansions =
4443             ExpansionTL.getTypePtr()->getNumExpansions();
4444         NumExpansions = OrigNumExpansions;
4445         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
4446                                                  Pattern.getSourceRange(),
4447                                                  Unexpanded,
4448                                                  ShouldExpand,
4449                                                  RetainExpansion,
4450                                                  NumExpansions)) {
4451           return true;
4452         }
4453
4454         if (ShouldExpand) {
4455           // Expand the function parameter pack into multiple, separate
4456           // parameters.
4457           getDerived().ExpandingFunctionParameterPack(OldParm);
4458           for (unsigned I = 0; I != *NumExpansions; ++I) {
4459             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4460             ParmVarDecl *NewParm
4461               = getDerived().TransformFunctionTypeParam(OldParm,
4462                                                         indexAdjustment++,
4463                                                         OrigNumExpansions,
4464                                                 /*ExpectParameterPack=*/false);
4465             if (!NewParm)
4466               return true;
4467
4468             OutParamTypes.push_back(NewParm->getType());
4469             if (PVars)
4470               PVars->push_back(NewParm);
4471           }
4472
4473           // If we're supposed to retain a pack expansion, do so by temporarily
4474           // forgetting the partially-substituted parameter pack.
4475           if (RetainExpansion) {
4476             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4477             ParmVarDecl *NewParm
4478               = getDerived().TransformFunctionTypeParam(OldParm,
4479                                                         indexAdjustment++,
4480                                                         OrigNumExpansions,
4481                                                 /*ExpectParameterPack=*/false);
4482             if (!NewParm)
4483               return true;
4484
4485             OutParamTypes.push_back(NewParm->getType());
4486             if (PVars)
4487               PVars->push_back(NewParm);
4488           }
4489
4490           // The next parameter should have the same adjustment as the
4491           // last thing we pushed, but we post-incremented indexAdjustment
4492           // on every push.  Also, if we push nothing, the adjustment should
4493           // go down by one.
4494           indexAdjustment--;
4495
4496           // We're done with the pack expansion.
4497           continue;
4498         }
4499
4500         // We'll substitute the parameter now without expanding the pack
4501         // expansion.
4502         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4503         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
4504                                                           indexAdjustment,
4505                                                           NumExpansions,
4506                                                   /*ExpectParameterPack=*/true);
4507       } else {
4508         NewParm = getDerived().TransformFunctionTypeParam(
4509             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
4510       }
4511
4512       if (!NewParm)
4513         return true;
4514
4515       OutParamTypes.push_back(NewParm->getType());
4516       if (PVars)
4517         PVars->push_back(NewParm);
4518       continue;
4519     }
4520
4521     // Deal with the possibility that we don't have a parameter
4522     // declaration for this parameter.
4523     QualType OldType = ParamTypes[i];
4524     bool IsPackExpansion = false;
4525     Optional<unsigned> NumExpansions;
4526     QualType NewType;
4527     if (const PackExpansionType *Expansion
4528                                        = dyn_cast<PackExpansionType>(OldType)) {
4529       // We have a function parameter pack that may need to be expanded.
4530       QualType Pattern = Expansion->getPattern();
4531       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4532       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4533
4534       // Determine whether we should expand the parameter packs.
4535       bool ShouldExpand = false;
4536       bool RetainExpansion = false;
4537       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
4538                                                Unexpanded,
4539                                                ShouldExpand,
4540                                                RetainExpansion,
4541                                                NumExpansions)) {
4542         return true;
4543       }
4544
4545       if (ShouldExpand) {
4546         // Expand the function parameter pack into multiple, separate
4547         // parameters.
4548         for (unsigned I = 0; I != *NumExpansions; ++I) {
4549           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4550           QualType NewType = getDerived().TransformType(Pattern);
4551           if (NewType.isNull())
4552             return true;
4553
4554           OutParamTypes.push_back(NewType);
4555           if (PVars)
4556             PVars->push_back(nullptr);
4557         }
4558
4559         // We're done with the pack expansion.
4560         continue;
4561       }
4562
4563       // If we're supposed to retain a pack expansion, do so by temporarily
4564       // forgetting the partially-substituted parameter pack.
4565       if (RetainExpansion) {
4566         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4567         QualType NewType = getDerived().TransformType(Pattern);
4568         if (NewType.isNull())
4569           return true;
4570
4571         OutParamTypes.push_back(NewType);
4572         if (PVars)
4573           PVars->push_back(nullptr);
4574       }
4575
4576       // We'll substitute the parameter now without expanding the pack
4577       // expansion.
4578       OldType = Expansion->getPattern();
4579       IsPackExpansion = true;
4580       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4581       NewType = getDerived().TransformType(OldType);
4582     } else {
4583       NewType = getDerived().TransformType(OldType);
4584     }
4585
4586     if (NewType.isNull())
4587       return true;
4588
4589     if (IsPackExpansion)
4590       NewType = getSema().Context.getPackExpansionType(NewType,
4591                                                        NumExpansions);
4592
4593     OutParamTypes.push_back(NewType);
4594     if (PVars)
4595       PVars->push_back(nullptr);
4596   }
4597
4598 #ifndef NDEBUG
4599   if (PVars) {
4600     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
4601       if (ParmVarDecl *parm = (*PVars)[i])
4602         assert(parm->getFunctionScopeIndex() == i);
4603   }
4604 #endif
4605
4606   return false;
4607 }
4608
4609 template<typename Derived>
4610 QualType
4611 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
4612                                                    FunctionProtoTypeLoc TL) {
4613   SmallVector<QualType, 4> ExceptionStorage;
4614   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
4615   return getDerived().TransformFunctionProtoType(
4616       TLB, TL, nullptr, 0,
4617       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
4618         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
4619                                             ExceptionStorage, Changed);
4620       });
4621 }
4622
4623 template<typename Derived> template<typename Fn>
4624 QualType TreeTransform<Derived>::TransformFunctionProtoType(
4625     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
4626     unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
4627   // Transform the parameters and return type.
4628   //
4629   // We are required to instantiate the params and return type in source order.
4630   // When the function has a trailing return type, we instantiate the
4631   // parameters before the return type,  since the return type can then refer
4632   // to the parameters themselves (via decltype, sizeof, etc.).
4633   //
4634   SmallVector<QualType, 4> ParamTypes;
4635   SmallVector<ParmVarDecl*, 4> ParamDecls;
4636   const FunctionProtoType *T = TL.getTypePtr();
4637
4638   QualType ResultType;
4639
4640   if (T->hasTrailingReturn()) {
4641     if (getDerived().TransformFunctionTypeParams(
4642             TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(),
4643             TL.getTypePtr()->param_type_begin(), ParamTypes, &ParamDecls))
4644       return QualType();
4645
4646     {
4647       // C++11 [expr.prim.general]p3:
4648       //   If a declaration declares a member function or member function
4649       //   template of a class X, the expression this is a prvalue of type
4650       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
4651       //   and the end of the function-definition, member-declarator, or
4652       //   declarator.
4653       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
4654
4655       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4656       if (ResultType.isNull())
4657         return QualType();
4658     }
4659   }
4660   else {
4661     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4662     if (ResultType.isNull())
4663       return QualType();
4664
4665     if (getDerived().TransformFunctionTypeParams(
4666             TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(),
4667             TL.getTypePtr()->param_type_begin(), ParamTypes, &ParamDecls))
4668       return QualType();
4669   }
4670
4671   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
4672
4673   bool EPIChanged = false;
4674   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
4675     return QualType();
4676
4677   // FIXME: Need to transform ConsumedParameters for variadic template
4678   // expansion.
4679
4680   QualType Result = TL.getType();
4681   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
4682       T->getNumParams() != ParamTypes.size() ||
4683       !std::equal(T->param_type_begin(), T->param_type_end(),
4684                   ParamTypes.begin()) || EPIChanged) {
4685     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
4686     if (Result.isNull())
4687       return QualType();
4688   }
4689
4690   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
4691   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
4692   NewTL.setLParenLoc(TL.getLParenLoc());
4693   NewTL.setRParenLoc(TL.getRParenLoc());
4694   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
4695   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
4696     NewTL.setParam(i, ParamDecls[i]);
4697
4698   return Result;
4699 }
4700
4701 template<typename Derived>
4702 bool TreeTransform<Derived>::TransformExceptionSpec(
4703     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
4704     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
4705   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
4706
4707   // Instantiate a dynamic noexcept expression, if any.
4708   if (ESI.Type == EST_ComputedNoexcept) {
4709     EnterExpressionEvaluationContext Unevaluated(getSema(),
4710                                                  Sema::ConstantEvaluated);
4711     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
4712     if (NoexceptExpr.isInvalid())
4713       return true;
4714
4715     NoexceptExpr = getSema().CheckBooleanCondition(
4716         NoexceptExpr.get(), NoexceptExpr.get()->getLocStart());
4717     if (NoexceptExpr.isInvalid())
4718       return true;
4719
4720     if (!NoexceptExpr.get()->isValueDependent()) {
4721       NoexceptExpr = getSema().VerifyIntegerConstantExpression(
4722           NoexceptExpr.get(), nullptr,
4723           diag::err_noexcept_needs_constant_expression,
4724           /*AllowFold*/false);
4725       if (NoexceptExpr.isInvalid())
4726         return true;
4727     }
4728
4729     if (ESI.NoexceptExpr != NoexceptExpr.get())
4730       Changed = true;
4731     ESI.NoexceptExpr = NoexceptExpr.get();
4732   }
4733
4734   if (ESI.Type != EST_Dynamic)
4735     return false;
4736
4737   // Instantiate a dynamic exception specification's type.
4738   for (QualType T : ESI.Exceptions) {
4739     if (const PackExpansionType *PackExpansion =
4740             T->getAs<PackExpansionType>()) {
4741       Changed = true;
4742
4743       // We have a pack expansion. Instantiate it.
4744       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4745       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
4746                                               Unexpanded);
4747       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4748
4749       // Determine whether the set of unexpanded parameter packs can and
4750       // should
4751       // be expanded.
4752       bool Expand = false;
4753       bool RetainExpansion = false;
4754       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
4755       // FIXME: Track the location of the ellipsis (and track source location
4756       // information for the types in the exception specification in general).
4757       if (getDerived().TryExpandParameterPacks(
4758               Loc, SourceRange(), Unexpanded, Expand,
4759               RetainExpansion, NumExpansions))
4760         return true;
4761
4762       if (!Expand) {
4763         // We can't expand this pack expansion into separate arguments yet;
4764         // just substitute into the pattern and create a new pack expansion
4765         // type.
4766         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4767         QualType U = getDerived().TransformType(PackExpansion->getPattern());
4768         if (U.isNull())
4769           return true;
4770
4771         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
4772         Exceptions.push_back(U);
4773         continue;
4774       }
4775
4776       // Substitute into the pack expansion pattern for each slice of the
4777       // pack.
4778       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
4779         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
4780
4781         QualType U = getDerived().TransformType(PackExpansion->getPattern());
4782         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
4783           return true;
4784
4785         Exceptions.push_back(U);
4786       }
4787     } else {
4788       QualType U = getDerived().TransformType(T);
4789       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
4790         return true;
4791       if (T != U)
4792         Changed = true;
4793
4794       Exceptions.push_back(U);
4795     }
4796   }
4797
4798   ESI.Exceptions = Exceptions;
4799   return false;
4800 }
4801
4802 template<typename Derived>
4803 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
4804                                                  TypeLocBuilder &TLB,
4805                                                  FunctionNoProtoTypeLoc TL) {
4806   const FunctionNoProtoType *T = TL.getTypePtr();
4807   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4808   if (ResultType.isNull())
4809     return QualType();
4810
4811   QualType Result = TL.getType();
4812   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
4813     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
4814
4815   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
4816   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
4817   NewTL.setLParenLoc(TL.getLParenLoc());
4818   NewTL.setRParenLoc(TL.getRParenLoc());
4819   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
4820
4821   return Result;
4822 }
4823
4824 template<typename Derived> QualType
4825 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
4826                                                  UnresolvedUsingTypeLoc TL) {
4827   const UnresolvedUsingType *T = TL.getTypePtr();
4828   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
4829   if (!D)
4830     return QualType();
4831
4832   QualType Result = TL.getType();
4833   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
4834     Result = getDerived().RebuildUnresolvedUsingType(D);
4835     if (Result.isNull())
4836       return QualType();
4837   }
4838
4839   // We might get an arbitrary type spec type back.  We should at
4840   // least always get a type spec type, though.
4841   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
4842   NewTL.setNameLoc(TL.getNameLoc());
4843
4844   return Result;
4845 }
4846
4847 template<typename Derived>
4848 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
4849                                                       TypedefTypeLoc TL) {
4850   const TypedefType *T = TL.getTypePtr();
4851   TypedefNameDecl *Typedef
4852     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
4853                                                                T->getDecl()));
4854   if (!Typedef)
4855     return QualType();
4856
4857   QualType Result = TL.getType();
4858   if (getDerived().AlwaysRebuild() ||
4859       Typedef != T->getDecl()) {
4860     Result = getDerived().RebuildTypedefType(Typedef);
4861     if (Result.isNull())
4862       return QualType();
4863   }
4864
4865   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
4866   NewTL.setNameLoc(TL.getNameLoc());
4867
4868   return Result;
4869 }
4870
4871 template<typename Derived>
4872 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
4873                                                       TypeOfExprTypeLoc TL) {
4874   // typeof expressions are not potentially evaluated contexts
4875   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
4876                                                Sema::ReuseLambdaContextDecl);
4877
4878   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
4879   if (E.isInvalid())
4880     return QualType();
4881
4882   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
4883   if (E.isInvalid())
4884     return QualType();
4885
4886   QualType Result = TL.getType();
4887   if (getDerived().AlwaysRebuild() ||
4888       E.get() != TL.getUnderlyingExpr()) {
4889     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
4890     if (Result.isNull())
4891       return QualType();
4892   }
4893   else E.get();
4894
4895   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
4896   NewTL.setTypeofLoc(TL.getTypeofLoc());
4897   NewTL.setLParenLoc(TL.getLParenLoc());
4898   NewTL.setRParenLoc(TL.getRParenLoc());
4899
4900   return Result;
4901 }
4902
4903 template<typename Derived>
4904 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
4905                                                      TypeOfTypeLoc TL) {
4906   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
4907   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
4908   if (!New_Under_TI)
4909     return QualType();
4910
4911   QualType Result = TL.getType();
4912   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
4913     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
4914     if (Result.isNull())
4915       return QualType();
4916   }
4917
4918   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
4919   NewTL.setTypeofLoc(TL.getTypeofLoc());
4920   NewTL.setLParenLoc(TL.getLParenLoc());
4921   NewTL.setRParenLoc(TL.getRParenLoc());
4922   NewTL.setUnderlyingTInfo(New_Under_TI);
4923
4924   return Result;
4925 }
4926
4927 template<typename Derived>
4928 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
4929                                                        DecltypeTypeLoc TL) {
4930   const DecltypeType *T = TL.getTypePtr();
4931
4932   // decltype expressions are not potentially evaluated contexts
4933   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
4934                                                nullptr, /*IsDecltype=*/ true);
4935
4936   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
4937   if (E.isInvalid())
4938     return QualType();
4939
4940   E = getSema().ActOnDecltypeExpression(E.get());
4941   if (E.isInvalid())
4942     return QualType();
4943
4944   QualType Result = TL.getType();
4945   if (getDerived().AlwaysRebuild() ||
4946       E.get() != T->getUnderlyingExpr()) {
4947     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
4948     if (Result.isNull())
4949       return QualType();
4950   }
4951   else E.get();
4952
4953   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
4954   NewTL.setNameLoc(TL.getNameLoc());
4955
4956   return Result;
4957 }
4958
4959 template<typename Derived>
4960 QualType TreeTransform<Derived>::TransformUnaryTransformType(
4961                                                             TypeLocBuilder &TLB,
4962                                                      UnaryTransformTypeLoc TL) {
4963   QualType Result = TL.getType();
4964   if (Result->isDependentType()) {
4965     const UnaryTransformType *T = TL.getTypePtr();
4966     QualType NewBase =
4967       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
4968     Result = getDerived().RebuildUnaryTransformType(NewBase,
4969                                                     T->getUTTKind(),
4970                                                     TL.getKWLoc());
4971     if (Result.isNull())
4972       return QualType();
4973   }
4974
4975   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
4976   NewTL.setKWLoc(TL.getKWLoc());
4977   NewTL.setParensRange(TL.getParensRange());
4978   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
4979   return Result;
4980 }
4981
4982 template<typename Derived>
4983 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
4984                                                    AutoTypeLoc TL) {
4985   const AutoType *T = TL.getTypePtr();
4986   QualType OldDeduced = T->getDeducedType();
4987   QualType NewDeduced;
4988   if (!OldDeduced.isNull()) {
4989     NewDeduced = getDerived().TransformType(OldDeduced);
4990     if (NewDeduced.isNull())
4991       return QualType();
4992   }
4993
4994   QualType Result = TL.getType();
4995   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
4996       T->isDependentType()) {
4997     Result = getDerived().RebuildAutoType(NewDeduced, T->isDecltypeAuto());
4998     if (Result.isNull())
4999       return QualType();
5000   }
5001
5002   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5003   NewTL.setNameLoc(TL.getNameLoc());
5004
5005   return Result;
5006 }
5007
5008 template<typename Derived>
5009 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5010                                                      RecordTypeLoc TL) {
5011   const RecordType *T = TL.getTypePtr();
5012   RecordDecl *Record
5013     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5014                                                           T->getDecl()));
5015   if (!Record)
5016     return QualType();
5017
5018   QualType Result = TL.getType();
5019   if (getDerived().AlwaysRebuild() ||
5020       Record != T->getDecl()) {
5021     Result = getDerived().RebuildRecordType(Record);
5022     if (Result.isNull())
5023       return QualType();
5024   }
5025
5026   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5027   NewTL.setNameLoc(TL.getNameLoc());
5028
5029   return Result;
5030 }
5031
5032 template<typename Derived>
5033 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5034                                                    EnumTypeLoc TL) {
5035   const EnumType *T = TL.getTypePtr();
5036   EnumDecl *Enum
5037     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5038                                                         T->getDecl()));
5039   if (!Enum)
5040     return QualType();
5041
5042   QualType Result = TL.getType();
5043   if (getDerived().AlwaysRebuild() ||
5044       Enum != T->getDecl()) {
5045     Result = getDerived().RebuildEnumType(Enum);
5046     if (Result.isNull())
5047       return QualType();
5048   }
5049
5050   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5051   NewTL.setNameLoc(TL.getNameLoc());
5052
5053   return Result;
5054 }
5055
5056 template<typename Derived>
5057 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5058                                          TypeLocBuilder &TLB,
5059                                          InjectedClassNameTypeLoc TL) {
5060   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5061                                        TL.getTypePtr()->getDecl());
5062   if (!D) return QualType();
5063
5064   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5065   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5066   return T;
5067 }
5068
5069 template<typename Derived>
5070 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5071                                                 TypeLocBuilder &TLB,
5072                                                 TemplateTypeParmTypeLoc TL) {
5073   return TransformTypeSpecType(TLB, TL);
5074 }
5075
5076 template<typename Derived>
5077 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5078                                          TypeLocBuilder &TLB,
5079                                          SubstTemplateTypeParmTypeLoc TL) {
5080   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5081
5082   // Substitute into the replacement type, which itself might involve something
5083   // that needs to be transformed. This only tends to occur with default
5084   // template arguments of template template parameters.
5085   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5086   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5087   if (Replacement.isNull())
5088     return QualType();
5089
5090   // Always canonicalize the replacement type.
5091   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5092   QualType Result
5093     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5094                                                    Replacement);
5095
5096   // Propagate type-source information.
5097   SubstTemplateTypeParmTypeLoc NewTL
5098     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5099   NewTL.setNameLoc(TL.getNameLoc());
5100   return Result;
5101
5102 }
5103
5104 template<typename Derived>
5105 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5106                                           TypeLocBuilder &TLB,
5107                                           SubstTemplateTypeParmPackTypeLoc TL) {
5108   return TransformTypeSpecType(TLB, TL);
5109 }
5110
5111 template<typename Derived>
5112 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5113                                                         TypeLocBuilder &TLB,
5114                                            TemplateSpecializationTypeLoc TL) {
5115   const TemplateSpecializationType *T = TL.getTypePtr();
5116
5117   // The nested-name-specifier never matters in a TemplateSpecializationType,
5118   // because we can't have a dependent nested-name-specifier anyway.
5119   CXXScopeSpec SS;
5120   TemplateName Template
5121     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5122                                          TL.getTemplateNameLoc());
5123   if (Template.isNull())
5124     return QualType();
5125
5126   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5127 }
5128
5129 template<typename Derived>
5130 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5131                                                      AtomicTypeLoc TL) {
5132   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5133   if (ValueType.isNull())
5134     return QualType();
5135
5136   QualType Result = TL.getType();
5137   if (getDerived().AlwaysRebuild() ||
5138       ValueType != TL.getValueLoc().getType()) {
5139     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5140     if (Result.isNull())
5141       return QualType();
5142   }
5143
5144   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5145   NewTL.setKWLoc(TL.getKWLoc());
5146   NewTL.setLParenLoc(TL.getLParenLoc());
5147   NewTL.setRParenLoc(TL.getRParenLoc());
5148
5149   return Result;
5150 }
5151
5152   /// \brief Simple iterator that traverses the template arguments in a
5153   /// container that provides a \c getArgLoc() member function.
5154   ///
5155   /// This iterator is intended to be used with the iterator form of
5156   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5157   template<typename ArgLocContainer>
5158   class TemplateArgumentLocContainerIterator {
5159     ArgLocContainer *Container;
5160     unsigned Index;
5161
5162   public:
5163     typedef TemplateArgumentLoc value_type;
5164     typedef TemplateArgumentLoc reference;
5165     typedef int difference_type;
5166     typedef std::input_iterator_tag iterator_category;
5167
5168     class pointer {
5169       TemplateArgumentLoc Arg;
5170
5171     public:
5172       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5173
5174       const TemplateArgumentLoc *operator->() const {
5175         return &Arg;
5176       }
5177     };
5178
5179
5180     TemplateArgumentLocContainerIterator() {}
5181
5182     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5183                                  unsigned Index)
5184       : Container(&Container), Index(Index) { }
5185
5186     TemplateArgumentLocContainerIterator &operator++() {
5187       ++Index;
5188       return *this;
5189     }
5190
5191     TemplateArgumentLocContainerIterator operator++(int) {
5192       TemplateArgumentLocContainerIterator Old(*this);
5193       ++(*this);
5194       return Old;
5195     }
5196
5197     TemplateArgumentLoc operator*() const {
5198       return Container->getArgLoc(Index);
5199     }
5200
5201     pointer operator->() const {
5202       return pointer(Container->getArgLoc(Index));
5203     }
5204
5205     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5206                            const TemplateArgumentLocContainerIterator &Y) {
5207       return X.Container == Y.Container && X.Index == Y.Index;
5208     }
5209
5210     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5211                            const TemplateArgumentLocContainerIterator &Y) {
5212       return !(X == Y);
5213     }
5214   };
5215
5216
5217 template <typename Derived>
5218 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5219                                                         TypeLocBuilder &TLB,
5220                                            TemplateSpecializationTypeLoc TL,
5221                                                       TemplateName Template) {
5222   TemplateArgumentListInfo NewTemplateArgs;
5223   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5224   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5225   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5226     ArgIterator;
5227   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5228                                               ArgIterator(TL, TL.getNumArgs()),
5229                                               NewTemplateArgs))
5230     return QualType();
5231
5232   // FIXME: maybe don't rebuild if all the template arguments are the same.
5233
5234   QualType Result =
5235     getDerived().RebuildTemplateSpecializationType(Template,
5236                                                    TL.getTemplateNameLoc(),
5237                                                    NewTemplateArgs);
5238
5239   if (!Result.isNull()) {
5240     // Specializations of template template parameters are represented as
5241     // TemplateSpecializationTypes, and substitution of type alias templates
5242     // within a dependent context can transform them into
5243     // DependentTemplateSpecializationTypes.
5244     if (isa<DependentTemplateSpecializationType>(Result)) {
5245       DependentTemplateSpecializationTypeLoc NewTL
5246         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5247       NewTL.setElaboratedKeywordLoc(SourceLocation());
5248       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5249       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5250       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5251       NewTL.setLAngleLoc(TL.getLAngleLoc());
5252       NewTL.setRAngleLoc(TL.getRAngleLoc());
5253       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5254         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5255       return Result;
5256     }
5257
5258     TemplateSpecializationTypeLoc NewTL
5259       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5260     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5261     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5262     NewTL.setLAngleLoc(TL.getLAngleLoc());
5263     NewTL.setRAngleLoc(TL.getRAngleLoc());
5264     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5265       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5266   }
5267
5268   return Result;
5269 }
5270
5271 template <typename Derived>
5272 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5273                                      TypeLocBuilder &TLB,
5274                                      DependentTemplateSpecializationTypeLoc TL,
5275                                      TemplateName Template,
5276                                      CXXScopeSpec &SS) {
5277   TemplateArgumentListInfo NewTemplateArgs;
5278   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5279   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5280   typedef TemplateArgumentLocContainerIterator<
5281             DependentTemplateSpecializationTypeLoc> ArgIterator;
5282   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5283                                               ArgIterator(TL, TL.getNumArgs()),
5284                                               NewTemplateArgs))
5285     return QualType();
5286
5287   // FIXME: maybe don't rebuild if all the template arguments are the same.
5288
5289   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5290     QualType Result
5291       = getSema().Context.getDependentTemplateSpecializationType(
5292                                                 TL.getTypePtr()->getKeyword(),
5293                                                          DTN->getQualifier(),
5294                                                          DTN->getIdentifier(),
5295                                                                NewTemplateArgs);
5296
5297     DependentTemplateSpecializationTypeLoc NewTL
5298       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5299     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5300     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5301     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5302     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5303     NewTL.setLAngleLoc(TL.getLAngleLoc());
5304     NewTL.setRAngleLoc(TL.getRAngleLoc());
5305     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5306       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5307     return Result;
5308   }
5309
5310   QualType Result
5311     = getDerived().RebuildTemplateSpecializationType(Template,
5312                                                      TL.getTemplateNameLoc(),
5313                                                      NewTemplateArgs);
5314
5315   if (!Result.isNull()) {
5316     /// FIXME: Wrap this in an elaborated-type-specifier?
5317     TemplateSpecializationTypeLoc NewTL
5318       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5319     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5320     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5321     NewTL.setLAngleLoc(TL.getLAngleLoc());
5322     NewTL.setRAngleLoc(TL.getRAngleLoc());
5323     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5324       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5325   }
5326
5327   return Result;
5328 }
5329
5330 template<typename Derived>
5331 QualType
5332 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5333                                                 ElaboratedTypeLoc TL) {
5334   const ElaboratedType *T = TL.getTypePtr();
5335
5336   NestedNameSpecifierLoc QualifierLoc;
5337   // NOTE: the qualifier in an ElaboratedType is optional.
5338   if (TL.getQualifierLoc()) {
5339     QualifierLoc
5340       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5341     if (!QualifierLoc)
5342       return QualType();
5343   }
5344
5345   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5346   if (NamedT.isNull())
5347     return QualType();
5348
5349   // C++0x [dcl.type.elab]p2:
5350   //   If the identifier resolves to a typedef-name or the simple-template-id
5351   //   resolves to an alias template specialization, the
5352   //   elaborated-type-specifier is ill-formed.
5353   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5354     if (const TemplateSpecializationType *TST =
5355           NamedT->getAs<TemplateSpecializationType>()) {
5356       TemplateName Template = TST->getTemplateName();
5357       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
5358               Template.getAsTemplateDecl())) {
5359         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5360                      diag::err_tag_reference_non_tag) << 4;
5361         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5362       }
5363     }
5364   }
5365
5366   QualType Result = TL.getType();
5367   if (getDerived().AlwaysRebuild() ||
5368       QualifierLoc != TL.getQualifierLoc() ||
5369       NamedT != T->getNamedType()) {
5370     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5371                                                 T->getKeyword(),
5372                                                 QualifierLoc, NamedT);
5373     if (Result.isNull())
5374       return QualType();
5375   }
5376
5377   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5378   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5379   NewTL.setQualifierLoc(QualifierLoc);
5380   return Result;
5381 }
5382
5383 template<typename Derived>
5384 QualType TreeTransform<Derived>::TransformAttributedType(
5385                                                 TypeLocBuilder &TLB,
5386                                                 AttributedTypeLoc TL) {
5387   const AttributedType *oldType = TL.getTypePtr();
5388   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
5389   if (modifiedType.isNull())
5390     return QualType();
5391
5392   QualType result = TL.getType();
5393
5394   // FIXME: dependent operand expressions?
5395   if (getDerived().AlwaysRebuild() ||
5396       modifiedType != oldType->getModifiedType()) {
5397     // TODO: this is really lame; we should really be rebuilding the
5398     // equivalent type from first principles.
5399     QualType equivalentType
5400       = getDerived().TransformType(oldType->getEquivalentType());
5401     if (equivalentType.isNull())
5402       return QualType();
5403
5404     // Check whether we can add nullability; it is only represented as
5405     // type sugar, and therefore cannot be diagnosed in any other way.
5406     if (auto nullability = oldType->getImmediateNullability()) {
5407       if (!modifiedType->canHaveNullability()) {
5408         SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer)
5409           << DiagNullabilityKind(*nullability, false) << modifiedType;
5410         return QualType();
5411       }
5412     }
5413
5414     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
5415                                                modifiedType,
5416                                                equivalentType);
5417   }
5418
5419   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
5420   newTL.setAttrNameLoc(TL.getAttrNameLoc());
5421   if (TL.hasAttrOperand())
5422     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5423   if (TL.hasAttrExprOperand())
5424     newTL.setAttrExprOperand(TL.getAttrExprOperand());
5425   else if (TL.hasAttrEnumOperand())
5426     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
5427
5428   return result;
5429 }
5430
5431 template<typename Derived>
5432 QualType
5433 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
5434                                            ParenTypeLoc TL) {
5435   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
5436   if (Inner.isNull())
5437     return QualType();
5438
5439   QualType Result = TL.getType();
5440   if (getDerived().AlwaysRebuild() ||
5441       Inner != TL.getInnerLoc().getType()) {
5442     Result = getDerived().RebuildParenType(Inner);
5443     if (Result.isNull())
5444       return QualType();
5445   }
5446
5447   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
5448   NewTL.setLParenLoc(TL.getLParenLoc());
5449   NewTL.setRParenLoc(TL.getRParenLoc());
5450   return Result;
5451 }
5452
5453 template<typename Derived>
5454 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
5455                                                       DependentNameTypeLoc TL) {
5456   const DependentNameType *T = TL.getTypePtr();
5457
5458   NestedNameSpecifierLoc QualifierLoc
5459     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5460   if (!QualifierLoc)
5461     return QualType();
5462
5463   QualType Result
5464     = getDerived().RebuildDependentNameType(T->getKeyword(),
5465                                             TL.getElaboratedKeywordLoc(),
5466                                             QualifierLoc,
5467                                             T->getIdentifier(),
5468                                             TL.getNameLoc());
5469   if (Result.isNull())
5470     return QualType();
5471
5472   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
5473     QualType NamedT = ElabT->getNamedType();
5474     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
5475
5476     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5477     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5478     NewTL.setQualifierLoc(QualifierLoc);
5479   } else {
5480     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
5481     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5482     NewTL.setQualifierLoc(QualifierLoc);
5483     NewTL.setNameLoc(TL.getNameLoc());
5484   }
5485   return Result;
5486 }
5487
5488 template<typename Derived>
5489 QualType TreeTransform<Derived>::
5490           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5491                                  DependentTemplateSpecializationTypeLoc TL) {
5492   NestedNameSpecifierLoc QualifierLoc;
5493   if (TL.getQualifierLoc()) {
5494     QualifierLoc
5495       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5496     if (!QualifierLoc)
5497       return QualType();
5498   }
5499
5500   return getDerived()
5501            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
5502 }
5503
5504 template<typename Derived>
5505 QualType TreeTransform<Derived>::
5506 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5507                                    DependentTemplateSpecializationTypeLoc TL,
5508                                        NestedNameSpecifierLoc QualifierLoc) {
5509   const DependentTemplateSpecializationType *T = TL.getTypePtr();
5510
5511   TemplateArgumentListInfo NewTemplateArgs;
5512   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5513   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5514
5515   typedef TemplateArgumentLocContainerIterator<
5516   DependentTemplateSpecializationTypeLoc> ArgIterator;
5517   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5518                                               ArgIterator(TL, TL.getNumArgs()),
5519                                               NewTemplateArgs))
5520     return QualType();
5521
5522   QualType Result
5523     = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
5524                                                               QualifierLoc,
5525                                                             T->getIdentifier(),
5526                                                        TL.getTemplateNameLoc(),
5527                                                             NewTemplateArgs);
5528   if (Result.isNull())
5529     return QualType();
5530
5531   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
5532     QualType NamedT = ElabT->getNamedType();
5533
5534     // Copy information relevant to the template specialization.
5535     TemplateSpecializationTypeLoc NamedTL
5536       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
5537     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5538     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5539     NamedTL.setLAngleLoc(TL.getLAngleLoc());
5540     NamedTL.setRAngleLoc(TL.getRAngleLoc());
5541     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5542       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5543
5544     // Copy information relevant to the elaborated type.
5545     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5546     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5547     NewTL.setQualifierLoc(QualifierLoc);
5548   } else if (isa<DependentTemplateSpecializationType>(Result)) {
5549     DependentTemplateSpecializationTypeLoc SpecTL
5550       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5551     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5552     SpecTL.setQualifierLoc(QualifierLoc);
5553     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5554     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5555     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5556     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5557     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5558       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5559   } else {
5560     TemplateSpecializationTypeLoc SpecTL
5561       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5562     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5563     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5564     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5565     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5566     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5567       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5568   }
5569   return Result;
5570 }
5571
5572 template<typename Derived>
5573 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
5574                                                       PackExpansionTypeLoc TL) {
5575   QualType Pattern
5576     = getDerived().TransformType(TLB, TL.getPatternLoc());
5577   if (Pattern.isNull())
5578     return QualType();
5579
5580   QualType Result = TL.getType();
5581   if (getDerived().AlwaysRebuild() ||
5582       Pattern != TL.getPatternLoc().getType()) {
5583     Result = getDerived().RebuildPackExpansionType(Pattern,
5584                                            TL.getPatternLoc().getSourceRange(),
5585                                                    TL.getEllipsisLoc(),
5586                                            TL.getTypePtr()->getNumExpansions());
5587     if (Result.isNull())
5588       return QualType();
5589   }
5590
5591   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
5592   NewT.setEllipsisLoc(TL.getEllipsisLoc());
5593   return Result;
5594 }
5595
5596 template<typename Derived>
5597 QualType
5598 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
5599                                                    ObjCInterfaceTypeLoc TL) {
5600   // ObjCInterfaceType is never dependent.
5601   TLB.pushFullCopy(TL);
5602   return TL.getType();
5603 }
5604
5605 template<typename Derived>
5606 QualType
5607 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
5608                                                 ObjCObjectTypeLoc TL) {
5609   // ObjCObjectType is never dependent.
5610   TLB.pushFullCopy(TL);
5611   return TL.getType();
5612 }
5613
5614 template<typename Derived>
5615 QualType
5616 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
5617                                                ObjCObjectPointerTypeLoc TL) {
5618   // ObjCObjectPointerType is never dependent.
5619   TLB.pushFullCopy(TL);
5620   return TL.getType();
5621 }
5622
5623 //===----------------------------------------------------------------------===//
5624 // Statement transformation
5625 //===----------------------------------------------------------------------===//
5626 template<typename Derived>
5627 StmtResult
5628 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
5629   return S;
5630 }
5631
5632 template<typename Derived>
5633 StmtResult
5634 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
5635   return getDerived().TransformCompoundStmt(S, false);
5636 }
5637
5638 template<typename Derived>
5639 StmtResult
5640 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
5641                                               bool IsStmtExpr) {
5642   Sema::CompoundScopeRAII CompoundScope(getSema());
5643
5644   bool SubStmtInvalid = false;
5645   bool SubStmtChanged = false;
5646   SmallVector<Stmt*, 8> Statements;
5647   for (auto *B : S->body()) {
5648     StmtResult Result = getDerived().TransformStmt(B);
5649     if (Result.isInvalid()) {
5650       // Immediately fail if this was a DeclStmt, since it's very
5651       // likely that this will cause problems for future statements.
5652       if (isa<DeclStmt>(B))
5653         return StmtError();
5654
5655       // Otherwise, just keep processing substatements and fail later.
5656       SubStmtInvalid = true;
5657       continue;
5658     }
5659
5660     SubStmtChanged = SubStmtChanged || Result.get() != B;
5661     Statements.push_back(Result.getAs<Stmt>());
5662   }
5663
5664   if (SubStmtInvalid)
5665     return StmtError();
5666
5667   if (!getDerived().AlwaysRebuild() &&
5668       !SubStmtChanged)
5669     return S;
5670
5671   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
5672                                           Statements,
5673                                           S->getRBracLoc(),
5674                                           IsStmtExpr);
5675 }
5676
5677 template<typename Derived>
5678 StmtResult
5679 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
5680   ExprResult LHS, RHS;
5681   {
5682     EnterExpressionEvaluationContext Unevaluated(SemaRef,
5683                                                  Sema::ConstantEvaluated);
5684
5685     // Transform the left-hand case value.
5686     LHS = getDerived().TransformExpr(S->getLHS());
5687     LHS = SemaRef.ActOnConstantExpression(LHS);
5688     if (LHS.isInvalid())
5689       return StmtError();
5690
5691     // Transform the right-hand case value (for the GNU case-range extension).
5692     RHS = getDerived().TransformExpr(S->getRHS());
5693     RHS = SemaRef.ActOnConstantExpression(RHS);
5694     if (RHS.isInvalid())
5695       return StmtError();
5696   }
5697
5698   // Build the case statement.
5699   // Case statements are always rebuilt so that they will attached to their
5700   // transformed switch statement.
5701   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
5702                                                        LHS.get(),
5703                                                        S->getEllipsisLoc(),
5704                                                        RHS.get(),
5705                                                        S->getColonLoc());
5706   if (Case.isInvalid())
5707     return StmtError();
5708
5709   // Transform the statement following the case
5710   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5711   if (SubStmt.isInvalid())
5712     return StmtError();
5713
5714   // Attach the body to the case statement
5715   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
5716 }
5717
5718 template<typename Derived>
5719 StmtResult
5720 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
5721   // Transform the statement following the default case
5722   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5723   if (SubStmt.isInvalid())
5724     return StmtError();
5725
5726   // Default statements are always rebuilt
5727   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
5728                                          SubStmt.get());
5729 }
5730
5731 template<typename Derived>
5732 StmtResult
5733 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
5734   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5735   if (SubStmt.isInvalid())
5736     return StmtError();
5737
5738   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
5739                                         S->getDecl());
5740   if (!LD)
5741     return StmtError();
5742
5743
5744   // FIXME: Pass the real colon location in.
5745   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
5746                                        cast<LabelDecl>(LD), SourceLocation(),
5747                                        SubStmt.get());
5748 }
5749
5750 template <typename Derived>
5751 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
5752   if (!R)
5753     return R;
5754
5755   switch (R->getKind()) {
5756 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
5757 #define ATTR(X)
5758 #define PRAGMA_SPELLING_ATTR(X)                                                \
5759   case attr::X:                                                                \
5760     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
5761 #include "clang/Basic/AttrList.inc"
5762   default:
5763     return R;
5764   }
5765 }
5766
5767 template <typename Derived>
5768 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
5769   bool AttrsChanged = false;
5770   SmallVector<const Attr *, 1> Attrs;
5771
5772   // Visit attributes and keep track if any are transformed.
5773   for (const auto *I : S->getAttrs()) {
5774     const Attr *R = getDerived().TransformAttr(I);
5775     AttrsChanged |= (I != R);
5776     Attrs.push_back(R);
5777   }
5778
5779   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5780   if (SubStmt.isInvalid())
5781     return StmtError();
5782
5783   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
5784     return S;
5785
5786   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
5787                                             SubStmt.get());
5788 }
5789
5790 template<typename Derived>
5791 StmtResult
5792 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
5793   // Transform the condition
5794   ExprResult Cond;
5795   VarDecl *ConditionVar = nullptr;
5796   if (S->getConditionVariable()) {
5797     ConditionVar
5798       = cast_or_null<VarDecl>(
5799                    getDerived().TransformDefinition(
5800                                       S->getConditionVariable()->getLocation(),
5801                                                     S->getConditionVariable()));
5802     if (!ConditionVar)
5803       return StmtError();
5804   } else {
5805     Cond = getDerived().TransformExpr(S->getCond());
5806
5807     if (Cond.isInvalid())
5808       return StmtError();
5809
5810     // Convert the condition to a boolean value.
5811     if (S->getCond()) {
5812       ExprResult CondE = getSema().ActOnBooleanCondition(nullptr, S->getIfLoc(),
5813                                                          Cond.get());
5814       if (CondE.isInvalid())
5815         return StmtError();
5816
5817       Cond = CondE.get();
5818     }
5819   }
5820
5821   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5822   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5823     return StmtError();
5824
5825   // Transform the "then" branch.
5826   StmtResult Then = getDerived().TransformStmt(S->getThen());
5827   if (Then.isInvalid())
5828     return StmtError();
5829
5830   // Transform the "else" branch.
5831   StmtResult Else = getDerived().TransformStmt(S->getElse());
5832   if (Else.isInvalid())
5833     return StmtError();
5834
5835   if (!getDerived().AlwaysRebuild() &&
5836       FullCond.get() == S->getCond() &&
5837       ConditionVar == S->getConditionVariable() &&
5838       Then.get() == S->getThen() &&
5839       Else.get() == S->getElse())
5840     return S;
5841
5842   return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
5843                                     Then.get(),
5844                                     S->getElseLoc(), Else.get());
5845 }
5846
5847 template<typename Derived>
5848 StmtResult
5849 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
5850   // Transform the condition.
5851   ExprResult Cond;
5852   VarDecl *ConditionVar = nullptr;
5853   if (S->getConditionVariable()) {
5854     ConditionVar
5855       = cast_or_null<VarDecl>(
5856                    getDerived().TransformDefinition(
5857                                       S->getConditionVariable()->getLocation(),
5858                                                     S->getConditionVariable()));
5859     if (!ConditionVar)
5860       return StmtError();
5861   } else {
5862     Cond = getDerived().TransformExpr(S->getCond());
5863
5864     if (Cond.isInvalid())
5865       return StmtError();
5866   }
5867
5868   // Rebuild the switch statement.
5869   StmtResult Switch
5870     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(),
5871                                           ConditionVar);
5872   if (Switch.isInvalid())
5873     return StmtError();
5874
5875   // Transform the body of the switch statement.
5876   StmtResult Body = getDerived().TransformStmt(S->getBody());
5877   if (Body.isInvalid())
5878     return StmtError();
5879
5880   // Complete the switch statement.
5881   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
5882                                             Body.get());
5883 }
5884
5885 template<typename Derived>
5886 StmtResult
5887 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
5888   // Transform the condition
5889   ExprResult Cond;
5890   VarDecl *ConditionVar = nullptr;
5891   if (S->getConditionVariable()) {
5892     ConditionVar
5893       = cast_or_null<VarDecl>(
5894                    getDerived().TransformDefinition(
5895                                       S->getConditionVariable()->getLocation(),
5896                                                     S->getConditionVariable()));
5897     if (!ConditionVar)
5898       return StmtError();
5899   } else {
5900     Cond = getDerived().TransformExpr(S->getCond());
5901
5902     if (Cond.isInvalid())
5903       return StmtError();
5904
5905     if (S->getCond()) {
5906       // Convert the condition to a boolean value.
5907       ExprResult CondE = getSema().ActOnBooleanCondition(nullptr,
5908                                                          S->getWhileLoc(),
5909                                                          Cond.get());
5910       if (CondE.isInvalid())
5911         return StmtError();
5912       Cond = CondE;
5913     }
5914   }
5915
5916   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5917   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5918     return StmtError();
5919
5920   // Transform the body
5921   StmtResult Body = getDerived().TransformStmt(S->getBody());
5922   if (Body.isInvalid())
5923     return StmtError();
5924
5925   if (!getDerived().AlwaysRebuild() &&
5926       FullCond.get() == S->getCond() &&
5927       ConditionVar == S->getConditionVariable() &&
5928       Body.get() == S->getBody())
5929     return Owned(S);
5930
5931   return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
5932                                        ConditionVar, Body.get());
5933 }
5934
5935 template<typename Derived>
5936 StmtResult
5937 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
5938   // Transform the body
5939   StmtResult Body = getDerived().TransformStmt(S->getBody());
5940   if (Body.isInvalid())
5941     return StmtError();
5942
5943   // Transform the condition
5944   ExprResult Cond = getDerived().TransformExpr(S->getCond());
5945   if (Cond.isInvalid())
5946     return StmtError();
5947
5948   if (!getDerived().AlwaysRebuild() &&
5949       Cond.get() == S->getCond() &&
5950       Body.get() == S->getBody())
5951     return S;
5952
5953   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
5954                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
5955                                     S->getRParenLoc());
5956 }
5957
5958 template<typename Derived>
5959 StmtResult
5960 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
5961   // Transform the initialization statement
5962   StmtResult Init = getDerived().TransformStmt(S->getInit());
5963   if (Init.isInvalid())
5964     return StmtError();
5965
5966   // Transform the condition
5967   ExprResult Cond;
5968   VarDecl *ConditionVar = nullptr;
5969   if (S->getConditionVariable()) {
5970     ConditionVar
5971       = cast_or_null<VarDecl>(
5972                    getDerived().TransformDefinition(
5973                                       S->getConditionVariable()->getLocation(),
5974                                                     S->getConditionVariable()));
5975     if (!ConditionVar)
5976       return StmtError();
5977   } else {
5978     Cond = getDerived().TransformExpr(S->getCond());
5979
5980     if (Cond.isInvalid())
5981       return StmtError();
5982
5983     if (S->getCond()) {
5984       // Convert the condition to a boolean value.
5985       ExprResult CondE = getSema().ActOnBooleanCondition(nullptr,
5986                                                          S->getForLoc(),
5987                                                          Cond.get());
5988       if (CondE.isInvalid())
5989         return StmtError();
5990
5991       Cond = CondE.get();
5992     }
5993   }
5994
5995   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5996   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5997     return StmtError();
5998
5999   // Transform the increment
6000   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6001   if (Inc.isInvalid())
6002     return StmtError();
6003
6004   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6005   if (S->getInc() && !FullInc.get())
6006     return StmtError();
6007
6008   // Transform the body
6009   StmtResult Body = getDerived().TransformStmt(S->getBody());
6010   if (Body.isInvalid())
6011     return StmtError();
6012
6013   if (!getDerived().AlwaysRebuild() &&
6014       Init.get() == S->getInit() &&
6015       FullCond.get() == S->getCond() &&
6016       Inc.get() == S->getInc() &&
6017       Body.get() == S->getBody())
6018     return S;
6019
6020   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6021                                      Init.get(), FullCond, ConditionVar,
6022                                      FullInc, S->getRParenLoc(), Body.get());
6023 }
6024
6025 template<typename Derived>
6026 StmtResult
6027 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6028   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6029                                         S->getLabel());
6030   if (!LD)
6031     return StmtError();
6032
6033   // Goto statements must always be rebuilt, to resolve the label.
6034   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6035                                       cast<LabelDecl>(LD));
6036 }
6037
6038 template<typename Derived>
6039 StmtResult
6040 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6041   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6042   if (Target.isInvalid())
6043     return StmtError();
6044   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6045
6046   if (!getDerived().AlwaysRebuild() &&
6047       Target.get() == S->getTarget())
6048     return S;
6049
6050   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6051                                               Target.get());
6052 }
6053
6054 template<typename Derived>
6055 StmtResult
6056 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6057   return S;
6058 }
6059
6060 template<typename Derived>
6061 StmtResult
6062 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6063   return S;
6064 }
6065
6066 template<typename Derived>
6067 StmtResult
6068 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6069   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6070                                                         /*NotCopyInit*/false);
6071   if (Result.isInvalid())
6072     return StmtError();
6073
6074   // FIXME: We always rebuild the return statement because there is no way
6075   // to tell whether the return type of the function has changed.
6076   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6077 }
6078
6079 template<typename Derived>
6080 StmtResult
6081 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6082   bool DeclChanged = false;
6083   SmallVector<Decl *, 4> Decls;
6084   for (auto *D : S->decls()) {
6085     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6086     if (!Transformed)
6087       return StmtError();
6088
6089     if (Transformed != D)
6090       DeclChanged = true;
6091
6092     Decls.push_back(Transformed);
6093   }
6094
6095   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6096     return S;
6097
6098   return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
6099 }
6100
6101 template<typename Derived>
6102 StmtResult
6103 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6104
6105   SmallVector<Expr*, 8> Constraints;
6106   SmallVector<Expr*, 8> Exprs;
6107   SmallVector<IdentifierInfo *, 4> Names;
6108
6109   ExprResult AsmString;
6110   SmallVector<Expr*, 8> Clobbers;
6111
6112   bool ExprsChanged = false;
6113
6114   // Go through the outputs.
6115   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6116     Names.push_back(S->getOutputIdentifier(I));
6117
6118     // No need to transform the constraint literal.
6119     Constraints.push_back(S->getOutputConstraintLiteral(I));
6120
6121     // Transform the output expr.
6122     Expr *OutputExpr = S->getOutputExpr(I);
6123     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6124     if (Result.isInvalid())
6125       return StmtError();
6126
6127     ExprsChanged |= Result.get() != OutputExpr;
6128
6129     Exprs.push_back(Result.get());
6130   }
6131
6132   // Go through the inputs.
6133   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6134     Names.push_back(S->getInputIdentifier(I));
6135
6136     // No need to transform the constraint literal.
6137     Constraints.push_back(S->getInputConstraintLiteral(I));
6138
6139     // Transform the input expr.
6140     Expr *InputExpr = S->getInputExpr(I);
6141     ExprResult Result = getDerived().TransformExpr(InputExpr);
6142     if (Result.isInvalid())
6143       return StmtError();
6144
6145     ExprsChanged |= Result.get() != InputExpr;
6146
6147     Exprs.push_back(Result.get());
6148   }
6149
6150   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6151     return S;
6152
6153   // Go through the clobbers.
6154   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6155     Clobbers.push_back(S->getClobberStringLiteral(I));
6156
6157   // No need to transform the asm string literal.
6158   AsmString = S->getAsmString();
6159   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6160                                         S->isVolatile(), S->getNumOutputs(),
6161                                         S->getNumInputs(), Names.data(),
6162                                         Constraints, Exprs, AsmString.get(),
6163                                         Clobbers, S->getRParenLoc());
6164 }
6165
6166 template<typename Derived>
6167 StmtResult
6168 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6169   ArrayRef<Token> AsmToks =
6170     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6171
6172   bool HadError = false, HadChange = false;
6173
6174   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6175   SmallVector<Expr*, 8> TransformedExprs;
6176   TransformedExprs.reserve(SrcExprs.size());
6177   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6178     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6179     if (!Result.isUsable()) {
6180       HadError = true;
6181     } else {
6182       HadChange |= (Result.get() != SrcExprs[i]);
6183       TransformedExprs.push_back(Result.get());
6184     }
6185   }
6186
6187   if (HadError) return StmtError();
6188   if (!HadChange && !getDerived().AlwaysRebuild())
6189     return Owned(S);
6190
6191   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6192                                        AsmToks, S->getAsmString(),
6193                                        S->getNumOutputs(), S->getNumInputs(),
6194                                        S->getAllConstraints(), S->getClobbers(),
6195                                        TransformedExprs, S->getEndLoc());
6196 }
6197
6198 template<typename Derived>
6199 StmtResult
6200 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
6201   // Transform the body of the @try.
6202   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
6203   if (TryBody.isInvalid())
6204     return StmtError();
6205
6206   // Transform the @catch statements (if present).
6207   bool AnyCatchChanged = false;
6208   SmallVector<Stmt*, 8> CatchStmts;
6209   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
6210     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
6211     if (Catch.isInvalid())
6212       return StmtError();
6213     if (Catch.get() != S->getCatchStmt(I))
6214       AnyCatchChanged = true;
6215     CatchStmts.push_back(Catch.get());
6216   }
6217
6218   // Transform the @finally statement (if present).
6219   StmtResult Finally;
6220   if (S->getFinallyStmt()) {
6221     Finally = getDerived().TransformStmt(S->getFinallyStmt());
6222     if (Finally.isInvalid())
6223       return StmtError();
6224   }
6225
6226   // If nothing changed, just retain this statement.
6227   if (!getDerived().AlwaysRebuild() &&
6228       TryBody.get() == S->getTryBody() &&
6229       !AnyCatchChanged &&
6230       Finally.get() == S->getFinallyStmt())
6231     return S;
6232
6233   // Build a new statement.
6234   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
6235                                            CatchStmts, Finally.get());
6236 }
6237
6238 template<typename Derived>
6239 StmtResult
6240 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
6241   // Transform the @catch parameter, if there is one.
6242   VarDecl *Var = nullptr;
6243   if (VarDecl *FromVar = S->getCatchParamDecl()) {
6244     TypeSourceInfo *TSInfo = nullptr;
6245     if (FromVar->getTypeSourceInfo()) {
6246       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
6247       if (!TSInfo)
6248         return StmtError();
6249     }
6250
6251     QualType T;
6252     if (TSInfo)
6253       T = TSInfo->getType();
6254     else {
6255       T = getDerived().TransformType(FromVar->getType());
6256       if (T.isNull())
6257         return StmtError();
6258     }
6259
6260     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
6261     if (!Var)
6262       return StmtError();
6263   }
6264
6265   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
6266   if (Body.isInvalid())
6267     return StmtError();
6268
6269   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
6270                                              S->getRParenLoc(),
6271                                              Var, Body.get());
6272 }
6273
6274 template<typename Derived>
6275 StmtResult
6276 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
6277   // Transform the body.
6278   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
6279   if (Body.isInvalid())
6280     return StmtError();
6281
6282   // If nothing changed, just retain this statement.
6283   if (!getDerived().AlwaysRebuild() &&
6284       Body.get() == S->getFinallyBody())
6285     return S;
6286
6287   // Build a new statement.
6288   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
6289                                                Body.get());
6290 }
6291
6292 template<typename Derived>
6293 StmtResult
6294 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6295   ExprResult Operand;
6296   if (S->getThrowExpr()) {
6297     Operand = getDerived().TransformExpr(S->getThrowExpr());
6298     if (Operand.isInvalid())
6299       return StmtError();
6300   }
6301
6302   if (!getDerived().AlwaysRebuild() &&
6303       Operand.get() == S->getThrowExpr())
6304     return S;
6305
6306   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
6307 }
6308
6309 template<typename Derived>
6310 StmtResult
6311 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
6312                                                   ObjCAtSynchronizedStmt *S) {
6313   // Transform the object we are locking.
6314   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
6315   if (Object.isInvalid())
6316     return StmtError();
6317   Object =
6318     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
6319                                                   Object.get());
6320   if (Object.isInvalid())
6321     return StmtError();
6322
6323   // Transform the body.
6324   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
6325   if (Body.isInvalid())
6326     return StmtError();
6327
6328   // If nothing change, just retain the current statement.
6329   if (!getDerived().AlwaysRebuild() &&
6330       Object.get() == S->getSynchExpr() &&
6331       Body.get() == S->getSynchBody())
6332     return S;
6333
6334   // Build a new statement.
6335   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
6336                                                     Object.get(), Body.get());
6337 }
6338
6339 template<typename Derived>
6340 StmtResult
6341 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
6342                                               ObjCAutoreleasePoolStmt *S) {
6343   // Transform the body.
6344   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
6345   if (Body.isInvalid())
6346     return StmtError();
6347
6348   // If nothing changed, just retain this statement.
6349   if (!getDerived().AlwaysRebuild() &&
6350       Body.get() == S->getSubStmt())
6351     return S;
6352
6353   // Build a new statement.
6354   return getDerived().RebuildObjCAutoreleasePoolStmt(
6355                         S->getAtLoc(), Body.get());
6356 }
6357
6358 template<typename Derived>
6359 StmtResult
6360 TreeTransform<Derived>::TransformObjCForCollectionStmt(
6361                                                   ObjCForCollectionStmt *S) {
6362   // Transform the element statement.
6363   StmtResult Element = getDerived().TransformStmt(S->getElement());
6364   if (Element.isInvalid())
6365     return StmtError();
6366
6367   // Transform the collection expression.
6368   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
6369   if (Collection.isInvalid())
6370     return StmtError();
6371
6372   // Transform the body.
6373   StmtResult Body = getDerived().TransformStmt(S->getBody());
6374   if (Body.isInvalid())
6375     return StmtError();
6376
6377   // If nothing changed, just retain this statement.
6378   if (!getDerived().AlwaysRebuild() &&
6379       Element.get() == S->getElement() &&
6380       Collection.get() == S->getCollection() &&
6381       Body.get() == S->getBody())
6382     return S;
6383
6384   // Build a new statement.
6385   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
6386                                                    Element.get(),
6387                                                    Collection.get(),
6388                                                    S->getRParenLoc(),
6389                                                    Body.get());
6390 }
6391
6392 template <typename Derived>
6393 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
6394   // Transform the exception declaration, if any.
6395   VarDecl *Var = nullptr;
6396   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
6397     TypeSourceInfo *T =
6398         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
6399     if (!T)
6400       return StmtError();
6401
6402     Var = getDerived().RebuildExceptionDecl(
6403         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
6404         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
6405     if (!Var || Var->isInvalidDecl())
6406       return StmtError();
6407   }
6408
6409   // Transform the actual exception handler.
6410   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
6411   if (Handler.isInvalid())
6412     return StmtError();
6413
6414   if (!getDerived().AlwaysRebuild() && !Var &&
6415       Handler.get() == S->getHandlerBlock())
6416     return S;
6417
6418   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
6419 }
6420
6421 template <typename Derived>
6422 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
6423   // Transform the try block itself.
6424   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6425   if (TryBlock.isInvalid())
6426     return StmtError();
6427
6428   // Transform the handlers.
6429   bool HandlerChanged = false;
6430   SmallVector<Stmt *, 8> Handlers;
6431   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
6432     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
6433     if (Handler.isInvalid())
6434       return StmtError();
6435
6436     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
6437     Handlers.push_back(Handler.getAs<Stmt>());
6438   }
6439
6440   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6441       !HandlerChanged)
6442     return S;
6443
6444   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
6445                                         Handlers);
6446 }
6447
6448 template<typename Derived>
6449 StmtResult
6450 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
6451   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
6452   if (Range.isInvalid())
6453     return StmtError();
6454
6455   StmtResult BeginEnd = getDerived().TransformStmt(S->getBeginEndStmt());
6456   if (BeginEnd.isInvalid())
6457     return StmtError();
6458
6459   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6460   if (Cond.isInvalid())
6461     return StmtError();
6462   if (Cond.get())
6463     Cond = SemaRef.CheckBooleanCondition(Cond.get(), S->getColonLoc());
6464   if (Cond.isInvalid())
6465     return StmtError();
6466   if (Cond.get())
6467     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
6468
6469   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6470   if (Inc.isInvalid())
6471     return StmtError();
6472   if (Inc.get())
6473     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
6474
6475   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
6476   if (LoopVar.isInvalid())
6477     return StmtError();
6478
6479   StmtResult NewStmt = S;
6480   if (getDerived().AlwaysRebuild() ||
6481       Range.get() != S->getRangeStmt() ||
6482       BeginEnd.get() != S->getBeginEndStmt() ||
6483       Cond.get() != S->getCond() ||
6484       Inc.get() != S->getInc() ||
6485       LoopVar.get() != S->getLoopVarStmt()) {
6486     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
6487                                                   S->getColonLoc(), Range.get(),
6488                                                   BeginEnd.get(), Cond.get(),
6489                                                   Inc.get(), LoopVar.get(),
6490                                                   S->getRParenLoc());
6491     if (NewStmt.isInvalid())
6492       return StmtError();
6493   }
6494
6495   StmtResult Body = getDerived().TransformStmt(S->getBody());
6496   if (Body.isInvalid())
6497     return StmtError();
6498
6499   // Body has changed but we didn't rebuild the for-range statement. Rebuild
6500   // it now so we have a new statement to attach the body to.
6501   if (Body.get() != S->getBody() && NewStmt.get() == S) {
6502     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
6503                                                   S->getColonLoc(), Range.get(),
6504                                                   BeginEnd.get(), Cond.get(),
6505                                                   Inc.get(), LoopVar.get(),
6506                                                   S->getRParenLoc());
6507     if (NewStmt.isInvalid())
6508       return StmtError();
6509   }
6510
6511   if (NewStmt.get() == S)
6512     return S;
6513
6514   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
6515 }
6516
6517 template<typename Derived>
6518 StmtResult
6519 TreeTransform<Derived>::TransformMSDependentExistsStmt(
6520                                                     MSDependentExistsStmt *S) {
6521   // Transform the nested-name-specifier, if any.
6522   NestedNameSpecifierLoc QualifierLoc;
6523   if (S->getQualifierLoc()) {
6524     QualifierLoc
6525       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
6526     if (!QualifierLoc)
6527       return StmtError();
6528   }
6529
6530   // Transform the declaration name.
6531   DeclarationNameInfo NameInfo = S->getNameInfo();
6532   if (NameInfo.getName()) {
6533     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
6534     if (!NameInfo.getName())
6535       return StmtError();
6536   }
6537
6538   // Check whether anything changed.
6539   if (!getDerived().AlwaysRebuild() &&
6540       QualifierLoc == S->getQualifierLoc() &&
6541       NameInfo.getName() == S->getNameInfo().getName())
6542     return S;
6543
6544   // Determine whether this name exists, if we can.
6545   CXXScopeSpec SS;
6546   SS.Adopt(QualifierLoc);
6547   bool Dependent = false;
6548   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
6549   case Sema::IER_Exists:
6550     if (S->isIfExists())
6551       break;
6552
6553     return new (getSema().Context) NullStmt(S->getKeywordLoc());
6554
6555   case Sema::IER_DoesNotExist:
6556     if (S->isIfNotExists())
6557       break;
6558
6559     return new (getSema().Context) NullStmt(S->getKeywordLoc());
6560
6561   case Sema::IER_Dependent:
6562     Dependent = true;
6563     break;
6564
6565   case Sema::IER_Error:
6566     return StmtError();
6567   }
6568
6569   // We need to continue with the instantiation, so do so now.
6570   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
6571   if (SubStmt.isInvalid())
6572     return StmtError();
6573
6574   // If we have resolved the name, just transform to the substatement.
6575   if (!Dependent)
6576     return SubStmt;
6577
6578   // The name is still dependent, so build a dependent expression again.
6579   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
6580                                                    S->isIfExists(),
6581                                                    QualifierLoc,
6582                                                    NameInfo,
6583                                                    SubStmt.get());
6584 }
6585
6586 template<typename Derived>
6587 ExprResult
6588 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
6589   NestedNameSpecifierLoc QualifierLoc;
6590   if (E->getQualifierLoc()) {
6591     QualifierLoc
6592     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
6593     if (!QualifierLoc)
6594       return ExprError();
6595   }
6596
6597   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
6598     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
6599   if (!PD)
6600     return ExprError();
6601
6602   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
6603   if (Base.isInvalid())
6604     return ExprError();
6605
6606   return new (SemaRef.getASTContext())
6607       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
6608                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
6609                         QualifierLoc, E->getMemberLoc());
6610 }
6611
6612 template <typename Derived>
6613 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
6614   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6615   if (TryBlock.isInvalid())
6616     return StmtError();
6617
6618   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
6619   if (Handler.isInvalid())
6620     return StmtError();
6621
6622   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6623       Handler.get() == S->getHandler())
6624     return S;
6625
6626   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
6627                                         TryBlock.get(), Handler.get());
6628 }
6629
6630 template <typename Derived>
6631 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
6632   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
6633   if (Block.isInvalid())
6634     return StmtError();
6635
6636   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
6637 }
6638
6639 template <typename Derived>
6640 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
6641   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
6642   if (FilterExpr.isInvalid())
6643     return StmtError();
6644
6645   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
6646   if (Block.isInvalid())
6647     return StmtError();
6648
6649   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
6650                                            Block.get());
6651 }
6652
6653 template <typename Derived>
6654 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
6655   if (isa<SEHFinallyStmt>(Handler))
6656     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
6657   else
6658     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
6659 }
6660
6661 template<typename Derived>
6662 StmtResult
6663 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
6664   return S;
6665 }
6666
6667 //===----------------------------------------------------------------------===//
6668 // OpenMP directive transformation
6669 //===----------------------------------------------------------------------===//
6670 template <typename Derived>
6671 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
6672     OMPExecutableDirective *D) {
6673
6674   // Transform the clauses
6675   llvm::SmallVector<OMPClause *, 16> TClauses;
6676   ArrayRef<OMPClause *> Clauses = D->clauses();
6677   TClauses.reserve(Clauses.size());
6678   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
6679        I != E; ++I) {
6680     if (*I) {
6681       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
6682       OMPClause *Clause = getDerived().TransformOMPClause(*I);
6683       getDerived().getSema().EndOpenMPClause();
6684       if (Clause)
6685         TClauses.push_back(Clause);
6686     } else {
6687       TClauses.push_back(nullptr);
6688     }
6689   }
6690   StmtResult AssociatedStmt;
6691   if (D->hasAssociatedStmt()) {
6692     if (!D->getAssociatedStmt()) {
6693       return StmtError();
6694     }
6695     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
6696                                                   /*CurScope=*/nullptr);
6697     StmtResult Body;
6698     {
6699       Sema::CompoundScopeRAII CompoundScope(getSema());
6700       Body = getDerived().TransformStmt(
6701           cast<CapturedStmt>(D->getAssociatedStmt())->getCapturedStmt());
6702     }
6703     AssociatedStmt =
6704         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
6705     if (AssociatedStmt.isInvalid()) {
6706       return StmtError();
6707     }
6708   }
6709   if (TClauses.size() != Clauses.size()) {
6710     return StmtError();
6711   }
6712
6713   // Transform directive name for 'omp critical' directive.
6714   DeclarationNameInfo DirName;
6715   if (D->getDirectiveKind() == OMPD_critical) {
6716     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
6717     DirName = getDerived().TransformDeclarationNameInfo(DirName);
6718   }
6719   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
6720   if (D->getDirectiveKind() == OMPD_cancellation_point) {
6721     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
6722   } else if (D->getDirectiveKind() == OMPD_cancel) {
6723     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
6724   }
6725
6726   return getDerived().RebuildOMPExecutableDirective(
6727       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
6728       AssociatedStmt.get(), D->getLocStart(), D->getLocEnd());
6729 }
6730
6731 template <typename Derived>
6732 StmtResult
6733 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
6734   DeclarationNameInfo DirName;
6735   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
6736                                              D->getLocStart());
6737   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6738   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6739   return Res;
6740 }
6741
6742 template <typename Derived>
6743 StmtResult
6744 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
6745   DeclarationNameInfo DirName;
6746   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
6747                                              D->getLocStart());
6748   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6749   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6750   return Res;
6751 }
6752
6753 template <typename Derived>
6754 StmtResult
6755 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
6756   DeclarationNameInfo DirName;
6757   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
6758                                              D->getLocStart());
6759   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6760   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6761   return Res;
6762 }
6763
6764 template <typename Derived>
6765 StmtResult
6766 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
6767   DeclarationNameInfo DirName;
6768   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
6769                                              D->getLocStart());
6770   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6771   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6772   return Res;
6773 }
6774
6775 template <typename Derived>
6776 StmtResult
6777 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
6778   DeclarationNameInfo DirName;
6779   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
6780                                              D->getLocStart());
6781   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6782   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6783   return Res;
6784 }
6785
6786 template <typename Derived>
6787 StmtResult
6788 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
6789   DeclarationNameInfo DirName;
6790   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
6791                                              D->getLocStart());
6792   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6793   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6794   return Res;
6795 }
6796
6797 template <typename Derived>
6798 StmtResult
6799 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
6800   DeclarationNameInfo DirName;
6801   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
6802                                              D->getLocStart());
6803   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6804   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6805   return Res;
6806 }
6807
6808 template <typename Derived>
6809 StmtResult
6810 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
6811   DeclarationNameInfo DirName;
6812   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
6813                                              D->getLocStart());
6814   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6815   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6816   return Res;
6817 }
6818
6819 template <typename Derived>
6820 StmtResult
6821 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
6822   getDerived().getSema().StartOpenMPDSABlock(
6823       OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart());
6824   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6825   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6826   return Res;
6827 }
6828
6829 template <typename Derived>
6830 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
6831     OMPParallelForDirective *D) {
6832   DeclarationNameInfo DirName;
6833   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
6834                                              nullptr, D->getLocStart());
6835   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6836   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6837   return Res;
6838 }
6839
6840 template <typename Derived>
6841 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
6842     OMPParallelForSimdDirective *D) {
6843   DeclarationNameInfo DirName;
6844   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
6845                                              nullptr, D->getLocStart());
6846   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6847   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6848   return Res;
6849 }
6850
6851 template <typename Derived>
6852 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
6853     OMPParallelSectionsDirective *D) {
6854   DeclarationNameInfo DirName;
6855   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
6856                                              nullptr, D->getLocStart());
6857   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6858   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6859   return Res;
6860 }
6861
6862 template <typename Derived>
6863 StmtResult
6864 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
6865   DeclarationNameInfo DirName;
6866   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
6867                                              D->getLocStart());
6868   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6869   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6870   return Res;
6871 }
6872
6873 template <typename Derived>
6874 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
6875     OMPTaskyieldDirective *D) {
6876   DeclarationNameInfo DirName;
6877   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
6878                                              D->getLocStart());
6879   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6880   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6881   return Res;
6882 }
6883
6884 template <typename Derived>
6885 StmtResult
6886 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
6887   DeclarationNameInfo DirName;
6888   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
6889                                              D->getLocStart());
6890   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6891   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6892   return Res;
6893 }
6894
6895 template <typename Derived>
6896 StmtResult
6897 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
6898   DeclarationNameInfo DirName;
6899   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
6900                                              D->getLocStart());
6901   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6902   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6903   return Res;
6904 }
6905
6906 template <typename Derived>
6907 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
6908     OMPTaskgroupDirective *D) {
6909   DeclarationNameInfo DirName;
6910   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
6911                                              D->getLocStart());
6912   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6913   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6914   return Res;
6915 }
6916
6917 template <typename Derived>
6918 StmtResult
6919 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
6920   DeclarationNameInfo DirName;
6921   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
6922                                              D->getLocStart());
6923   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6924   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6925   return Res;
6926 }
6927
6928 template <typename Derived>
6929 StmtResult
6930 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
6931   DeclarationNameInfo DirName;
6932   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
6933                                              D->getLocStart());
6934   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6935   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6936   return Res;
6937 }
6938
6939 template <typename Derived>
6940 StmtResult
6941 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
6942   DeclarationNameInfo DirName;
6943   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
6944                                              D->getLocStart());
6945   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6946   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6947   return Res;
6948 }
6949
6950 template <typename Derived>
6951 StmtResult
6952 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
6953   DeclarationNameInfo DirName;
6954   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
6955                                              D->getLocStart());
6956   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6957   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6958   return Res;
6959 }
6960
6961 template <typename Derived>
6962 StmtResult
6963 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
6964   DeclarationNameInfo DirName;
6965   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
6966                                              D->getLocStart());
6967   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6968   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6969   return Res;
6970 }
6971
6972 template <typename Derived>
6973 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
6974     OMPCancellationPointDirective *D) {
6975   DeclarationNameInfo DirName;
6976   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
6977                                              nullptr, D->getLocStart());
6978   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6979   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6980   return Res;
6981 }
6982
6983 template <typename Derived>
6984 StmtResult
6985 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
6986   DeclarationNameInfo DirName;
6987   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
6988                                              D->getLocStart());
6989   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6990   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6991   return Res;
6992 }
6993
6994 //===----------------------------------------------------------------------===//
6995 // OpenMP clause transformation
6996 //===----------------------------------------------------------------------===//
6997 template <typename Derived>
6998 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
6999   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
7000   if (Cond.isInvalid())
7001     return nullptr;
7002   return getDerived().RebuildOMPIfClause(Cond.get(), C->getLocStart(),
7003                                          C->getLParenLoc(), C->getLocEnd());
7004 }
7005
7006 template <typename Derived>
7007 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
7008   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
7009   if (Cond.isInvalid())
7010     return nullptr;
7011   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(),
7012                                             C->getLParenLoc(), C->getLocEnd());
7013 }
7014
7015 template <typename Derived>
7016 OMPClause *
7017 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
7018   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
7019   if (NumThreads.isInvalid())
7020     return nullptr;
7021   return getDerived().RebuildOMPNumThreadsClause(
7022       NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7023 }
7024
7025 template <typename Derived>
7026 OMPClause *
7027 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
7028   ExprResult E = getDerived().TransformExpr(C->getSafelen());
7029   if (E.isInvalid())
7030     return nullptr;
7031   return getDerived().RebuildOMPSafelenClause(
7032       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7033 }
7034
7035 template <typename Derived>
7036 OMPClause *
7037 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
7038   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
7039   if (E.isInvalid())
7040     return 0;
7041   return getDerived().RebuildOMPCollapseClause(
7042       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7043 }
7044
7045 template <typename Derived>
7046 OMPClause *
7047 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
7048   return getDerived().RebuildOMPDefaultClause(
7049       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
7050       C->getLParenLoc(), C->getLocEnd());
7051 }
7052
7053 template <typename Derived>
7054 OMPClause *
7055 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
7056   return getDerived().RebuildOMPProcBindClause(
7057       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
7058       C->getLParenLoc(), C->getLocEnd());
7059 }
7060
7061 template <typename Derived>
7062 OMPClause *
7063 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
7064   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
7065   if (E.isInvalid())
7066     return nullptr;
7067   return getDerived().RebuildOMPScheduleClause(
7068       C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
7069       C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
7070 }
7071
7072 template <typename Derived>
7073 OMPClause *
7074 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
7075   // No need to rebuild this clause, no template-dependent parameters.
7076   return C;
7077 }
7078
7079 template <typename Derived>
7080 OMPClause *
7081 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
7082   // No need to rebuild this clause, no template-dependent parameters.
7083   return C;
7084 }
7085
7086 template <typename Derived>
7087 OMPClause *
7088 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
7089   // No need to rebuild this clause, no template-dependent parameters.
7090   return C;
7091 }
7092
7093 template <typename Derived>
7094 OMPClause *
7095 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
7096   // No need to rebuild this clause, no template-dependent parameters.
7097   return C;
7098 }
7099
7100 template <typename Derived>
7101 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
7102   // No need to rebuild this clause, no template-dependent parameters.
7103   return C;
7104 }
7105
7106 template <typename Derived>
7107 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
7108   // No need to rebuild this clause, no template-dependent parameters.
7109   return C;
7110 }
7111
7112 template <typename Derived>
7113 OMPClause *
7114 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
7115   // No need to rebuild this clause, no template-dependent parameters.
7116   return C;
7117 }
7118
7119 template <typename Derived>
7120 OMPClause *
7121 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
7122   // No need to rebuild this clause, no template-dependent parameters.
7123   return C;
7124 }
7125
7126 template <typename Derived>
7127 OMPClause *
7128 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
7129   // No need to rebuild this clause, no template-dependent parameters.
7130   return C;
7131 }
7132
7133 template <typename Derived>
7134 OMPClause *
7135 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
7136   llvm::SmallVector<Expr *, 16> Vars;
7137   Vars.reserve(C->varlist_size());
7138   for (auto *VE : C->varlists()) {
7139     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7140     if (EVar.isInvalid())
7141       return nullptr;
7142     Vars.push_back(EVar.get());
7143   }
7144   return getDerived().RebuildOMPPrivateClause(
7145       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7146 }
7147
7148 template <typename Derived>
7149 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
7150     OMPFirstprivateClause *C) {
7151   llvm::SmallVector<Expr *, 16> Vars;
7152   Vars.reserve(C->varlist_size());
7153   for (auto *VE : C->varlists()) {
7154     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7155     if (EVar.isInvalid())
7156       return nullptr;
7157     Vars.push_back(EVar.get());
7158   }
7159   return getDerived().RebuildOMPFirstprivateClause(
7160       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7161 }
7162
7163 template <typename Derived>
7164 OMPClause *
7165 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
7166   llvm::SmallVector<Expr *, 16> Vars;
7167   Vars.reserve(C->varlist_size());
7168   for (auto *VE : C->varlists()) {
7169     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7170     if (EVar.isInvalid())
7171       return nullptr;
7172     Vars.push_back(EVar.get());
7173   }
7174   return getDerived().RebuildOMPLastprivateClause(
7175       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7176 }
7177
7178 template <typename Derived>
7179 OMPClause *
7180 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
7181   llvm::SmallVector<Expr *, 16> Vars;
7182   Vars.reserve(C->varlist_size());
7183   for (auto *VE : C->varlists()) {
7184     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7185     if (EVar.isInvalid())
7186       return nullptr;
7187     Vars.push_back(EVar.get());
7188   }
7189   return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
7190                                              C->getLParenLoc(), C->getLocEnd());
7191 }
7192
7193 template <typename Derived>
7194 OMPClause *
7195 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
7196   llvm::SmallVector<Expr *, 16> Vars;
7197   Vars.reserve(C->varlist_size());
7198   for (auto *VE : C->varlists()) {
7199     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7200     if (EVar.isInvalid())
7201       return nullptr;
7202     Vars.push_back(EVar.get());
7203   }
7204   CXXScopeSpec ReductionIdScopeSpec;
7205   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
7206
7207   DeclarationNameInfo NameInfo = C->getNameInfo();
7208   if (NameInfo.getName()) {
7209     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7210     if (!NameInfo.getName())
7211       return nullptr;
7212   }
7213   return getDerived().RebuildOMPReductionClause(
7214       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
7215       C->getLocEnd(), ReductionIdScopeSpec, NameInfo);
7216 }
7217
7218 template <typename Derived>
7219 OMPClause *
7220 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
7221   llvm::SmallVector<Expr *, 16> Vars;
7222   Vars.reserve(C->varlist_size());
7223   for (auto *VE : C->varlists()) {
7224     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7225     if (EVar.isInvalid())
7226       return nullptr;
7227     Vars.push_back(EVar.get());
7228   }
7229   ExprResult Step = getDerived().TransformExpr(C->getStep());
7230   if (Step.isInvalid())
7231     return nullptr;
7232   return getDerived().RebuildOMPLinearClause(Vars, Step.get(), C->getLocStart(),
7233                                              C->getLParenLoc(),
7234                                              C->getColonLoc(), C->getLocEnd());
7235 }
7236
7237 template <typename Derived>
7238 OMPClause *
7239 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
7240   llvm::SmallVector<Expr *, 16> Vars;
7241   Vars.reserve(C->varlist_size());
7242   for (auto *VE : C->varlists()) {
7243     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7244     if (EVar.isInvalid())
7245       return nullptr;
7246     Vars.push_back(EVar.get());
7247   }
7248   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
7249   if (Alignment.isInvalid())
7250     return nullptr;
7251   return getDerived().RebuildOMPAlignedClause(
7252       Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
7253       C->getColonLoc(), C->getLocEnd());
7254 }
7255
7256 template <typename Derived>
7257 OMPClause *
7258 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
7259   llvm::SmallVector<Expr *, 16> Vars;
7260   Vars.reserve(C->varlist_size());
7261   for (auto *VE : C->varlists()) {
7262     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7263     if (EVar.isInvalid())
7264       return nullptr;
7265     Vars.push_back(EVar.get());
7266   }
7267   return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
7268                                              C->getLParenLoc(), C->getLocEnd());
7269 }
7270
7271 template <typename Derived>
7272 OMPClause *
7273 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
7274   llvm::SmallVector<Expr *, 16> Vars;
7275   Vars.reserve(C->varlist_size());
7276   for (auto *VE : C->varlists()) {
7277     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7278     if (EVar.isInvalid())
7279       return nullptr;
7280     Vars.push_back(EVar.get());
7281   }
7282   return getDerived().RebuildOMPCopyprivateClause(
7283       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7284 }
7285
7286 template <typename Derived>
7287 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
7288   llvm::SmallVector<Expr *, 16> Vars;
7289   Vars.reserve(C->varlist_size());
7290   for (auto *VE : C->varlists()) {
7291     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7292     if (EVar.isInvalid())
7293       return nullptr;
7294     Vars.push_back(EVar.get());
7295   }
7296   return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(),
7297                                             C->getLParenLoc(), C->getLocEnd());
7298 }
7299
7300 template <typename Derived>
7301 OMPClause *
7302 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
7303   llvm::SmallVector<Expr *, 16> Vars;
7304   Vars.reserve(C->varlist_size());
7305   for (auto *VE : C->varlists()) {
7306     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7307     if (EVar.isInvalid())
7308       return nullptr;
7309     Vars.push_back(EVar.get());
7310   }
7311   return getDerived().RebuildOMPDependClause(
7312       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
7313       C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7314 }
7315
7316 //===----------------------------------------------------------------------===//
7317 // Expression transformation
7318 //===----------------------------------------------------------------------===//
7319 template<typename Derived>
7320 ExprResult
7321 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
7322   if (!E->isTypeDependent())
7323     return E;
7324
7325   return getDerived().RebuildPredefinedExpr(E->getLocation(),
7326                                             E->getIdentType());
7327 }
7328
7329 template<typename Derived>
7330 ExprResult
7331 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
7332   NestedNameSpecifierLoc QualifierLoc;
7333   if (E->getQualifierLoc()) {
7334     QualifierLoc
7335       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7336     if (!QualifierLoc)
7337       return ExprError();
7338   }
7339
7340   ValueDecl *ND
7341     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
7342                                                          E->getDecl()));
7343   if (!ND)
7344     return ExprError();
7345
7346   DeclarationNameInfo NameInfo = E->getNameInfo();
7347   if (NameInfo.getName()) {
7348     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7349     if (!NameInfo.getName())
7350       return ExprError();
7351   }
7352
7353   if (!getDerived().AlwaysRebuild() &&
7354       QualifierLoc == E->getQualifierLoc() &&
7355       ND == E->getDecl() &&
7356       NameInfo.getName() == E->getDecl()->getDeclName() &&
7357       !E->hasExplicitTemplateArgs()) {
7358
7359     // Mark it referenced in the new context regardless.
7360     // FIXME: this is a bit instantiation-specific.
7361     SemaRef.MarkDeclRefReferenced(E);
7362
7363     return E;
7364   }
7365
7366   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
7367   if (E->hasExplicitTemplateArgs()) {
7368     TemplateArgs = &TransArgs;
7369     TransArgs.setLAngleLoc(E->getLAngleLoc());
7370     TransArgs.setRAngleLoc(E->getRAngleLoc());
7371     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7372                                                 E->getNumTemplateArgs(),
7373                                                 TransArgs))
7374       return ExprError();
7375   }
7376
7377   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
7378                                          TemplateArgs);
7379 }
7380
7381 template<typename Derived>
7382 ExprResult
7383 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
7384   return E;
7385 }
7386
7387 template<typename Derived>
7388 ExprResult
7389 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
7390   return E;
7391 }
7392
7393 template<typename Derived>
7394 ExprResult
7395 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
7396   return E;
7397 }
7398
7399 template<typename Derived>
7400 ExprResult
7401 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
7402   return E;
7403 }
7404
7405 template<typename Derived>
7406 ExprResult
7407 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
7408   return E;
7409 }
7410
7411 template<typename Derived>
7412 ExprResult
7413 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
7414   if (FunctionDecl *FD = E->getDirectCallee())
7415     SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
7416   return SemaRef.MaybeBindToTemporary(E);
7417 }
7418
7419 template<typename Derived>
7420 ExprResult
7421 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
7422   ExprResult ControllingExpr =
7423     getDerived().TransformExpr(E->getControllingExpr());
7424   if (ControllingExpr.isInvalid())
7425     return ExprError();
7426
7427   SmallVector<Expr *, 4> AssocExprs;
7428   SmallVector<TypeSourceInfo *, 4> AssocTypes;
7429   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
7430     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
7431     if (TS) {
7432       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
7433       if (!AssocType)
7434         return ExprError();
7435       AssocTypes.push_back(AssocType);
7436     } else {
7437       AssocTypes.push_back(nullptr);
7438     }
7439
7440     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
7441     if (AssocExpr.isInvalid())
7442       return ExprError();
7443     AssocExprs.push_back(AssocExpr.get());
7444   }
7445
7446   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
7447                                                   E->getDefaultLoc(),
7448                                                   E->getRParenLoc(),
7449                                                   ControllingExpr.get(),
7450                                                   AssocTypes,
7451                                                   AssocExprs);
7452 }
7453
7454 template<typename Derived>
7455 ExprResult
7456 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
7457   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
7458   if (SubExpr.isInvalid())
7459     return ExprError();
7460
7461   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
7462     return E;
7463
7464   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
7465                                        E->getRParen());
7466 }
7467
7468 /// \brief The operand of a unary address-of operator has special rules: it's
7469 /// allowed to refer to a non-static member of a class even if there's no 'this'
7470 /// object available.
7471 template<typename Derived>
7472 ExprResult
7473 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
7474   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
7475     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
7476   else
7477     return getDerived().TransformExpr(E);
7478 }
7479
7480 template<typename Derived>
7481 ExprResult
7482 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
7483   ExprResult SubExpr;
7484   if (E->getOpcode() == UO_AddrOf)
7485     SubExpr = TransformAddressOfOperand(E->getSubExpr());
7486   else
7487     SubExpr = TransformExpr(E->getSubExpr());
7488   if (SubExpr.isInvalid())
7489     return ExprError();
7490
7491   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
7492     return E;
7493
7494   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
7495                                            E->getOpcode(),
7496                                            SubExpr.get());
7497 }
7498
7499 template<typename Derived>
7500 ExprResult
7501 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
7502   // Transform the type.
7503   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
7504   if (!Type)
7505     return ExprError();
7506
7507   // Transform all of the components into components similar to what the
7508   // parser uses.
7509   // FIXME: It would be slightly more efficient in the non-dependent case to
7510   // just map FieldDecls, rather than requiring the rebuilder to look for
7511   // the fields again. However, __builtin_offsetof is rare enough in
7512   // template code that we don't care.
7513   bool ExprChanged = false;
7514   typedef Sema::OffsetOfComponent Component;
7515   typedef OffsetOfExpr::OffsetOfNode Node;
7516   SmallVector<Component, 4> Components;
7517   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
7518     const Node &ON = E->getComponent(I);
7519     Component Comp;
7520     Comp.isBrackets = true;
7521     Comp.LocStart = ON.getSourceRange().getBegin();
7522     Comp.LocEnd = ON.getSourceRange().getEnd();
7523     switch (ON.getKind()) {
7524     case Node::Array: {
7525       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
7526       ExprResult Index = getDerived().TransformExpr(FromIndex);
7527       if (Index.isInvalid())
7528         return ExprError();
7529
7530       ExprChanged = ExprChanged || Index.get() != FromIndex;
7531       Comp.isBrackets = true;
7532       Comp.U.E = Index.get();
7533       break;
7534     }
7535
7536     case Node::Field:
7537     case Node::Identifier:
7538       Comp.isBrackets = false;
7539       Comp.U.IdentInfo = ON.getFieldName();
7540       if (!Comp.U.IdentInfo)
7541         continue;
7542
7543       break;
7544
7545     case Node::Base:
7546       // Will be recomputed during the rebuild.
7547       continue;
7548     }
7549
7550     Components.push_back(Comp);
7551   }
7552
7553   // If nothing changed, retain the existing expression.
7554   if (!getDerived().AlwaysRebuild() &&
7555       Type == E->getTypeSourceInfo() &&
7556       !ExprChanged)
7557     return E;
7558
7559   // Build a new offsetof expression.
7560   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
7561                                           Components.data(), Components.size(),
7562                                           E->getRParenLoc());
7563 }
7564
7565 template<typename Derived>
7566 ExprResult
7567 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
7568   assert(getDerived().AlreadyTransformed(E->getType()) &&
7569          "opaque value expression requires transformation");
7570   return E;
7571 }
7572
7573 template<typename Derived>
7574 ExprResult
7575 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
7576   return E;
7577 }
7578
7579 template<typename Derived>
7580 ExprResult
7581 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
7582   // Rebuild the syntactic form.  The original syntactic form has
7583   // opaque-value expressions in it, so strip those away and rebuild
7584   // the result.  This is a really awful way of doing this, but the
7585   // better solution (rebuilding the semantic expressions and
7586   // rebinding OVEs as necessary) doesn't work; we'd need
7587   // TreeTransform to not strip away implicit conversions.
7588   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
7589   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
7590   if (result.isInvalid()) return ExprError();
7591
7592   // If that gives us a pseudo-object result back, the pseudo-object
7593   // expression must have been an lvalue-to-rvalue conversion which we
7594   // should reapply.
7595   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
7596     result = SemaRef.checkPseudoObjectRValue(result.get());
7597
7598   return result;
7599 }
7600
7601 template<typename Derived>
7602 ExprResult
7603 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
7604                                                 UnaryExprOrTypeTraitExpr *E) {
7605   if (E->isArgumentType()) {
7606     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
7607
7608     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
7609     if (!NewT)
7610       return ExprError();
7611
7612     if (!getDerived().AlwaysRebuild() && OldT == NewT)
7613       return E;
7614
7615     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
7616                                                     E->getKind(),
7617                                                     E->getSourceRange());
7618   }
7619
7620   // C++0x [expr.sizeof]p1:
7621   //   The operand is either an expression, which is an unevaluated operand
7622   //   [...]
7623   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
7624                                                Sema::ReuseLambdaContextDecl);
7625
7626   // Try to recover if we have something like sizeof(T::X) where X is a type.
7627   // Notably, there must be *exactly* one set of parens if X is a type.
7628   TypeSourceInfo *RecoveryTSI = nullptr;
7629   ExprResult SubExpr;
7630   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
7631   if (auto *DRE =
7632           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
7633     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
7634         PE, DRE, false, &RecoveryTSI);
7635   else
7636     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
7637
7638   if (RecoveryTSI) {
7639     return getDerived().RebuildUnaryExprOrTypeTrait(
7640         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
7641   } else if (SubExpr.isInvalid())
7642     return ExprError();
7643
7644   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
7645     return E;
7646
7647   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
7648                                                   E->getOperatorLoc(),
7649                                                   E->getKind(),
7650                                                   E->getSourceRange());
7651 }
7652
7653 template<typename Derived>
7654 ExprResult
7655 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
7656   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7657   if (LHS.isInvalid())
7658     return ExprError();
7659
7660   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7661   if (RHS.isInvalid())
7662     return ExprError();
7663
7664
7665   if (!getDerived().AlwaysRebuild() &&
7666       LHS.get() == E->getLHS() &&
7667       RHS.get() == E->getRHS())
7668     return E;
7669
7670   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
7671                                            /*FIXME:*/E->getLHS()->getLocStart(),
7672                                                 RHS.get(),
7673                                                 E->getRBracketLoc());
7674 }
7675
7676 template<typename Derived>
7677 ExprResult
7678 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
7679   // Transform the callee.
7680   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
7681   if (Callee.isInvalid())
7682     return ExprError();
7683
7684   // Transform arguments.
7685   bool ArgChanged = false;
7686   SmallVector<Expr*, 8> Args;
7687   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
7688                                   &ArgChanged))
7689     return ExprError();
7690
7691   if (!getDerived().AlwaysRebuild() &&
7692       Callee.get() == E->getCallee() &&
7693       !ArgChanged)
7694     return SemaRef.MaybeBindToTemporary(E);
7695
7696   // FIXME: Wrong source location information for the '('.
7697   SourceLocation FakeLParenLoc
7698     = ((Expr *)Callee.get())->getSourceRange().getBegin();
7699   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
7700                                       Args,
7701                                       E->getRParenLoc());
7702 }
7703
7704 template<typename Derived>
7705 ExprResult
7706 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
7707   ExprResult Base = getDerived().TransformExpr(E->getBase());
7708   if (Base.isInvalid())
7709     return ExprError();
7710
7711   NestedNameSpecifierLoc QualifierLoc;
7712   if (E->hasQualifier()) {
7713     QualifierLoc
7714       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7715
7716     if (!QualifierLoc)
7717       return ExprError();
7718   }
7719   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
7720
7721   ValueDecl *Member
7722     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
7723                                                          E->getMemberDecl()));
7724   if (!Member)
7725     return ExprError();
7726
7727   NamedDecl *FoundDecl = E->getFoundDecl();
7728   if (FoundDecl == E->getMemberDecl()) {
7729     FoundDecl = Member;
7730   } else {
7731     FoundDecl = cast_or_null<NamedDecl>(
7732                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
7733     if (!FoundDecl)
7734       return ExprError();
7735   }
7736
7737   if (!getDerived().AlwaysRebuild() &&
7738       Base.get() == E->getBase() &&
7739       QualifierLoc == E->getQualifierLoc() &&
7740       Member == E->getMemberDecl() &&
7741       FoundDecl == E->getFoundDecl() &&
7742       !E->hasExplicitTemplateArgs()) {
7743
7744     // Mark it referenced in the new context regardless.
7745     // FIXME: this is a bit instantiation-specific.
7746     SemaRef.MarkMemberReferenced(E);
7747
7748     return E;
7749   }
7750
7751   TemplateArgumentListInfo TransArgs;
7752   if (E->hasExplicitTemplateArgs()) {
7753     TransArgs.setLAngleLoc(E->getLAngleLoc());
7754     TransArgs.setRAngleLoc(E->getRAngleLoc());
7755     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7756                                                 E->getNumTemplateArgs(),
7757                                                 TransArgs))
7758       return ExprError();
7759   }
7760
7761   // FIXME: Bogus source location for the operator
7762   SourceLocation FakeOperatorLoc =
7763       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
7764
7765   // FIXME: to do this check properly, we will need to preserve the
7766   // first-qualifier-in-scope here, just in case we had a dependent
7767   // base (and therefore couldn't do the check) and a
7768   // nested-name-qualifier (and therefore could do the lookup).
7769   NamedDecl *FirstQualifierInScope = nullptr;
7770
7771   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
7772                                         E->isArrow(),
7773                                         QualifierLoc,
7774                                         TemplateKWLoc,
7775                                         E->getMemberNameInfo(),
7776                                         Member,
7777                                         FoundDecl,
7778                                         (E->hasExplicitTemplateArgs()
7779                                            ? &TransArgs : nullptr),
7780                                         FirstQualifierInScope);
7781 }
7782
7783 template<typename Derived>
7784 ExprResult
7785 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
7786   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7787   if (LHS.isInvalid())
7788     return ExprError();
7789
7790   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7791   if (RHS.isInvalid())
7792     return ExprError();
7793
7794   if (!getDerived().AlwaysRebuild() &&
7795       LHS.get() == E->getLHS() &&
7796       RHS.get() == E->getRHS())
7797     return E;
7798
7799   Sema::FPContractStateRAII FPContractState(getSema());
7800   getSema().FPFeatures.fp_contract = E->isFPContractable();
7801
7802   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
7803                                             LHS.get(), RHS.get());
7804 }
7805
7806 template<typename Derived>
7807 ExprResult
7808 TreeTransform<Derived>::TransformCompoundAssignOperator(
7809                                                       CompoundAssignOperator *E) {
7810   return getDerived().TransformBinaryOperator(E);
7811 }
7812
7813 template<typename Derived>
7814 ExprResult TreeTransform<Derived>::
7815 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
7816   // Just rebuild the common and RHS expressions and see whether we
7817   // get any changes.
7818
7819   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
7820   if (commonExpr.isInvalid())
7821     return ExprError();
7822
7823   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
7824   if (rhs.isInvalid())
7825     return ExprError();
7826
7827   if (!getDerived().AlwaysRebuild() &&
7828       commonExpr.get() == e->getCommon() &&
7829       rhs.get() == e->getFalseExpr())
7830     return e;
7831
7832   return getDerived().RebuildConditionalOperator(commonExpr.get(),
7833                                                  e->getQuestionLoc(),
7834                                                  nullptr,
7835                                                  e->getColonLoc(),
7836                                                  rhs.get());
7837 }
7838
7839 template<typename Derived>
7840 ExprResult
7841 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
7842   ExprResult Cond = getDerived().TransformExpr(E->getCond());
7843   if (Cond.isInvalid())
7844     return ExprError();
7845
7846   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7847   if (LHS.isInvalid())
7848     return ExprError();
7849
7850   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7851   if (RHS.isInvalid())
7852     return ExprError();
7853
7854   if (!getDerived().AlwaysRebuild() &&
7855       Cond.get() == E->getCond() &&
7856       LHS.get() == E->getLHS() &&
7857       RHS.get() == E->getRHS())
7858     return E;
7859
7860   return getDerived().RebuildConditionalOperator(Cond.get(),
7861                                                  E->getQuestionLoc(),
7862                                                  LHS.get(),
7863                                                  E->getColonLoc(),
7864                                                  RHS.get());
7865 }
7866
7867 template<typename Derived>
7868 ExprResult
7869 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
7870   // Implicit casts are eliminated during transformation, since they
7871   // will be recomputed by semantic analysis after transformation.
7872   return getDerived().TransformExpr(E->getSubExprAsWritten());
7873 }
7874
7875 template<typename Derived>
7876 ExprResult
7877 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
7878   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
7879   if (!Type)
7880     return ExprError();
7881
7882   ExprResult SubExpr
7883     = getDerived().TransformExpr(E->getSubExprAsWritten());
7884   if (SubExpr.isInvalid())
7885     return ExprError();
7886
7887   if (!getDerived().AlwaysRebuild() &&
7888       Type == E->getTypeInfoAsWritten() &&
7889       SubExpr.get() == E->getSubExpr())
7890     return E;
7891
7892   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
7893                                             Type,
7894                                             E->getRParenLoc(),
7895                                             SubExpr.get());
7896 }
7897
7898 template<typename Derived>
7899 ExprResult
7900 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
7901   TypeSourceInfo *OldT = E->getTypeSourceInfo();
7902   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
7903   if (!NewT)
7904     return ExprError();
7905
7906   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
7907   if (Init.isInvalid())
7908     return ExprError();
7909
7910   if (!getDerived().AlwaysRebuild() &&
7911       OldT == NewT &&
7912       Init.get() == E->getInitializer())
7913     return SemaRef.MaybeBindToTemporary(E);
7914
7915   // Note: the expression type doesn't necessarily match the
7916   // type-as-written, but that's okay, because it should always be
7917   // derivable from the initializer.
7918
7919   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
7920                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
7921                                                  Init.get());
7922 }
7923
7924 template<typename Derived>
7925 ExprResult
7926 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
7927   ExprResult Base = getDerived().TransformExpr(E->getBase());
7928   if (Base.isInvalid())
7929     return ExprError();
7930
7931   if (!getDerived().AlwaysRebuild() &&
7932       Base.get() == E->getBase())
7933     return E;
7934
7935   // FIXME: Bad source location
7936   SourceLocation FakeOperatorLoc =
7937       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
7938   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
7939                                                   E->getAccessorLoc(),
7940                                                   E->getAccessor());
7941 }
7942
7943 template<typename Derived>
7944 ExprResult
7945 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
7946   if (InitListExpr *Syntactic = E->getSyntacticForm())
7947     E = Syntactic;
7948
7949   bool InitChanged = false;
7950
7951   SmallVector<Expr*, 4> Inits;
7952   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
7953                                   Inits, &InitChanged))
7954     return ExprError();
7955
7956   if (!getDerived().AlwaysRebuild() && !InitChanged) {
7957     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
7958     // in some cases. We can't reuse it in general, because the syntactic and
7959     // semantic forms are linked, and we can't know that semantic form will
7960     // match even if the syntactic form does.
7961   }
7962
7963   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
7964                                       E->getRBraceLoc(), E->getType());
7965 }
7966
7967 template<typename Derived>
7968 ExprResult
7969 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
7970   Designation Desig;
7971
7972   // transform the initializer value
7973   ExprResult Init = getDerived().TransformExpr(E->getInit());
7974   if (Init.isInvalid())
7975     return ExprError();
7976
7977   // transform the designators.
7978   SmallVector<Expr*, 4> ArrayExprs;
7979   bool ExprChanged = false;
7980   for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
7981                                              DEnd = E->designators_end();
7982        D != DEnd; ++D) {
7983     if (D->isFieldDesignator()) {
7984       Desig.AddDesignator(Designator::getField(D->getFieldName(),
7985                                                D->getDotLoc(),
7986                                                D->getFieldLoc()));
7987       continue;
7988     }
7989
7990     if (D->isArrayDesignator()) {
7991       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
7992       if (Index.isInvalid())
7993         return ExprError();
7994
7995       Desig.AddDesignator(Designator::getArray(Index.get(),
7996                                                D->getLBracketLoc()));
7997
7998       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
7999       ArrayExprs.push_back(Index.get());
8000       continue;
8001     }
8002
8003     assert(D->isArrayRangeDesignator() && "New kind of designator?");
8004     ExprResult Start
8005       = getDerived().TransformExpr(E->getArrayRangeStart(*D));
8006     if (Start.isInvalid())
8007       return ExprError();
8008
8009     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
8010     if (End.isInvalid())
8011       return ExprError();
8012
8013     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
8014                                                   End.get(),
8015                                                   D->getLBracketLoc(),
8016                                                   D->getEllipsisLoc()));
8017
8018     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
8019       End.get() != E->getArrayRangeEnd(*D);
8020
8021     ArrayExprs.push_back(Start.get());
8022     ArrayExprs.push_back(End.get());
8023   }
8024
8025   if (!getDerived().AlwaysRebuild() &&
8026       Init.get() == E->getInit() &&
8027       !ExprChanged)
8028     return E;
8029
8030   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
8031                                                 E->getEqualOrColonLoc(),
8032                                                 E->usesGNUSyntax(), Init.get());
8033 }
8034
8035 // Seems that if TransformInitListExpr() only works on the syntactic form of an
8036 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
8037 template<typename Derived>
8038 ExprResult
8039 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
8040     DesignatedInitUpdateExpr *E) {
8041   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
8042                    "initializer");
8043   return ExprError();
8044 }
8045
8046 template<typename Derived>
8047 ExprResult
8048 TreeTransform<Derived>::TransformNoInitExpr(
8049     NoInitExpr *E) {
8050   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
8051   return ExprError();
8052 }
8053
8054 template<typename Derived>
8055 ExprResult
8056 TreeTransform<Derived>::TransformImplicitValueInitExpr(
8057                                                      ImplicitValueInitExpr *E) {
8058   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
8059
8060   // FIXME: Will we ever have proper type location here? Will we actually
8061   // need to transform the type?
8062   QualType T = getDerived().TransformType(E->getType());
8063   if (T.isNull())
8064     return ExprError();
8065
8066   if (!getDerived().AlwaysRebuild() &&
8067       T == E->getType())
8068     return E;
8069
8070   return getDerived().RebuildImplicitValueInitExpr(T);
8071 }
8072
8073 template<typename Derived>
8074 ExprResult
8075 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
8076   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
8077   if (!TInfo)
8078     return ExprError();
8079
8080   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8081   if (SubExpr.isInvalid())
8082     return ExprError();
8083
8084   if (!getDerived().AlwaysRebuild() &&
8085       TInfo == E->getWrittenTypeInfo() &&
8086       SubExpr.get() == E->getSubExpr())
8087     return E;
8088
8089   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
8090                                        TInfo, E->getRParenLoc());
8091 }
8092
8093 template<typename Derived>
8094 ExprResult
8095 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
8096   bool ArgumentChanged = false;
8097   SmallVector<Expr*, 4> Inits;
8098   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
8099                      &ArgumentChanged))
8100     return ExprError();
8101
8102   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
8103                                            Inits,
8104                                            E->getRParenLoc());
8105 }
8106
8107 /// \brief Transform an address-of-label expression.
8108 ///
8109 /// By default, the transformation of an address-of-label expression always
8110 /// rebuilds the expression, so that the label identifier can be resolved to
8111 /// the corresponding label statement by semantic analysis.
8112 template<typename Derived>
8113 ExprResult
8114 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
8115   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
8116                                         E->getLabel());
8117   if (!LD)
8118     return ExprError();
8119
8120   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
8121                                            cast<LabelDecl>(LD));
8122 }
8123
8124 template<typename Derived>
8125 ExprResult
8126 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
8127   SemaRef.ActOnStartStmtExpr();
8128   StmtResult SubStmt
8129     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
8130   if (SubStmt.isInvalid()) {
8131     SemaRef.ActOnStmtExprError();
8132     return ExprError();
8133   }
8134
8135   if (!getDerived().AlwaysRebuild() &&
8136       SubStmt.get() == E->getSubStmt()) {
8137     // Calling this an 'error' is unintuitive, but it does the right thing.
8138     SemaRef.ActOnStmtExprError();
8139     return SemaRef.MaybeBindToTemporary(E);
8140   }
8141
8142   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
8143                                       SubStmt.get(),
8144                                       E->getRParenLoc());
8145 }
8146
8147 template<typename Derived>
8148 ExprResult
8149 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
8150   ExprResult Cond = getDerived().TransformExpr(E->getCond());
8151   if (Cond.isInvalid())
8152     return ExprError();
8153
8154   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8155   if (LHS.isInvalid())
8156     return ExprError();
8157
8158   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8159   if (RHS.isInvalid())
8160     return ExprError();
8161
8162   if (!getDerived().AlwaysRebuild() &&
8163       Cond.get() == E->getCond() &&
8164       LHS.get() == E->getLHS() &&
8165       RHS.get() == E->getRHS())
8166     return E;
8167
8168   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
8169                                         Cond.get(), LHS.get(), RHS.get(),
8170                                         E->getRParenLoc());
8171 }
8172
8173 template<typename Derived>
8174 ExprResult
8175 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
8176   return E;
8177 }
8178
8179 template<typename Derived>
8180 ExprResult
8181 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
8182   switch (E->getOperator()) {
8183   case OO_New:
8184   case OO_Delete:
8185   case OO_Array_New:
8186   case OO_Array_Delete:
8187     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
8188
8189   case OO_Call: {
8190     // This is a call to an object's operator().
8191     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
8192
8193     // Transform the object itself.
8194     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
8195     if (Object.isInvalid())
8196       return ExprError();
8197
8198     // FIXME: Poor location information
8199     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
8200         static_cast<Expr *>(Object.get())->getLocEnd());
8201
8202     // Transform the call arguments.
8203     SmallVector<Expr*, 8> Args;
8204     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
8205                                     Args))
8206       return ExprError();
8207
8208     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
8209                                         Args,
8210                                         E->getLocEnd());
8211   }
8212
8213 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
8214   case OO_##Name:
8215 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
8216 #include "clang/Basic/OperatorKinds.def"
8217   case OO_Subscript:
8218     // Handled below.
8219     break;
8220
8221   case OO_Conditional:
8222     llvm_unreachable("conditional operator is not actually overloadable");
8223
8224   case OO_None:
8225   case NUM_OVERLOADED_OPERATORS:
8226     llvm_unreachable("not an overloaded operator?");
8227   }
8228
8229   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8230   if (Callee.isInvalid())
8231     return ExprError();
8232
8233   ExprResult First;
8234   if (E->getOperator() == OO_Amp)
8235     First = getDerived().TransformAddressOfOperand(E->getArg(0));
8236   else
8237     First = getDerived().TransformExpr(E->getArg(0));
8238   if (First.isInvalid())
8239     return ExprError();
8240
8241   ExprResult Second;
8242   if (E->getNumArgs() == 2) {
8243     Second = getDerived().TransformExpr(E->getArg(1));
8244     if (Second.isInvalid())
8245       return ExprError();
8246   }
8247
8248   if (!getDerived().AlwaysRebuild() &&
8249       Callee.get() == E->getCallee() &&
8250       First.get() == E->getArg(0) &&
8251       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
8252     return SemaRef.MaybeBindToTemporary(E);
8253
8254   Sema::FPContractStateRAII FPContractState(getSema());
8255   getSema().FPFeatures.fp_contract = E->isFPContractable();
8256
8257   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
8258                                                  E->getOperatorLoc(),
8259                                                  Callee.get(),
8260                                                  First.get(),
8261                                                  Second.get());
8262 }
8263
8264 template<typename Derived>
8265 ExprResult
8266 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
8267   return getDerived().TransformCallExpr(E);
8268 }
8269
8270 template<typename Derived>
8271 ExprResult
8272 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
8273   // Transform the callee.
8274   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8275   if (Callee.isInvalid())
8276     return ExprError();
8277
8278   // Transform exec config.
8279   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
8280   if (EC.isInvalid())
8281     return ExprError();
8282
8283   // Transform arguments.
8284   bool ArgChanged = false;
8285   SmallVector<Expr*, 8> Args;
8286   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
8287                                   &ArgChanged))
8288     return ExprError();
8289
8290   if (!getDerived().AlwaysRebuild() &&
8291       Callee.get() == E->getCallee() &&
8292       !ArgChanged)
8293     return SemaRef.MaybeBindToTemporary(E);
8294
8295   // FIXME: Wrong source location information for the '('.
8296   SourceLocation FakeLParenLoc
8297     = ((Expr *)Callee.get())->getSourceRange().getBegin();
8298   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
8299                                       Args,
8300                                       E->getRParenLoc(), EC.get());
8301 }
8302
8303 template<typename Derived>
8304 ExprResult
8305 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
8306   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8307   if (!Type)
8308     return ExprError();
8309
8310   ExprResult SubExpr
8311     = getDerived().TransformExpr(E->getSubExprAsWritten());
8312   if (SubExpr.isInvalid())
8313     return ExprError();
8314
8315   if (!getDerived().AlwaysRebuild() &&
8316       Type == E->getTypeInfoAsWritten() &&
8317       SubExpr.get() == E->getSubExpr())
8318     return E;
8319   return getDerived().RebuildCXXNamedCastExpr(
8320       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
8321       Type, E->getAngleBrackets().getEnd(),
8322       // FIXME. this should be '(' location
8323       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
8324 }
8325
8326 template<typename Derived>
8327 ExprResult
8328 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
8329   return getDerived().TransformCXXNamedCastExpr(E);
8330 }
8331
8332 template<typename Derived>
8333 ExprResult
8334 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
8335   return getDerived().TransformCXXNamedCastExpr(E);
8336 }
8337
8338 template<typename Derived>
8339 ExprResult
8340 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
8341                                                       CXXReinterpretCastExpr *E) {
8342   return getDerived().TransformCXXNamedCastExpr(E);
8343 }
8344
8345 template<typename Derived>
8346 ExprResult
8347 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
8348   return getDerived().TransformCXXNamedCastExpr(E);
8349 }
8350
8351 template<typename Derived>
8352 ExprResult
8353 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
8354                                                      CXXFunctionalCastExpr *E) {
8355   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8356   if (!Type)
8357     return ExprError();
8358
8359   ExprResult SubExpr
8360     = getDerived().TransformExpr(E->getSubExprAsWritten());
8361   if (SubExpr.isInvalid())
8362     return ExprError();
8363
8364   if (!getDerived().AlwaysRebuild() &&
8365       Type == E->getTypeInfoAsWritten() &&
8366       SubExpr.get() == E->getSubExpr())
8367     return E;
8368
8369   return getDerived().RebuildCXXFunctionalCastExpr(Type,
8370                                                    E->getLParenLoc(),
8371                                                    SubExpr.get(),
8372                                                    E->getRParenLoc());
8373 }
8374
8375 template<typename Derived>
8376 ExprResult
8377 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
8378   if (E->isTypeOperand()) {
8379     TypeSourceInfo *TInfo
8380       = getDerived().TransformType(E->getTypeOperandSourceInfo());
8381     if (!TInfo)
8382       return ExprError();
8383
8384     if (!getDerived().AlwaysRebuild() &&
8385         TInfo == E->getTypeOperandSourceInfo())
8386       return E;
8387
8388     return getDerived().RebuildCXXTypeidExpr(E->getType(),
8389                                              E->getLocStart(),
8390                                              TInfo,
8391                                              E->getLocEnd());
8392   }
8393
8394   // We don't know whether the subexpression is potentially evaluated until
8395   // after we perform semantic analysis.  We speculatively assume it is
8396   // unevaluated; it will get fixed later if the subexpression is in fact
8397   // potentially evaluated.
8398   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
8399                                                Sema::ReuseLambdaContextDecl);
8400
8401   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
8402   if (SubExpr.isInvalid())
8403     return ExprError();
8404
8405   if (!getDerived().AlwaysRebuild() &&
8406       SubExpr.get() == E->getExprOperand())
8407     return E;
8408
8409   return getDerived().RebuildCXXTypeidExpr(E->getType(),
8410                                            E->getLocStart(),
8411                                            SubExpr.get(),
8412                                            E->getLocEnd());
8413 }
8414
8415 template<typename Derived>
8416 ExprResult
8417 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
8418   if (E->isTypeOperand()) {
8419     TypeSourceInfo *TInfo
8420       = getDerived().TransformType(E->getTypeOperandSourceInfo());
8421     if (!TInfo)
8422       return ExprError();
8423
8424     if (!getDerived().AlwaysRebuild() &&
8425         TInfo == E->getTypeOperandSourceInfo())
8426       return E;
8427
8428     return getDerived().RebuildCXXUuidofExpr(E->getType(),
8429                                              E->getLocStart(),
8430                                              TInfo,
8431                                              E->getLocEnd());
8432   }
8433
8434   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8435
8436   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
8437   if (SubExpr.isInvalid())
8438     return ExprError();
8439
8440   if (!getDerived().AlwaysRebuild() &&
8441       SubExpr.get() == E->getExprOperand())
8442     return E;
8443
8444   return getDerived().RebuildCXXUuidofExpr(E->getType(),
8445                                            E->getLocStart(),
8446                                            SubExpr.get(),
8447                                            E->getLocEnd());
8448 }
8449
8450 template<typename Derived>
8451 ExprResult
8452 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
8453   return E;
8454 }
8455
8456 template<typename Derived>
8457 ExprResult
8458 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
8459                                                      CXXNullPtrLiteralExpr *E) {
8460   return E;
8461 }
8462
8463 template<typename Derived>
8464 ExprResult
8465 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
8466   QualType T = getSema().getCurrentThisType();
8467
8468   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
8469     // Make sure that we capture 'this'.
8470     getSema().CheckCXXThisCapture(E->getLocStart());
8471     return E;
8472   }
8473
8474   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
8475 }
8476
8477 template<typename Derived>
8478 ExprResult
8479 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
8480   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8481   if (SubExpr.isInvalid())
8482     return ExprError();
8483
8484   if (!getDerived().AlwaysRebuild() &&
8485       SubExpr.get() == E->getSubExpr())
8486     return E;
8487
8488   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
8489                                           E->isThrownVariableInScope());
8490 }
8491
8492 template<typename Derived>
8493 ExprResult
8494 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
8495   ParmVarDecl *Param
8496     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
8497                                                            E->getParam()));
8498   if (!Param)
8499     return ExprError();
8500
8501   if (!getDerived().AlwaysRebuild() &&
8502       Param == E->getParam())
8503     return E;
8504
8505   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
8506 }
8507
8508 template<typename Derived>
8509 ExprResult
8510 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
8511   FieldDecl *Field
8512     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
8513                                                          E->getField()));
8514   if (!Field)
8515     return ExprError();
8516
8517   if (!getDerived().AlwaysRebuild() && Field == E->getField())
8518     return E;
8519
8520   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
8521 }
8522
8523 template<typename Derived>
8524 ExprResult
8525 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
8526                                                     CXXScalarValueInitExpr *E) {
8527   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
8528   if (!T)
8529     return ExprError();
8530
8531   if (!getDerived().AlwaysRebuild() &&
8532       T == E->getTypeSourceInfo())
8533     return E;
8534
8535   return getDerived().RebuildCXXScalarValueInitExpr(T,
8536                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
8537                                                     E->getRParenLoc());
8538 }
8539
8540 template<typename Derived>
8541 ExprResult
8542 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
8543   // Transform the type that we're allocating
8544   TypeSourceInfo *AllocTypeInfo
8545     = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
8546   if (!AllocTypeInfo)
8547     return ExprError();
8548
8549   // Transform the size of the array we're allocating (if any).
8550   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
8551   if (ArraySize.isInvalid())
8552     return ExprError();
8553
8554   // Transform the placement arguments (if any).
8555   bool ArgumentChanged = false;
8556   SmallVector<Expr*, 8> PlacementArgs;
8557   if (getDerived().TransformExprs(E->getPlacementArgs(),
8558                                   E->getNumPlacementArgs(), true,
8559                                   PlacementArgs, &ArgumentChanged))
8560     return ExprError();
8561
8562   // Transform the initializer (if any).
8563   Expr *OldInit = E->getInitializer();
8564   ExprResult NewInit;
8565   if (OldInit)
8566     NewInit = getDerived().TransformInitializer(OldInit, true);
8567   if (NewInit.isInvalid())
8568     return ExprError();
8569
8570   // Transform new operator and delete operator.
8571   FunctionDecl *OperatorNew = nullptr;
8572   if (E->getOperatorNew()) {
8573     OperatorNew = cast_or_null<FunctionDecl>(
8574                                  getDerived().TransformDecl(E->getLocStart(),
8575                                                          E->getOperatorNew()));
8576     if (!OperatorNew)
8577       return ExprError();
8578   }
8579
8580   FunctionDecl *OperatorDelete = nullptr;
8581   if (E->getOperatorDelete()) {
8582     OperatorDelete = cast_or_null<FunctionDecl>(
8583                                    getDerived().TransformDecl(E->getLocStart(),
8584                                                        E->getOperatorDelete()));
8585     if (!OperatorDelete)
8586       return ExprError();
8587   }
8588
8589   if (!getDerived().AlwaysRebuild() &&
8590       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
8591       ArraySize.get() == E->getArraySize() &&
8592       NewInit.get() == OldInit &&
8593       OperatorNew == E->getOperatorNew() &&
8594       OperatorDelete == E->getOperatorDelete() &&
8595       !ArgumentChanged) {
8596     // Mark any declarations we need as referenced.
8597     // FIXME: instantiation-specific.
8598     if (OperatorNew)
8599       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
8600     if (OperatorDelete)
8601       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
8602
8603     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
8604       QualType ElementType
8605         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
8606       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
8607         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
8608         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
8609           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
8610         }
8611       }
8612     }
8613
8614     return E;
8615   }
8616
8617   QualType AllocType = AllocTypeInfo->getType();
8618   if (!ArraySize.get()) {
8619     // If no array size was specified, but the new expression was
8620     // instantiated with an array type (e.g., "new T" where T is
8621     // instantiated with "int[4]"), extract the outer bound from the
8622     // array type as our array size. We do this with constant and
8623     // dependently-sized array types.
8624     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
8625     if (!ArrayT) {
8626       // Do nothing
8627     } else if (const ConstantArrayType *ConsArrayT
8628                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
8629       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
8630                                          SemaRef.Context.getSizeType(),
8631                                          /*FIXME:*/ E->getLocStart());
8632       AllocType = ConsArrayT->getElementType();
8633     } else if (const DependentSizedArrayType *DepArrayT
8634                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
8635       if (DepArrayT->getSizeExpr()) {
8636         ArraySize = DepArrayT->getSizeExpr();
8637         AllocType = DepArrayT->getElementType();
8638       }
8639     }
8640   }
8641
8642   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
8643                                         E->isGlobalNew(),
8644                                         /*FIXME:*/E->getLocStart(),
8645                                         PlacementArgs,
8646                                         /*FIXME:*/E->getLocStart(),
8647                                         E->getTypeIdParens(),
8648                                         AllocType,
8649                                         AllocTypeInfo,
8650                                         ArraySize.get(),
8651                                         E->getDirectInitRange(),
8652                                         NewInit.get());
8653 }
8654
8655 template<typename Derived>
8656 ExprResult
8657 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
8658   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
8659   if (Operand.isInvalid())
8660     return ExprError();
8661
8662   // Transform the delete operator, if known.
8663   FunctionDecl *OperatorDelete = nullptr;
8664   if (E->getOperatorDelete()) {
8665     OperatorDelete = cast_or_null<FunctionDecl>(
8666                                    getDerived().TransformDecl(E->getLocStart(),
8667                                                        E->getOperatorDelete()));
8668     if (!OperatorDelete)
8669       return ExprError();
8670   }
8671
8672   if (!getDerived().AlwaysRebuild() &&
8673       Operand.get() == E->getArgument() &&
8674       OperatorDelete == E->getOperatorDelete()) {
8675     // Mark any declarations we need as referenced.
8676     // FIXME: instantiation-specific.
8677     if (OperatorDelete)
8678       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
8679
8680     if (!E->getArgument()->isTypeDependent()) {
8681       QualType Destroyed = SemaRef.Context.getBaseElementType(
8682                                                          E->getDestroyedType());
8683       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
8684         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
8685         SemaRef.MarkFunctionReferenced(E->getLocStart(),
8686                                        SemaRef.LookupDestructor(Record));
8687       }
8688     }
8689
8690     return E;
8691   }
8692
8693   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
8694                                            E->isGlobalDelete(),
8695                                            E->isArrayForm(),
8696                                            Operand.get());
8697 }
8698
8699 template<typename Derived>
8700 ExprResult
8701 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
8702                                                      CXXPseudoDestructorExpr *E) {
8703   ExprResult Base = getDerived().TransformExpr(E->getBase());
8704   if (Base.isInvalid())
8705     return ExprError();
8706
8707   ParsedType ObjectTypePtr;
8708   bool MayBePseudoDestructor = false;
8709   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
8710                                               E->getOperatorLoc(),
8711                                         E->isArrow()? tok::arrow : tok::period,
8712                                               ObjectTypePtr,
8713                                               MayBePseudoDestructor);
8714   if (Base.isInvalid())
8715     return ExprError();
8716
8717   QualType ObjectType = ObjectTypePtr.get();
8718   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
8719   if (QualifierLoc) {
8720     QualifierLoc
8721       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
8722     if (!QualifierLoc)
8723       return ExprError();
8724   }
8725   CXXScopeSpec SS;
8726   SS.Adopt(QualifierLoc);
8727
8728   PseudoDestructorTypeStorage Destroyed;
8729   if (E->getDestroyedTypeInfo()) {
8730     TypeSourceInfo *DestroyedTypeInfo
8731       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
8732                                                 ObjectType, nullptr, SS);
8733     if (!DestroyedTypeInfo)
8734       return ExprError();
8735     Destroyed = DestroyedTypeInfo;
8736   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
8737     // We aren't likely to be able to resolve the identifier down to a type
8738     // now anyway, so just retain the identifier.
8739     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
8740                                             E->getDestroyedTypeLoc());
8741   } else {
8742     // Look for a destructor known with the given name.
8743     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
8744                                               *E->getDestroyedTypeIdentifier(),
8745                                                 E->getDestroyedTypeLoc(),
8746                                                 /*Scope=*/nullptr,
8747                                                 SS, ObjectTypePtr,
8748                                                 false);
8749     if (!T)
8750       return ExprError();
8751
8752     Destroyed
8753       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
8754                                                  E->getDestroyedTypeLoc());
8755   }
8756
8757   TypeSourceInfo *ScopeTypeInfo = nullptr;
8758   if (E->getScopeTypeInfo()) {
8759     CXXScopeSpec EmptySS;
8760     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
8761                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
8762     if (!ScopeTypeInfo)
8763       return ExprError();
8764   }
8765
8766   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
8767                                                      E->getOperatorLoc(),
8768                                                      E->isArrow(),
8769                                                      SS,
8770                                                      ScopeTypeInfo,
8771                                                      E->getColonColonLoc(),
8772                                                      E->getTildeLoc(),
8773                                                      Destroyed);
8774 }
8775
8776 template<typename Derived>
8777 ExprResult
8778 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
8779                                                   UnresolvedLookupExpr *Old) {
8780   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
8781                  Sema::LookupOrdinaryName);
8782
8783   // Transform all the decls.
8784   for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
8785          E = Old->decls_end(); I != E; ++I) {
8786     NamedDecl *InstD = static_cast<NamedDecl*>(
8787                                  getDerived().TransformDecl(Old->getNameLoc(),
8788                                                             *I));
8789     if (!InstD) {
8790       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
8791       // This can happen because of dependent hiding.
8792       if (isa<UsingShadowDecl>(*I))
8793         continue;
8794       else {
8795         R.clear();
8796         return ExprError();
8797       }
8798     }
8799
8800     // Expand using declarations.
8801     if (isa<UsingDecl>(InstD)) {
8802       UsingDecl *UD = cast<UsingDecl>(InstD);
8803       for (auto *I : UD->shadows())
8804         R.addDecl(I);
8805       continue;
8806     }
8807
8808     R.addDecl(InstD);
8809   }
8810
8811   // Resolve a kind, but don't do any further analysis.  If it's
8812   // ambiguous, the callee needs to deal with it.
8813   R.resolveKind();
8814
8815   // Rebuild the nested-name qualifier, if present.
8816   CXXScopeSpec SS;
8817   if (Old->getQualifierLoc()) {
8818     NestedNameSpecifierLoc QualifierLoc
8819       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
8820     if (!QualifierLoc)
8821       return ExprError();
8822
8823     SS.Adopt(QualifierLoc);
8824   }
8825
8826   if (Old->getNamingClass()) {
8827     CXXRecordDecl *NamingClass
8828       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
8829                                                             Old->getNameLoc(),
8830                                                         Old->getNamingClass()));
8831     if (!NamingClass) {
8832       R.clear();
8833       return ExprError();
8834     }
8835
8836     R.setNamingClass(NamingClass);
8837   }
8838
8839   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
8840
8841   // If we have neither explicit template arguments, nor the template keyword,
8842   // it's a normal declaration name.
8843   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid())
8844     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
8845
8846   // If we have template arguments, rebuild them, then rebuild the
8847   // templateid expression.
8848   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
8849   if (Old->hasExplicitTemplateArgs() &&
8850       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
8851                                               Old->getNumTemplateArgs(),
8852                                               TransArgs)) {
8853     R.clear();
8854     return ExprError();
8855   }
8856
8857   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
8858                                             Old->requiresADL(), &TransArgs);
8859 }
8860
8861 template<typename Derived>
8862 ExprResult
8863 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
8864   bool ArgChanged = false;
8865   SmallVector<TypeSourceInfo *, 4> Args;
8866   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
8867     TypeSourceInfo *From = E->getArg(I);
8868     TypeLoc FromTL = From->getTypeLoc();
8869     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
8870       TypeLocBuilder TLB;
8871       TLB.reserve(FromTL.getFullDataSize());
8872       QualType To = getDerived().TransformType(TLB, FromTL);
8873       if (To.isNull())
8874         return ExprError();
8875
8876       if (To == From->getType())
8877         Args.push_back(From);
8878       else {
8879         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8880         ArgChanged = true;
8881       }
8882       continue;
8883     }
8884
8885     ArgChanged = true;
8886
8887     // We have a pack expansion. Instantiate it.
8888     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
8889     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
8890     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
8891     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
8892
8893     // Determine whether the set of unexpanded parameter packs can and should
8894     // be expanded.
8895     bool Expand = true;
8896     bool RetainExpansion = false;
8897     Optional<unsigned> OrigNumExpansions =
8898         ExpansionTL.getTypePtr()->getNumExpansions();
8899     Optional<unsigned> NumExpansions = OrigNumExpansions;
8900     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
8901                                              PatternTL.getSourceRange(),
8902                                              Unexpanded,
8903                                              Expand, RetainExpansion,
8904                                              NumExpansions))
8905       return ExprError();
8906
8907     if (!Expand) {
8908       // The transform has determined that we should perform a simple
8909       // transformation on the pack expansion, producing another pack
8910       // expansion.
8911       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
8912
8913       TypeLocBuilder TLB;
8914       TLB.reserve(From->getTypeLoc().getFullDataSize());
8915
8916       QualType To = getDerived().TransformType(TLB, PatternTL);
8917       if (To.isNull())
8918         return ExprError();
8919
8920       To = getDerived().RebuildPackExpansionType(To,
8921                                                  PatternTL.getSourceRange(),
8922                                                  ExpansionTL.getEllipsisLoc(),
8923                                                  NumExpansions);
8924       if (To.isNull())
8925         return ExprError();
8926
8927       PackExpansionTypeLoc ToExpansionTL
8928         = TLB.push<PackExpansionTypeLoc>(To);
8929       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8930       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8931       continue;
8932     }
8933
8934     // Expand the pack expansion by substituting for each argument in the
8935     // pack(s).
8936     for (unsigned I = 0; I != *NumExpansions; ++I) {
8937       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
8938       TypeLocBuilder TLB;
8939       TLB.reserve(PatternTL.getFullDataSize());
8940       QualType To = getDerived().TransformType(TLB, PatternTL);
8941       if (To.isNull())
8942         return ExprError();
8943
8944       if (To->containsUnexpandedParameterPack()) {
8945         To = getDerived().RebuildPackExpansionType(To,
8946                                                    PatternTL.getSourceRange(),
8947                                                    ExpansionTL.getEllipsisLoc(),
8948                                                    NumExpansions);
8949         if (To.isNull())
8950           return ExprError();
8951
8952         PackExpansionTypeLoc ToExpansionTL
8953           = TLB.push<PackExpansionTypeLoc>(To);
8954         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8955       }
8956
8957       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8958     }
8959
8960     if (!RetainExpansion)
8961       continue;
8962
8963     // If we're supposed to retain a pack expansion, do so by temporarily
8964     // forgetting the partially-substituted parameter pack.
8965     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
8966
8967     TypeLocBuilder TLB;
8968     TLB.reserve(From->getTypeLoc().getFullDataSize());
8969
8970     QualType To = getDerived().TransformType(TLB, PatternTL);
8971     if (To.isNull())
8972       return ExprError();
8973
8974     To = getDerived().RebuildPackExpansionType(To,
8975                                                PatternTL.getSourceRange(),
8976                                                ExpansionTL.getEllipsisLoc(),
8977                                                NumExpansions);
8978     if (To.isNull())
8979       return ExprError();
8980
8981     PackExpansionTypeLoc ToExpansionTL
8982       = TLB.push<PackExpansionTypeLoc>(To);
8983     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8984     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8985   }
8986
8987   if (!getDerived().AlwaysRebuild() && !ArgChanged)
8988     return E;
8989
8990   return getDerived().RebuildTypeTrait(E->getTrait(),
8991                                        E->getLocStart(),
8992                                        Args,
8993                                        E->getLocEnd());
8994 }
8995
8996 template<typename Derived>
8997 ExprResult
8998 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
8999   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
9000   if (!T)
9001     return ExprError();
9002
9003   if (!getDerived().AlwaysRebuild() &&
9004       T == E->getQueriedTypeSourceInfo())
9005     return E;
9006
9007   ExprResult SubExpr;
9008   {
9009     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9010     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
9011     if (SubExpr.isInvalid())
9012       return ExprError();
9013
9014     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
9015       return E;
9016   }
9017
9018   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
9019                                             E->getLocStart(),
9020                                             T,
9021                                             SubExpr.get(),
9022                                             E->getLocEnd());
9023 }
9024
9025 template<typename Derived>
9026 ExprResult
9027 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
9028   ExprResult SubExpr;
9029   {
9030     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9031     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
9032     if (SubExpr.isInvalid())
9033       return ExprError();
9034
9035     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
9036       return E;
9037   }
9038
9039   return getDerived().RebuildExpressionTrait(
9040       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
9041 }
9042
9043 template <typename Derived>
9044 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
9045     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
9046     TypeSourceInfo **RecoveryTSI) {
9047   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
9048       DRE, AddrTaken, RecoveryTSI);
9049
9050   // Propagate both errors and recovered types, which return ExprEmpty.
9051   if (!NewDRE.isUsable())
9052     return NewDRE;
9053
9054   // We got an expr, wrap it up in parens.
9055   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
9056     return PE;
9057   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
9058                                        PE->getRParen());
9059 }
9060
9061 template <typename Derived>
9062 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
9063     DependentScopeDeclRefExpr *E) {
9064   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
9065                                             nullptr);
9066 }
9067
9068 template<typename Derived>
9069 ExprResult
9070 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
9071                                                DependentScopeDeclRefExpr *E,
9072                                                bool IsAddressOfOperand,
9073                                                TypeSourceInfo **RecoveryTSI) {
9074   assert(E->getQualifierLoc());
9075   NestedNameSpecifierLoc QualifierLoc
9076   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9077   if (!QualifierLoc)
9078     return ExprError();
9079   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9080
9081   // TODO: If this is a conversion-function-id, verify that the
9082   // destination type name (if present) resolves the same way after
9083   // instantiation as it did in the local scope.
9084
9085   DeclarationNameInfo NameInfo
9086     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
9087   if (!NameInfo.getName())
9088     return ExprError();
9089
9090   if (!E->hasExplicitTemplateArgs()) {
9091     if (!getDerived().AlwaysRebuild() &&
9092         QualifierLoc == E->getQualifierLoc() &&
9093         // Note: it is sufficient to compare the Name component of NameInfo:
9094         // if name has not changed, DNLoc has not changed either.
9095         NameInfo.getName() == E->getDeclName())
9096       return E;
9097
9098     return getDerived().RebuildDependentScopeDeclRefExpr(
9099         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
9100         IsAddressOfOperand, RecoveryTSI);
9101   }
9102
9103   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
9104   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9105                                               E->getNumTemplateArgs(),
9106                                               TransArgs))
9107     return ExprError();
9108
9109   return getDerived().RebuildDependentScopeDeclRefExpr(
9110       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
9111       RecoveryTSI);
9112 }
9113
9114 template<typename Derived>
9115 ExprResult
9116 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
9117   // CXXConstructExprs other than for list-initialization and
9118   // CXXTemporaryObjectExpr are always implicit, so when we have
9119   // a 1-argument construction we just transform that argument.
9120   if ((E->getNumArgs() == 1 ||
9121        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
9122       (!getDerived().DropCallArgument(E->getArg(0))) &&
9123       !E->isListInitialization())
9124     return getDerived().TransformExpr(E->getArg(0));
9125
9126   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
9127
9128   QualType T = getDerived().TransformType(E->getType());
9129   if (T.isNull())
9130     return ExprError();
9131
9132   CXXConstructorDecl *Constructor
9133     = cast_or_null<CXXConstructorDecl>(
9134                                 getDerived().TransformDecl(E->getLocStart(),
9135                                                          E->getConstructor()));
9136   if (!Constructor)
9137     return ExprError();
9138
9139   bool ArgumentChanged = false;
9140   SmallVector<Expr*, 8> Args;
9141   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9142                                   &ArgumentChanged))
9143     return ExprError();
9144
9145   if (!getDerived().AlwaysRebuild() &&
9146       T == E->getType() &&
9147       Constructor == E->getConstructor() &&
9148       !ArgumentChanged) {
9149     // Mark the constructor as referenced.
9150     // FIXME: Instantiation-specific
9151     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
9152     return E;
9153   }
9154
9155   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
9156                                               Constructor, E->isElidable(),
9157                                               Args,
9158                                               E->hadMultipleCandidates(),
9159                                               E->isListInitialization(),
9160                                               E->isStdInitListInitialization(),
9161                                               E->requiresZeroInitialization(),
9162                                               E->getConstructionKind(),
9163                                               E->getParenOrBraceRange());
9164 }
9165
9166 /// \brief Transform a C++ temporary-binding expression.
9167 ///
9168 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
9169 /// transform the subexpression and return that.
9170 template<typename Derived>
9171 ExprResult
9172 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
9173   return getDerived().TransformExpr(E->getSubExpr());
9174 }
9175
9176 /// \brief Transform a C++ expression that contains cleanups that should
9177 /// be run after the expression is evaluated.
9178 ///
9179 /// Since ExprWithCleanups nodes are implicitly generated, we
9180 /// just transform the subexpression and return that.
9181 template<typename Derived>
9182 ExprResult
9183 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
9184   return getDerived().TransformExpr(E->getSubExpr());
9185 }
9186
9187 template<typename Derived>
9188 ExprResult
9189 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
9190                                                     CXXTemporaryObjectExpr *E) {
9191   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9192   if (!T)
9193     return ExprError();
9194
9195   CXXConstructorDecl *Constructor
9196     = cast_or_null<CXXConstructorDecl>(
9197                                   getDerived().TransformDecl(E->getLocStart(),
9198                                                          E->getConstructor()));
9199   if (!Constructor)
9200     return ExprError();
9201
9202   bool ArgumentChanged = false;
9203   SmallVector<Expr*, 8> Args;
9204   Args.reserve(E->getNumArgs());
9205   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9206                      &ArgumentChanged))
9207     return ExprError();
9208
9209   if (!getDerived().AlwaysRebuild() &&
9210       T == E->getTypeSourceInfo() &&
9211       Constructor == E->getConstructor() &&
9212       !ArgumentChanged) {
9213     // FIXME: Instantiation-specific
9214     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
9215     return SemaRef.MaybeBindToTemporary(E);
9216   }
9217
9218   // FIXME: Pass in E->isListInitialization().
9219   return getDerived().RebuildCXXTemporaryObjectExpr(T,
9220                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
9221                                                     Args,
9222                                                     E->getLocEnd());
9223 }
9224
9225 template<typename Derived>
9226 ExprResult
9227 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
9228   // Transform any init-capture expressions before entering the scope of the
9229   // lambda body, because they are not semantically within that scope.
9230   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
9231   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
9232   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
9233                                   E->explicit_capture_begin());
9234   for (LambdaExpr::capture_iterator C = E->capture_begin(),
9235                                     CEnd = E->capture_end();
9236        C != CEnd; ++C) {
9237     if (!E->isInitCapture(C))
9238       continue;
9239     EnterExpressionEvaluationContext EEEC(getSema(),
9240                                           Sema::PotentiallyEvaluated);
9241     ExprResult NewExprInitResult = getDerived().TransformInitializer(
9242         C->getCapturedVar()->getInit(),
9243         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
9244
9245     if (NewExprInitResult.isInvalid())
9246       return ExprError();
9247     Expr *NewExprInit = NewExprInitResult.get();
9248
9249     VarDecl *OldVD = C->getCapturedVar();
9250     QualType NewInitCaptureType =
9251         getSema().performLambdaInitCaptureInitialization(C->getLocation(),
9252             OldVD->getType()->isReferenceType(), OldVD->getIdentifier(),
9253             NewExprInit);
9254     NewExprInitResult = NewExprInit;
9255     InitCaptureExprsAndTypes[C - E->capture_begin()] =
9256         std::make_pair(NewExprInitResult, NewInitCaptureType);
9257   }
9258
9259   // Transform the template parameters, and add them to the current
9260   // instantiation scope. The null case is handled correctly.
9261   auto TPL = getDerived().TransformTemplateParameterList(
9262       E->getTemplateParameterList());
9263
9264   // Transform the type of the original lambda's call operator.
9265   // The transformation MUST be done in the CurrentInstantiationScope since
9266   // it introduces a mapping of the original to the newly created
9267   // transformed parameters.
9268   TypeSourceInfo *NewCallOpTSI = nullptr;
9269   {
9270     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
9271     FunctionProtoTypeLoc OldCallOpFPTL = 
9272         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
9273
9274     TypeLocBuilder NewCallOpTLBuilder;
9275     SmallVector<QualType, 4> ExceptionStorage;
9276     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
9277     QualType NewCallOpType = TransformFunctionProtoType(
9278         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
9279         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
9280           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
9281                                               ExceptionStorage, Changed);
9282         });
9283     if (NewCallOpType.isNull())
9284       return ExprError();
9285     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
9286                                                         NewCallOpType);
9287   }
9288
9289   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
9290   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
9291   LSI->GLTemplateParameterList = TPL;
9292
9293   // Create the local class that will describe the lambda.
9294   CXXRecordDecl *Class
9295     = getSema().createLambdaClosureType(E->getIntroducerRange(),
9296                                         NewCallOpTSI,
9297                                         /*KnownDependent=*/false,
9298                                         E->getCaptureDefault());
9299   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
9300
9301   // Build the call operator.
9302   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
9303       Class, E->getIntroducerRange(), NewCallOpTSI,
9304       E->getCallOperator()->getLocEnd(),
9305       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams());
9306   LSI->CallOperator = NewCallOperator;
9307
9308   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
9309   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
9310
9311   // Introduce the context of the call operator.
9312   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
9313                                  /*NewThisContext*/false);
9314
9315   // Enter the scope of the lambda.
9316   getSema().buildLambdaScope(LSI, NewCallOperator,
9317                              E->getIntroducerRange(),
9318                              E->getCaptureDefault(),
9319                              E->getCaptureDefaultLoc(),
9320                              E->hasExplicitParameters(),
9321                              E->hasExplicitResultType(),
9322                              E->isMutable());
9323
9324   bool Invalid = false;
9325
9326   // Transform captures.
9327   bool FinishedExplicitCaptures = false;
9328   for (LambdaExpr::capture_iterator C = E->capture_begin(),
9329                                  CEnd = E->capture_end();
9330        C != CEnd; ++C) {
9331     // When we hit the first implicit capture, tell Sema that we've finished
9332     // the list of explicit captures.
9333     if (!FinishedExplicitCaptures && C->isImplicit()) {
9334       getSema().finishLambdaExplicitCaptures(LSI);
9335       FinishedExplicitCaptures = true;
9336     }
9337
9338     // Capturing 'this' is trivial.
9339     if (C->capturesThis()) {
9340       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit());
9341       continue;
9342     }
9343     // Captured expression will be recaptured during captured variables
9344     // rebuilding.
9345     if (C->capturesVLAType())
9346       continue;
9347
9348     // Rebuild init-captures, including the implied field declaration.
9349     if (E->isInitCapture(C)) {
9350       InitCaptureInfoTy InitExprTypePair = 
9351           InitCaptureExprsAndTypes[C - E->capture_begin()];
9352       ExprResult Init = InitExprTypePair.first;
9353       QualType InitQualType = InitExprTypePair.second;
9354       if (Init.isInvalid() || InitQualType.isNull()) {
9355         Invalid = true;
9356         continue;
9357       }
9358       VarDecl *OldVD = C->getCapturedVar();
9359       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
9360           OldVD->getLocation(), InitExprTypePair.second, 
9361           OldVD->getIdentifier(), Init.get());
9362       if (!NewVD)
9363         Invalid = true;
9364       else {
9365         getDerived().transformedLocalDecl(OldVD, NewVD);
9366       }
9367       getSema().buildInitCaptureField(LSI, NewVD);
9368       continue;
9369     }
9370
9371     assert(C->capturesVariable() && "unexpected kind of lambda capture");
9372
9373     // Determine the capture kind for Sema.
9374     Sema::TryCaptureKind Kind
9375       = C->isImplicit()? Sema::TryCapture_Implicit
9376                        : C->getCaptureKind() == LCK_ByCopy
9377                            ? Sema::TryCapture_ExplicitByVal
9378                            : Sema::TryCapture_ExplicitByRef;
9379     SourceLocation EllipsisLoc;
9380     if (C->isPackExpansion()) {
9381       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
9382       bool ShouldExpand = false;
9383       bool RetainExpansion = false;
9384       Optional<unsigned> NumExpansions;
9385       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
9386                                                C->getLocation(),
9387                                                Unexpanded,
9388                                                ShouldExpand, RetainExpansion,
9389                                                NumExpansions)) {
9390         Invalid = true;
9391         continue;
9392       }
9393
9394       if (ShouldExpand) {
9395         // The transform has determined that we should perform an expansion;
9396         // transform and capture each of the arguments.
9397         // expansion of the pattern. Do so.
9398         VarDecl *Pack = C->getCapturedVar();
9399         for (unsigned I = 0; I != *NumExpansions; ++I) {
9400           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
9401           VarDecl *CapturedVar
9402             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
9403                                                                Pack));
9404           if (!CapturedVar) {
9405             Invalid = true;
9406             continue;
9407           }
9408
9409           // Capture the transformed variable.
9410           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
9411         }
9412
9413         // FIXME: Retain a pack expansion if RetainExpansion is true.
9414
9415         continue;
9416       }
9417
9418       EllipsisLoc = C->getEllipsisLoc();
9419     }
9420
9421     // Transform the captured variable.
9422     VarDecl *CapturedVar
9423       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
9424                                                          C->getCapturedVar()));
9425     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
9426       Invalid = true;
9427       continue;
9428     }
9429
9430     // Capture the transformed variable.
9431     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
9432                                  EllipsisLoc);
9433   }
9434   if (!FinishedExplicitCaptures)
9435     getSema().finishLambdaExplicitCaptures(LSI);
9436
9437   // Enter a new evaluation context to insulate the lambda from any
9438   // cleanups from the enclosing full-expression.
9439   getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated);
9440
9441   // Instantiate the body of the lambda expression.
9442   StmtResult Body =
9443       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
9444
9445   // ActOnLambda* will pop the function scope for us.
9446   FuncScopeCleanup.disable();
9447
9448   if (Body.isInvalid()) {
9449     SavedContext.pop();
9450     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
9451                                /*IsInstantiation=*/true);
9452     return ExprError();
9453   }
9454
9455   // Copy the LSI before ActOnFinishFunctionBody removes it.
9456   // FIXME: This is dumb. Store the lambda information somewhere that outlives
9457   // the call operator.
9458   auto LSICopy = *LSI;
9459   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
9460                                     /*IsInstantiation*/ true);
9461   SavedContext.pop();
9462
9463   return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(),
9464                                    &LSICopy);
9465 }
9466
9467 template<typename Derived>
9468 ExprResult
9469 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
9470                                                   CXXUnresolvedConstructExpr *E) {
9471   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9472   if (!T)
9473     return ExprError();
9474
9475   bool ArgumentChanged = false;
9476   SmallVector<Expr*, 8> Args;
9477   Args.reserve(E->arg_size());
9478   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
9479                                   &ArgumentChanged))
9480     return ExprError();
9481
9482   if (!getDerived().AlwaysRebuild() &&
9483       T == E->getTypeSourceInfo() &&
9484       !ArgumentChanged)
9485     return E;
9486
9487   // FIXME: we're faking the locations of the commas
9488   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
9489                                                         E->getLParenLoc(),
9490                                                         Args,
9491                                                         E->getRParenLoc());
9492 }
9493
9494 template<typename Derived>
9495 ExprResult
9496 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
9497                                              CXXDependentScopeMemberExpr *E) {
9498   // Transform the base of the expression.
9499   ExprResult Base((Expr*) nullptr);
9500   Expr *OldBase;
9501   QualType BaseType;
9502   QualType ObjectType;
9503   if (!E->isImplicitAccess()) {
9504     OldBase = E->getBase();
9505     Base = getDerived().TransformExpr(OldBase);
9506     if (Base.isInvalid())
9507       return ExprError();
9508
9509     // Start the member reference and compute the object's type.
9510     ParsedType ObjectTy;
9511     bool MayBePseudoDestructor = false;
9512     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
9513                                                 E->getOperatorLoc(),
9514                                       E->isArrow()? tok::arrow : tok::period,
9515                                                 ObjectTy,
9516                                                 MayBePseudoDestructor);
9517     if (Base.isInvalid())
9518       return ExprError();
9519
9520     ObjectType = ObjectTy.get();
9521     BaseType = ((Expr*) Base.get())->getType();
9522   } else {
9523     OldBase = nullptr;
9524     BaseType = getDerived().TransformType(E->getBaseType());
9525     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
9526   }
9527
9528   // Transform the first part of the nested-name-specifier that qualifies
9529   // the member name.
9530   NamedDecl *FirstQualifierInScope
9531     = getDerived().TransformFirstQualifierInScope(
9532                                             E->getFirstQualifierFoundInScope(),
9533                                             E->getQualifierLoc().getBeginLoc());
9534
9535   NestedNameSpecifierLoc QualifierLoc;
9536   if (E->getQualifier()) {
9537     QualifierLoc
9538       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
9539                                                      ObjectType,
9540                                                      FirstQualifierInScope);
9541     if (!QualifierLoc)
9542       return ExprError();
9543   }
9544
9545   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9546
9547   // TODO: If this is a conversion-function-id, verify that the
9548   // destination type name (if present) resolves the same way after
9549   // instantiation as it did in the local scope.
9550
9551   DeclarationNameInfo NameInfo
9552     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
9553   if (!NameInfo.getName())
9554     return ExprError();
9555
9556   if (!E->hasExplicitTemplateArgs()) {
9557     // This is a reference to a member without an explicitly-specified
9558     // template argument list. Optimize for this common case.
9559     if (!getDerived().AlwaysRebuild() &&
9560         Base.get() == OldBase &&
9561         BaseType == E->getBaseType() &&
9562         QualifierLoc == E->getQualifierLoc() &&
9563         NameInfo.getName() == E->getMember() &&
9564         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
9565       return E;
9566
9567     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
9568                                                        BaseType,
9569                                                        E->isArrow(),
9570                                                        E->getOperatorLoc(),
9571                                                        QualifierLoc,
9572                                                        TemplateKWLoc,
9573                                                        FirstQualifierInScope,
9574                                                        NameInfo,
9575                                                        /*TemplateArgs*/nullptr);
9576   }
9577
9578   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
9579   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9580                                               E->getNumTemplateArgs(),
9581                                               TransArgs))
9582     return ExprError();
9583
9584   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
9585                                                      BaseType,
9586                                                      E->isArrow(),
9587                                                      E->getOperatorLoc(),
9588                                                      QualifierLoc,
9589                                                      TemplateKWLoc,
9590                                                      FirstQualifierInScope,
9591                                                      NameInfo,
9592                                                      &TransArgs);
9593 }
9594
9595 template<typename Derived>
9596 ExprResult
9597 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
9598   // Transform the base of the expression.
9599   ExprResult Base((Expr*) nullptr);
9600   QualType BaseType;
9601   if (!Old->isImplicitAccess()) {
9602     Base = getDerived().TransformExpr(Old->getBase());
9603     if (Base.isInvalid())
9604       return ExprError();
9605     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
9606                                                      Old->isArrow());
9607     if (Base.isInvalid())
9608       return ExprError();
9609     BaseType = Base.get()->getType();
9610   } else {
9611     BaseType = getDerived().TransformType(Old->getBaseType());
9612   }
9613
9614   NestedNameSpecifierLoc QualifierLoc;
9615   if (Old->getQualifierLoc()) {
9616     QualifierLoc
9617     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
9618     if (!QualifierLoc)
9619       return ExprError();
9620   }
9621
9622   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
9623
9624   LookupResult R(SemaRef, Old->getMemberNameInfo(),
9625                  Sema::LookupOrdinaryName);
9626
9627   // Transform all the decls.
9628   for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
9629          E = Old->decls_end(); I != E; ++I) {
9630     NamedDecl *InstD = static_cast<NamedDecl*>(
9631                                 getDerived().TransformDecl(Old->getMemberLoc(),
9632                                                            *I));
9633     if (!InstD) {
9634       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
9635       // This can happen because of dependent hiding.
9636       if (isa<UsingShadowDecl>(*I))
9637         continue;
9638       else {
9639         R.clear();
9640         return ExprError();
9641       }
9642     }
9643
9644     // Expand using declarations.
9645     if (isa<UsingDecl>(InstD)) {
9646       UsingDecl *UD = cast<UsingDecl>(InstD);
9647       for (auto *I : UD->shadows())
9648         R.addDecl(I);
9649       continue;
9650     }
9651
9652     R.addDecl(InstD);
9653   }
9654
9655   R.resolveKind();
9656
9657   // Determine the naming class.
9658   if (Old->getNamingClass()) {
9659     CXXRecordDecl *NamingClass
9660       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
9661                                                           Old->getMemberLoc(),
9662                                                         Old->getNamingClass()));
9663     if (!NamingClass)
9664       return ExprError();
9665
9666     R.setNamingClass(NamingClass);
9667   }
9668
9669   TemplateArgumentListInfo TransArgs;
9670   if (Old->hasExplicitTemplateArgs()) {
9671     TransArgs.setLAngleLoc(Old->getLAngleLoc());
9672     TransArgs.setRAngleLoc(Old->getRAngleLoc());
9673     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
9674                                                 Old->getNumTemplateArgs(),
9675                                                 TransArgs))
9676       return ExprError();
9677   }
9678
9679   // FIXME: to do this check properly, we will need to preserve the
9680   // first-qualifier-in-scope here, just in case we had a dependent
9681   // base (and therefore couldn't do the check) and a
9682   // nested-name-qualifier (and therefore could do the lookup).
9683   NamedDecl *FirstQualifierInScope = nullptr;
9684
9685   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
9686                                                   BaseType,
9687                                                   Old->getOperatorLoc(),
9688                                                   Old->isArrow(),
9689                                                   QualifierLoc,
9690                                                   TemplateKWLoc,
9691                                                   FirstQualifierInScope,
9692                                                   R,
9693                                               (Old->hasExplicitTemplateArgs()
9694                                                   ? &TransArgs : nullptr));
9695 }
9696
9697 template<typename Derived>
9698 ExprResult
9699 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
9700   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9701   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
9702   if (SubExpr.isInvalid())
9703     return ExprError();
9704
9705   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
9706     return E;
9707
9708   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
9709 }
9710
9711 template<typename Derived>
9712 ExprResult
9713 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
9714   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
9715   if (Pattern.isInvalid())
9716     return ExprError();
9717
9718   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
9719     return E;
9720
9721   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
9722                                            E->getNumExpansions());
9723 }
9724
9725 template<typename Derived>
9726 ExprResult
9727 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
9728   // If E is not value-dependent, then nothing will change when we transform it.
9729   // Note: This is an instantiation-centric view.
9730   if (!E->isValueDependent())
9731     return E;
9732
9733   // Note: None of the implementations of TryExpandParameterPacks can ever
9734   // produce a diagnostic when given only a single unexpanded parameter pack,
9735   // so
9736   UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
9737   bool ShouldExpand = false;
9738   bool RetainExpansion = false;
9739   Optional<unsigned> NumExpansions;
9740   if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
9741                                            Unexpanded,
9742                                            ShouldExpand, RetainExpansion,
9743                                            NumExpansions))
9744     return ExprError();
9745
9746   if (RetainExpansion)
9747     return E;
9748
9749   NamedDecl *Pack = E->getPack();
9750   if (!ShouldExpand) {
9751     Pack = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getPackLoc(),
9752                                                               Pack));
9753     if (!Pack)
9754       return ExprError();
9755   }
9756
9757
9758   // We now know the length of the parameter pack, so build a new expression
9759   // that stores that length.
9760   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
9761                                             E->getPackLoc(), E->getRParenLoc(),
9762                                             NumExpansions);
9763 }
9764
9765 template<typename Derived>
9766 ExprResult
9767 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
9768                                           SubstNonTypeTemplateParmPackExpr *E) {
9769   // Default behavior is to do nothing with this transformation.
9770   return E;
9771 }
9772
9773 template<typename Derived>
9774 ExprResult
9775 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
9776                                           SubstNonTypeTemplateParmExpr *E) {
9777   // Default behavior is to do nothing with this transformation.
9778   return E;
9779 }
9780
9781 template<typename Derived>
9782 ExprResult
9783 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
9784   // Default behavior is to do nothing with this transformation.
9785   return E;
9786 }
9787
9788 template<typename Derived>
9789 ExprResult
9790 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
9791                                                   MaterializeTemporaryExpr *E) {
9792   return getDerived().TransformExpr(E->GetTemporaryExpr());
9793 }
9794
9795 template<typename Derived>
9796 ExprResult
9797 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
9798   Expr *Pattern = E->getPattern();
9799
9800   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9801   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
9802   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
9803
9804   // Determine whether the set of unexpanded parameter packs can and should
9805   // be expanded.
9806   bool Expand = true;
9807   bool RetainExpansion = false;
9808   Optional<unsigned> NumExpansions;
9809   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
9810                                            Pattern->getSourceRange(),
9811                                            Unexpanded,
9812                                            Expand, RetainExpansion,
9813                                            NumExpansions))
9814     return true;
9815
9816   if (!Expand) {
9817     // Do not expand any packs here, just transform and rebuild a fold
9818     // expression.
9819     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
9820
9821     ExprResult LHS =
9822         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
9823     if (LHS.isInvalid())
9824       return true;
9825
9826     ExprResult RHS =
9827         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
9828     if (RHS.isInvalid())
9829       return true;
9830
9831     if (!getDerived().AlwaysRebuild() &&
9832         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
9833       return E;
9834
9835     return getDerived().RebuildCXXFoldExpr(
9836         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
9837         RHS.get(), E->getLocEnd());
9838   }
9839
9840   // The transform has determined that we should perform an elementwise
9841   // expansion of the pattern. Do so.
9842   ExprResult Result = getDerived().TransformExpr(E->getInit());
9843   if (Result.isInvalid())
9844     return true;
9845   bool LeftFold = E->isLeftFold();
9846
9847   // If we're retaining an expansion for a right fold, it is the innermost
9848   // component and takes the init (if any).
9849   if (!LeftFold && RetainExpansion) {
9850     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
9851
9852     ExprResult Out = getDerived().TransformExpr(Pattern);
9853     if (Out.isInvalid())
9854       return true;
9855
9856     Result = getDerived().RebuildCXXFoldExpr(
9857         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
9858         Result.get(), E->getLocEnd());
9859     if (Result.isInvalid())
9860       return true;
9861   }
9862
9863   for (unsigned I = 0; I != *NumExpansions; ++I) {
9864     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
9865         getSema(), LeftFold ? I : *NumExpansions - I - 1);
9866     ExprResult Out = getDerived().TransformExpr(Pattern);
9867     if (Out.isInvalid())
9868       return true;
9869
9870     if (Out.get()->containsUnexpandedParameterPack()) {
9871       // We still have a pack; retain a pack expansion for this slice.
9872       Result = getDerived().RebuildCXXFoldExpr(
9873           E->getLocStart(),
9874           LeftFold ? Result.get() : Out.get(),
9875           E->getOperator(), E->getEllipsisLoc(),
9876           LeftFold ? Out.get() : Result.get(),
9877           E->getLocEnd());
9878     } else if (Result.isUsable()) {
9879       // We've got down to a single element; build a binary operator.
9880       Result = getDerived().RebuildBinaryOperator(
9881           E->getEllipsisLoc(), E->getOperator(),
9882           LeftFold ? Result.get() : Out.get(),
9883           LeftFold ? Out.get() : Result.get());
9884     } else
9885       Result = Out;
9886
9887     if (Result.isInvalid())
9888       return true;
9889   }
9890
9891   // If we're retaining an expansion for a left fold, it is the outermost
9892   // component and takes the complete expansion so far as its init (if any).
9893   if (LeftFold && RetainExpansion) {
9894     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
9895
9896     ExprResult Out = getDerived().TransformExpr(Pattern);
9897     if (Out.isInvalid())
9898       return true;
9899
9900     Result = getDerived().RebuildCXXFoldExpr(
9901         E->getLocStart(), Result.get(),
9902         E->getOperator(), E->getEllipsisLoc(),
9903         Out.get(), E->getLocEnd());
9904     if (Result.isInvalid())
9905       return true;
9906   }
9907
9908   // If we had no init and an empty pack, and we're not retaining an expansion,
9909   // then produce a fallback value or error.
9910   if (Result.isUnset())
9911     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
9912                                                 E->getOperator());
9913
9914   return Result;
9915 }
9916
9917 template<typename Derived>
9918 ExprResult
9919 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
9920     CXXStdInitializerListExpr *E) {
9921   return getDerived().TransformExpr(E->getSubExpr());
9922 }
9923
9924 template<typename Derived>
9925 ExprResult
9926 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
9927   return SemaRef.MaybeBindToTemporary(E);
9928 }
9929
9930 template<typename Derived>
9931 ExprResult
9932 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
9933   return E;
9934 }
9935
9936 template<typename Derived>
9937 ExprResult
9938 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
9939   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9940   if (SubExpr.isInvalid())
9941     return ExprError();
9942
9943   if (!getDerived().AlwaysRebuild() &&
9944       SubExpr.get() == E->getSubExpr())
9945     return E;
9946
9947   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
9948 }
9949
9950 template<typename Derived>
9951 ExprResult
9952 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
9953   // Transform each of the elements.
9954   SmallVector<Expr *, 8> Elements;
9955   bool ArgChanged = false;
9956   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
9957                                   /*IsCall=*/false, Elements, &ArgChanged))
9958     return ExprError();
9959
9960   if (!getDerived().AlwaysRebuild() && !ArgChanged)
9961     return SemaRef.MaybeBindToTemporary(E);
9962
9963   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
9964                                               Elements.data(),
9965                                               Elements.size());
9966 }
9967
9968 template<typename Derived>
9969 ExprResult
9970 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
9971                                                     ObjCDictionaryLiteral *E) {
9972   // Transform each of the elements.
9973   SmallVector<ObjCDictionaryElement, 8> Elements;
9974   bool ArgChanged = false;
9975   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
9976     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
9977
9978     if (OrigElement.isPackExpansion()) {
9979       // This key/value element is a pack expansion.
9980       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9981       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
9982       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
9983       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
9984
9985       // Determine whether the set of unexpanded parameter packs can
9986       // and should be expanded.
9987       bool Expand = true;
9988       bool RetainExpansion = false;
9989       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
9990       Optional<unsigned> NumExpansions = OrigNumExpansions;
9991       SourceRange PatternRange(OrigElement.Key->getLocStart(),
9992                                OrigElement.Value->getLocEnd());
9993      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
9994                                                PatternRange,
9995                                                Unexpanded,
9996                                                Expand, RetainExpansion,
9997                                                NumExpansions))
9998         return ExprError();
9999
10000       if (!Expand) {
10001         // The transform has determined that we should perform a simple
10002         // transformation on the pack expansion, producing another pack
10003         // expansion.
10004         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10005         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
10006         if (Key.isInvalid())
10007           return ExprError();
10008
10009         if (Key.get() != OrigElement.Key)
10010           ArgChanged = true;
10011
10012         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
10013         if (Value.isInvalid())
10014           return ExprError();
10015
10016         if (Value.get() != OrigElement.Value)
10017           ArgChanged = true;
10018
10019         ObjCDictionaryElement Expansion = {
10020           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
10021         };
10022         Elements.push_back(Expansion);
10023         continue;
10024       }
10025
10026       // Record right away that the argument was changed.  This needs
10027       // to happen even if the array expands to nothing.
10028       ArgChanged = true;
10029
10030       // The transform has determined that we should perform an elementwise
10031       // expansion of the pattern. Do so.
10032       for (unsigned I = 0; I != *NumExpansions; ++I) {
10033         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
10034         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
10035         if (Key.isInvalid())
10036           return ExprError();
10037
10038         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
10039         if (Value.isInvalid())
10040           return ExprError();
10041
10042         ObjCDictionaryElement Element = {
10043           Key.get(), Value.get(), SourceLocation(), NumExpansions
10044         };
10045
10046         // If any unexpanded parameter packs remain, we still have a
10047         // pack expansion.
10048         // FIXME: Can this really happen?
10049         if (Key.get()->containsUnexpandedParameterPack() ||
10050             Value.get()->containsUnexpandedParameterPack())
10051           Element.EllipsisLoc = OrigElement.EllipsisLoc;
10052
10053         Elements.push_back(Element);
10054       }
10055
10056       // FIXME: Retain a pack expansion if RetainExpansion is true.
10057
10058       // We've finished with this pack expansion.
10059       continue;
10060     }
10061
10062     // Transform and check key.
10063     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
10064     if (Key.isInvalid())
10065       return ExprError();
10066
10067     if (Key.get() != OrigElement.Key)
10068       ArgChanged = true;
10069
10070     // Transform and check value.
10071     ExprResult Value
10072       = getDerived().TransformExpr(OrigElement.Value);
10073     if (Value.isInvalid())
10074       return ExprError();
10075
10076     if (Value.get() != OrigElement.Value)
10077       ArgChanged = true;
10078
10079     ObjCDictionaryElement Element = {
10080       Key.get(), Value.get(), SourceLocation(), None
10081     };
10082     Elements.push_back(Element);
10083   }
10084
10085   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10086     return SemaRef.MaybeBindToTemporary(E);
10087
10088   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
10089                                                    Elements.data(),
10090                                                    Elements.size());
10091 }
10092
10093 template<typename Derived>
10094 ExprResult
10095 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
10096   TypeSourceInfo *EncodedTypeInfo
10097     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
10098   if (!EncodedTypeInfo)
10099     return ExprError();
10100
10101   if (!getDerived().AlwaysRebuild() &&
10102       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
10103     return E;
10104
10105   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
10106                                             EncodedTypeInfo,
10107                                             E->getRParenLoc());
10108 }
10109
10110 template<typename Derived>
10111 ExprResult TreeTransform<Derived>::
10112 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
10113   // This is a kind of implicit conversion, and it needs to get dropped
10114   // and recomputed for the same general reasons that ImplicitCastExprs
10115   // do, as well a more specific one: this expression is only valid when
10116   // it appears *immediately* as an argument expression.
10117   return getDerived().TransformExpr(E->getSubExpr());
10118 }
10119
10120 template<typename Derived>
10121 ExprResult TreeTransform<Derived>::
10122 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
10123   TypeSourceInfo *TSInfo
10124     = getDerived().TransformType(E->getTypeInfoAsWritten());
10125   if (!TSInfo)
10126     return ExprError();
10127
10128   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
10129   if (Result.isInvalid())
10130     return ExprError();
10131
10132   if (!getDerived().AlwaysRebuild() &&
10133       TSInfo == E->getTypeInfoAsWritten() &&
10134       Result.get() == E->getSubExpr())
10135     return E;
10136
10137   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
10138                                       E->getBridgeKeywordLoc(), TSInfo,
10139                                       Result.get());
10140 }
10141
10142 template<typename Derived>
10143 ExprResult
10144 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
10145   // Transform arguments.
10146   bool ArgChanged = false;
10147   SmallVector<Expr*, 8> Args;
10148   Args.reserve(E->getNumArgs());
10149   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
10150                                   &ArgChanged))
10151     return ExprError();
10152
10153   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
10154     // Class message: transform the receiver type.
10155     TypeSourceInfo *ReceiverTypeInfo
10156       = getDerived().TransformType(E->getClassReceiverTypeInfo());
10157     if (!ReceiverTypeInfo)
10158       return ExprError();
10159
10160     // If nothing changed, just retain the existing message send.
10161     if (!getDerived().AlwaysRebuild() &&
10162         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
10163       return SemaRef.MaybeBindToTemporary(E);
10164
10165     // Build a new class message send.
10166     SmallVector<SourceLocation, 16> SelLocs;
10167     E->getSelectorLocs(SelLocs);
10168     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
10169                                                E->getSelector(),
10170                                                SelLocs,
10171                                                E->getMethodDecl(),
10172                                                E->getLeftLoc(),
10173                                                Args,
10174                                                E->getRightLoc());
10175   }
10176   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
10177            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
10178     // Build a new class message send to 'super'.
10179     SmallVector<SourceLocation, 16> SelLocs;
10180     E->getSelectorLocs(SelLocs);
10181     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
10182                                                E->getSelector(),
10183                                                SelLocs,
10184                                                E->getMethodDecl(),
10185                                                E->getLeftLoc(),
10186                                                Args,
10187                                                E->getRightLoc());
10188   }
10189
10190   // Instance message: transform the receiver
10191   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
10192          "Only class and instance messages may be instantiated");
10193   ExprResult Receiver
10194     = getDerived().TransformExpr(E->getInstanceReceiver());
10195   if (Receiver.isInvalid())
10196     return ExprError();
10197
10198   // If nothing changed, just retain the existing message send.
10199   if (!getDerived().AlwaysRebuild() &&
10200       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
10201     return SemaRef.MaybeBindToTemporary(E);
10202
10203   // Build a new instance message send.
10204   SmallVector<SourceLocation, 16> SelLocs;
10205   E->getSelectorLocs(SelLocs);
10206   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
10207                                              E->getSelector(),
10208                                              SelLocs,
10209                                              E->getMethodDecl(),
10210                                              E->getLeftLoc(),
10211                                              Args,
10212                                              E->getRightLoc());
10213 }
10214
10215 template<typename Derived>
10216 ExprResult
10217 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
10218   return E;
10219 }
10220
10221 template<typename Derived>
10222 ExprResult
10223 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
10224   return E;
10225 }
10226
10227 template<typename Derived>
10228 ExprResult
10229 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
10230   // Transform the base expression.
10231   ExprResult Base = getDerived().TransformExpr(E->getBase());
10232   if (Base.isInvalid())
10233     return ExprError();
10234
10235   // We don't need to transform the ivar; it will never change.
10236
10237   // If nothing changed, just retain the existing expression.
10238   if (!getDerived().AlwaysRebuild() &&
10239       Base.get() == E->getBase())
10240     return E;
10241
10242   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
10243                                              E->getLocation(),
10244                                              E->isArrow(), E->isFreeIvar());
10245 }
10246
10247 template<typename Derived>
10248 ExprResult
10249 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
10250   // 'super' and types never change. Property never changes. Just
10251   // retain the existing expression.
10252   if (!E->isObjectReceiver())
10253     return E;
10254
10255   // Transform the base expression.
10256   ExprResult Base = getDerived().TransformExpr(E->getBase());
10257   if (Base.isInvalid())
10258     return ExprError();
10259
10260   // We don't need to transform the property; it will never change.
10261
10262   // If nothing changed, just retain the existing expression.
10263   if (!getDerived().AlwaysRebuild() &&
10264       Base.get() == E->getBase())
10265     return E;
10266
10267   if (E->isExplicitProperty())
10268     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
10269                                                    E->getExplicitProperty(),
10270                                                    E->getLocation());
10271
10272   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
10273                                                  SemaRef.Context.PseudoObjectTy,
10274                                                  E->getImplicitPropertyGetter(),
10275                                                  E->getImplicitPropertySetter(),
10276                                                  E->getLocation());
10277 }
10278
10279 template<typename Derived>
10280 ExprResult
10281 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
10282   // Transform the base expression.
10283   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
10284   if (Base.isInvalid())
10285     return ExprError();
10286
10287   // Transform the key expression.
10288   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
10289   if (Key.isInvalid())
10290     return ExprError();
10291
10292   // If nothing changed, just retain the existing expression.
10293   if (!getDerived().AlwaysRebuild() &&
10294       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
10295     return E;
10296
10297   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
10298                                                   Base.get(), Key.get(),
10299                                                   E->getAtIndexMethodDecl(),
10300                                                   E->setAtIndexMethodDecl());
10301 }
10302
10303 template<typename Derived>
10304 ExprResult
10305 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
10306   // Transform the base expression.
10307   ExprResult Base = getDerived().TransformExpr(E->getBase());
10308   if (Base.isInvalid())
10309     return ExprError();
10310
10311   // If nothing changed, just retain the existing expression.
10312   if (!getDerived().AlwaysRebuild() &&
10313       Base.get() == E->getBase())
10314     return E;
10315
10316   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
10317                                          E->getOpLoc(),
10318                                          E->isArrow());
10319 }
10320
10321 template<typename Derived>
10322 ExprResult
10323 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
10324   bool ArgumentChanged = false;
10325   SmallVector<Expr*, 8> SubExprs;
10326   SubExprs.reserve(E->getNumSubExprs());
10327   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
10328                                   SubExprs, &ArgumentChanged))
10329     return ExprError();
10330
10331   if (!getDerived().AlwaysRebuild() &&
10332       !ArgumentChanged)
10333     return E;
10334
10335   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
10336                                                SubExprs,
10337                                                E->getRParenLoc());
10338 }
10339
10340 template<typename Derived>
10341 ExprResult
10342 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
10343   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
10344   if (SrcExpr.isInvalid())
10345     return ExprError();
10346
10347   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10348   if (!Type)
10349     return ExprError();
10350
10351   if (!getDerived().AlwaysRebuild() &&
10352       Type == E->getTypeSourceInfo() &&
10353       SrcExpr.get() == E->getSrcExpr())
10354     return E;
10355
10356   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
10357                                                SrcExpr.get(), Type,
10358                                                E->getRParenLoc());
10359 }
10360
10361 template<typename Derived>
10362 ExprResult
10363 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
10364   BlockDecl *oldBlock = E->getBlockDecl();
10365
10366   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
10367   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
10368
10369   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
10370   blockScope->TheDecl->setBlockMissingReturnType(
10371                          oldBlock->blockMissingReturnType());
10372
10373   SmallVector<ParmVarDecl*, 4> params;
10374   SmallVector<QualType, 4> paramTypes;
10375
10376   // Parameter substitution.
10377   if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(),
10378                                                oldBlock->param_begin(),
10379                                                oldBlock->param_size(),
10380                                                nullptr, paramTypes, &params)) {
10381     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
10382     return ExprError();
10383   }
10384
10385   const FunctionProtoType *exprFunctionType = E->getFunctionType();
10386   QualType exprResultType =
10387       getDerived().TransformType(exprFunctionType->getReturnType());
10388
10389   QualType functionType =
10390     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes,
10391                                           exprFunctionType->getExtProtoInfo());
10392   blockScope->FunctionType = functionType;
10393
10394   // Set the parameters on the block decl.
10395   if (!params.empty())
10396     blockScope->TheDecl->setParams(params);
10397
10398   if (!oldBlock->blockMissingReturnType()) {
10399     blockScope->HasImplicitReturnType = false;
10400     blockScope->ReturnType = exprResultType;
10401   }
10402
10403   // Transform the body
10404   StmtResult body = getDerived().TransformStmt(E->getBody());
10405   if (body.isInvalid()) {
10406     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
10407     return ExprError();
10408   }
10409
10410 #ifndef NDEBUG
10411   // In builds with assertions, make sure that we captured everything we
10412   // captured before.
10413   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
10414     for (const auto &I : oldBlock->captures()) {
10415       VarDecl *oldCapture = I.getVariable();
10416
10417       // Ignore parameter packs.
10418       if (isa<ParmVarDecl>(oldCapture) &&
10419           cast<ParmVarDecl>(oldCapture)->isParameterPack())
10420         continue;
10421
10422       VarDecl *newCapture =
10423         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
10424                                                  oldCapture));
10425       assert(blockScope->CaptureMap.count(newCapture));
10426     }
10427     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
10428   }
10429 #endif
10430
10431   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
10432                                     /*Scope=*/nullptr);
10433 }
10434
10435 template<typename Derived>
10436 ExprResult
10437 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
10438   llvm_unreachable("Cannot transform asType expressions yet");
10439 }
10440
10441 template<typename Derived>
10442 ExprResult
10443 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
10444   QualType RetTy = getDerived().TransformType(E->getType());
10445   bool ArgumentChanged = false;
10446   SmallVector<Expr*, 8> SubExprs;
10447   SubExprs.reserve(E->getNumSubExprs());
10448   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
10449                                   SubExprs, &ArgumentChanged))
10450     return ExprError();
10451
10452   if (!getDerived().AlwaysRebuild() &&
10453       !ArgumentChanged)
10454     return E;
10455
10456   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
10457                                         RetTy, E->getOp(), E->getRParenLoc());
10458 }
10459
10460 //===----------------------------------------------------------------------===//
10461 // Type reconstruction
10462 //===----------------------------------------------------------------------===//
10463
10464 template<typename Derived>
10465 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
10466                                                     SourceLocation Star) {
10467   return SemaRef.BuildPointerType(PointeeType, Star,
10468                                   getDerived().getBaseEntity());
10469 }
10470
10471 template<typename Derived>
10472 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
10473                                                          SourceLocation Star) {
10474   return SemaRef.BuildBlockPointerType(PointeeType, Star,
10475                                        getDerived().getBaseEntity());
10476 }
10477
10478 template<typename Derived>
10479 QualType
10480 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
10481                                              bool WrittenAsLValue,
10482                                              SourceLocation Sigil) {
10483   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
10484                                     Sigil, getDerived().getBaseEntity());
10485 }
10486
10487 template<typename Derived>
10488 QualType
10489 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
10490                                                  QualType ClassType,
10491                                                  SourceLocation Sigil) {
10492   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
10493                                         getDerived().getBaseEntity());
10494 }
10495
10496 template<typename Derived>
10497 QualType
10498 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
10499                                          ArrayType::ArraySizeModifier SizeMod,
10500                                          const llvm::APInt *Size,
10501                                          Expr *SizeExpr,
10502                                          unsigned IndexTypeQuals,
10503                                          SourceRange BracketsRange) {
10504   if (SizeExpr || !Size)
10505     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
10506                                   IndexTypeQuals, BracketsRange,
10507                                   getDerived().getBaseEntity());
10508
10509   QualType Types[] = {
10510     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
10511     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
10512     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
10513   };
10514   const unsigned NumTypes = llvm::array_lengthof(Types);
10515   QualType SizeType;
10516   for (unsigned I = 0; I != NumTypes; ++I)
10517     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
10518       SizeType = Types[I];
10519       break;
10520     }
10521
10522   // Note that we can return a VariableArrayType here in the case where
10523   // the element type was a dependent VariableArrayType.
10524   IntegerLiteral *ArraySize
10525       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
10526                                /*FIXME*/BracketsRange.getBegin());
10527   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
10528                                 IndexTypeQuals, BracketsRange,
10529                                 getDerived().getBaseEntity());
10530 }
10531
10532 template<typename Derived>
10533 QualType
10534 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
10535                                                  ArrayType::ArraySizeModifier SizeMod,
10536                                                  const llvm::APInt &Size,
10537                                                  unsigned IndexTypeQuals,
10538                                                  SourceRange BracketsRange) {
10539   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
10540                                         IndexTypeQuals, BracketsRange);
10541 }
10542
10543 template<typename Derived>
10544 QualType
10545 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
10546                                           ArrayType::ArraySizeModifier SizeMod,
10547                                                  unsigned IndexTypeQuals,
10548                                                    SourceRange BracketsRange) {
10549   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
10550                                        IndexTypeQuals, BracketsRange);
10551 }
10552
10553 template<typename Derived>
10554 QualType
10555 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
10556                                           ArrayType::ArraySizeModifier SizeMod,
10557                                                  Expr *SizeExpr,
10558                                                  unsigned IndexTypeQuals,
10559                                                  SourceRange BracketsRange) {
10560   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
10561                                        SizeExpr,
10562                                        IndexTypeQuals, BracketsRange);
10563 }
10564
10565 template<typename Derived>
10566 QualType
10567 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
10568                                           ArrayType::ArraySizeModifier SizeMod,
10569                                                        Expr *SizeExpr,
10570                                                        unsigned IndexTypeQuals,
10571                                                    SourceRange BracketsRange) {
10572   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
10573                                        SizeExpr,
10574                                        IndexTypeQuals, BracketsRange);
10575 }
10576
10577 template<typename Derived>
10578 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
10579                                                unsigned NumElements,
10580                                                VectorType::VectorKind VecKind) {
10581   // FIXME: semantic checking!
10582   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
10583 }
10584
10585 template<typename Derived>
10586 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
10587                                                       unsigned NumElements,
10588                                                  SourceLocation AttributeLoc) {
10589   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
10590                           NumElements, true);
10591   IntegerLiteral *VectorSize
10592     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
10593                              AttributeLoc);
10594   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
10595 }
10596
10597 template<typename Derived>
10598 QualType
10599 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
10600                                                            Expr *SizeExpr,
10601                                                   SourceLocation AttributeLoc) {
10602   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
10603 }
10604
10605 template<typename Derived>
10606 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
10607     QualType T,
10608     MutableArrayRef<QualType> ParamTypes,
10609     const FunctionProtoType::ExtProtoInfo &EPI) {
10610   return SemaRef.BuildFunctionType(T, ParamTypes,
10611                                    getDerived().getBaseLocation(),
10612                                    getDerived().getBaseEntity(),
10613                                    EPI);
10614 }
10615
10616 template<typename Derived>
10617 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
10618   return SemaRef.Context.getFunctionNoProtoType(T);
10619 }
10620
10621 template<typename Derived>
10622 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
10623   assert(D && "no decl found");
10624   if (D->isInvalidDecl()) return QualType();
10625
10626   // FIXME: Doesn't account for ObjCInterfaceDecl!
10627   TypeDecl *Ty;
10628   if (isa<UsingDecl>(D)) {
10629     UsingDecl *Using = cast<UsingDecl>(D);
10630     assert(Using->hasTypename() &&
10631            "UnresolvedUsingTypenameDecl transformed to non-typename using");
10632
10633     // A valid resolved using typename decl points to exactly one type decl.
10634     assert(++Using->shadow_begin() == Using->shadow_end());
10635     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
10636
10637   } else {
10638     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
10639            "UnresolvedUsingTypenameDecl transformed to non-using decl");
10640     Ty = cast<UnresolvedUsingTypenameDecl>(D);
10641   }
10642
10643   return SemaRef.Context.getTypeDeclType(Ty);
10644 }
10645
10646 template<typename Derived>
10647 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
10648                                                        SourceLocation Loc) {
10649   return SemaRef.BuildTypeofExprType(E, Loc);
10650 }
10651
10652 template<typename Derived>
10653 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
10654   return SemaRef.Context.getTypeOfType(Underlying);
10655 }
10656
10657 template<typename Derived>
10658 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
10659                                                      SourceLocation Loc) {
10660   return SemaRef.BuildDecltypeType(E, Loc);
10661 }
10662
10663 template<typename Derived>
10664 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
10665                                             UnaryTransformType::UTTKind UKind,
10666                                             SourceLocation Loc) {
10667   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
10668 }
10669
10670 template<typename Derived>
10671 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
10672                                                       TemplateName Template,
10673                                              SourceLocation TemplateNameLoc,
10674                                      TemplateArgumentListInfo &TemplateArgs) {
10675   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
10676 }
10677
10678 template<typename Derived>
10679 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
10680                                                    SourceLocation KWLoc) {
10681   return SemaRef.BuildAtomicType(ValueType, KWLoc);
10682 }
10683
10684 template<typename Derived>
10685 TemplateName
10686 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10687                                             bool TemplateKW,
10688                                             TemplateDecl *Template) {
10689   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
10690                                                   Template);
10691 }
10692
10693 template<typename Derived>
10694 TemplateName
10695 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10696                                             const IdentifierInfo &Name,
10697                                             SourceLocation NameLoc,
10698                                             QualType ObjectType,
10699                                             NamedDecl *FirstQualifierInScope) {
10700   UnqualifiedId TemplateName;
10701   TemplateName.setIdentifier(&Name, NameLoc);
10702   Sema::TemplateTy Template;
10703   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10704   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
10705                                        SS, TemplateKWLoc, TemplateName,
10706                                        ParsedType::make(ObjectType),
10707                                        /*EnteringContext=*/false,
10708                                        Template);
10709   return Template.get();
10710 }
10711
10712 template<typename Derived>
10713 TemplateName
10714 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10715                                             OverloadedOperatorKind Operator,
10716                                             SourceLocation NameLoc,
10717                                             QualType ObjectType) {
10718   UnqualifiedId Name;
10719   // FIXME: Bogus location information.
10720   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
10721   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
10722   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10723   Sema::TemplateTy Template;
10724   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
10725                                        SS, TemplateKWLoc, Name,
10726                                        ParsedType::make(ObjectType),
10727                                        /*EnteringContext=*/false,
10728                                        Template);
10729   return Template.get();
10730 }
10731
10732 template<typename Derived>
10733 ExprResult
10734 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
10735                                                    SourceLocation OpLoc,
10736                                                    Expr *OrigCallee,
10737                                                    Expr *First,
10738                                                    Expr *Second) {
10739   Expr *Callee = OrigCallee->IgnoreParenCasts();
10740   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
10741
10742   if (First->getObjectKind() == OK_ObjCProperty) {
10743     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10744     if (BinaryOperator::isAssignmentOp(Opc))
10745       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
10746                                                  First, Second);
10747     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
10748     if (Result.isInvalid())
10749       return ExprError();
10750     First = Result.get();
10751   }
10752
10753   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
10754     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
10755     if (Result.isInvalid())
10756       return ExprError();
10757     Second = Result.get();
10758   }
10759
10760   // Determine whether this should be a builtin operation.
10761   if (Op == OO_Subscript) {
10762     if (!First->getType()->isOverloadableType() &&
10763         !Second->getType()->isOverloadableType())
10764       return getSema().CreateBuiltinArraySubscriptExpr(First,
10765                                                        Callee->getLocStart(),
10766                                                        Second, OpLoc);
10767   } else if (Op == OO_Arrow) {
10768     // -> is never a builtin operation.
10769     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
10770   } else if (Second == nullptr || isPostIncDec) {
10771     if (!First->getType()->isOverloadableType()) {
10772       // The argument is not of overloadable type, so try to create a
10773       // built-in unary operation.
10774       UnaryOperatorKind Opc
10775         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
10776
10777       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
10778     }
10779   } else {
10780     if (!First->getType()->isOverloadableType() &&
10781         !Second->getType()->isOverloadableType()) {
10782       // Neither of the arguments is an overloadable type, so try to
10783       // create a built-in binary operation.
10784       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10785       ExprResult Result
10786         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
10787       if (Result.isInvalid())
10788         return ExprError();
10789
10790       return Result;
10791     }
10792   }
10793
10794   // Compute the transformed set of functions (and function templates) to be
10795   // used during overload resolution.
10796   UnresolvedSet<16> Functions;
10797
10798   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
10799     assert(ULE->requiresADL());
10800     Functions.append(ULE->decls_begin(), ULE->decls_end());
10801   } else {
10802     // If we've resolved this to a particular non-member function, just call
10803     // that function. If we resolved it to a member function,
10804     // CreateOverloaded* will find that function for us.
10805     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
10806     if (!isa<CXXMethodDecl>(ND))
10807       Functions.addDecl(ND);
10808   }
10809
10810   // Add any functions found via argument-dependent lookup.
10811   Expr *Args[2] = { First, Second };
10812   unsigned NumArgs = 1 + (Second != nullptr);
10813
10814   // Create the overloaded operator invocation for unary operators.
10815   if (NumArgs == 1 || isPostIncDec) {
10816     UnaryOperatorKind Opc
10817       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
10818     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
10819   }
10820
10821   if (Op == OO_Subscript) {
10822     SourceLocation LBrace;
10823     SourceLocation RBrace;
10824
10825     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
10826         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
10827         LBrace = SourceLocation::getFromRawEncoding(
10828                     NameLoc.CXXOperatorName.BeginOpNameLoc);
10829         RBrace = SourceLocation::getFromRawEncoding(
10830                     NameLoc.CXXOperatorName.EndOpNameLoc);
10831     } else {
10832         LBrace = Callee->getLocStart();
10833         RBrace = OpLoc;
10834     }
10835
10836     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
10837                                                       First, Second);
10838   }
10839
10840   // Create the overloaded operator invocation for binary operators.
10841   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10842   ExprResult Result
10843     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
10844   if (Result.isInvalid())
10845     return ExprError();
10846
10847   return Result;
10848 }
10849
10850 template<typename Derived>
10851 ExprResult
10852 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
10853                                                      SourceLocation OperatorLoc,
10854                                                        bool isArrow,
10855                                                        CXXScopeSpec &SS,
10856                                                      TypeSourceInfo *ScopeType,
10857                                                        SourceLocation CCLoc,
10858                                                        SourceLocation TildeLoc,
10859                                         PseudoDestructorTypeStorage Destroyed) {
10860   QualType BaseType = Base->getType();
10861   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
10862       (!isArrow && !BaseType->getAs<RecordType>()) ||
10863       (isArrow && BaseType->getAs<PointerType>() &&
10864        !BaseType->getAs<PointerType>()->getPointeeType()
10865                                               ->template getAs<RecordType>())){
10866     // This pseudo-destructor expression is still a pseudo-destructor.
10867     return SemaRef.BuildPseudoDestructorExpr(
10868         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
10869         CCLoc, TildeLoc, Destroyed);
10870   }
10871
10872   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
10873   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
10874                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
10875   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
10876   NameInfo.setNamedTypeInfo(DestroyedType);
10877
10878   // The scope type is now known to be a valid nested name specifier
10879   // component. Tack it on to the end of the nested name specifier.
10880   if (ScopeType) {
10881     if (!ScopeType->getType()->getAs<TagType>()) {
10882       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
10883                      diag::err_expected_class_or_namespace)
10884           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
10885       return ExprError();
10886     }
10887     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
10888               CCLoc);
10889   }
10890
10891   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10892   return getSema().BuildMemberReferenceExpr(Base, BaseType,
10893                                             OperatorLoc, isArrow,
10894                                             SS, TemplateKWLoc,
10895                                             /*FIXME: FirstQualifier*/ nullptr,
10896                                             NameInfo,
10897                                             /*TemplateArgs*/ nullptr);
10898 }
10899
10900 template<typename Derived>
10901 StmtResult
10902 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
10903   SourceLocation Loc = S->getLocStart();
10904   CapturedDecl *CD = S->getCapturedDecl();
10905   unsigned NumParams = CD->getNumParams();
10906   unsigned ContextParamPos = CD->getContextParamPosition();
10907   SmallVector<Sema::CapturedParamNameType, 4> Params;
10908   for (unsigned I = 0; I < NumParams; ++I) {
10909     if (I != ContextParamPos) {
10910       Params.push_back(
10911              std::make_pair(
10912                   CD->getParam(I)->getName(),
10913                   getDerived().TransformType(CD->getParam(I)->getType())));
10914     } else {
10915       Params.push_back(std::make_pair(StringRef(), QualType()));
10916     }
10917   }
10918   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
10919                                      S->getCapturedRegionKind(), Params);
10920   StmtResult Body;
10921   {
10922     Sema::CompoundScopeRAII CompoundScope(getSema());
10923     Body = getDerived().TransformStmt(S->getCapturedStmt());
10924   }
10925
10926   if (Body.isInvalid()) {
10927     getSema().ActOnCapturedRegionError();
10928     return StmtError();
10929   }
10930
10931   return getSema().ActOnCapturedRegionEnd(Body.get());
10932 }
10933
10934 } // end namespace clang
10935
10936 #endif