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