TreeTransform.h revision 5431299f6e1e1d14b39b924fe24bf04035f4ae42
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#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
14#define LLVM_CLANG_SEMA_TREETRANSFORM_H
15
16#include "Sema.h"
17#include "Lookup.h"
18#include "clang/Sema/SemaDiagnostic.h"
19#include "clang/AST/Decl.h"
20#include "clang/AST/Expr.h"
21#include "clang/AST/ExprCXX.h"
22#include "clang/AST/ExprObjC.h"
23#include "clang/AST/Stmt.h"
24#include "clang/AST/StmtCXX.h"
25#include "clang/AST/StmtObjC.h"
26#include "clang/AST/TypeLocBuilder.h"
27#include "clang/Parse/Ownership.h"
28#include "clang/Parse/Designator.h"
29#include "clang/Lex/Preprocessor.h"
30#include "llvm/Support/ErrorHandling.h"
31#include <algorithm>
32
33namespace clang {
34
35/// \brief A semantic tree transformation that allows one to transform one
36/// abstract syntax tree into another.
37///
38/// A new tree transformation is defined by creating a new subclass \c X of
39/// \c TreeTransform<X> and then overriding certain operations to provide
40/// behavior specific to that transformation. For example, template
41/// instantiation is implemented as a tree transformation where the
42/// transformation of TemplateTypeParmType nodes involves substituting the
43/// template arguments for their corresponding template parameters; a similar
44/// transformation is performed for non-type template parameters and
45/// template template parameters.
46///
47/// This tree-transformation template uses static polymorphism to allow
48/// subclasses to customize any of its operations. Thus, a subclass can
49/// override any of the transformation or rebuild operators by providing an
50/// operation with the same signature as the default implementation. The
51/// overridding function should not be virtual.
52///
53/// Semantic tree transformations are split into two stages, either of which
54/// can be replaced by a subclass. The "transform" step transforms an AST node
55/// or the parts of an AST node using the various transformation functions,
56/// then passes the pieces on to the "rebuild" step, which constructs a new AST
57/// node of the appropriate kind from the pieces. The default transformation
58/// routines recursively transform the operands to composite AST nodes (e.g.,
59/// the pointee type of a PointerType node) and, if any of those operand nodes
60/// were changed by the transformation, invokes the rebuild operation to create
61/// a new AST node.
62///
63/// Subclasses can customize the transformation at various levels. The
64/// most coarse-grained transformations involve replacing TransformType(),
65/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
66/// TransformTemplateName(), or TransformTemplateArgument() with entirely
67/// new implementations.
68///
69/// For more fine-grained transformations, subclasses can replace any of the
70/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
71/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
72/// replacing TransformTemplateTypeParmType() allows template instantiation
73/// to substitute template arguments for their corresponding template
74/// parameters. Additionally, subclasses can override the \c RebuildXXX
75/// functions to control how AST nodes are rebuilt when their operands change.
76/// By default, \c TreeTransform will invoke semantic analysis to rebuild
77/// AST nodes. However, certain other tree transformations (e.g, cloning) may
78/// be able to use more efficient rebuild steps.
79///
80/// There are a handful of other functions that can be overridden, allowing one
81/// to avoid traversing nodes that don't need any transformation
82/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
83/// operands have not changed (\c AlwaysRebuild()), and customize the
84/// default locations and entity names used for type-checking
85/// (\c getBaseLocation(), \c getBaseEntity()).
86template<typename Derived>
87class TreeTransform {
88protected:
89  Sema &SemaRef;
90
91public:
92  typedef Sema::OwningStmtResult OwningStmtResult;
93  typedef Sema::OwningExprResult OwningExprResult;
94  typedef Sema::StmtArg StmtArg;
95  typedef Sema::ExprArg ExprArg;
96  typedef Sema::MultiExprArg MultiExprArg;
97  typedef Sema::MultiStmtArg MultiStmtArg;
98  typedef Sema::DeclPtrTy DeclPtrTy;
99
100  /// \brief Initializes a new tree transformer.
101  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
102
103  /// \brief Retrieves a reference to the derived class.
104  Derived &getDerived() { return static_cast<Derived&>(*this); }
105
106  /// \brief Retrieves a reference to the derived class.
107  const Derived &getDerived() const {
108    return static_cast<const Derived&>(*this);
109  }
110
111  /// \brief Retrieves a reference to the semantic analysis object used for
112  /// this tree transform.
113  Sema &getSema() const { return SemaRef; }
114
115  /// \brief Whether the transformation should always rebuild AST nodes, even
116  /// if none of the children have changed.
117  ///
118  /// Subclasses may override this function to specify when the transformation
119  /// should rebuild all AST nodes.
120  bool AlwaysRebuild() { return false; }
121
122  /// \brief Returns the location of the entity being transformed, if that
123  /// information was not available elsewhere in the AST.
124  ///
125  /// By default, returns no source-location information. Subclasses can
126  /// provide an alternative implementation that provides better location
127  /// information.
128  SourceLocation getBaseLocation() { return SourceLocation(); }
129
130  /// \brief Returns the name of the entity being transformed, if that
131  /// information was not available elsewhere in the AST.
132  ///
133  /// By default, returns an empty name. Subclasses can provide an alternative
134  /// implementation with a more precise name.
135  DeclarationName getBaseEntity() { return DeclarationName(); }
136
137  /// \brief Sets the "base" location and entity when that
138  /// information is known based on another transformation.
139  ///
140  /// By default, the source location and entity are ignored. Subclasses can
141  /// override this function to provide a customized implementation.
142  void setBase(SourceLocation Loc, DeclarationName Entity) { }
143
144  /// \brief RAII object that temporarily sets the base location and entity
145  /// used for reporting diagnostics in types.
146  class TemporaryBase {
147    TreeTransform &Self;
148    SourceLocation OldLocation;
149    DeclarationName OldEntity;
150
151  public:
152    TemporaryBase(TreeTransform &Self, SourceLocation Location,
153                  DeclarationName Entity) : Self(Self) {
154      OldLocation = Self.getDerived().getBaseLocation();
155      OldEntity = Self.getDerived().getBaseEntity();
156      Self.getDerived().setBase(Location, Entity);
157    }
158
159    ~TemporaryBase() {
160      Self.getDerived().setBase(OldLocation, OldEntity);
161    }
162  };
163
164  /// \brief Determine whether the given type \p T has already been
165  /// transformed.
166  ///
167  /// Subclasses can provide an alternative implementation of this routine
168  /// to short-circuit evaluation when it is known that a given type will
169  /// not change. For example, template instantiation need not traverse
170  /// non-dependent types.
171  bool AlreadyTransformed(QualType T) {
172    return T.isNull();
173  }
174
175  /// \brief Determine whether the given call argument should be dropped, e.g.,
176  /// because it is a default argument.
177  ///
178  /// Subclasses can provide an alternative implementation of this routine to
179  /// determine which kinds of call arguments get dropped. By default,
180  /// CXXDefaultArgument nodes are dropped (prior to transformation).
181  bool DropCallArgument(Expr *E) {
182    return E->isDefaultArgument();
183  }
184
185  /// \brief Transforms the given type into another type.
186  ///
187  /// By default, this routine transforms a type by creating a
188  /// TypeSourceInfo for it and delegating to the appropriate
189  /// function.  This is expensive, but we don't mind, because
190  /// this method is deprecated anyway;  all users should be
191  /// switched to storing TypeSourceInfos.
192  ///
193  /// \returns the transformed type.
194  QualType TransformType(QualType T, QualType ObjectType = QualType());
195
196  /// \brief Transforms the given type-with-location into a new
197  /// type-with-location.
198  ///
199  /// By default, this routine transforms a type by delegating to the
200  /// appropriate TransformXXXType to build a new type.  Subclasses
201  /// may override this function (to take over all type
202  /// transformations) or some set of the TransformXXXType functions
203  /// to alter the transformation.
204  TypeSourceInfo *TransformType(TypeSourceInfo *DI,
205                                QualType ObjectType = QualType());
206
207  /// \brief Transform the given type-with-location into a new
208  /// type, collecting location information in the given builder
209  /// as necessary.
210  ///
211  QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL,
212                         QualType ObjectType = QualType());
213
214  /// \brief Transform the given statement.
215  ///
216  /// By default, this routine transforms a statement by delegating to the
217  /// appropriate TransformXXXStmt function to transform a specific kind of
218  /// statement or the TransformExpr() function to transform an expression.
219  /// Subclasses may override this function to transform statements using some
220  /// other mechanism.
221  ///
222  /// \returns the transformed statement.
223  OwningStmtResult TransformStmt(Stmt *S);
224
225  /// \brief Transform the given expression.
226  ///
227  /// By default, this routine transforms an expression by delegating to the
228  /// appropriate TransformXXXExpr function to build a new expression.
229  /// Subclasses may override this function to transform expressions using some
230  /// other mechanism.
231  ///
232  /// \returns the transformed expression.
233  OwningExprResult TransformExpr(Expr *E);
234
235  /// \brief Transform the given declaration, which is referenced from a type
236  /// or expression.
237  ///
238  /// By default, acts as the identity function on declarations. Subclasses
239  /// may override this function to provide alternate behavior.
240  Decl *TransformDecl(SourceLocation Loc, Decl *D) { return D; }
241
242  /// \brief Transform the definition of the given declaration.
243  ///
244  /// By default, invokes TransformDecl() to transform the declaration.
245  /// Subclasses may override this function to provide alternate behavior.
246  Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
247    return getDerived().TransformDecl(Loc, D);
248  }
249
250  /// \brief Transform the given declaration, which was the first part of a
251  /// nested-name-specifier in a member access expression.
252  ///
253  /// This specific declaration transformation only applies to the first
254  /// identifier in a nested-name-specifier of a member access expression, e.g.,
255  /// the \c T in \c x->T::member
256  ///
257  /// By default, invokes TransformDecl() to transform the declaration.
258  /// Subclasses may override this function to provide alternate behavior.
259  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
260    return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
261  }
262
263  /// \brief Transform the given nested-name-specifier.
264  ///
265  /// By default, transforms all of the types and declarations within the
266  /// nested-name-specifier. Subclasses may override this function to provide
267  /// alternate behavior.
268  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
269                                                    SourceRange Range,
270                                              QualType ObjectType = QualType(),
271                                          NamedDecl *FirstQualifierInScope = 0);
272
273  /// \brief Transform the given declaration name.
274  ///
275  /// By default, transforms the types of conversion function, constructor,
276  /// and destructor names and then (if needed) rebuilds the declaration name.
277  /// Identifiers and selectors are returned unmodified. Sublcasses may
278  /// override this function to provide alternate behavior.
279  DeclarationName TransformDeclarationName(DeclarationName Name,
280                                           SourceLocation Loc,
281                                           QualType ObjectType = QualType());
282
283  /// \brief Transform the given template name.
284  ///
285  /// By default, transforms the template name by transforming the declarations
286  /// and nested-name-specifiers that occur within the template name.
287  /// Subclasses may override this function to provide alternate behavior.
288  TemplateName TransformTemplateName(TemplateName Name,
289                                     QualType ObjectType = QualType());
290
291  /// \brief Transform the given template argument.
292  ///
293  /// By default, this operation transforms the type, expression, or
294  /// declaration stored within the template argument and constructs a
295  /// new template argument from the transformed result. Subclasses may
296  /// override this function to provide alternate behavior.
297  ///
298  /// Returns true if there was an error.
299  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
300                                 TemplateArgumentLoc &Output);
301
302  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
303  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
304                                 TemplateArgumentLoc &ArgLoc);
305
306  /// \brief Fakes up a TypeSourceInfo for a type.
307  TypeSourceInfo *InventTypeSourceInfo(QualType T) {
308    return SemaRef.Context.getTrivialTypeSourceInfo(T,
309                       getDerived().getBaseLocation());
310  }
311
312#define ABSTRACT_TYPELOC(CLASS, PARENT)
313#define TYPELOC(CLASS, PARENT)                                   \
314  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T, \
315                                  QualType ObjectType = QualType());
316#include "clang/AST/TypeLocNodes.def"
317
318  /// \brief Transforms the parameters of a function type into the
319  /// given vectors.
320  ///
321  /// The result vectors should be kept in sync; null entries in the
322  /// variables vector are acceptable.
323  ///
324  /// Return true on error.
325  bool TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
326                                   llvm::SmallVectorImpl<QualType> &PTypes,
327                                   llvm::SmallVectorImpl<ParmVarDecl*> &PVars);
328
329  /// \brief Transforms a single function-type parameter.  Return null
330  /// on error.
331  ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm);
332
333  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL,
334                                  QualType ObjectType);
335
336  QualType
337  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
338                                      QualType ObjectType);
339
340  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
341  OwningExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
342
343#define STMT(Node, Parent)                        \
344  OwningStmtResult Transform##Node(Node *S);
345#define EXPR(Node, Parent)                        \
346  OwningExprResult Transform##Node(Node *E);
347#define ABSTRACT(Stmt)
348#include "clang/AST/StmtNodes.inc"
349
350  /// \brief Build a new pointer type given its pointee type.
351  ///
352  /// By default, performs semantic analysis when building the pointer type.
353  /// Subclasses may override this routine to provide different behavior.
354  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
355
356  /// \brief Build a new block pointer type given its pointee type.
357  ///
358  /// By default, performs semantic analysis when building the block pointer
359  /// type. Subclasses may override this routine to provide different behavior.
360  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
361
362  /// \brief Build a new reference type given the type it references.
363  ///
364  /// By default, performs semantic analysis when building the
365  /// reference type. Subclasses may override this routine to provide
366  /// different behavior.
367  ///
368  /// \param LValue whether the type was written with an lvalue sigil
369  /// or an rvalue sigil.
370  QualType RebuildReferenceType(QualType ReferentType,
371                                bool LValue,
372                                SourceLocation Sigil);
373
374  /// \brief Build a new member pointer type given the pointee type and the
375  /// class type it refers into.
376  ///
377  /// By default, performs semantic analysis when building the member pointer
378  /// type. Subclasses may override this routine to provide different behavior.
379  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
380                                    SourceLocation Sigil);
381
382  /// \brief Build a new array type given the element type, size
383  /// modifier, size of the array (if known), size expression, and index type
384  /// qualifiers.
385  ///
386  /// By default, performs semantic analysis when building the array type.
387  /// Subclasses may override this routine to provide different behavior.
388  /// Also by default, all of the other Rebuild*Array
389  QualType RebuildArrayType(QualType ElementType,
390                            ArrayType::ArraySizeModifier SizeMod,
391                            const llvm::APInt *Size,
392                            Expr *SizeExpr,
393                            unsigned IndexTypeQuals,
394                            SourceRange BracketsRange);
395
396  /// \brief Build a new constant array type given the element type, size
397  /// modifier, (known) size of the array, and index type qualifiers.
398  ///
399  /// By default, performs semantic analysis when building the array type.
400  /// Subclasses may override this routine to provide different behavior.
401  QualType RebuildConstantArrayType(QualType ElementType,
402                                    ArrayType::ArraySizeModifier SizeMod,
403                                    const llvm::APInt &Size,
404                                    unsigned IndexTypeQuals,
405                                    SourceRange BracketsRange);
406
407  /// \brief Build a new incomplete array type given the element type, size
408  /// modifier, and index type qualifiers.
409  ///
410  /// By default, performs semantic analysis when building the array type.
411  /// Subclasses may override this routine to provide different behavior.
412  QualType RebuildIncompleteArrayType(QualType ElementType,
413                                      ArrayType::ArraySizeModifier SizeMod,
414                                      unsigned IndexTypeQuals,
415                                      SourceRange BracketsRange);
416
417  /// \brief Build a new variable-length array type given the element type,
418  /// size modifier, size expression, and index type qualifiers.
419  ///
420  /// By default, performs semantic analysis when building the array type.
421  /// Subclasses may override this routine to provide different behavior.
422  QualType RebuildVariableArrayType(QualType ElementType,
423                                    ArrayType::ArraySizeModifier SizeMod,
424                                    ExprArg SizeExpr,
425                                    unsigned IndexTypeQuals,
426                                    SourceRange BracketsRange);
427
428  /// \brief Build a new dependent-sized array type given the element type,
429  /// size modifier, size expression, and index type qualifiers.
430  ///
431  /// By default, performs semantic analysis when building the array type.
432  /// Subclasses may override this routine to provide different behavior.
433  QualType RebuildDependentSizedArrayType(QualType ElementType,
434                                          ArrayType::ArraySizeModifier SizeMod,
435                                          ExprArg SizeExpr,
436                                          unsigned IndexTypeQuals,
437                                          SourceRange BracketsRange);
438
439  /// \brief Build a new vector type given the element type and
440  /// number of elements.
441  ///
442  /// By default, performs semantic analysis when building the vector type.
443  /// Subclasses may override this routine to provide different behavior.
444  QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
445    bool IsAltiVec, bool IsPixel);
446
447  /// \brief Build a new extended vector type given the element type and
448  /// number of elements.
449  ///
450  /// By default, performs semantic analysis when building the vector type.
451  /// Subclasses may override this routine to provide different behavior.
452  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
453                                SourceLocation AttributeLoc);
454
455  /// \brief Build a new potentially dependently-sized extended vector type
456  /// given the element type and number of elements.
457  ///
458  /// By default, performs semantic analysis when building the vector type.
459  /// Subclasses may override this routine to provide different behavior.
460  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
461                                              ExprArg SizeExpr,
462                                              SourceLocation AttributeLoc);
463
464  /// \brief Build a new function type.
465  ///
466  /// By default, performs semantic analysis when building the function type.
467  /// Subclasses may override this routine to provide different behavior.
468  QualType RebuildFunctionProtoType(QualType T,
469                                    QualType *ParamTypes,
470                                    unsigned NumParamTypes,
471                                    bool Variadic, unsigned Quals);
472
473  /// \brief Build a new unprototyped function type.
474  QualType RebuildFunctionNoProtoType(QualType ResultType);
475
476  /// \brief Rebuild an unresolved typename type, given the decl that
477  /// the UnresolvedUsingTypenameDecl was transformed to.
478  QualType RebuildUnresolvedUsingType(Decl *D);
479
480  /// \brief Build a new typedef type.
481  QualType RebuildTypedefType(TypedefDecl *Typedef) {
482    return SemaRef.Context.getTypeDeclType(Typedef);
483  }
484
485  /// \brief Build a new class/struct/union type.
486  QualType RebuildRecordType(RecordDecl *Record) {
487    return SemaRef.Context.getTypeDeclType(Record);
488  }
489
490  /// \brief Build a new Enum type.
491  QualType RebuildEnumType(EnumDecl *Enum) {
492    return SemaRef.Context.getTypeDeclType(Enum);
493  }
494
495  /// \brief Build a new typeof(expr) type.
496  ///
497  /// By default, performs semantic analysis when building the typeof type.
498  /// Subclasses may override this routine to provide different behavior.
499  QualType RebuildTypeOfExprType(ExprArg Underlying);
500
501  /// \brief Build a new typeof(type) type.
502  ///
503  /// By default, builds a new TypeOfType with the given underlying type.
504  QualType RebuildTypeOfType(QualType Underlying);
505
506  /// \brief Build a new C++0x decltype type.
507  ///
508  /// By default, performs semantic analysis when building the decltype type.
509  /// Subclasses may override this routine to provide different behavior.
510  QualType RebuildDecltypeType(ExprArg Underlying);
511
512  /// \brief Build a new template specialization type.
513  ///
514  /// By default, performs semantic analysis when building the template
515  /// specialization type. Subclasses may override this routine to provide
516  /// different behavior.
517  QualType RebuildTemplateSpecializationType(TemplateName Template,
518                                             SourceLocation TemplateLoc,
519                                       const TemplateArgumentListInfo &Args);
520
521  /// \brief Build a new qualified name type.
522  ///
523  /// By default, builds a new ElaboratedType type from the keyword,
524  /// the nested-name-specifier and the named type.
525  /// Subclasses may override this routine to provide different behavior.
526  QualType RebuildElaboratedType(ElaboratedTypeKeyword Keyword,
527                                 NestedNameSpecifier *NNS, QualType Named) {
528    return SemaRef.Context.getElaboratedType(Keyword, NNS, Named);
529  }
530
531  /// \brief Build a new typename type that refers to a template-id.
532  ///
533  /// By default, builds a new DependentNameType type from the
534  /// nested-name-specifier
535  /// and the given type. Subclasses may override this routine to provide
536  /// different behavior.
537  QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
538                                    NestedNameSpecifier *NNS, QualType T) {
539    if (NNS->isDependent()) {
540      // If the name is still dependent, just build a new dependent name type.
541      CXXScopeSpec SS;
542      SS.setScopeRep(NNS);
543      if (!SemaRef.computeDeclContext(SS))
544        return SemaRef.Context.getDependentNameType(Keyword, NNS,
545                                          cast<TemplateSpecializationType>(T));
546    }
547
548    return SemaRef.Context.getElaboratedType(Keyword, NNS, T);
549  }
550
551  /// \brief Build a new typename type that refers to an identifier.
552  ///
553  /// By default, performs semantic analysis when building the typename type
554  /// (or qualified name type). Subclasses may override this routine to provide
555  /// different behavior.
556  QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
557                                    NestedNameSpecifier *NNS,
558                                    const IdentifierInfo *Id,
559                                    SourceRange SR) {
560    CXXScopeSpec SS;
561    SS.setScopeRep(NNS);
562
563    if (NNS->isDependent()) {
564      // If the name is still dependent, just build a new dependent name type.
565      if (!SemaRef.computeDeclContext(SS))
566        return SemaRef.Context.getDependentNameType(Keyword, NNS, Id);
567    }
568
569    if (Keyword == ETK_None || Keyword == ETK_Typename)
570      return SemaRef.CheckTypenameType(Keyword, NNS, *Id, SR);
571
572    TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
573
574    // We had a dependent elaborated-type-specifier that as been transformed
575    // into a non-dependent elaborated-type-specifier. Find the tag we're
576    // referring to.
577    LookupResult Result(SemaRef, Id, SR.getEnd(), Sema::LookupTagName);
578    DeclContext *DC = SemaRef.computeDeclContext(SS, false);
579    if (!DC)
580      return QualType();
581
582    TagDecl *Tag = 0;
583    SemaRef.LookupQualifiedName(Result, DC);
584    switch (Result.getResultKind()) {
585      case LookupResult::NotFound:
586      case LookupResult::NotFoundInCurrentInstantiation:
587        break;
588
589      case LookupResult::Found:
590        Tag = Result.getAsSingle<TagDecl>();
591        break;
592
593      case LookupResult::FoundOverloaded:
594      case LookupResult::FoundUnresolvedValue:
595        llvm_unreachable("Tag lookup cannot find non-tags");
596        return QualType();
597
598      case LookupResult::Ambiguous:
599        // Let the LookupResult structure handle ambiguities.
600        return QualType();
601    }
602
603    if (!Tag) {
604      // FIXME: Would be nice to highlight just the source range.
605      SemaRef.Diag(SR.getEnd(), diag::err_not_tag_in_scope)
606        << Kind << Id << DC;
607      return QualType();
608    }
609
610    // FIXME: Terrible location information
611    if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, SR.getEnd(), *Id)) {
612      SemaRef.Diag(SR.getBegin(), diag::err_use_with_wrong_tag) << Id;
613      SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
614      return QualType();
615    }
616
617    // Build the elaborated-type-specifier type.
618    QualType T = SemaRef.Context.getTypeDeclType(Tag);
619    return SemaRef.Context.getElaboratedType(Keyword, NNS, T);
620  }
621
622  /// \brief Build a new nested-name-specifier given the prefix and an
623  /// identifier that names the next step in the nested-name-specifier.
624  ///
625  /// By default, performs semantic analysis when building the new
626  /// nested-name-specifier. Subclasses may override this routine to provide
627  /// different behavior.
628  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
629                                                  SourceRange Range,
630                                                  IdentifierInfo &II,
631                                                  QualType ObjectType,
632                                              NamedDecl *FirstQualifierInScope);
633
634  /// \brief Build a new nested-name-specifier given the prefix and the
635  /// namespace named in the next step in the nested-name-specifier.
636  ///
637  /// By default, performs semantic analysis when building the new
638  /// nested-name-specifier. Subclasses may override this routine to provide
639  /// different behavior.
640  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
641                                                  SourceRange Range,
642                                                  NamespaceDecl *NS);
643
644  /// \brief Build a new nested-name-specifier given the prefix and the
645  /// type named in the next step in the nested-name-specifier.
646  ///
647  /// By default, performs semantic analysis when building the new
648  /// nested-name-specifier. Subclasses may override this routine to provide
649  /// different behavior.
650  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
651                                                  SourceRange Range,
652                                                  bool TemplateKW,
653                                                  QualType T);
654
655  /// \brief Build a new template name given a nested name specifier, a flag
656  /// indicating whether the "template" keyword was provided, and the template
657  /// that the template name refers to.
658  ///
659  /// By default, builds the new template name directly. Subclasses may override
660  /// this routine to provide different behavior.
661  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
662                                   bool TemplateKW,
663                                   TemplateDecl *Template);
664
665  /// \brief Build a new template name given a nested name specifier and the
666  /// name that is referred to as a template.
667  ///
668  /// By default, performs semantic analysis to determine whether the name can
669  /// be resolved to a specific template, then builds the appropriate kind of
670  /// template name. Subclasses may override this routine to provide different
671  /// behavior.
672  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
673                                   const IdentifierInfo &II,
674                                   QualType ObjectType);
675
676  /// \brief Build a new template name given a nested name specifier and the
677  /// overloaded operator name that is referred to as a template.
678  ///
679  /// By default, performs semantic analysis to determine whether the name can
680  /// be resolved to a specific template, then builds the appropriate kind of
681  /// template name. Subclasses may override this routine to provide different
682  /// behavior.
683  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
684                                   OverloadedOperatorKind Operator,
685                                   QualType ObjectType);
686
687  /// \brief Build a new compound statement.
688  ///
689  /// By default, performs semantic analysis to build the new statement.
690  /// Subclasses may override this routine to provide different behavior.
691  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
692                                       MultiStmtArg Statements,
693                                       SourceLocation RBraceLoc,
694                                       bool IsStmtExpr) {
695    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
696                                       IsStmtExpr);
697  }
698
699  /// \brief Build a new case statement.
700  ///
701  /// By default, performs semantic analysis to build the new statement.
702  /// Subclasses may override this routine to provide different behavior.
703  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
704                                   ExprArg LHS,
705                                   SourceLocation EllipsisLoc,
706                                   ExprArg RHS,
707                                   SourceLocation ColonLoc) {
708    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
709                                   ColonLoc);
710  }
711
712  /// \brief Attach the body to a new case statement.
713  ///
714  /// By default, performs semantic analysis to build the new statement.
715  /// Subclasses may override this routine to provide different behavior.
716  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
717    getSema().ActOnCaseStmtBody(S.get(), move(Body));
718    return move(S);
719  }
720
721  /// \brief Build a new default statement.
722  ///
723  /// By default, performs semantic analysis to build the new statement.
724  /// Subclasses may override this routine to provide different behavior.
725  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
726                                      SourceLocation ColonLoc,
727                                      StmtArg SubStmt) {
728    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
729                                      /*CurScope=*/0);
730  }
731
732  /// \brief Build a new label statement.
733  ///
734  /// By default, performs semantic analysis to build the new statement.
735  /// Subclasses may override this routine to provide different behavior.
736  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
737                                    IdentifierInfo *Id,
738                                    SourceLocation ColonLoc,
739                                    StmtArg SubStmt) {
740    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
741  }
742
743  /// \brief Build a new "if" statement.
744  ///
745  /// By default, performs semantic analysis to build the new statement.
746  /// Subclasses may override this routine to provide different behavior.
747  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
748                                 VarDecl *CondVar, StmtArg Then,
749                                 SourceLocation ElseLoc, StmtArg Else) {
750    return getSema().ActOnIfStmt(IfLoc, Cond, DeclPtrTy::make(CondVar),
751                                 move(Then), ElseLoc, move(Else));
752  }
753
754  /// \brief Start building a new switch statement.
755  ///
756  /// By default, performs semantic analysis to build the new statement.
757  /// Subclasses may override this routine to provide different behavior.
758  OwningStmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
759                                          Sema::ExprArg Cond,
760                                          VarDecl *CondVar) {
761    return getSema().ActOnStartOfSwitchStmt(SwitchLoc, move(Cond),
762                                            DeclPtrTy::make(CondVar));
763  }
764
765  /// \brief Attach the body to the switch statement.
766  ///
767  /// By default, performs semantic analysis to build the new statement.
768  /// Subclasses may override this routine to provide different behavior.
769  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
770                                         StmtArg Switch, StmtArg Body) {
771    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
772                                         move(Body));
773  }
774
775  /// \brief Build a new while statement.
776  ///
777  /// By default, performs semantic analysis to build the new statement.
778  /// Subclasses may override this routine to provide different behavior.
779  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
780                                    Sema::FullExprArg Cond,
781                                    VarDecl *CondVar,
782                                    StmtArg Body) {
783    return getSema().ActOnWhileStmt(WhileLoc, Cond,
784                                    DeclPtrTy::make(CondVar), move(Body));
785  }
786
787  /// \brief Build a new do-while statement.
788  ///
789  /// By default, performs semantic analysis to build the new statement.
790  /// Subclasses may override this routine to provide different behavior.
791  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
792                                 SourceLocation WhileLoc,
793                                 SourceLocation LParenLoc,
794                                 ExprArg Cond,
795                                 SourceLocation RParenLoc) {
796    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
797                                 move(Cond), RParenLoc);
798  }
799
800  /// \brief Build a new for statement.
801  ///
802  /// By default, performs semantic analysis to build the new statement.
803  /// Subclasses may override this routine to provide different behavior.
804  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
805                                  SourceLocation LParenLoc,
806                                  StmtArg Init, Sema::FullExprArg Cond,
807                                  VarDecl *CondVar, Sema::FullExprArg Inc,
808                                  SourceLocation RParenLoc, StmtArg Body) {
809    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), Cond,
810                                  DeclPtrTy::make(CondVar),
811                                  Inc, RParenLoc, move(Body));
812  }
813
814  /// \brief Build a new goto statement.
815  ///
816  /// By default, performs semantic analysis to build the new statement.
817  /// Subclasses may override this routine to provide different behavior.
818  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
819                                   SourceLocation LabelLoc,
820                                   LabelStmt *Label) {
821    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
822  }
823
824  /// \brief Build a new indirect goto statement.
825  ///
826  /// By default, performs semantic analysis to build the new statement.
827  /// Subclasses may override this routine to provide different behavior.
828  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
829                                           SourceLocation StarLoc,
830                                           ExprArg Target) {
831    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
832  }
833
834  /// \brief Build a new return statement.
835  ///
836  /// By default, performs semantic analysis to build the new statement.
837  /// Subclasses may override this routine to provide different behavior.
838  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
839                                     ExprArg Result) {
840
841    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
842  }
843
844  /// \brief Build a new declaration statement.
845  ///
846  /// By default, performs semantic analysis to build the new statement.
847  /// Subclasses may override this routine to provide different behavior.
848  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
849                                   SourceLocation StartLoc,
850                                   SourceLocation EndLoc) {
851    return getSema().Owned(
852             new (getSema().Context) DeclStmt(
853                                        DeclGroupRef::Create(getSema().Context,
854                                                             Decls, NumDecls),
855                                              StartLoc, EndLoc));
856  }
857
858  /// \brief Build a new inline asm statement.
859  ///
860  /// By default, performs semantic analysis to build the new statement.
861  /// Subclasses may override this routine to provide different behavior.
862  OwningStmtResult RebuildAsmStmt(SourceLocation AsmLoc,
863                                  bool IsSimple,
864                                  bool IsVolatile,
865                                  unsigned NumOutputs,
866                                  unsigned NumInputs,
867                                  IdentifierInfo **Names,
868                                  MultiExprArg Constraints,
869                                  MultiExprArg Exprs,
870                                  ExprArg AsmString,
871                                  MultiExprArg Clobbers,
872                                  SourceLocation RParenLoc,
873                                  bool MSAsm) {
874    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
875                                  NumInputs, Names, move(Constraints),
876                                  move(Exprs), move(AsmString), move(Clobbers),
877                                  RParenLoc, MSAsm);
878  }
879
880  /// \brief Build a new Objective-C @try statement.
881  ///
882  /// By default, performs semantic analysis to build the new statement.
883  /// Subclasses may override this routine to provide different behavior.
884  OwningStmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
885                                        StmtArg TryBody,
886                                        MultiStmtArg CatchStmts,
887                                        StmtArg Finally) {
888    return getSema().ActOnObjCAtTryStmt(AtLoc, move(TryBody), move(CatchStmts),
889                                        move(Finally));
890  }
891
892  /// \brief Rebuild an Objective-C exception declaration.
893  ///
894  /// By default, performs semantic analysis to build the new declaration.
895  /// Subclasses may override this routine to provide different behavior.
896  VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
897                                    TypeSourceInfo *TInfo, QualType T) {
898    return getSema().BuildObjCExceptionDecl(TInfo, T,
899                                            ExceptionDecl->getIdentifier(),
900                                            ExceptionDecl->getLocation());
901  }
902
903  /// \brief Build a new Objective-C @catch statement.
904  ///
905  /// By default, performs semantic analysis to build the new statement.
906  /// Subclasses may override this routine to provide different behavior.
907  OwningStmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
908                                          SourceLocation RParenLoc,
909                                          VarDecl *Var,
910                                          StmtArg Body) {
911    return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
912                                          Sema::DeclPtrTy::make(Var),
913                                          move(Body));
914  }
915
916  /// \brief Build a new Objective-C @finally statement.
917  ///
918  /// By default, performs semantic analysis to build the new statement.
919  /// Subclasses may override this routine to provide different behavior.
920  OwningStmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
921                                            StmtArg Body) {
922    return getSema().ActOnObjCAtFinallyStmt(AtLoc, move(Body));
923  }
924
925  /// \brief Build a new Objective-C @throw statement.
926  ///
927  /// By default, performs semantic analysis to build the new statement.
928  /// Subclasses may override this routine to provide different behavior.
929  OwningStmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
930                                          ExprArg Operand) {
931    return getSema().BuildObjCAtThrowStmt(AtLoc, move(Operand));
932  }
933
934  /// \brief Build a new Objective-C @synchronized statement.
935  ///
936  /// By default, performs semantic analysis to build the new statement.
937  /// Subclasses may override this routine to provide different behavior.
938  OwningStmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
939                                                 ExprArg Object,
940                                                 StmtArg Body) {
941    return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, move(Object),
942                                                 move(Body));
943  }
944
945  /// \brief Build a new Objective-C fast enumeration statement.
946  ///
947  /// By default, performs semantic analysis to build the new statement.
948  /// Subclasses may override this routine to provide different behavior.
949  OwningStmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
950                                                SourceLocation LParenLoc,
951                                                StmtArg Element,
952                                                ExprArg Collection,
953                                                SourceLocation RParenLoc,
954                                                StmtArg Body) {
955    return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
956                                                move(Element),
957                                                move(Collection),
958                                                RParenLoc,
959                                                move(Body));
960  }
961
962  /// \brief Build a new C++ exception declaration.
963  ///
964  /// By default, performs semantic analysis to build the new decaration.
965  /// Subclasses may override this routine to provide different behavior.
966  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
967                                TypeSourceInfo *Declarator,
968                                IdentifierInfo *Name,
969                                SourceLocation Loc,
970                                SourceRange TypeRange) {
971    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
972                                               TypeRange);
973  }
974
975  /// \brief Build a new C++ catch statement.
976  ///
977  /// By default, performs semantic analysis to build the new statement.
978  /// Subclasses may override this routine to provide different behavior.
979  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
980                                       VarDecl *ExceptionDecl,
981                                       StmtArg Handler) {
982    return getSema().Owned(
983             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
984                                                  Handler.takeAs<Stmt>()));
985  }
986
987  /// \brief Build a new C++ try statement.
988  ///
989  /// By default, performs semantic analysis to build the new statement.
990  /// Subclasses may override this routine to provide different behavior.
991  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
992                                     StmtArg TryBlock,
993                                     MultiStmtArg Handlers) {
994    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
995  }
996
997  /// \brief Build a new expression that references a declaration.
998  ///
999  /// By default, performs semantic analysis to build the new expression.
1000  /// Subclasses may override this routine to provide different behavior.
1001  OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1002                                              LookupResult &R,
1003                                              bool RequiresADL) {
1004    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1005  }
1006
1007
1008  /// \brief Build a new expression that references a declaration.
1009  ///
1010  /// By default, performs semantic analysis to build the new expression.
1011  /// Subclasses may override this routine to provide different behavior.
1012  OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
1013                                      SourceRange QualifierRange,
1014                                      ValueDecl *VD, SourceLocation Loc,
1015                                      TemplateArgumentListInfo *TemplateArgs) {
1016    CXXScopeSpec SS;
1017    SS.setScopeRep(Qualifier);
1018    SS.setRange(QualifierRange);
1019
1020    // FIXME: loses template args.
1021
1022    return getSema().BuildDeclarationNameExpr(SS, Loc, VD);
1023  }
1024
1025  /// \brief Build a new expression in parentheses.
1026  ///
1027  /// By default, performs semantic analysis to build the new expression.
1028  /// Subclasses may override this routine to provide different behavior.
1029  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
1030                                    SourceLocation RParen) {
1031    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
1032  }
1033
1034  /// \brief Build a new pseudo-destructor expression.
1035  ///
1036  /// By default, performs semantic analysis to build the new expression.
1037  /// Subclasses may override this routine to provide different behavior.
1038  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
1039                                                  SourceLocation OperatorLoc,
1040                                                  bool isArrow,
1041                                                NestedNameSpecifier *Qualifier,
1042                                                  SourceRange QualifierRange,
1043                                                  TypeSourceInfo *ScopeType,
1044                                                  SourceLocation CCLoc,
1045                                                  SourceLocation TildeLoc,
1046                                        PseudoDestructorTypeStorage Destroyed);
1047
1048  /// \brief Build a new unary operator expression.
1049  ///
1050  /// By default, performs semantic analysis to build the new expression.
1051  /// Subclasses may override this routine to provide different behavior.
1052  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
1053                                        UnaryOperator::Opcode Opc,
1054                                        ExprArg SubExpr) {
1055    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr));
1056  }
1057
1058  /// \brief Build a new builtin offsetof expression.
1059  ///
1060  /// By default, performs semantic analysis to build the new expression.
1061  /// Subclasses may override this routine to provide different behavior.
1062  OwningExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
1063                                       TypeSourceInfo *Type,
1064                                       Action::OffsetOfComponent *Components,
1065                                       unsigned NumComponents,
1066                                       SourceLocation RParenLoc) {
1067    return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
1068                                          NumComponents, RParenLoc);
1069  }
1070
1071  /// \brief Build a new sizeof or alignof expression with a type argument.
1072  ///
1073  /// By default, performs semantic analysis to build the new expression.
1074  /// Subclasses may override this routine to provide different behavior.
1075  OwningExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
1076                                        SourceLocation OpLoc,
1077                                        bool isSizeOf, SourceRange R) {
1078    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
1079  }
1080
1081  /// \brief Build a new sizeof or alignof expression with an expression
1082  /// argument.
1083  ///
1084  /// By default, performs semantic analysis to build the new expression.
1085  /// Subclasses may override this routine to provide different behavior.
1086  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
1087                                        bool isSizeOf, SourceRange R) {
1088    OwningExprResult Result
1089      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
1090                                          OpLoc, isSizeOf, R);
1091    if (Result.isInvalid())
1092      return getSema().ExprError();
1093
1094    SubExpr.release();
1095    return move(Result);
1096  }
1097
1098  /// \brief Build a new array subscript expression.
1099  ///
1100  /// By default, performs semantic analysis to build the new expression.
1101  /// Subclasses may override this routine to provide different behavior.
1102  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
1103                                             SourceLocation LBracketLoc,
1104                                             ExprArg RHS,
1105                                             SourceLocation RBracketLoc) {
1106    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
1107                                             LBracketLoc, move(RHS),
1108                                             RBracketLoc);
1109  }
1110
1111  /// \brief Build a new call expression.
1112  ///
1113  /// By default, performs semantic analysis to build the new expression.
1114  /// Subclasses may override this routine to provide different behavior.
1115  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
1116                                   MultiExprArg Args,
1117                                   SourceLocation *CommaLocs,
1118                                   SourceLocation RParenLoc) {
1119    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
1120                                   move(Args), CommaLocs, RParenLoc);
1121  }
1122
1123  /// \brief Build a new member access expression.
1124  ///
1125  /// By default, performs semantic analysis to build the new expression.
1126  /// Subclasses may override this routine to provide different behavior.
1127  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
1128                                     bool isArrow,
1129                                     NestedNameSpecifier *Qualifier,
1130                                     SourceRange QualifierRange,
1131                                     SourceLocation MemberLoc,
1132                                     ValueDecl *Member,
1133                                     NamedDecl *FoundDecl,
1134                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
1135                                     NamedDecl *FirstQualifierInScope) {
1136    if (!Member->getDeclName()) {
1137      // We have a reference to an unnamed field.
1138      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
1139
1140      Expr *BaseExpr = Base.takeAs<Expr>();
1141      if (getSema().PerformObjectMemberConversion(BaseExpr, Qualifier,
1142                                                  FoundDecl, Member))
1143        return getSema().ExprError();
1144
1145      MemberExpr *ME =
1146        new (getSema().Context) MemberExpr(BaseExpr, isArrow,
1147                                           Member, MemberLoc,
1148                                           cast<FieldDecl>(Member)->getType());
1149      return getSema().Owned(ME);
1150    }
1151
1152    CXXScopeSpec SS;
1153    if (Qualifier) {
1154      SS.setRange(QualifierRange);
1155      SS.setScopeRep(Qualifier);
1156    }
1157
1158    QualType BaseType = ((Expr*) Base.get())->getType();
1159
1160    // FIXME: this involves duplicating earlier analysis in a lot of
1161    // cases; we should avoid this when possible.
1162    LookupResult R(getSema(), Member->getDeclName(), MemberLoc,
1163                   Sema::LookupMemberName);
1164    R.addDecl(FoundDecl);
1165    R.resolveKind();
1166
1167    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1168                                              OpLoc, isArrow,
1169                                              SS, FirstQualifierInScope,
1170                                              R, ExplicitTemplateArgs);
1171  }
1172
1173  /// \brief Build a new binary operator expression.
1174  ///
1175  /// By default, performs semantic analysis to build the new expression.
1176  /// Subclasses may override this routine to provide different behavior.
1177  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1178                                         BinaryOperator::Opcode Opc,
1179                                         ExprArg LHS, ExprArg RHS) {
1180    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc,
1181                                LHS.takeAs<Expr>(), RHS.takeAs<Expr>());
1182  }
1183
1184  /// \brief Build a new conditional operator expression.
1185  ///
1186  /// By default, performs semantic analysis to build the new expression.
1187  /// Subclasses may override this routine to provide different behavior.
1188  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
1189                                              SourceLocation QuestionLoc,
1190                                              ExprArg LHS,
1191                                              SourceLocation ColonLoc,
1192                                              ExprArg RHS) {
1193    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
1194                                        move(LHS), move(RHS));
1195  }
1196
1197  /// \brief Build a new C-style cast expression.
1198  ///
1199  /// By default, performs semantic analysis to build the new expression.
1200  /// Subclasses may override this routine to provide different behavior.
1201  OwningExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
1202                                         TypeSourceInfo *TInfo,
1203                                         SourceLocation RParenLoc,
1204                                         ExprArg SubExpr) {
1205    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
1206                                         move(SubExpr));
1207  }
1208
1209  /// \brief Build a new compound literal expression.
1210  ///
1211  /// By default, performs semantic analysis to build the new expression.
1212  /// Subclasses may override this routine to provide different behavior.
1213  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1214                                              TypeSourceInfo *TInfo,
1215                                              SourceLocation RParenLoc,
1216                                              ExprArg Init) {
1217    return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
1218                                              move(Init));
1219  }
1220
1221  /// \brief Build a new extended vector element access expression.
1222  ///
1223  /// By default, performs semantic analysis to build the new expression.
1224  /// Subclasses may override this routine to provide different behavior.
1225  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
1226                                               SourceLocation OpLoc,
1227                                               SourceLocation AccessorLoc,
1228                                               IdentifierInfo &Accessor) {
1229
1230    CXXScopeSpec SS;
1231    QualType BaseType = ((Expr*) Base.get())->getType();
1232    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1233                                              OpLoc, /*IsArrow*/ false,
1234                                              SS, /*FirstQualifierInScope*/ 0,
1235                                              DeclarationName(&Accessor),
1236                                              AccessorLoc,
1237                                              /* TemplateArgs */ 0);
1238  }
1239
1240  /// \brief Build a new initializer list expression.
1241  ///
1242  /// By default, performs semantic analysis to build the new expression.
1243  /// Subclasses may override this routine to provide different behavior.
1244  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1245                                   MultiExprArg Inits,
1246                                   SourceLocation RBraceLoc,
1247                                   QualType ResultTy) {
1248    OwningExprResult Result
1249      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1250    if (Result.isInvalid() || ResultTy->isDependentType())
1251      return move(Result);
1252
1253    // Patch in the result type we were given, which may have been computed
1254    // when the initial InitListExpr was built.
1255    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1256    ILE->setType(ResultTy);
1257    return move(Result);
1258  }
1259
1260  /// \brief Build a new designated initializer expression.
1261  ///
1262  /// By default, performs semantic analysis to build the new expression.
1263  /// Subclasses may override this routine to provide different behavior.
1264  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1265                                             MultiExprArg ArrayExprs,
1266                                             SourceLocation EqualOrColonLoc,
1267                                             bool GNUSyntax,
1268                                             ExprArg Init) {
1269    OwningExprResult Result
1270      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1271                                           move(Init));
1272    if (Result.isInvalid())
1273      return SemaRef.ExprError();
1274
1275    ArrayExprs.release();
1276    return move(Result);
1277  }
1278
1279  /// \brief Build a new value-initialized expression.
1280  ///
1281  /// By default, builds the implicit value initialization without performing
1282  /// any semantic analysis. Subclasses may override this routine to provide
1283  /// different behavior.
1284  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1285    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1286  }
1287
1288  /// \brief Build a new \c va_arg expression.
1289  ///
1290  /// By default, performs semantic analysis to build the new expression.
1291  /// Subclasses may override this routine to provide different behavior.
1292  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1293                                    QualType T, SourceLocation RParenLoc) {
1294    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1295                                RParenLoc);
1296  }
1297
1298  /// \brief Build a new expression list in parentheses.
1299  ///
1300  /// By default, performs semantic analysis to build the new expression.
1301  /// Subclasses may override this routine to provide different behavior.
1302  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1303                                        MultiExprArg SubExprs,
1304                                        SourceLocation RParenLoc) {
1305    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1306                                               move(SubExprs));
1307  }
1308
1309  /// \brief Build a new address-of-label expression.
1310  ///
1311  /// By default, performs semantic analysis, using the name of the label
1312  /// rather than attempting to map the label statement itself.
1313  /// Subclasses may override this routine to provide different behavior.
1314  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1315                                        SourceLocation LabelLoc,
1316                                        LabelStmt *Label) {
1317    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1318  }
1319
1320  /// \brief Build a new GNU statement expression.
1321  ///
1322  /// By default, performs semantic analysis to build the new expression.
1323  /// Subclasses may override this routine to provide different behavior.
1324  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1325                                   StmtArg SubStmt,
1326                                   SourceLocation RParenLoc) {
1327    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1328  }
1329
1330  /// \brief Build a new __builtin_types_compatible_p expression.
1331  ///
1332  /// By default, performs semantic analysis to build the new expression.
1333  /// Subclasses may override this routine to provide different behavior.
1334  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1335                                              QualType T1, QualType T2,
1336                                              SourceLocation RParenLoc) {
1337    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1338                                              T1.getAsOpaquePtr(),
1339                                              T2.getAsOpaquePtr(),
1340                                              RParenLoc);
1341  }
1342
1343  /// \brief Build a new __builtin_choose_expr expression.
1344  ///
1345  /// By default, performs semantic analysis to build the new expression.
1346  /// Subclasses may override this routine to provide different behavior.
1347  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1348                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1349                                     SourceLocation RParenLoc) {
1350    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1351                                   move(Cond), move(LHS), move(RHS),
1352                                   RParenLoc);
1353  }
1354
1355  /// \brief Build a new overloaded operator call expression.
1356  ///
1357  /// By default, performs semantic analysis to build the new expression.
1358  /// The semantic analysis provides the behavior of template instantiation,
1359  /// copying with transformations that turn what looks like an overloaded
1360  /// operator call into a use of a builtin operator, performing
1361  /// argument-dependent lookup, etc. Subclasses may override this routine to
1362  /// provide different behavior.
1363  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1364                                              SourceLocation OpLoc,
1365                                              ExprArg Callee,
1366                                              ExprArg First,
1367                                              ExprArg Second);
1368
1369  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1370  /// reinterpret_cast.
1371  ///
1372  /// By default, this routine dispatches to one of the more-specific routines
1373  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1374  /// Subclasses may override this routine to provide different behavior.
1375  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1376                                           Stmt::StmtClass Class,
1377                                           SourceLocation LAngleLoc,
1378                                           TypeSourceInfo *TInfo,
1379                                           SourceLocation RAngleLoc,
1380                                           SourceLocation LParenLoc,
1381                                           ExprArg SubExpr,
1382                                           SourceLocation RParenLoc) {
1383    switch (Class) {
1384    case Stmt::CXXStaticCastExprClass:
1385      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
1386                                                   RAngleLoc, LParenLoc,
1387                                                   move(SubExpr), RParenLoc);
1388
1389    case Stmt::CXXDynamicCastExprClass:
1390      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
1391                                                    RAngleLoc, LParenLoc,
1392                                                    move(SubExpr), RParenLoc);
1393
1394    case Stmt::CXXReinterpretCastExprClass:
1395      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
1396                                                        RAngleLoc, LParenLoc,
1397                                                        move(SubExpr),
1398                                                        RParenLoc);
1399
1400    case Stmt::CXXConstCastExprClass:
1401      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
1402                                                   RAngleLoc, LParenLoc,
1403                                                   move(SubExpr), RParenLoc);
1404
1405    default:
1406      assert(false && "Invalid C++ named cast");
1407      break;
1408    }
1409
1410    return getSema().ExprError();
1411  }
1412
1413  /// \brief Build a new C++ static_cast expression.
1414  ///
1415  /// By default, performs semantic analysis to build the new expression.
1416  /// Subclasses may override this routine to provide different behavior.
1417  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1418                                            SourceLocation LAngleLoc,
1419                                            TypeSourceInfo *TInfo,
1420                                            SourceLocation RAngleLoc,
1421                                            SourceLocation LParenLoc,
1422                                            ExprArg SubExpr,
1423                                            SourceLocation RParenLoc) {
1424    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
1425                                       TInfo, move(SubExpr),
1426                                       SourceRange(LAngleLoc, RAngleLoc),
1427                                       SourceRange(LParenLoc, RParenLoc));
1428  }
1429
1430  /// \brief Build a new C++ dynamic_cast expression.
1431  ///
1432  /// By default, performs semantic analysis to build the new expression.
1433  /// Subclasses may override this routine to provide different behavior.
1434  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1435                                             SourceLocation LAngleLoc,
1436                                             TypeSourceInfo *TInfo,
1437                                             SourceLocation RAngleLoc,
1438                                             SourceLocation LParenLoc,
1439                                             ExprArg SubExpr,
1440                                             SourceLocation RParenLoc) {
1441    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
1442                                       TInfo, move(SubExpr),
1443                                       SourceRange(LAngleLoc, RAngleLoc),
1444                                       SourceRange(LParenLoc, RParenLoc));
1445  }
1446
1447  /// \brief Build a new C++ reinterpret_cast expression.
1448  ///
1449  /// By default, performs semantic analysis to build the new expression.
1450  /// Subclasses may override this routine to provide different behavior.
1451  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1452                                                 SourceLocation LAngleLoc,
1453                                                 TypeSourceInfo *TInfo,
1454                                                 SourceLocation RAngleLoc,
1455                                                 SourceLocation LParenLoc,
1456                                                 ExprArg SubExpr,
1457                                                 SourceLocation RParenLoc) {
1458    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1459                                       TInfo, move(SubExpr),
1460                                       SourceRange(LAngleLoc, RAngleLoc),
1461                                       SourceRange(LParenLoc, RParenLoc));
1462  }
1463
1464  /// \brief Build a new C++ const_cast expression.
1465  ///
1466  /// By default, performs semantic analysis to build the new expression.
1467  /// Subclasses may override this routine to provide different behavior.
1468  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1469                                           SourceLocation LAngleLoc,
1470                                           TypeSourceInfo *TInfo,
1471                                           SourceLocation RAngleLoc,
1472                                           SourceLocation LParenLoc,
1473                                           ExprArg SubExpr,
1474                                           SourceLocation RParenLoc) {
1475    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
1476                                       TInfo, move(SubExpr),
1477                                       SourceRange(LAngleLoc, RAngleLoc),
1478                                       SourceRange(LParenLoc, RParenLoc));
1479  }
1480
1481  /// \brief Build a new C++ functional-style cast expression.
1482  ///
1483  /// By default, performs semantic analysis to build the new expression.
1484  /// Subclasses may override this routine to provide different behavior.
1485  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
1486                                                TypeSourceInfo *TInfo,
1487                                                SourceLocation LParenLoc,
1488                                                ExprArg SubExpr,
1489                                                SourceLocation RParenLoc) {
1490    void *Sub = SubExpr.takeAs<Expr>();
1491    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1492                                               TInfo->getType().getAsOpaquePtr(),
1493                                               LParenLoc,
1494                                         Sema::MultiExprArg(getSema(), &Sub, 1),
1495                                               /*CommaLocs=*/0,
1496                                               RParenLoc);
1497  }
1498
1499  /// \brief Build a new C++ typeid(type) expression.
1500  ///
1501  /// By default, performs semantic analysis to build the new expression.
1502  /// Subclasses may override this routine to provide different behavior.
1503  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
1504                                        SourceLocation TypeidLoc,
1505                                        TypeSourceInfo *Operand,
1506                                        SourceLocation RParenLoc) {
1507    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
1508                                    RParenLoc);
1509  }
1510
1511  /// \brief Build a new C++ typeid(expr) expression.
1512  ///
1513  /// By default, performs semantic analysis to build the new expression.
1514  /// Subclasses may override this routine to provide different behavior.
1515  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
1516                                        SourceLocation TypeidLoc,
1517                                        ExprArg Operand,
1518                                        SourceLocation RParenLoc) {
1519    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, move(Operand),
1520                                    RParenLoc);
1521  }
1522
1523  /// \brief Build a new C++ "this" expression.
1524  ///
1525  /// By default, builds a new "this" expression without performing any
1526  /// semantic analysis. Subclasses may override this routine to provide
1527  /// different behavior.
1528  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1529                                      QualType ThisType,
1530                                      bool isImplicit) {
1531    return getSema().Owned(
1532                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1533                                                          isImplicit));
1534  }
1535
1536  /// \brief Build a new C++ throw expression.
1537  ///
1538  /// By default, performs semantic analysis to build the new expression.
1539  /// Subclasses may override this routine to provide different behavior.
1540  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1541    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1542  }
1543
1544  /// \brief Build a new C++ default-argument expression.
1545  ///
1546  /// By default, builds a new default-argument expression, which does not
1547  /// require any semantic analysis. Subclasses may override this routine to
1548  /// provide different behavior.
1549  OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1550                                            ParmVarDecl *Param) {
1551    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1552                                                     Param));
1553  }
1554
1555  /// \brief Build a new C++ zero-initialization expression.
1556  ///
1557  /// By default, performs semantic analysis to build the new expression.
1558  /// Subclasses may override this routine to provide different behavior.
1559  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1560                                               SourceLocation LParenLoc,
1561                                               QualType T,
1562                                               SourceLocation RParenLoc) {
1563    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1564                                               T.getAsOpaquePtr(), LParenLoc,
1565                                               MultiExprArg(getSema(), 0, 0),
1566                                               0, RParenLoc);
1567  }
1568
1569  /// \brief Build a new C++ "new" expression.
1570  ///
1571  /// By default, performs semantic analysis to build the new expression.
1572  /// Subclasses may override this routine to provide different behavior.
1573  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1574                                     bool UseGlobal,
1575                                     SourceLocation PlacementLParen,
1576                                     MultiExprArg PlacementArgs,
1577                                     SourceLocation PlacementRParen,
1578                                     bool ParenTypeId,
1579                                     QualType AllocType,
1580                                     SourceLocation TypeLoc,
1581                                     SourceRange TypeRange,
1582                                     ExprArg ArraySize,
1583                                     SourceLocation ConstructorLParen,
1584                                     MultiExprArg ConstructorArgs,
1585                                     SourceLocation ConstructorRParen) {
1586    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1587                                 PlacementLParen,
1588                                 move(PlacementArgs),
1589                                 PlacementRParen,
1590                                 ParenTypeId,
1591                                 AllocType,
1592                                 TypeLoc,
1593                                 TypeRange,
1594                                 move(ArraySize),
1595                                 ConstructorLParen,
1596                                 move(ConstructorArgs),
1597                                 ConstructorRParen);
1598  }
1599
1600  /// \brief Build a new C++ "delete" expression.
1601  ///
1602  /// By default, performs semantic analysis to build the new expression.
1603  /// Subclasses may override this routine to provide different behavior.
1604  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1605                                        bool IsGlobalDelete,
1606                                        bool IsArrayForm,
1607                                        ExprArg Operand) {
1608    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1609                                    move(Operand));
1610  }
1611
1612  /// \brief Build a new unary type trait expression.
1613  ///
1614  /// By default, performs semantic analysis to build the new expression.
1615  /// Subclasses may override this routine to provide different behavior.
1616  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1617                                         SourceLocation StartLoc,
1618                                         SourceLocation LParenLoc,
1619                                         QualType T,
1620                                         SourceLocation RParenLoc) {
1621    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1622                                         T.getAsOpaquePtr(), RParenLoc);
1623  }
1624
1625  /// \brief Build a new (previously unresolved) declaration reference
1626  /// expression.
1627  ///
1628  /// By default, performs semantic analysis to build the new expression.
1629  /// Subclasses may override this routine to provide different behavior.
1630  OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1631                                                SourceRange QualifierRange,
1632                                                DeclarationName Name,
1633                                                SourceLocation Location,
1634                              const TemplateArgumentListInfo *TemplateArgs) {
1635    CXXScopeSpec SS;
1636    SS.setRange(QualifierRange);
1637    SS.setScopeRep(NNS);
1638
1639    if (TemplateArgs)
1640      return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location,
1641                                                    *TemplateArgs);
1642
1643    return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location);
1644  }
1645
1646  /// \brief Build a new template-id expression.
1647  ///
1648  /// By default, performs semantic analysis to build the new expression.
1649  /// Subclasses may override this routine to provide different behavior.
1650  OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1651                                         LookupResult &R,
1652                                         bool RequiresADL,
1653                              const TemplateArgumentListInfo &TemplateArgs) {
1654    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1655  }
1656
1657  /// \brief Build a new object-construction expression.
1658  ///
1659  /// By default, performs semantic analysis to build the new expression.
1660  /// Subclasses may override this routine to provide different behavior.
1661  OwningExprResult RebuildCXXConstructExpr(QualType T,
1662                                           SourceLocation Loc,
1663                                           CXXConstructorDecl *Constructor,
1664                                           bool IsElidable,
1665                                           MultiExprArg Args) {
1666    ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef);
1667    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
1668                                          ConvertedArgs))
1669      return getSema().ExprError();
1670
1671    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
1672                                           move_arg(ConvertedArgs));
1673  }
1674
1675  /// \brief Build a new object-construction expression.
1676  ///
1677  /// By default, performs semantic analysis to build the new expression.
1678  /// Subclasses may override this routine to provide different behavior.
1679  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1680                                                 QualType T,
1681                                                 SourceLocation LParenLoc,
1682                                                 MultiExprArg Args,
1683                                                 SourceLocation *Commas,
1684                                                 SourceLocation RParenLoc) {
1685    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1686                                               T.getAsOpaquePtr(),
1687                                               LParenLoc,
1688                                               move(Args),
1689                                               Commas,
1690                                               RParenLoc);
1691  }
1692
1693  /// \brief Build a new object-construction expression.
1694  ///
1695  /// By default, performs semantic analysis to build the new expression.
1696  /// Subclasses may override this routine to provide different behavior.
1697  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1698                                                     QualType T,
1699                                                     SourceLocation LParenLoc,
1700                                                     MultiExprArg Args,
1701                                                     SourceLocation *Commas,
1702                                                     SourceLocation RParenLoc) {
1703    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1704                                                           /*FIXME*/LParenLoc),
1705                                               T.getAsOpaquePtr(),
1706                                               LParenLoc,
1707                                               move(Args),
1708                                               Commas,
1709                                               RParenLoc);
1710  }
1711
1712  /// \brief Build a new member reference expression.
1713  ///
1714  /// By default, performs semantic analysis to build the new expression.
1715  /// Subclasses may override this routine to provide different behavior.
1716  OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE,
1717                                                  QualType BaseType,
1718                                                  bool IsArrow,
1719                                                  SourceLocation OperatorLoc,
1720                                              NestedNameSpecifier *Qualifier,
1721                                                  SourceRange QualifierRange,
1722                                            NamedDecl *FirstQualifierInScope,
1723                                                  DeclarationName Name,
1724                                                  SourceLocation MemberLoc,
1725                              const TemplateArgumentListInfo *TemplateArgs) {
1726    CXXScopeSpec SS;
1727    SS.setRange(QualifierRange);
1728    SS.setScopeRep(Qualifier);
1729
1730    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1731                                            OperatorLoc, IsArrow,
1732                                            SS, FirstQualifierInScope,
1733                                            Name, MemberLoc, TemplateArgs);
1734  }
1735
1736  /// \brief Build a new member reference expression.
1737  ///
1738  /// By default, performs semantic analysis to build the new expression.
1739  /// Subclasses may override this routine to provide different behavior.
1740  OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE,
1741                                               QualType BaseType,
1742                                               SourceLocation OperatorLoc,
1743                                               bool IsArrow,
1744                                               NestedNameSpecifier *Qualifier,
1745                                               SourceRange QualifierRange,
1746                                               NamedDecl *FirstQualifierInScope,
1747                                               LookupResult &R,
1748                                const TemplateArgumentListInfo *TemplateArgs) {
1749    CXXScopeSpec SS;
1750    SS.setRange(QualifierRange);
1751    SS.setScopeRep(Qualifier);
1752
1753    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1754                                            OperatorLoc, IsArrow,
1755                                            SS, FirstQualifierInScope,
1756                                            R, TemplateArgs);
1757  }
1758
1759  /// \brief Build a new Objective-C @encode expression.
1760  ///
1761  /// By default, performs semantic analysis to build the new expression.
1762  /// Subclasses may override this routine to provide different behavior.
1763  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1764                                         TypeSourceInfo *EncodeTypeInfo,
1765                                         SourceLocation RParenLoc) {
1766    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
1767                                                           RParenLoc));
1768  }
1769
1770  /// \brief Build a new Objective-C class message.
1771  OwningExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
1772                                          Selector Sel,
1773                                          ObjCMethodDecl *Method,
1774                                          SourceLocation LBracLoc,
1775                                          MultiExprArg Args,
1776                                          SourceLocation RBracLoc) {
1777    return SemaRef.BuildClassMessage(ReceiverTypeInfo,
1778                                     ReceiverTypeInfo->getType(),
1779                                     /*SuperLoc=*/SourceLocation(),
1780                                     Sel, Method, LBracLoc, RBracLoc,
1781                                     move(Args));
1782  }
1783
1784  /// \brief Build a new Objective-C instance message.
1785  OwningExprResult RebuildObjCMessageExpr(ExprArg Receiver,
1786                                          Selector Sel,
1787                                          ObjCMethodDecl *Method,
1788                                          SourceLocation LBracLoc,
1789                                          MultiExprArg Args,
1790                                          SourceLocation RBracLoc) {
1791    QualType ReceiverType = static_cast<Expr *>(Receiver.get())->getType();
1792    return SemaRef.BuildInstanceMessage(move(Receiver),
1793                                        ReceiverType,
1794                                        /*SuperLoc=*/SourceLocation(),
1795                                        Sel, Method, LBracLoc, RBracLoc,
1796                                        move(Args));
1797  }
1798
1799  /// \brief Build a new Objective-C ivar reference expression.
1800  ///
1801  /// By default, performs semantic analysis to build the new expression.
1802  /// Subclasses may override this routine to provide different behavior.
1803  OwningExprResult RebuildObjCIvarRefExpr(ExprArg BaseArg, ObjCIvarDecl *Ivar,
1804                                          SourceLocation IvarLoc,
1805                                          bool IsArrow, bool IsFreeIvar) {
1806    // FIXME: We lose track of the IsFreeIvar bit.
1807    CXXScopeSpec SS;
1808    Expr *Base = BaseArg.takeAs<Expr>();
1809    LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
1810                   Sema::LookupMemberName);
1811    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1812                                                         /*FIME:*/IvarLoc,
1813                                                         SS, DeclPtrTy());
1814    if (Result.isInvalid())
1815      return getSema().ExprError();
1816
1817    if (Result.get())
1818      return move(Result);
1819
1820    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1821                                              Base->getType(),
1822                                              /*FIXME:*/IvarLoc, IsArrow, SS,
1823                                              /*FirstQualifierInScope=*/0,
1824                                              R,
1825                                              /*TemplateArgs=*/0);
1826  }
1827
1828  /// \brief Build a new Objective-C property reference expression.
1829  ///
1830  /// By default, performs semantic analysis to build the new expression.
1831  /// Subclasses may override this routine to provide different behavior.
1832  OwningExprResult RebuildObjCPropertyRefExpr(ExprArg BaseArg,
1833                                              ObjCPropertyDecl *Property,
1834                                              SourceLocation PropertyLoc) {
1835    CXXScopeSpec SS;
1836    Expr *Base = BaseArg.takeAs<Expr>();
1837    LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
1838                   Sema::LookupMemberName);
1839    bool IsArrow = false;
1840    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1841                                                         /*FIME:*/PropertyLoc,
1842                                                         SS, DeclPtrTy());
1843    if (Result.isInvalid())
1844      return getSema().ExprError();
1845
1846    if (Result.get())
1847      return move(Result);
1848
1849    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1850                                              Base->getType(),
1851                                              /*FIXME:*/PropertyLoc, IsArrow,
1852                                              SS,
1853                                              /*FirstQualifierInScope=*/0,
1854                                              R,
1855                                              /*TemplateArgs=*/0);
1856  }
1857
1858  /// \brief Build a new Objective-C implicit setter/getter reference
1859  /// expression.
1860  ///
1861  /// By default, performs semantic analysis to build the new expression.
1862  /// Subclasses may override this routine to provide different behavior.
1863  OwningExprResult RebuildObjCImplicitSetterGetterRefExpr(
1864                                                        ObjCMethodDecl *Getter,
1865                                                          QualType T,
1866                                                        ObjCMethodDecl *Setter,
1867                                                        SourceLocation NameLoc,
1868                                                          ExprArg Base) {
1869    // Since these expressions can only be value-dependent, we do not need to
1870    // perform semantic analysis again.
1871    return getSema().Owned(
1872             new (getSema().Context) ObjCImplicitSetterGetterRefExpr(Getter, T,
1873                                                                     Setter,
1874                                                                     NameLoc,
1875                                                          Base.takeAs<Expr>()));
1876  }
1877
1878  /// \brief Build a new Objective-C "isa" expression.
1879  ///
1880  /// By default, performs semantic analysis to build the new expression.
1881  /// Subclasses may override this routine to provide different behavior.
1882  OwningExprResult RebuildObjCIsaExpr(ExprArg BaseArg, SourceLocation IsaLoc,
1883                                      bool IsArrow) {
1884    CXXScopeSpec SS;
1885    Expr *Base = BaseArg.takeAs<Expr>();
1886    LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
1887                   Sema::LookupMemberName);
1888    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1889                                                         /*FIME:*/IsaLoc,
1890                                                         SS, DeclPtrTy());
1891    if (Result.isInvalid())
1892      return getSema().ExprError();
1893
1894    if (Result.get())
1895      return move(Result);
1896
1897    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1898                                              Base->getType(),
1899                                              /*FIXME:*/IsaLoc, IsArrow, SS,
1900                                              /*FirstQualifierInScope=*/0,
1901                                              R,
1902                                              /*TemplateArgs=*/0);
1903  }
1904
1905  /// \brief Build a new shuffle vector expression.
1906  ///
1907  /// By default, performs semantic analysis to build the new expression.
1908  /// Subclasses may override this routine to provide different behavior.
1909  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1910                                            MultiExprArg SubExprs,
1911                                            SourceLocation RParenLoc) {
1912    // Find the declaration for __builtin_shufflevector
1913    const IdentifierInfo &Name
1914      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1915    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1916    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1917    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
1918
1919    // Build a reference to the __builtin_shufflevector builtin
1920    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
1921    Expr *Callee
1922      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1923                                          BuiltinLoc);
1924    SemaRef.UsualUnaryConversions(Callee);
1925
1926    // Build the CallExpr
1927    unsigned NumSubExprs = SubExprs.size();
1928    Expr **Subs = (Expr **)SubExprs.release();
1929    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1930                                                       Subs, NumSubExprs,
1931                                                       Builtin->getResultType(),
1932                                                       RParenLoc);
1933    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
1934
1935    // Type-check the __builtin_shufflevector expression.
1936    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1937    if (Result.isInvalid())
1938      return SemaRef.ExprError();
1939
1940    OwnedCall.release();
1941    return move(Result);
1942  }
1943};
1944
1945template<typename Derived>
1946Sema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
1947  if (!S)
1948    return SemaRef.Owned(S);
1949
1950  switch (S->getStmtClass()) {
1951  case Stmt::NoStmtClass: break;
1952
1953  // Transform individual statement nodes
1954#define STMT(Node, Parent)                                              \
1955  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
1956#define EXPR(Node, Parent)
1957#include "clang/AST/StmtNodes.inc"
1958
1959  // Transform expressions by calling TransformExpr.
1960#define STMT(Node, Parent)
1961#define ABSTRACT(Stmt)
1962#define EXPR(Node, Parent) case Stmt::Node##Class:
1963#include "clang/AST/StmtNodes.inc"
1964    {
1965      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
1966      if (E.isInvalid())
1967        return getSema().StmtError();
1968
1969      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E));
1970    }
1971  }
1972
1973  return SemaRef.Owned(S->Retain());
1974}
1975
1976
1977template<typename Derived>
1978Sema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
1979  if (!E)
1980    return SemaRef.Owned(E);
1981
1982  switch (E->getStmtClass()) {
1983    case Stmt::NoStmtClass: break;
1984#define STMT(Node, Parent) case Stmt::Node##Class: break;
1985#define ABSTRACT(Stmt)
1986#define EXPR(Node, Parent)                                              \
1987    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1988#include "clang/AST/StmtNodes.inc"
1989  }
1990
1991  return SemaRef.Owned(E->Retain());
1992}
1993
1994template<typename Derived>
1995NestedNameSpecifier *
1996TreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1997                                                     SourceRange Range,
1998                                                     QualType ObjectType,
1999                                             NamedDecl *FirstQualifierInScope) {
2000  if (!NNS)
2001    return 0;
2002
2003  // Transform the prefix of this nested name specifier.
2004  NestedNameSpecifier *Prefix = NNS->getPrefix();
2005  if (Prefix) {
2006    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
2007                                                       ObjectType,
2008                                                       FirstQualifierInScope);
2009    if (!Prefix)
2010      return 0;
2011
2012    // Clear out the object type and the first qualifier in scope; they only
2013    // apply to the first element in the nested-name-specifier.
2014    ObjectType = QualType();
2015    FirstQualifierInScope = 0;
2016  }
2017
2018  switch (NNS->getKind()) {
2019  case NestedNameSpecifier::Identifier:
2020    assert((Prefix || !ObjectType.isNull()) &&
2021            "Identifier nested-name-specifier with no prefix or object type");
2022    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
2023        ObjectType.isNull())
2024      return NNS;
2025
2026    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
2027                                                   *NNS->getAsIdentifier(),
2028                                                   ObjectType,
2029                                                   FirstQualifierInScope);
2030
2031  case NestedNameSpecifier::Namespace: {
2032    NamespaceDecl *NS
2033      = cast_or_null<NamespaceDecl>(
2034                                    getDerived().TransformDecl(Range.getBegin(),
2035                                                       NNS->getAsNamespace()));
2036    if (!getDerived().AlwaysRebuild() &&
2037        Prefix == NNS->getPrefix() &&
2038        NS == NNS->getAsNamespace())
2039      return NNS;
2040
2041    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
2042  }
2043
2044  case NestedNameSpecifier::Global:
2045    // There is no meaningful transformation that one could perform on the
2046    // global scope.
2047    return NNS;
2048
2049  case NestedNameSpecifier::TypeSpecWithTemplate:
2050  case NestedNameSpecifier::TypeSpec: {
2051    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
2052    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0),
2053                                            ObjectType);
2054    if (T.isNull())
2055      return 0;
2056
2057    if (!getDerived().AlwaysRebuild() &&
2058        Prefix == NNS->getPrefix() &&
2059        T == QualType(NNS->getAsType(), 0))
2060      return NNS;
2061
2062    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
2063                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
2064                                                   T);
2065  }
2066  }
2067
2068  // Required to silence a GCC warning
2069  return 0;
2070}
2071
2072template<typename Derived>
2073DeclarationName
2074TreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
2075                                                 SourceLocation Loc,
2076                                                 QualType ObjectType) {
2077  if (!Name)
2078    return Name;
2079
2080  switch (Name.getNameKind()) {
2081  case DeclarationName::Identifier:
2082  case DeclarationName::ObjCZeroArgSelector:
2083  case DeclarationName::ObjCOneArgSelector:
2084  case DeclarationName::ObjCMultiArgSelector:
2085  case DeclarationName::CXXOperatorName:
2086  case DeclarationName::CXXLiteralOperatorName:
2087  case DeclarationName::CXXUsingDirective:
2088    return Name;
2089
2090  case DeclarationName::CXXConstructorName:
2091  case DeclarationName::CXXDestructorName:
2092  case DeclarationName::CXXConversionFunctionName: {
2093    TemporaryBase Rebase(*this, Loc, Name);
2094    QualType T = getDerived().TransformType(Name.getCXXNameType(),
2095                                            ObjectType);
2096    if (T.isNull())
2097      return DeclarationName();
2098
2099    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
2100                                                           Name.getNameKind(),
2101                                          SemaRef.Context.getCanonicalType(T));
2102  }
2103  }
2104
2105  return DeclarationName();
2106}
2107
2108template<typename Derived>
2109TemplateName
2110TreeTransform<Derived>::TransformTemplateName(TemplateName Name,
2111                                              QualType ObjectType) {
2112  SourceLocation Loc = getDerived().getBaseLocation();
2113
2114  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
2115    NestedNameSpecifier *NNS
2116      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
2117                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2118                                                  ObjectType);
2119    if (!NNS)
2120      return TemplateName();
2121
2122    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
2123      TemplateDecl *TransTemplate
2124        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2125      if (!TransTemplate)
2126        return TemplateName();
2127
2128      if (!getDerived().AlwaysRebuild() &&
2129          NNS == QTN->getQualifier() &&
2130          TransTemplate == Template)
2131        return Name;
2132
2133      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
2134                                              TransTemplate);
2135    }
2136
2137    // These should be getting filtered out before they make it into the AST.
2138    assert(false && "overloaded template name survived to here");
2139  }
2140
2141  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
2142    NestedNameSpecifier *NNS
2143      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
2144                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2145                                                  ObjectType);
2146    if (!NNS && DTN->getQualifier())
2147      return TemplateName();
2148
2149    if (!getDerived().AlwaysRebuild() &&
2150        NNS == DTN->getQualifier() &&
2151        ObjectType.isNull())
2152      return Name;
2153
2154    if (DTN->isIdentifier())
2155      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
2156                                              ObjectType);
2157
2158    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
2159                                            ObjectType);
2160  }
2161
2162  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
2163    TemplateDecl *TransTemplate
2164      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2165    if (!TransTemplate)
2166      return TemplateName();
2167
2168    if (!getDerived().AlwaysRebuild() &&
2169        TransTemplate == Template)
2170      return Name;
2171
2172    return TemplateName(TransTemplate);
2173  }
2174
2175  // These should be getting filtered out before they reach the AST.
2176  assert(false && "overloaded function decl survived to here");
2177  return TemplateName();
2178}
2179
2180template<typename Derived>
2181void TreeTransform<Derived>::InventTemplateArgumentLoc(
2182                                         const TemplateArgument &Arg,
2183                                         TemplateArgumentLoc &Output) {
2184  SourceLocation Loc = getDerived().getBaseLocation();
2185  switch (Arg.getKind()) {
2186  case TemplateArgument::Null:
2187    llvm_unreachable("null template argument in TreeTransform");
2188    break;
2189
2190  case TemplateArgument::Type:
2191    Output = TemplateArgumentLoc(Arg,
2192               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
2193
2194    break;
2195
2196  case TemplateArgument::Template:
2197    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
2198    break;
2199
2200  case TemplateArgument::Expression:
2201    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
2202    break;
2203
2204  case TemplateArgument::Declaration:
2205  case TemplateArgument::Integral:
2206  case TemplateArgument::Pack:
2207    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
2208    break;
2209  }
2210}
2211
2212template<typename Derived>
2213bool TreeTransform<Derived>::TransformTemplateArgument(
2214                                         const TemplateArgumentLoc &Input,
2215                                         TemplateArgumentLoc &Output) {
2216  const TemplateArgument &Arg = Input.getArgument();
2217  switch (Arg.getKind()) {
2218  case TemplateArgument::Null:
2219  case TemplateArgument::Integral:
2220    Output = Input;
2221    return false;
2222
2223  case TemplateArgument::Type: {
2224    TypeSourceInfo *DI = Input.getTypeSourceInfo();
2225    if (DI == NULL)
2226      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
2227
2228    DI = getDerived().TransformType(DI);
2229    if (!DI) return true;
2230
2231    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
2232    return false;
2233  }
2234
2235  case TemplateArgument::Declaration: {
2236    // FIXME: we should never have to transform one of these.
2237    DeclarationName Name;
2238    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
2239      Name = ND->getDeclName();
2240    TemporaryBase Rebase(*this, Input.getLocation(), Name);
2241    Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
2242    if (!D) return true;
2243
2244    Expr *SourceExpr = Input.getSourceDeclExpression();
2245    if (SourceExpr) {
2246      EnterExpressionEvaluationContext Unevaluated(getSema(),
2247                                                   Action::Unevaluated);
2248      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
2249      if (E.isInvalid())
2250        SourceExpr = NULL;
2251      else {
2252        SourceExpr = E.takeAs<Expr>();
2253        SourceExpr->Retain();
2254      }
2255    }
2256
2257    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
2258    return false;
2259  }
2260
2261  case TemplateArgument::Template: {
2262    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
2263    TemplateName Template
2264      = getDerived().TransformTemplateName(Arg.getAsTemplate());
2265    if (Template.isNull())
2266      return true;
2267
2268    Output = TemplateArgumentLoc(TemplateArgument(Template),
2269                                 Input.getTemplateQualifierRange(),
2270                                 Input.getTemplateNameLoc());
2271    return false;
2272  }
2273
2274  case TemplateArgument::Expression: {
2275    // Template argument expressions are not potentially evaluated.
2276    EnterExpressionEvaluationContext Unevaluated(getSema(),
2277                                                 Action::Unevaluated);
2278
2279    Expr *InputExpr = Input.getSourceExpression();
2280    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2281
2282    Sema::OwningExprResult E
2283      = getDerived().TransformExpr(InputExpr);
2284    if (E.isInvalid()) return true;
2285
2286    Expr *ETaken = E.takeAs<Expr>();
2287    ETaken->Retain();
2288    Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
2289    return false;
2290  }
2291
2292  case TemplateArgument::Pack: {
2293    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2294    TransformedArgs.reserve(Arg.pack_size());
2295    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2296                                      AEnd = Arg.pack_end();
2297         A != AEnd; ++A) {
2298
2299      // FIXME: preserve source information here when we start
2300      // caring about parameter packs.
2301
2302      TemplateArgumentLoc InputArg;
2303      TemplateArgumentLoc OutputArg;
2304      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2305      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2306        return true;
2307
2308      TransformedArgs.push_back(OutputArg.getArgument());
2309    }
2310    TemplateArgument Result;
2311    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2312                           true);
2313    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2314    return false;
2315  }
2316  }
2317
2318  // Work around bogus GCC warning
2319  return true;
2320}
2321
2322//===----------------------------------------------------------------------===//
2323// Type transformation
2324//===----------------------------------------------------------------------===//
2325
2326template<typename Derived>
2327QualType TreeTransform<Derived>::TransformType(QualType T,
2328                                               QualType ObjectType) {
2329  if (getDerived().AlreadyTransformed(T))
2330    return T;
2331
2332  // Temporary workaround.  All of these transformations should
2333  // eventually turn into transformations on TypeLocs.
2334  TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T);
2335  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2336
2337  TypeSourceInfo *NewDI = getDerived().TransformType(DI, ObjectType);
2338
2339  if (!NewDI)
2340    return QualType();
2341
2342  return NewDI->getType();
2343}
2344
2345template<typename Derived>
2346TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI,
2347                                                      QualType ObjectType) {
2348  if (getDerived().AlreadyTransformed(DI->getType()))
2349    return DI;
2350
2351  TypeLocBuilder TLB;
2352
2353  TypeLoc TL = DI->getTypeLoc();
2354  TLB.reserve(TL.getFullDataSize());
2355
2356  QualType Result = getDerived().TransformType(TLB, TL, ObjectType);
2357  if (Result.isNull())
2358    return 0;
2359
2360  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
2361}
2362
2363template<typename Derived>
2364QualType
2365TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T,
2366                                      QualType ObjectType) {
2367  switch (T.getTypeLocClass()) {
2368#define ABSTRACT_TYPELOC(CLASS, PARENT)
2369#define TYPELOC(CLASS, PARENT) \
2370  case TypeLoc::CLASS: \
2371    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T), \
2372                                               ObjectType);
2373#include "clang/AST/TypeLocNodes.def"
2374  }
2375
2376  llvm_unreachable("unhandled type loc!");
2377  return QualType();
2378}
2379
2380/// FIXME: By default, this routine adds type qualifiers only to types
2381/// that can have qualifiers, and silently suppresses those qualifiers
2382/// that are not permitted (e.g., qualifiers on reference or function
2383/// types). This is the right thing for template instantiation, but
2384/// probably not for other clients.
2385template<typename Derived>
2386QualType
2387TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2388                                               QualifiedTypeLoc T,
2389                                               QualType ObjectType) {
2390  Qualifiers Quals = T.getType().getLocalQualifiers();
2391
2392  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc(),
2393                                               ObjectType);
2394  if (Result.isNull())
2395    return QualType();
2396
2397  // Silently suppress qualifiers if the result type can't be qualified.
2398  // FIXME: this is the right thing for template instantiation, but
2399  // probably not for other clients.
2400  if (Result->isFunctionType() || Result->isReferenceType())
2401    return Result;
2402
2403  Result = SemaRef.Context.getQualifiedType(Result, Quals);
2404
2405  TLB.push<QualifiedTypeLoc>(Result);
2406
2407  // No location information to preserve.
2408
2409  return Result;
2410}
2411
2412template <class TyLoc> static inline
2413QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2414  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2415  NewT.setNameLoc(T.getNameLoc());
2416  return T.getType();
2417}
2418
2419template<typename Derived>
2420QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2421                                                      BuiltinTypeLoc T,
2422                                                      QualType ObjectType) {
2423  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
2424  NewT.setBuiltinLoc(T.getBuiltinLoc());
2425  if (T.needsExtraLocalData())
2426    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
2427  return T.getType();
2428}
2429
2430template<typename Derived>
2431QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2432                                                      ComplexTypeLoc T,
2433                                                      QualType ObjectType) {
2434  // FIXME: recurse?
2435  return TransformTypeSpecType(TLB, T);
2436}
2437
2438template<typename Derived>
2439QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2440                                                      PointerTypeLoc TL,
2441                                                      QualType ObjectType) {
2442  QualType PointeeType
2443    = getDerived().TransformType(TLB, TL.getPointeeLoc());
2444  if (PointeeType.isNull())
2445    return QualType();
2446
2447  QualType Result = TL.getType();
2448  if (PointeeType->isObjCInterfaceType() ||
2449      PointeeType->isSpecificBuiltinType(BuiltinType::ObjCId)) {
2450    // A dependent pointer type 'T *' has is being transformed such
2451    // that an Objective-C class type is being replaced for 'T'. The
2452    // resulting pointer type is an ObjCObjectPointerType, not a
2453    // PointerType.
2454    ObjCProtocolDecl **Protocols = 0;
2455    unsigned NumProtocols = 0;
2456
2457    if (const ObjCInterfaceType *IFace
2458          = PointeeType->getAs<ObjCInterfaceType>()) {
2459      Protocols = const_cast<ObjCProtocolDecl**>(IFace->qual_begin());
2460      NumProtocols = IFace->getNumProtocols();
2461    }
2462
2463    Result = SemaRef.Context.getObjCObjectPointerType(PointeeType,
2464                                                      Protocols,
2465                                                      NumProtocols);
2466
2467    ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
2468    NewT.setStarLoc(TL.getSigilLoc());
2469    NewT.setHasProtocolsAsWritten(false);
2470    NewT.setLAngleLoc(SourceLocation());
2471    NewT.setRAngleLoc(SourceLocation());
2472    NewT.setHasBaseTypeAsWritten(true);
2473    return Result;
2474  }
2475
2476  if (getDerived().AlwaysRebuild() ||
2477      PointeeType != TL.getPointeeLoc().getType()) {
2478    Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
2479    if (Result.isNull())
2480      return QualType();
2481  }
2482
2483  PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
2484  NewT.setSigilLoc(TL.getSigilLoc());
2485  return Result;
2486}
2487
2488template<typename Derived>
2489QualType
2490TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2491                                                  BlockPointerTypeLoc TL,
2492                                                  QualType ObjectType) {
2493  QualType PointeeType
2494    = getDerived().TransformType(TLB, TL.getPointeeLoc());
2495  if (PointeeType.isNull())
2496    return QualType();
2497
2498  QualType Result = TL.getType();
2499  if (getDerived().AlwaysRebuild() ||
2500      PointeeType != TL.getPointeeLoc().getType()) {
2501    Result = getDerived().RebuildBlockPointerType(PointeeType,
2502                                                  TL.getSigilLoc());
2503    if (Result.isNull())
2504      return QualType();
2505  }
2506
2507  BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
2508  NewT.setSigilLoc(TL.getSigilLoc());
2509  return Result;
2510}
2511
2512/// Transforms a reference type.  Note that somewhat paradoxically we
2513/// don't care whether the type itself is an l-value type or an r-value
2514/// type;  we only care if the type was *written* as an l-value type
2515/// or an r-value type.
2516template<typename Derived>
2517QualType
2518TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
2519                                               ReferenceTypeLoc TL,
2520                                               QualType ObjectType) {
2521  const ReferenceType *T = TL.getTypePtr();
2522
2523  // Note that this works with the pointee-as-written.
2524  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2525  if (PointeeType.isNull())
2526    return QualType();
2527
2528  QualType Result = TL.getType();
2529  if (getDerived().AlwaysRebuild() ||
2530      PointeeType != T->getPointeeTypeAsWritten()) {
2531    Result = getDerived().RebuildReferenceType(PointeeType,
2532                                               T->isSpelledAsLValue(),
2533                                               TL.getSigilLoc());
2534    if (Result.isNull())
2535      return QualType();
2536  }
2537
2538  // r-value references can be rebuilt as l-value references.
2539  ReferenceTypeLoc NewTL;
2540  if (isa<LValueReferenceType>(Result))
2541    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
2542  else
2543    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
2544  NewTL.setSigilLoc(TL.getSigilLoc());
2545
2546  return Result;
2547}
2548
2549template<typename Derived>
2550QualType
2551TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2552                                                 LValueReferenceTypeLoc TL,
2553                                                     QualType ObjectType) {
2554  return TransformReferenceType(TLB, TL, ObjectType);
2555}
2556
2557template<typename Derived>
2558QualType
2559TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2560                                                 RValueReferenceTypeLoc TL,
2561                                                     QualType ObjectType) {
2562  return TransformReferenceType(TLB, TL, ObjectType);
2563}
2564
2565template<typename Derived>
2566QualType
2567TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2568                                                   MemberPointerTypeLoc TL,
2569                                                   QualType ObjectType) {
2570  MemberPointerType *T = TL.getTypePtr();
2571
2572  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2573  if (PointeeType.isNull())
2574    return QualType();
2575
2576  // TODO: preserve source information for this.
2577  QualType ClassType
2578    = getDerived().TransformType(QualType(T->getClass(), 0));
2579  if (ClassType.isNull())
2580    return QualType();
2581
2582  QualType Result = TL.getType();
2583  if (getDerived().AlwaysRebuild() ||
2584      PointeeType != T->getPointeeType() ||
2585      ClassType != QualType(T->getClass(), 0)) {
2586    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
2587                                                   TL.getStarLoc());
2588    if (Result.isNull())
2589      return QualType();
2590  }
2591
2592  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2593  NewTL.setSigilLoc(TL.getSigilLoc());
2594
2595  return Result;
2596}
2597
2598template<typename Derived>
2599QualType
2600TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2601                                                   ConstantArrayTypeLoc TL,
2602                                                   QualType ObjectType) {
2603  ConstantArrayType *T = TL.getTypePtr();
2604  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2605  if (ElementType.isNull())
2606    return QualType();
2607
2608  QualType Result = TL.getType();
2609  if (getDerived().AlwaysRebuild() ||
2610      ElementType != T->getElementType()) {
2611    Result = getDerived().RebuildConstantArrayType(ElementType,
2612                                                   T->getSizeModifier(),
2613                                                   T->getSize(),
2614                                             T->getIndexTypeCVRQualifiers(),
2615                                                   TL.getBracketsRange());
2616    if (Result.isNull())
2617      return QualType();
2618  }
2619
2620  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2621  NewTL.setLBracketLoc(TL.getLBracketLoc());
2622  NewTL.setRBracketLoc(TL.getRBracketLoc());
2623
2624  Expr *Size = TL.getSizeExpr();
2625  if (Size) {
2626    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2627    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2628  }
2629  NewTL.setSizeExpr(Size);
2630
2631  return Result;
2632}
2633
2634template<typename Derived>
2635QualType TreeTransform<Derived>::TransformIncompleteArrayType(
2636                                              TypeLocBuilder &TLB,
2637                                              IncompleteArrayTypeLoc TL,
2638                                              QualType ObjectType) {
2639  IncompleteArrayType *T = TL.getTypePtr();
2640  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2641  if (ElementType.isNull())
2642    return QualType();
2643
2644  QualType Result = TL.getType();
2645  if (getDerived().AlwaysRebuild() ||
2646      ElementType != T->getElementType()) {
2647    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2648                                                     T->getSizeModifier(),
2649                                           T->getIndexTypeCVRQualifiers(),
2650                                                     TL.getBracketsRange());
2651    if (Result.isNull())
2652      return QualType();
2653  }
2654
2655  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2656  NewTL.setLBracketLoc(TL.getLBracketLoc());
2657  NewTL.setRBracketLoc(TL.getRBracketLoc());
2658  NewTL.setSizeExpr(0);
2659
2660  return Result;
2661}
2662
2663template<typename Derived>
2664QualType
2665TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2666                                                   VariableArrayTypeLoc TL,
2667                                                   QualType ObjectType) {
2668  VariableArrayType *T = TL.getTypePtr();
2669  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2670  if (ElementType.isNull())
2671    return QualType();
2672
2673  // Array bounds are not potentially evaluated contexts
2674  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2675
2676  Sema::OwningExprResult SizeResult
2677    = getDerived().TransformExpr(T->getSizeExpr());
2678  if (SizeResult.isInvalid())
2679    return QualType();
2680
2681  Expr *Size = static_cast<Expr*>(SizeResult.get());
2682
2683  QualType Result = TL.getType();
2684  if (getDerived().AlwaysRebuild() ||
2685      ElementType != T->getElementType() ||
2686      Size != T->getSizeExpr()) {
2687    Result = getDerived().RebuildVariableArrayType(ElementType,
2688                                                   T->getSizeModifier(),
2689                                                   move(SizeResult),
2690                                             T->getIndexTypeCVRQualifiers(),
2691                                                   TL.getBracketsRange());
2692    if (Result.isNull())
2693      return QualType();
2694  }
2695  else SizeResult.take();
2696
2697  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2698  NewTL.setLBracketLoc(TL.getLBracketLoc());
2699  NewTL.setRBracketLoc(TL.getRBracketLoc());
2700  NewTL.setSizeExpr(Size);
2701
2702  return Result;
2703}
2704
2705template<typename Derived>
2706QualType
2707TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2708                                             DependentSizedArrayTypeLoc TL,
2709                                                        QualType ObjectType) {
2710  DependentSizedArrayType *T = TL.getTypePtr();
2711  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2712  if (ElementType.isNull())
2713    return QualType();
2714
2715  // Array bounds are not potentially evaluated contexts
2716  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2717
2718  Sema::OwningExprResult SizeResult
2719    = getDerived().TransformExpr(T->getSizeExpr());
2720  if (SizeResult.isInvalid())
2721    return QualType();
2722
2723  Expr *Size = static_cast<Expr*>(SizeResult.get());
2724
2725  QualType Result = TL.getType();
2726  if (getDerived().AlwaysRebuild() ||
2727      ElementType != T->getElementType() ||
2728      Size != T->getSizeExpr()) {
2729    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2730                                                         T->getSizeModifier(),
2731                                                         move(SizeResult),
2732                                                T->getIndexTypeCVRQualifiers(),
2733                                                        TL.getBracketsRange());
2734    if (Result.isNull())
2735      return QualType();
2736  }
2737  else SizeResult.take();
2738
2739  // We might have any sort of array type now, but fortunately they
2740  // all have the same location layout.
2741  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2742  NewTL.setLBracketLoc(TL.getLBracketLoc());
2743  NewTL.setRBracketLoc(TL.getRBracketLoc());
2744  NewTL.setSizeExpr(Size);
2745
2746  return Result;
2747}
2748
2749template<typename Derived>
2750QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2751                                      TypeLocBuilder &TLB,
2752                                      DependentSizedExtVectorTypeLoc TL,
2753                                      QualType ObjectType) {
2754  DependentSizedExtVectorType *T = TL.getTypePtr();
2755
2756  // FIXME: ext vector locs should be nested
2757  QualType ElementType = getDerived().TransformType(T->getElementType());
2758  if (ElementType.isNull())
2759    return QualType();
2760
2761  // Vector sizes are not potentially evaluated contexts
2762  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2763
2764  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2765  if (Size.isInvalid())
2766    return QualType();
2767
2768  QualType Result = TL.getType();
2769  if (getDerived().AlwaysRebuild() ||
2770      ElementType != T->getElementType() ||
2771      Size.get() != T->getSizeExpr()) {
2772    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
2773                                                         move(Size),
2774                                                         T->getAttributeLoc());
2775    if (Result.isNull())
2776      return QualType();
2777  }
2778  else Size.take();
2779
2780  // Result might be dependent or not.
2781  if (isa<DependentSizedExtVectorType>(Result)) {
2782    DependentSizedExtVectorTypeLoc NewTL
2783      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2784    NewTL.setNameLoc(TL.getNameLoc());
2785  } else {
2786    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2787    NewTL.setNameLoc(TL.getNameLoc());
2788  }
2789
2790  return Result;
2791}
2792
2793template<typename Derived>
2794QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2795                                                     VectorTypeLoc TL,
2796                                                     QualType ObjectType) {
2797  VectorType *T = TL.getTypePtr();
2798  QualType ElementType = getDerived().TransformType(T->getElementType());
2799  if (ElementType.isNull())
2800    return QualType();
2801
2802  QualType Result = TL.getType();
2803  if (getDerived().AlwaysRebuild() ||
2804      ElementType != T->getElementType()) {
2805    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
2806      T->isAltiVec(), T->isPixel());
2807    if (Result.isNull())
2808      return QualType();
2809  }
2810
2811  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2812  NewTL.setNameLoc(TL.getNameLoc());
2813
2814  return Result;
2815}
2816
2817template<typename Derived>
2818QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2819                                                        ExtVectorTypeLoc TL,
2820                                                        QualType ObjectType) {
2821  VectorType *T = TL.getTypePtr();
2822  QualType ElementType = getDerived().TransformType(T->getElementType());
2823  if (ElementType.isNull())
2824    return QualType();
2825
2826  QualType Result = TL.getType();
2827  if (getDerived().AlwaysRebuild() ||
2828      ElementType != T->getElementType()) {
2829    Result = getDerived().RebuildExtVectorType(ElementType,
2830                                               T->getNumElements(),
2831                                               /*FIXME*/ SourceLocation());
2832    if (Result.isNull())
2833      return QualType();
2834  }
2835
2836  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2837  NewTL.setNameLoc(TL.getNameLoc());
2838
2839  return Result;
2840}
2841
2842template<typename Derived>
2843ParmVarDecl *
2844TreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm) {
2845  TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
2846  TypeSourceInfo *NewDI = getDerived().TransformType(OldDI);
2847  if (!NewDI)
2848    return 0;
2849
2850  if (NewDI == OldDI)
2851    return OldParm;
2852  else
2853    return ParmVarDecl::Create(SemaRef.Context,
2854                               OldParm->getDeclContext(),
2855                               OldParm->getLocation(),
2856                               OldParm->getIdentifier(),
2857                               NewDI->getType(),
2858                               NewDI,
2859                               OldParm->getStorageClass(),
2860                               OldParm->getStorageClassAsWritten(),
2861                               /* DefArg */ NULL);
2862}
2863
2864template<typename Derived>
2865bool TreeTransform<Derived>::
2866  TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
2867                              llvm::SmallVectorImpl<QualType> &PTypes,
2868                              llvm::SmallVectorImpl<ParmVarDecl*> &PVars) {
2869  FunctionProtoType *T = TL.getTypePtr();
2870
2871  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2872    ParmVarDecl *OldParm = TL.getArg(i);
2873
2874    QualType NewType;
2875    ParmVarDecl *NewParm;
2876
2877    if (OldParm) {
2878      NewParm = getDerived().TransformFunctionTypeParam(OldParm);
2879      if (!NewParm)
2880        return true;
2881      NewType = NewParm->getType();
2882
2883    // Deal with the possibility that we don't have a parameter
2884    // declaration for this parameter.
2885    } else {
2886      NewParm = 0;
2887
2888      QualType OldType = T->getArgType(i);
2889      NewType = getDerived().TransformType(OldType);
2890      if (NewType.isNull())
2891        return true;
2892    }
2893
2894    PTypes.push_back(NewType);
2895    PVars.push_back(NewParm);
2896  }
2897
2898  return false;
2899}
2900
2901template<typename Derived>
2902QualType
2903TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
2904                                                   FunctionProtoTypeLoc TL,
2905                                                   QualType ObjectType) {
2906  // Transform the parameters. We do this first for the benefit of template
2907  // instantiations, so that the ParmVarDecls get/ placed into the template
2908  // instantiation scope before we transform the function type.
2909  llvm::SmallVector<QualType, 4> ParamTypes;
2910  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
2911  if (getDerived().TransformFunctionTypeParams(TL, ParamTypes, ParamDecls))
2912    return QualType();
2913
2914  FunctionProtoType *T = TL.getTypePtr();
2915  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2916  if (ResultType.isNull())
2917    return QualType();
2918
2919  QualType Result = TL.getType();
2920  if (getDerived().AlwaysRebuild() ||
2921      ResultType != T->getResultType() ||
2922      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2923    Result = getDerived().RebuildFunctionProtoType(ResultType,
2924                                                   ParamTypes.data(),
2925                                                   ParamTypes.size(),
2926                                                   T->isVariadic(),
2927                                                   T->getTypeQuals());
2928    if (Result.isNull())
2929      return QualType();
2930  }
2931
2932  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2933  NewTL.setLParenLoc(TL.getLParenLoc());
2934  NewTL.setRParenLoc(TL.getRParenLoc());
2935  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2936    NewTL.setArg(i, ParamDecls[i]);
2937
2938  return Result;
2939}
2940
2941template<typename Derived>
2942QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2943                                                 TypeLocBuilder &TLB,
2944                                                 FunctionNoProtoTypeLoc TL,
2945                                                 QualType ObjectType) {
2946  FunctionNoProtoType *T = TL.getTypePtr();
2947  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2948  if (ResultType.isNull())
2949    return QualType();
2950
2951  QualType Result = TL.getType();
2952  if (getDerived().AlwaysRebuild() ||
2953      ResultType != T->getResultType())
2954    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2955
2956  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2957  NewTL.setLParenLoc(TL.getLParenLoc());
2958  NewTL.setRParenLoc(TL.getRParenLoc());
2959
2960  return Result;
2961}
2962
2963template<typename Derived> QualType
2964TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
2965                                                 UnresolvedUsingTypeLoc TL,
2966                                                     QualType ObjectType) {
2967  UnresolvedUsingType *T = TL.getTypePtr();
2968  Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
2969  if (!D)
2970    return QualType();
2971
2972  QualType Result = TL.getType();
2973  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
2974    Result = getDerived().RebuildUnresolvedUsingType(D);
2975    if (Result.isNull())
2976      return QualType();
2977  }
2978
2979  // We might get an arbitrary type spec type back.  We should at
2980  // least always get a type spec type, though.
2981  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
2982  NewTL.setNameLoc(TL.getNameLoc());
2983
2984  return Result;
2985}
2986
2987template<typename Derived>
2988QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2989                                                      TypedefTypeLoc TL,
2990                                                      QualType ObjectType) {
2991  TypedefType *T = TL.getTypePtr();
2992  TypedefDecl *Typedef
2993    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(),
2994                                                           T->getDecl()));
2995  if (!Typedef)
2996    return QualType();
2997
2998  QualType Result = TL.getType();
2999  if (getDerived().AlwaysRebuild() ||
3000      Typedef != T->getDecl()) {
3001    Result = getDerived().RebuildTypedefType(Typedef);
3002    if (Result.isNull())
3003      return QualType();
3004  }
3005
3006  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
3007  NewTL.setNameLoc(TL.getNameLoc());
3008
3009  return Result;
3010}
3011
3012template<typename Derived>
3013QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
3014                                                      TypeOfExprTypeLoc TL,
3015                                                       QualType ObjectType) {
3016  // typeof expressions are not potentially evaluated contexts
3017  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
3018
3019  Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
3020  if (E.isInvalid())
3021    return QualType();
3022
3023  QualType Result = TL.getType();
3024  if (getDerived().AlwaysRebuild() ||
3025      E.get() != TL.getUnderlyingExpr()) {
3026    Result = getDerived().RebuildTypeOfExprType(move(E));
3027    if (Result.isNull())
3028      return QualType();
3029  }
3030  else E.take();
3031
3032  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
3033  NewTL.setTypeofLoc(TL.getTypeofLoc());
3034  NewTL.setLParenLoc(TL.getLParenLoc());
3035  NewTL.setRParenLoc(TL.getRParenLoc());
3036
3037  return Result;
3038}
3039
3040template<typename Derived>
3041QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
3042                                                     TypeOfTypeLoc TL,
3043                                                     QualType ObjectType) {
3044  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
3045  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
3046  if (!New_Under_TI)
3047    return QualType();
3048
3049  QualType Result = TL.getType();
3050  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
3051    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
3052    if (Result.isNull())
3053      return QualType();
3054  }
3055
3056  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
3057  NewTL.setTypeofLoc(TL.getTypeofLoc());
3058  NewTL.setLParenLoc(TL.getLParenLoc());
3059  NewTL.setRParenLoc(TL.getRParenLoc());
3060  NewTL.setUnderlyingTInfo(New_Under_TI);
3061
3062  return Result;
3063}
3064
3065template<typename Derived>
3066QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
3067                                                       DecltypeTypeLoc TL,
3068                                                       QualType ObjectType) {
3069  DecltypeType *T = TL.getTypePtr();
3070
3071  // decltype expressions are not potentially evaluated contexts
3072  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
3073
3074  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
3075  if (E.isInvalid())
3076    return QualType();
3077
3078  QualType Result = TL.getType();
3079  if (getDerived().AlwaysRebuild() ||
3080      E.get() != T->getUnderlyingExpr()) {
3081    Result = getDerived().RebuildDecltypeType(move(E));
3082    if (Result.isNull())
3083      return QualType();
3084  }
3085  else E.take();
3086
3087  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
3088  NewTL.setNameLoc(TL.getNameLoc());
3089
3090  return Result;
3091}
3092
3093template<typename Derived>
3094QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
3095                                                     RecordTypeLoc TL,
3096                                                     QualType ObjectType) {
3097  RecordType *T = TL.getTypePtr();
3098  RecordDecl *Record
3099    = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
3100                                                          T->getDecl()));
3101  if (!Record)
3102    return QualType();
3103
3104  QualType Result = TL.getType();
3105  if (getDerived().AlwaysRebuild() ||
3106      Record != T->getDecl()) {
3107    Result = getDerived().RebuildRecordType(Record);
3108    if (Result.isNull())
3109      return QualType();
3110  }
3111
3112  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
3113  NewTL.setNameLoc(TL.getNameLoc());
3114
3115  return Result;
3116}
3117
3118template<typename Derived>
3119QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
3120                                                   EnumTypeLoc TL,
3121                                                   QualType ObjectType) {
3122  EnumType *T = TL.getTypePtr();
3123  EnumDecl *Enum
3124    = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
3125                                                        T->getDecl()));
3126  if (!Enum)
3127    return QualType();
3128
3129  QualType Result = TL.getType();
3130  if (getDerived().AlwaysRebuild() ||
3131      Enum != T->getDecl()) {
3132    Result = getDerived().RebuildEnumType(Enum);
3133    if (Result.isNull())
3134      return QualType();
3135  }
3136
3137  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
3138  NewTL.setNameLoc(TL.getNameLoc());
3139
3140  return Result;
3141}
3142
3143template<typename Derived>
3144QualType TreeTransform<Derived>::TransformInjectedClassNameType(
3145                                         TypeLocBuilder &TLB,
3146                                         InjectedClassNameTypeLoc TL,
3147                                         QualType ObjectType) {
3148  Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
3149                                       TL.getTypePtr()->getDecl());
3150  if (!D) return QualType();
3151
3152  QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
3153  TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
3154  return T;
3155}
3156
3157
3158template<typename Derived>
3159QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
3160                                                TypeLocBuilder &TLB,
3161                                                TemplateTypeParmTypeLoc TL,
3162                                                QualType ObjectType) {
3163  return TransformTypeSpecType(TLB, TL);
3164}
3165
3166template<typename Derived>
3167QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
3168                                         TypeLocBuilder &TLB,
3169                                         SubstTemplateTypeParmTypeLoc TL,
3170                                         QualType ObjectType) {
3171  return TransformTypeSpecType(TLB, TL);
3172}
3173
3174template<typename Derived>
3175QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3176                                      const TemplateSpecializationType *TST,
3177                                                        QualType ObjectType) {
3178  // FIXME: this entire method is a temporary workaround; callers
3179  // should be rewritten to provide real type locs.
3180
3181  // Fake up a TemplateSpecializationTypeLoc.
3182  TypeLocBuilder TLB;
3183  TemplateSpecializationTypeLoc TL
3184    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
3185
3186  SourceLocation BaseLoc = getDerived().getBaseLocation();
3187
3188  TL.setTemplateNameLoc(BaseLoc);
3189  TL.setLAngleLoc(BaseLoc);
3190  TL.setRAngleLoc(BaseLoc);
3191  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
3192    const TemplateArgument &TA = TST->getArg(i);
3193    TemplateArgumentLoc TAL;
3194    getDerived().InventTemplateArgumentLoc(TA, TAL);
3195    TL.setArgLocInfo(i, TAL.getLocInfo());
3196  }
3197
3198  TypeLocBuilder IgnoredTLB;
3199  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
3200}
3201
3202template<typename Derived>
3203QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3204                                                        TypeLocBuilder &TLB,
3205                                           TemplateSpecializationTypeLoc TL,
3206                                                        QualType ObjectType) {
3207  const TemplateSpecializationType *T = TL.getTypePtr();
3208
3209  TemplateName Template
3210    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
3211  if (Template.isNull())
3212    return QualType();
3213
3214  TemplateArgumentListInfo NewTemplateArgs;
3215  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
3216  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
3217
3218  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
3219    TemplateArgumentLoc Loc;
3220    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
3221      return QualType();
3222    NewTemplateArgs.addArgument(Loc);
3223  }
3224
3225  // FIXME: maybe don't rebuild if all the template arguments are the same.
3226
3227  QualType Result =
3228    getDerived().RebuildTemplateSpecializationType(Template,
3229                                                   TL.getTemplateNameLoc(),
3230                                                   NewTemplateArgs);
3231
3232  if (!Result.isNull()) {
3233    TemplateSpecializationTypeLoc NewTL
3234      = TLB.push<TemplateSpecializationTypeLoc>(Result);
3235    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
3236    NewTL.setLAngleLoc(TL.getLAngleLoc());
3237    NewTL.setRAngleLoc(TL.getRAngleLoc());
3238    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
3239      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
3240  }
3241
3242  return Result;
3243}
3244
3245template<typename Derived>
3246QualType
3247TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
3248                                                ElaboratedTypeLoc TL,
3249                                                QualType ObjectType) {
3250  QualType Named = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
3251  if (Named.isNull())
3252    return QualType();
3253
3254  ElaboratedType *T = TL.getTypePtr();
3255
3256  NestedNameSpecifier *NNS = 0;
3257  // NOTE: the qualifier in an ElaboratedType is optional.
3258  if (T->getQualifier() != 0) {
3259    NNS = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3260                                                    /* FIXME */ SourceRange(),
3261                                                    ObjectType);
3262    if (!NNS)
3263      return QualType();
3264  }
3265
3266  QualType Result = TL.getType();
3267  if (getDerived().AlwaysRebuild() ||
3268      NNS != T->getQualifier() ||
3269      Named != T->getNamedType()) {
3270    Result = getDerived().RebuildElaboratedType(T->getKeyword(), NNS, Named);
3271    if (Result.isNull())
3272      return QualType();
3273  }
3274
3275  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3276  NewTL.setKeywordLoc(TL.getKeywordLoc());
3277
3278  return Result;
3279}
3280
3281template<typename Derived>
3282QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
3283                                                       DependentNameTypeLoc TL,
3284                                                       QualType ObjectType) {
3285  DependentNameType *T = TL.getTypePtr();
3286
3287  /* FIXME: preserve source information better than this */
3288  SourceRange SR(TL.getNameLoc());
3289
3290  NestedNameSpecifier *NNS
3291    = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR,
3292                                                ObjectType);
3293  if (!NNS)
3294    return QualType();
3295
3296  QualType Result;
3297
3298  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
3299    QualType NewTemplateId
3300      = getDerived().TransformType(QualType(TemplateId, 0));
3301    if (NewTemplateId.isNull())
3302      return QualType();
3303
3304    if (!getDerived().AlwaysRebuild() &&
3305        NNS == T->getQualifier() &&
3306        NewTemplateId == QualType(TemplateId, 0))
3307      return QualType(T, 0);
3308
3309    Result = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
3310                                                   NewTemplateId);
3311  } else {
3312    Result = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
3313                                                   T->getIdentifier(), SR);
3314  }
3315  if (Result.isNull())
3316    return QualType();
3317
3318  if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
3319    QualType NamedT = ElabT->getNamedType();
3320    if (isa<TypedefType>(NamedT)) {
3321      TypedefTypeLoc NamedTLoc = TLB.push<TypedefTypeLoc>(NamedT);
3322      NamedTLoc.setNameLoc(TL.getNameLoc());
3323    }
3324    else if (isa<RecordType>(NamedT)) {
3325      RecordTypeLoc NamedTLoc = TLB.push<RecordTypeLoc>(NamedT);
3326      NamedTLoc.setNameLoc(TL.getNameLoc());
3327    }
3328    else if (isa<EnumType>(NamedT)) {
3329      EnumTypeLoc NamedTLoc = TLB.push<EnumTypeLoc>(NamedT);
3330      NamedTLoc.setNameLoc(TL.getNameLoc());
3331    }
3332    else if (isa<TemplateSpecializationType>(NamedT)) {
3333      TemplateSpecializationTypeLoc NamedTLoc
3334        = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
3335      // FIXME: fill locations
3336      NamedTLoc.initializeLocal(SourceLocation());
3337    }
3338    else
3339      llvm_unreachable("Unexpected type");
3340    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3341    NewTL.setKeywordLoc(TL.getKeywordLoc());
3342  }
3343  else {
3344    DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
3345    NewTL.setKeywordLoc(TL.getKeywordLoc());
3346    NewTL.setNameLoc(TL.getNameLoc());
3347  }
3348  return Result;
3349}
3350
3351template<typename Derived>
3352QualType
3353TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
3354                                                   ObjCInterfaceTypeLoc TL,
3355                                                   QualType ObjectType) {
3356  // ObjCInterfaceType is never dependent.
3357  return TL.getType();
3358}
3359
3360template<typename Derived>
3361QualType
3362TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
3363                                               ObjCObjectPointerTypeLoc TL,
3364                                                       QualType ObjectType) {
3365  // ObjCObjectPointerType is never dependent.
3366  return TL.getType();
3367}
3368
3369//===----------------------------------------------------------------------===//
3370// Statement transformation
3371//===----------------------------------------------------------------------===//
3372template<typename Derived>
3373Sema::OwningStmtResult
3374TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
3375  return SemaRef.Owned(S->Retain());
3376}
3377
3378template<typename Derived>
3379Sema::OwningStmtResult
3380TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
3381  return getDerived().TransformCompoundStmt(S, false);
3382}
3383
3384template<typename Derived>
3385Sema::OwningStmtResult
3386TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
3387                                              bool IsStmtExpr) {
3388  bool SubStmtChanged = false;
3389  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
3390  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
3391       B != BEnd; ++B) {
3392    OwningStmtResult Result = getDerived().TransformStmt(*B);
3393    if (Result.isInvalid())
3394      return getSema().StmtError();
3395
3396    SubStmtChanged = SubStmtChanged || Result.get() != *B;
3397    Statements.push_back(Result.takeAs<Stmt>());
3398  }
3399
3400  if (!getDerived().AlwaysRebuild() &&
3401      !SubStmtChanged)
3402    return SemaRef.Owned(S->Retain());
3403
3404  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
3405                                          move_arg(Statements),
3406                                          S->getRBracLoc(),
3407                                          IsStmtExpr);
3408}
3409
3410template<typename Derived>
3411Sema::OwningStmtResult
3412TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
3413  OwningExprResult LHS(SemaRef), RHS(SemaRef);
3414  {
3415    // The case value expressions are not potentially evaluated.
3416    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
3417
3418    // Transform the left-hand case value.
3419    LHS = getDerived().TransformExpr(S->getLHS());
3420    if (LHS.isInvalid())
3421      return SemaRef.StmtError();
3422
3423    // Transform the right-hand case value (for the GNU case-range extension).
3424    RHS = getDerived().TransformExpr(S->getRHS());
3425    if (RHS.isInvalid())
3426      return SemaRef.StmtError();
3427  }
3428
3429  // Build the case statement.
3430  // Case statements are always rebuilt so that they will attached to their
3431  // transformed switch statement.
3432  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
3433                                                       move(LHS),
3434                                                       S->getEllipsisLoc(),
3435                                                       move(RHS),
3436                                                       S->getColonLoc());
3437  if (Case.isInvalid())
3438    return SemaRef.StmtError();
3439
3440  // Transform the statement following the case
3441  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3442  if (SubStmt.isInvalid())
3443    return SemaRef.StmtError();
3444
3445  // Attach the body to the case statement
3446  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
3447}
3448
3449template<typename Derived>
3450Sema::OwningStmtResult
3451TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
3452  // Transform the statement following the default case
3453  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3454  if (SubStmt.isInvalid())
3455    return SemaRef.StmtError();
3456
3457  // Default statements are always rebuilt
3458  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
3459                                         move(SubStmt));
3460}
3461
3462template<typename Derived>
3463Sema::OwningStmtResult
3464TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
3465  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3466  if (SubStmt.isInvalid())
3467    return SemaRef.StmtError();
3468
3469  // FIXME: Pass the real colon location in.
3470  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
3471  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
3472                                       move(SubStmt));
3473}
3474
3475template<typename Derived>
3476Sema::OwningStmtResult
3477TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
3478  // Transform the condition
3479  OwningExprResult Cond(SemaRef);
3480  VarDecl *ConditionVar = 0;
3481  if (S->getConditionVariable()) {
3482    ConditionVar
3483      = cast_or_null<VarDecl>(
3484                   getDerived().TransformDefinition(
3485                                      S->getConditionVariable()->getLocation(),
3486                                                    S->getConditionVariable()));
3487    if (!ConditionVar)
3488      return SemaRef.StmtError();
3489  } else {
3490    Cond = getDerived().TransformExpr(S->getCond());
3491
3492    if (Cond.isInvalid())
3493      return SemaRef.StmtError();
3494
3495    // Convert the condition to a boolean value.
3496    if (S->getCond()) {
3497      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3498                                                               S->getIfLoc(),
3499                                                               move(Cond));
3500      if (CondE.isInvalid())
3501        return getSema().StmtError();
3502
3503      Cond = move(CondE);
3504    }
3505  }
3506
3507  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3508  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3509    return SemaRef.StmtError();
3510
3511  // Transform the "then" branch.
3512  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
3513  if (Then.isInvalid())
3514    return SemaRef.StmtError();
3515
3516  // Transform the "else" branch.
3517  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
3518  if (Else.isInvalid())
3519    return SemaRef.StmtError();
3520
3521  if (!getDerived().AlwaysRebuild() &&
3522      FullCond->get() == S->getCond() &&
3523      ConditionVar == S->getConditionVariable() &&
3524      Then.get() == S->getThen() &&
3525      Else.get() == S->getElse())
3526    return SemaRef.Owned(S->Retain());
3527
3528  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
3529                                    move(Then),
3530                                    S->getElseLoc(), move(Else));
3531}
3532
3533template<typename Derived>
3534Sema::OwningStmtResult
3535TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
3536  // Transform the condition.
3537  OwningExprResult Cond(SemaRef);
3538  VarDecl *ConditionVar = 0;
3539  if (S->getConditionVariable()) {
3540    ConditionVar
3541      = cast_or_null<VarDecl>(
3542                   getDerived().TransformDefinition(
3543                                      S->getConditionVariable()->getLocation(),
3544                                                    S->getConditionVariable()));
3545    if (!ConditionVar)
3546      return SemaRef.StmtError();
3547  } else {
3548    Cond = getDerived().TransformExpr(S->getCond());
3549
3550    if (Cond.isInvalid())
3551      return SemaRef.StmtError();
3552  }
3553
3554  // Rebuild the switch statement.
3555  OwningStmtResult Switch
3556    = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), move(Cond),
3557                                          ConditionVar);
3558  if (Switch.isInvalid())
3559    return SemaRef.StmtError();
3560
3561  // Transform the body of the switch statement.
3562  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3563  if (Body.isInvalid())
3564    return SemaRef.StmtError();
3565
3566  // Complete the switch statement.
3567  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
3568                                            move(Body));
3569}
3570
3571template<typename Derived>
3572Sema::OwningStmtResult
3573TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
3574  // Transform the condition
3575  OwningExprResult Cond(SemaRef);
3576  VarDecl *ConditionVar = 0;
3577  if (S->getConditionVariable()) {
3578    ConditionVar
3579      = cast_or_null<VarDecl>(
3580                   getDerived().TransformDefinition(
3581                                      S->getConditionVariable()->getLocation(),
3582                                                    S->getConditionVariable()));
3583    if (!ConditionVar)
3584      return SemaRef.StmtError();
3585  } else {
3586    Cond = getDerived().TransformExpr(S->getCond());
3587
3588    if (Cond.isInvalid())
3589      return SemaRef.StmtError();
3590
3591    if (S->getCond()) {
3592      // Convert the condition to a boolean value.
3593      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3594                                                             S->getWhileLoc(),
3595                                                               move(Cond));
3596      if (CondE.isInvalid())
3597        return getSema().StmtError();
3598      Cond = move(CondE);
3599    }
3600  }
3601
3602  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3603  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3604    return SemaRef.StmtError();
3605
3606  // Transform the body
3607  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3608  if (Body.isInvalid())
3609    return SemaRef.StmtError();
3610
3611  if (!getDerived().AlwaysRebuild() &&
3612      FullCond->get() == S->getCond() &&
3613      ConditionVar == S->getConditionVariable() &&
3614      Body.get() == S->getBody())
3615    return SemaRef.Owned(S->Retain());
3616
3617  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
3618                                       ConditionVar, move(Body));
3619}
3620
3621template<typename Derived>
3622Sema::OwningStmtResult
3623TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
3624  // Transform the body
3625  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3626  if (Body.isInvalid())
3627    return SemaRef.StmtError();
3628
3629  // Transform the condition
3630  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3631  if (Cond.isInvalid())
3632    return SemaRef.StmtError();
3633
3634  if (!getDerived().AlwaysRebuild() &&
3635      Cond.get() == S->getCond() &&
3636      Body.get() == S->getBody())
3637    return SemaRef.Owned(S->Retain());
3638
3639  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
3640                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
3641                                    S->getRParenLoc());
3642}
3643
3644template<typename Derived>
3645Sema::OwningStmtResult
3646TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
3647  // Transform the initialization statement
3648  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
3649  if (Init.isInvalid())
3650    return SemaRef.StmtError();
3651
3652  // Transform the condition
3653  OwningExprResult Cond(SemaRef);
3654  VarDecl *ConditionVar = 0;
3655  if (S->getConditionVariable()) {
3656    ConditionVar
3657      = cast_or_null<VarDecl>(
3658                   getDerived().TransformDefinition(
3659                                      S->getConditionVariable()->getLocation(),
3660                                                    S->getConditionVariable()));
3661    if (!ConditionVar)
3662      return SemaRef.StmtError();
3663  } else {
3664    Cond = getDerived().TransformExpr(S->getCond());
3665
3666    if (Cond.isInvalid())
3667      return SemaRef.StmtError();
3668
3669    if (S->getCond()) {
3670      // Convert the condition to a boolean value.
3671      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3672                                                               S->getForLoc(),
3673                                                               move(Cond));
3674      if (CondE.isInvalid())
3675        return getSema().StmtError();
3676
3677      Cond = move(CondE);
3678    }
3679  }
3680
3681  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3682  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3683    return SemaRef.StmtError();
3684
3685  // Transform the increment
3686  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
3687  if (Inc.isInvalid())
3688    return SemaRef.StmtError();
3689
3690  Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc));
3691  if (S->getInc() && !FullInc->get())
3692    return SemaRef.StmtError();
3693
3694  // Transform the body
3695  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3696  if (Body.isInvalid())
3697    return SemaRef.StmtError();
3698
3699  if (!getDerived().AlwaysRebuild() &&
3700      Init.get() == S->getInit() &&
3701      FullCond->get() == S->getCond() &&
3702      Inc.get() == S->getInc() &&
3703      Body.get() == S->getBody())
3704    return SemaRef.Owned(S->Retain());
3705
3706  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
3707                                     move(Init), FullCond, ConditionVar,
3708                                     FullInc, S->getRParenLoc(), move(Body));
3709}
3710
3711template<typename Derived>
3712Sema::OwningStmtResult
3713TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
3714  // Goto statements must always be rebuilt, to resolve the label.
3715  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
3716                                      S->getLabel());
3717}
3718
3719template<typename Derived>
3720Sema::OwningStmtResult
3721TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
3722  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
3723  if (Target.isInvalid())
3724    return SemaRef.StmtError();
3725
3726  if (!getDerived().AlwaysRebuild() &&
3727      Target.get() == S->getTarget())
3728    return SemaRef.Owned(S->Retain());
3729
3730  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
3731                                              move(Target));
3732}
3733
3734template<typename Derived>
3735Sema::OwningStmtResult
3736TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
3737  return SemaRef.Owned(S->Retain());
3738}
3739
3740template<typename Derived>
3741Sema::OwningStmtResult
3742TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
3743  return SemaRef.Owned(S->Retain());
3744}
3745
3746template<typename Derived>
3747Sema::OwningStmtResult
3748TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
3749  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
3750  if (Result.isInvalid())
3751    return SemaRef.StmtError();
3752
3753  // FIXME: We always rebuild the return statement because there is no way
3754  // to tell whether the return type of the function has changed.
3755  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
3756}
3757
3758template<typename Derived>
3759Sema::OwningStmtResult
3760TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
3761  bool DeclChanged = false;
3762  llvm::SmallVector<Decl *, 4> Decls;
3763  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
3764       D != DEnd; ++D) {
3765    Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
3766                                                         *D);
3767    if (!Transformed)
3768      return SemaRef.StmtError();
3769
3770    if (Transformed != *D)
3771      DeclChanged = true;
3772
3773    Decls.push_back(Transformed);
3774  }
3775
3776  if (!getDerived().AlwaysRebuild() && !DeclChanged)
3777    return SemaRef.Owned(S->Retain());
3778
3779  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
3780                                      S->getStartLoc(), S->getEndLoc());
3781}
3782
3783template<typename Derived>
3784Sema::OwningStmtResult
3785TreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
3786  assert(false && "SwitchCase is abstract and cannot be transformed");
3787  return SemaRef.Owned(S->Retain());
3788}
3789
3790template<typename Derived>
3791Sema::OwningStmtResult
3792TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
3793
3794  ASTOwningVector<&ActionBase::DeleteExpr> Constraints(getSema());
3795  ASTOwningVector<&ActionBase::DeleteExpr> Exprs(getSema());
3796  llvm::SmallVector<IdentifierInfo *, 4> Names;
3797
3798  OwningExprResult AsmString(SemaRef);
3799  ASTOwningVector<&ActionBase::DeleteExpr> Clobbers(getSema());
3800
3801  bool ExprsChanged = false;
3802
3803  // Go through the outputs.
3804  for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
3805    Names.push_back(S->getOutputIdentifier(I));
3806
3807    // No need to transform the constraint literal.
3808    Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain());
3809
3810    // Transform the output expr.
3811    Expr *OutputExpr = S->getOutputExpr(I);
3812    OwningExprResult Result = getDerived().TransformExpr(OutputExpr);
3813    if (Result.isInvalid())
3814      return SemaRef.StmtError();
3815
3816    ExprsChanged |= Result.get() != OutputExpr;
3817
3818    Exprs.push_back(Result.takeAs<Expr>());
3819  }
3820
3821  // Go through the inputs.
3822  for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
3823    Names.push_back(S->getInputIdentifier(I));
3824
3825    // No need to transform the constraint literal.
3826    Constraints.push_back(S->getInputConstraintLiteral(I)->Retain());
3827
3828    // Transform the input expr.
3829    Expr *InputExpr = S->getInputExpr(I);
3830    OwningExprResult Result = getDerived().TransformExpr(InputExpr);
3831    if (Result.isInvalid())
3832      return SemaRef.StmtError();
3833
3834    ExprsChanged |= Result.get() != InputExpr;
3835
3836    Exprs.push_back(Result.takeAs<Expr>());
3837  }
3838
3839  if (!getDerived().AlwaysRebuild() && !ExprsChanged)
3840    return SemaRef.Owned(S->Retain());
3841
3842  // Go through the clobbers.
3843  for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
3844    Clobbers.push_back(S->getClobber(I)->Retain());
3845
3846  // No need to transform the asm string literal.
3847  AsmString = SemaRef.Owned(S->getAsmString());
3848
3849  return getDerived().RebuildAsmStmt(S->getAsmLoc(),
3850                                     S->isSimple(),
3851                                     S->isVolatile(),
3852                                     S->getNumOutputs(),
3853                                     S->getNumInputs(),
3854                                     Names.data(),
3855                                     move_arg(Constraints),
3856                                     move_arg(Exprs),
3857                                     move(AsmString),
3858                                     move_arg(Clobbers),
3859                                     S->getRParenLoc(),
3860                                     S->isMSAsm());
3861}
3862
3863
3864template<typename Derived>
3865Sema::OwningStmtResult
3866TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
3867  // Transform the body of the @try.
3868  OwningStmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
3869  if (TryBody.isInvalid())
3870    return SemaRef.StmtError();
3871
3872  // Transform the @catch statements (if present).
3873  bool AnyCatchChanged = false;
3874  ASTOwningVector<&ActionBase::DeleteStmt> CatchStmts(SemaRef);
3875  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
3876    OwningStmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
3877    if (Catch.isInvalid())
3878      return SemaRef.StmtError();
3879    if (Catch.get() != S->getCatchStmt(I))
3880      AnyCatchChanged = true;
3881    CatchStmts.push_back(Catch.release());
3882  }
3883
3884  // Transform the @finally statement (if present).
3885  OwningStmtResult Finally(SemaRef);
3886  if (S->getFinallyStmt()) {
3887    Finally = getDerived().TransformStmt(S->getFinallyStmt());
3888    if (Finally.isInvalid())
3889      return SemaRef.StmtError();
3890  }
3891
3892  // If nothing changed, just retain this statement.
3893  if (!getDerived().AlwaysRebuild() &&
3894      TryBody.get() == S->getTryBody() &&
3895      !AnyCatchChanged &&
3896      Finally.get() == S->getFinallyStmt())
3897    return SemaRef.Owned(S->Retain());
3898
3899  // Build a new statement.
3900  return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), move(TryBody),
3901                                           move_arg(CatchStmts), move(Finally));
3902}
3903
3904template<typename Derived>
3905Sema::OwningStmtResult
3906TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
3907  // Transform the @catch parameter, if there is one.
3908  VarDecl *Var = 0;
3909  if (VarDecl *FromVar = S->getCatchParamDecl()) {
3910    TypeSourceInfo *TSInfo = 0;
3911    if (FromVar->getTypeSourceInfo()) {
3912      TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
3913      if (!TSInfo)
3914        return SemaRef.StmtError();
3915    }
3916
3917    QualType T;
3918    if (TSInfo)
3919      T = TSInfo->getType();
3920    else {
3921      T = getDerived().TransformType(FromVar->getType());
3922      if (T.isNull())
3923        return SemaRef.StmtError();
3924    }
3925
3926    Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
3927    if (!Var)
3928      return SemaRef.StmtError();
3929  }
3930
3931  OwningStmtResult Body = getDerived().TransformStmt(S->getCatchBody());
3932  if (Body.isInvalid())
3933    return SemaRef.StmtError();
3934
3935  return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
3936                                             S->getRParenLoc(),
3937                                             Var, move(Body));
3938}
3939
3940template<typename Derived>
3941Sema::OwningStmtResult
3942TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
3943  // Transform the body.
3944  OwningStmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
3945  if (Body.isInvalid())
3946    return SemaRef.StmtError();
3947
3948  // If nothing changed, just retain this statement.
3949  if (!getDerived().AlwaysRebuild() &&
3950      Body.get() == S->getFinallyBody())
3951    return SemaRef.Owned(S->Retain());
3952
3953  // Build a new statement.
3954  return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
3955                                               move(Body));
3956}
3957
3958template<typename Derived>
3959Sema::OwningStmtResult
3960TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
3961  OwningExprResult Operand(SemaRef);
3962  if (S->getThrowExpr()) {
3963    Operand = getDerived().TransformExpr(S->getThrowExpr());
3964    if (Operand.isInvalid())
3965      return getSema().StmtError();
3966  }
3967
3968  if (!getDerived().AlwaysRebuild() &&
3969      Operand.get() == S->getThrowExpr())
3970    return getSema().Owned(S->Retain());
3971
3972  return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), move(Operand));
3973}
3974
3975template<typename Derived>
3976Sema::OwningStmtResult
3977TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
3978                                                  ObjCAtSynchronizedStmt *S) {
3979  // Transform the object we are locking.
3980  OwningExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
3981  if (Object.isInvalid())
3982    return SemaRef.StmtError();
3983
3984  // Transform the body.
3985  OwningStmtResult Body = getDerived().TransformStmt(S->getSynchBody());
3986  if (Body.isInvalid())
3987    return SemaRef.StmtError();
3988
3989  // If nothing change, just retain the current statement.
3990  if (!getDerived().AlwaysRebuild() &&
3991      Object.get() == S->getSynchExpr() &&
3992      Body.get() == S->getSynchBody())
3993    return SemaRef.Owned(S->Retain());
3994
3995  // Build a new statement.
3996  return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
3997                                                    move(Object), move(Body));
3998}
3999
4000template<typename Derived>
4001Sema::OwningStmtResult
4002TreeTransform<Derived>::TransformObjCForCollectionStmt(
4003                                                  ObjCForCollectionStmt *S) {
4004  // Transform the element statement.
4005  OwningStmtResult Element = getDerived().TransformStmt(S->getElement());
4006  if (Element.isInvalid())
4007    return SemaRef.StmtError();
4008
4009  // Transform the collection expression.
4010  OwningExprResult Collection = getDerived().TransformExpr(S->getCollection());
4011  if (Collection.isInvalid())
4012    return SemaRef.StmtError();
4013
4014  // Transform the body.
4015  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
4016  if (Body.isInvalid())
4017    return SemaRef.StmtError();
4018
4019  // If nothing changed, just retain this statement.
4020  if (!getDerived().AlwaysRebuild() &&
4021      Element.get() == S->getElement() &&
4022      Collection.get() == S->getCollection() &&
4023      Body.get() == S->getBody())
4024    return SemaRef.Owned(S->Retain());
4025
4026  // Build a new statement.
4027  return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
4028                                                   /*FIXME:*/S->getForLoc(),
4029                                                   move(Element),
4030                                                   move(Collection),
4031                                                   S->getRParenLoc(),
4032                                                   move(Body));
4033}
4034
4035
4036template<typename Derived>
4037Sema::OwningStmtResult
4038TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
4039  // Transform the exception declaration, if any.
4040  VarDecl *Var = 0;
4041  if (S->getExceptionDecl()) {
4042    VarDecl *ExceptionDecl = S->getExceptionDecl();
4043    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
4044                         ExceptionDecl->getDeclName());
4045
4046    QualType T = getDerived().TransformType(ExceptionDecl->getType());
4047    if (T.isNull())
4048      return SemaRef.StmtError();
4049
4050    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
4051                                            T,
4052                                            ExceptionDecl->getTypeSourceInfo(),
4053                                            ExceptionDecl->getIdentifier(),
4054                                            ExceptionDecl->getLocation(),
4055                                            /*FIXME: Inaccurate*/
4056                                    SourceRange(ExceptionDecl->getLocation()));
4057    if (!Var || Var->isInvalidDecl()) {
4058      if (Var)
4059        Var->Destroy(SemaRef.Context);
4060      return SemaRef.StmtError();
4061    }
4062  }
4063
4064  // Transform the actual exception handler.
4065  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
4066  if (Handler.isInvalid()) {
4067    if (Var)
4068      Var->Destroy(SemaRef.Context);
4069    return SemaRef.StmtError();
4070  }
4071
4072  if (!getDerived().AlwaysRebuild() &&
4073      !Var &&
4074      Handler.get() == S->getHandlerBlock())
4075    return SemaRef.Owned(S->Retain());
4076
4077  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
4078                                          Var,
4079                                          move(Handler));
4080}
4081
4082template<typename Derived>
4083Sema::OwningStmtResult
4084TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
4085  // Transform the try block itself.
4086  OwningStmtResult TryBlock
4087    = getDerived().TransformCompoundStmt(S->getTryBlock());
4088  if (TryBlock.isInvalid())
4089    return SemaRef.StmtError();
4090
4091  // Transform the handlers.
4092  bool HandlerChanged = false;
4093  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
4094  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
4095    OwningStmtResult Handler
4096      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
4097    if (Handler.isInvalid())
4098      return SemaRef.StmtError();
4099
4100    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
4101    Handlers.push_back(Handler.takeAs<Stmt>());
4102  }
4103
4104  if (!getDerived().AlwaysRebuild() &&
4105      TryBlock.get() == S->getTryBlock() &&
4106      !HandlerChanged)
4107    return SemaRef.Owned(S->Retain());
4108
4109  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
4110                                        move_arg(Handlers));
4111}
4112
4113//===----------------------------------------------------------------------===//
4114// Expression transformation
4115//===----------------------------------------------------------------------===//
4116template<typename Derived>
4117Sema::OwningExprResult
4118TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
4119  return SemaRef.Owned(E->Retain());
4120}
4121
4122template<typename Derived>
4123Sema::OwningExprResult
4124TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
4125  NestedNameSpecifier *Qualifier = 0;
4126  if (E->getQualifier()) {
4127    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4128                                                       E->getQualifierRange());
4129    if (!Qualifier)
4130      return SemaRef.ExprError();
4131  }
4132
4133  ValueDecl *ND
4134    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
4135                                                         E->getDecl()));
4136  if (!ND)
4137    return SemaRef.ExprError();
4138
4139  if (!getDerived().AlwaysRebuild() &&
4140      Qualifier == E->getQualifier() &&
4141      ND == E->getDecl() &&
4142      !E->hasExplicitTemplateArgumentList()) {
4143
4144    // Mark it referenced in the new context regardless.
4145    // FIXME: this is a bit instantiation-specific.
4146    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
4147
4148    return SemaRef.Owned(E->Retain());
4149  }
4150
4151  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
4152  if (E->hasExplicitTemplateArgumentList()) {
4153    TemplateArgs = &TransArgs;
4154    TransArgs.setLAngleLoc(E->getLAngleLoc());
4155    TransArgs.setRAngleLoc(E->getRAngleLoc());
4156    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4157      TemplateArgumentLoc Loc;
4158      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4159        return SemaRef.ExprError();
4160      TransArgs.addArgument(Loc);
4161    }
4162  }
4163
4164  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
4165                                         ND, E->getLocation(), TemplateArgs);
4166}
4167
4168template<typename Derived>
4169Sema::OwningExprResult
4170TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
4171  return SemaRef.Owned(E->Retain());
4172}
4173
4174template<typename Derived>
4175Sema::OwningExprResult
4176TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
4177  return SemaRef.Owned(E->Retain());
4178}
4179
4180template<typename Derived>
4181Sema::OwningExprResult
4182TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
4183  return SemaRef.Owned(E->Retain());
4184}
4185
4186template<typename Derived>
4187Sema::OwningExprResult
4188TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
4189  return SemaRef.Owned(E->Retain());
4190}
4191
4192template<typename Derived>
4193Sema::OwningExprResult
4194TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
4195  return SemaRef.Owned(E->Retain());
4196}
4197
4198template<typename Derived>
4199Sema::OwningExprResult
4200TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
4201  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4202  if (SubExpr.isInvalid())
4203    return SemaRef.ExprError();
4204
4205  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
4206    return SemaRef.Owned(E->Retain());
4207
4208  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
4209                                       E->getRParen());
4210}
4211
4212template<typename Derived>
4213Sema::OwningExprResult
4214TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
4215  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4216  if (SubExpr.isInvalid())
4217    return SemaRef.ExprError();
4218
4219  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
4220    return SemaRef.Owned(E->Retain());
4221
4222  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
4223                                           E->getOpcode(),
4224                                           move(SubExpr));
4225}
4226
4227template<typename Derived>
4228Sema::OwningExprResult
4229TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
4230  // Transform the type.
4231  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
4232  if (!Type)
4233    return getSema().ExprError();
4234
4235  // Transform all of the components into components similar to what the
4236  // parser uses.
4237  // FIXME: It would be slightly more efficient in the non-dependent case to
4238  // just map FieldDecls, rather than requiring the rebuilder to look for
4239  // the fields again. However, __builtin_offsetof is rare enough in
4240  // template code that we don't care.
4241  bool ExprChanged = false;
4242  typedef Action::OffsetOfComponent Component;
4243  typedef OffsetOfExpr::OffsetOfNode Node;
4244  llvm::SmallVector<Component, 4> Components;
4245  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
4246    const Node &ON = E->getComponent(I);
4247    Component Comp;
4248    Comp.isBrackets = true;
4249    Comp.LocStart = ON.getRange().getBegin();
4250    Comp.LocEnd = ON.getRange().getEnd();
4251    switch (ON.getKind()) {
4252    case Node::Array: {
4253      Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
4254      OwningExprResult Index = getDerived().TransformExpr(FromIndex);
4255      if (Index.isInvalid())
4256        return getSema().ExprError();
4257
4258      ExprChanged = ExprChanged || Index.get() != FromIndex;
4259      Comp.isBrackets = true;
4260      Comp.U.E = Index.takeAs<Expr>(); // FIXME: leaked
4261      break;
4262    }
4263
4264    case Node::Field:
4265    case Node::Identifier:
4266      Comp.isBrackets = false;
4267      Comp.U.IdentInfo = ON.getFieldName();
4268      if (!Comp.U.IdentInfo)
4269        continue;
4270
4271      break;
4272
4273    case Node::Base:
4274      // Will be recomputed during the rebuild.
4275      continue;
4276    }
4277
4278    Components.push_back(Comp);
4279  }
4280
4281  // If nothing changed, retain the existing expression.
4282  if (!getDerived().AlwaysRebuild() &&
4283      Type == E->getTypeSourceInfo() &&
4284      !ExprChanged)
4285    return SemaRef.Owned(E->Retain());
4286
4287  // Build a new offsetof expression.
4288  return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
4289                                          Components.data(), Components.size(),
4290                                          E->getRParenLoc());
4291}
4292
4293template<typename Derived>
4294Sema::OwningExprResult
4295TreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
4296  if (E->isArgumentType()) {
4297    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
4298
4299    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
4300    if (!NewT)
4301      return SemaRef.ExprError();
4302
4303    if (!getDerived().AlwaysRebuild() && OldT == NewT)
4304      return SemaRef.Owned(E->Retain());
4305
4306    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
4307                                             E->isSizeOf(),
4308                                             E->getSourceRange());
4309  }
4310
4311  Sema::OwningExprResult SubExpr(SemaRef);
4312  {
4313    // C++0x [expr.sizeof]p1:
4314    //   The operand is either an expression, which is an unevaluated operand
4315    //   [...]
4316    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
4317
4318    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
4319    if (SubExpr.isInvalid())
4320      return SemaRef.ExprError();
4321
4322    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
4323      return SemaRef.Owned(E->Retain());
4324  }
4325
4326  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
4327                                           E->isSizeOf(),
4328                                           E->getSourceRange());
4329}
4330
4331template<typename Derived>
4332Sema::OwningExprResult
4333TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
4334  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4335  if (LHS.isInvalid())
4336    return SemaRef.ExprError();
4337
4338  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4339  if (RHS.isInvalid())
4340    return SemaRef.ExprError();
4341
4342
4343  if (!getDerived().AlwaysRebuild() &&
4344      LHS.get() == E->getLHS() &&
4345      RHS.get() == E->getRHS())
4346    return SemaRef.Owned(E->Retain());
4347
4348  return getDerived().RebuildArraySubscriptExpr(move(LHS),
4349                                           /*FIXME:*/E->getLHS()->getLocStart(),
4350                                                move(RHS),
4351                                                E->getRBracketLoc());
4352}
4353
4354template<typename Derived>
4355Sema::OwningExprResult
4356TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
4357  // Transform the callee.
4358  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4359  if (Callee.isInvalid())
4360    return SemaRef.ExprError();
4361
4362  // Transform arguments.
4363  bool ArgChanged = false;
4364  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4365  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4366  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
4367    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4368    if (Arg.isInvalid())
4369      return SemaRef.ExprError();
4370
4371    // FIXME: Wrong source location information for the ','.
4372    FakeCommaLocs.push_back(
4373       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
4374
4375    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
4376    Args.push_back(Arg.takeAs<Expr>());
4377  }
4378
4379  if (!getDerived().AlwaysRebuild() &&
4380      Callee.get() == E->getCallee() &&
4381      !ArgChanged)
4382    return SemaRef.Owned(E->Retain());
4383
4384  // FIXME: Wrong source location information for the '('.
4385  SourceLocation FakeLParenLoc
4386    = ((Expr *)Callee.get())->getSourceRange().getBegin();
4387  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
4388                                      move_arg(Args),
4389                                      FakeCommaLocs.data(),
4390                                      E->getRParenLoc());
4391}
4392
4393template<typename Derived>
4394Sema::OwningExprResult
4395TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
4396  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4397  if (Base.isInvalid())
4398    return SemaRef.ExprError();
4399
4400  NestedNameSpecifier *Qualifier = 0;
4401  if (E->hasQualifier()) {
4402    Qualifier
4403      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4404                                                  E->getQualifierRange());
4405    if (Qualifier == 0)
4406      return SemaRef.ExprError();
4407  }
4408
4409  ValueDecl *Member
4410    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
4411                                                         E->getMemberDecl()));
4412  if (!Member)
4413    return SemaRef.ExprError();
4414
4415  NamedDecl *FoundDecl = E->getFoundDecl();
4416  if (FoundDecl == E->getMemberDecl()) {
4417    FoundDecl = Member;
4418  } else {
4419    FoundDecl = cast_or_null<NamedDecl>(
4420                   getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
4421    if (!FoundDecl)
4422      return SemaRef.ExprError();
4423  }
4424
4425  if (!getDerived().AlwaysRebuild() &&
4426      Base.get() == E->getBase() &&
4427      Qualifier == E->getQualifier() &&
4428      Member == E->getMemberDecl() &&
4429      FoundDecl == E->getFoundDecl() &&
4430      !E->hasExplicitTemplateArgumentList()) {
4431
4432    // Mark it referenced in the new context regardless.
4433    // FIXME: this is a bit instantiation-specific.
4434    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
4435    return SemaRef.Owned(E->Retain());
4436  }
4437
4438  TemplateArgumentListInfo TransArgs;
4439  if (E->hasExplicitTemplateArgumentList()) {
4440    TransArgs.setLAngleLoc(E->getLAngleLoc());
4441    TransArgs.setRAngleLoc(E->getRAngleLoc());
4442    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4443      TemplateArgumentLoc Loc;
4444      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4445        return SemaRef.ExprError();
4446      TransArgs.addArgument(Loc);
4447    }
4448  }
4449
4450  // FIXME: Bogus source location for the operator
4451  SourceLocation FakeOperatorLoc
4452    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
4453
4454  // FIXME: to do this check properly, we will need to preserve the
4455  // first-qualifier-in-scope here, just in case we had a dependent
4456  // base (and therefore couldn't do the check) and a
4457  // nested-name-qualifier (and therefore could do the lookup).
4458  NamedDecl *FirstQualifierInScope = 0;
4459
4460  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
4461                                        E->isArrow(),
4462                                        Qualifier,
4463                                        E->getQualifierRange(),
4464                                        E->getMemberLoc(),
4465                                        Member,
4466                                        FoundDecl,
4467                                        (E->hasExplicitTemplateArgumentList()
4468                                           ? &TransArgs : 0),
4469                                        FirstQualifierInScope);
4470}
4471
4472template<typename Derived>
4473Sema::OwningExprResult
4474TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
4475  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4476  if (LHS.isInvalid())
4477    return SemaRef.ExprError();
4478
4479  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4480  if (RHS.isInvalid())
4481    return SemaRef.ExprError();
4482
4483  if (!getDerived().AlwaysRebuild() &&
4484      LHS.get() == E->getLHS() &&
4485      RHS.get() == E->getRHS())
4486    return SemaRef.Owned(E->Retain());
4487
4488  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
4489                                            move(LHS), move(RHS));
4490}
4491
4492template<typename Derived>
4493Sema::OwningExprResult
4494TreeTransform<Derived>::TransformCompoundAssignOperator(
4495                                                      CompoundAssignOperator *E) {
4496  return getDerived().TransformBinaryOperator(E);
4497}
4498
4499template<typename Derived>
4500Sema::OwningExprResult
4501TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
4502  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4503  if (Cond.isInvalid())
4504    return SemaRef.ExprError();
4505
4506  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4507  if (LHS.isInvalid())
4508    return SemaRef.ExprError();
4509
4510  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4511  if (RHS.isInvalid())
4512    return SemaRef.ExprError();
4513
4514  if (!getDerived().AlwaysRebuild() &&
4515      Cond.get() == E->getCond() &&
4516      LHS.get() == E->getLHS() &&
4517      RHS.get() == E->getRHS())
4518    return SemaRef.Owned(E->Retain());
4519
4520  return getDerived().RebuildConditionalOperator(move(Cond),
4521                                                 E->getQuestionLoc(),
4522                                                 move(LHS),
4523                                                 E->getColonLoc(),
4524                                                 move(RHS));
4525}
4526
4527template<typename Derived>
4528Sema::OwningExprResult
4529TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
4530  // Implicit casts are eliminated during transformation, since they
4531  // will be recomputed by semantic analysis after transformation.
4532  return getDerived().TransformExpr(E->getSubExprAsWritten());
4533}
4534
4535template<typename Derived>
4536Sema::OwningExprResult
4537TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
4538  TypeSourceInfo *OldT;
4539  TypeSourceInfo *NewT;
4540  {
4541    // FIXME: Source location isn't quite accurate.
4542    SourceLocation TypeStartLoc
4543      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
4544    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
4545
4546    OldT = E->getTypeInfoAsWritten();
4547    NewT = getDerived().TransformType(OldT);
4548    if (!NewT)
4549      return SemaRef.ExprError();
4550  }
4551
4552  OwningExprResult SubExpr
4553    = getDerived().TransformExpr(E->getSubExprAsWritten());
4554  if (SubExpr.isInvalid())
4555    return SemaRef.ExprError();
4556
4557  if (!getDerived().AlwaysRebuild() &&
4558      OldT == NewT &&
4559      SubExpr.get() == E->getSubExpr())
4560    return SemaRef.Owned(E->Retain());
4561
4562  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
4563                                            NewT,
4564                                            E->getRParenLoc(),
4565                                            move(SubExpr));
4566}
4567
4568template<typename Derived>
4569Sema::OwningExprResult
4570TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
4571  TypeSourceInfo *OldT = E->getTypeSourceInfo();
4572  TypeSourceInfo *NewT = getDerived().TransformType(OldT);
4573  if (!NewT)
4574    return SemaRef.ExprError();
4575
4576  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
4577  if (Init.isInvalid())
4578    return SemaRef.ExprError();
4579
4580  if (!getDerived().AlwaysRebuild() &&
4581      OldT == NewT &&
4582      Init.get() == E->getInitializer())
4583    return SemaRef.Owned(E->Retain());
4584
4585  // Note: the expression type doesn't necessarily match the
4586  // type-as-written, but that's okay, because it should always be
4587  // derivable from the initializer.
4588
4589  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
4590                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
4591                                                 move(Init));
4592}
4593
4594template<typename Derived>
4595Sema::OwningExprResult
4596TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
4597  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4598  if (Base.isInvalid())
4599    return SemaRef.ExprError();
4600
4601  if (!getDerived().AlwaysRebuild() &&
4602      Base.get() == E->getBase())
4603    return SemaRef.Owned(E->Retain());
4604
4605  // FIXME: Bad source location
4606  SourceLocation FakeOperatorLoc
4607    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
4608  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
4609                                                  E->getAccessorLoc(),
4610                                                  E->getAccessor());
4611}
4612
4613template<typename Derived>
4614Sema::OwningExprResult
4615TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
4616  bool InitChanged = false;
4617
4618  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4619  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
4620    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
4621    if (Init.isInvalid())
4622      return SemaRef.ExprError();
4623
4624    InitChanged = InitChanged || Init.get() != E->getInit(I);
4625    Inits.push_back(Init.takeAs<Expr>());
4626  }
4627
4628  if (!getDerived().AlwaysRebuild() && !InitChanged)
4629    return SemaRef.Owned(E->Retain());
4630
4631  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
4632                                      E->getRBraceLoc(), E->getType());
4633}
4634
4635template<typename Derived>
4636Sema::OwningExprResult
4637TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
4638  Designation Desig;
4639
4640  // transform the initializer value
4641  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
4642  if (Init.isInvalid())
4643    return SemaRef.ExprError();
4644
4645  // transform the designators.
4646  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
4647  bool ExprChanged = false;
4648  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
4649                                             DEnd = E->designators_end();
4650       D != DEnd; ++D) {
4651    if (D->isFieldDesignator()) {
4652      Desig.AddDesignator(Designator::getField(D->getFieldName(),
4653                                               D->getDotLoc(),
4654                                               D->getFieldLoc()));
4655      continue;
4656    }
4657
4658    if (D->isArrayDesignator()) {
4659      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
4660      if (Index.isInvalid())
4661        return SemaRef.ExprError();
4662
4663      Desig.AddDesignator(Designator::getArray(Index.get(),
4664                                               D->getLBracketLoc()));
4665
4666      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
4667      ArrayExprs.push_back(Index.release());
4668      continue;
4669    }
4670
4671    assert(D->isArrayRangeDesignator() && "New kind of designator?");
4672    OwningExprResult Start
4673      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
4674    if (Start.isInvalid())
4675      return SemaRef.ExprError();
4676
4677    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
4678    if (End.isInvalid())
4679      return SemaRef.ExprError();
4680
4681    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
4682                                                  End.get(),
4683                                                  D->getLBracketLoc(),
4684                                                  D->getEllipsisLoc()));
4685
4686    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
4687      End.get() != E->getArrayRangeEnd(*D);
4688
4689    ArrayExprs.push_back(Start.release());
4690    ArrayExprs.push_back(End.release());
4691  }
4692
4693  if (!getDerived().AlwaysRebuild() &&
4694      Init.get() == E->getInit() &&
4695      !ExprChanged)
4696    return SemaRef.Owned(E->Retain());
4697
4698  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
4699                                                E->getEqualOrColonLoc(),
4700                                                E->usesGNUSyntax(), move(Init));
4701}
4702
4703template<typename Derived>
4704Sema::OwningExprResult
4705TreeTransform<Derived>::TransformImplicitValueInitExpr(
4706                                                     ImplicitValueInitExpr *E) {
4707  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4708
4709  // FIXME: Will we ever have proper type location here? Will we actually
4710  // need to transform the type?
4711  QualType T = getDerived().TransformType(E->getType());
4712  if (T.isNull())
4713    return SemaRef.ExprError();
4714
4715  if (!getDerived().AlwaysRebuild() &&
4716      T == E->getType())
4717    return SemaRef.Owned(E->Retain());
4718
4719  return getDerived().RebuildImplicitValueInitExpr(T);
4720}
4721
4722template<typename Derived>
4723Sema::OwningExprResult
4724TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
4725  // FIXME: Do we want the type as written?
4726  QualType T;
4727
4728  {
4729    // FIXME: Source location isn't quite accurate.
4730    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
4731    T = getDerived().TransformType(E->getType());
4732    if (T.isNull())
4733      return SemaRef.ExprError();
4734  }
4735
4736  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4737  if (SubExpr.isInvalid())
4738    return SemaRef.ExprError();
4739
4740  if (!getDerived().AlwaysRebuild() &&
4741      T == E->getType() &&
4742      SubExpr.get() == E->getSubExpr())
4743    return SemaRef.Owned(E->Retain());
4744
4745  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
4746                                       T, E->getRParenLoc());
4747}
4748
4749template<typename Derived>
4750Sema::OwningExprResult
4751TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
4752  bool ArgumentChanged = false;
4753  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4754  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
4755    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4756    if (Init.isInvalid())
4757      return SemaRef.ExprError();
4758
4759    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
4760    Inits.push_back(Init.takeAs<Expr>());
4761  }
4762
4763  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4764                                           move_arg(Inits),
4765                                           E->getRParenLoc());
4766}
4767
4768/// \brief Transform an address-of-label expression.
4769///
4770/// By default, the transformation of an address-of-label expression always
4771/// rebuilds the expression, so that the label identifier can be resolved to
4772/// the corresponding label statement by semantic analysis.
4773template<typename Derived>
4774Sema::OwningExprResult
4775TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
4776  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4777                                           E->getLabel());
4778}
4779
4780template<typename Derived>
4781Sema::OwningExprResult
4782TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
4783  OwningStmtResult SubStmt
4784    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4785  if (SubStmt.isInvalid())
4786    return SemaRef.ExprError();
4787
4788  if (!getDerived().AlwaysRebuild() &&
4789      SubStmt.get() == E->getSubStmt())
4790    return SemaRef.Owned(E->Retain());
4791
4792  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
4793                                      move(SubStmt),
4794                                      E->getRParenLoc());
4795}
4796
4797template<typename Derived>
4798Sema::OwningExprResult
4799TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
4800  QualType T1, T2;
4801  {
4802    // FIXME: Source location isn't quite accurate.
4803    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
4804
4805    T1 = getDerived().TransformType(E->getArgType1());
4806    if (T1.isNull())
4807      return SemaRef.ExprError();
4808
4809    T2 = getDerived().TransformType(E->getArgType2());
4810    if (T2.isNull())
4811      return SemaRef.ExprError();
4812  }
4813
4814  if (!getDerived().AlwaysRebuild() &&
4815      T1 == E->getArgType1() &&
4816      T2 == E->getArgType2())
4817    return SemaRef.Owned(E->Retain());
4818
4819  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
4820                                                 T1, T2, E->getRParenLoc());
4821}
4822
4823template<typename Derived>
4824Sema::OwningExprResult
4825TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
4826  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4827  if (Cond.isInvalid())
4828    return SemaRef.ExprError();
4829
4830  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4831  if (LHS.isInvalid())
4832    return SemaRef.ExprError();
4833
4834  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4835  if (RHS.isInvalid())
4836    return SemaRef.ExprError();
4837
4838  if (!getDerived().AlwaysRebuild() &&
4839      Cond.get() == E->getCond() &&
4840      LHS.get() == E->getLHS() &&
4841      RHS.get() == E->getRHS())
4842    return SemaRef.Owned(E->Retain());
4843
4844  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4845                                        move(Cond), move(LHS), move(RHS),
4846                                        E->getRParenLoc());
4847}
4848
4849template<typename Derived>
4850Sema::OwningExprResult
4851TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
4852  return SemaRef.Owned(E->Retain());
4853}
4854
4855template<typename Derived>
4856Sema::OwningExprResult
4857TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4858  switch (E->getOperator()) {
4859  case OO_New:
4860  case OO_Delete:
4861  case OO_Array_New:
4862  case OO_Array_Delete:
4863    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
4864    return SemaRef.ExprError();
4865
4866  case OO_Call: {
4867    // This is a call to an object's operator().
4868    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
4869
4870    // Transform the object itself.
4871    OwningExprResult Object = getDerived().TransformExpr(E->getArg(0));
4872    if (Object.isInvalid())
4873      return SemaRef.ExprError();
4874
4875    // FIXME: Poor location information
4876    SourceLocation FakeLParenLoc
4877      = SemaRef.PP.getLocForEndOfToken(
4878                              static_cast<Expr *>(Object.get())->getLocEnd());
4879
4880    // Transform the call arguments.
4881    ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4882    llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4883    for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) {
4884      if (getDerived().DropCallArgument(E->getArg(I)))
4885        break;
4886
4887      OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4888      if (Arg.isInvalid())
4889        return SemaRef.ExprError();
4890
4891      // FIXME: Poor source location information.
4892      SourceLocation FakeCommaLoc
4893        = SemaRef.PP.getLocForEndOfToken(
4894                                 static_cast<Expr *>(Arg.get())->getLocEnd());
4895      FakeCommaLocs.push_back(FakeCommaLoc);
4896      Args.push_back(Arg.release());
4897    }
4898
4899    return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc,
4900                                        move_arg(Args),
4901                                        FakeCommaLocs.data(),
4902                                        E->getLocEnd());
4903  }
4904
4905#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
4906  case OO_##Name:
4907#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
4908#include "clang/Basic/OperatorKinds.def"
4909  case OO_Subscript:
4910    // Handled below.
4911    break;
4912
4913  case OO_Conditional:
4914    llvm_unreachable("conditional operator is not actually overloadable");
4915    return SemaRef.ExprError();
4916
4917  case OO_None:
4918  case NUM_OVERLOADED_OPERATORS:
4919    llvm_unreachable("not an overloaded operator?");
4920    return SemaRef.ExprError();
4921  }
4922
4923  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4924  if (Callee.isInvalid())
4925    return SemaRef.ExprError();
4926
4927  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
4928  if (First.isInvalid())
4929    return SemaRef.ExprError();
4930
4931  OwningExprResult Second(SemaRef);
4932  if (E->getNumArgs() == 2) {
4933    Second = getDerived().TransformExpr(E->getArg(1));
4934    if (Second.isInvalid())
4935      return SemaRef.ExprError();
4936  }
4937
4938  if (!getDerived().AlwaysRebuild() &&
4939      Callee.get() == E->getCallee() &&
4940      First.get() == E->getArg(0) &&
4941      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
4942    return SemaRef.Owned(E->Retain());
4943
4944  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4945                                                 E->getOperatorLoc(),
4946                                                 move(Callee),
4947                                                 move(First),
4948                                                 move(Second));
4949}
4950
4951template<typename Derived>
4952Sema::OwningExprResult
4953TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
4954  return getDerived().TransformCallExpr(E);
4955}
4956
4957template<typename Derived>
4958Sema::OwningExprResult
4959TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
4960  TypeSourceInfo *OldT;
4961  TypeSourceInfo *NewT;
4962  {
4963    // FIXME: Source location isn't quite accurate.
4964    SourceLocation TypeStartLoc
4965      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4966    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
4967
4968    OldT = E->getTypeInfoAsWritten();
4969    NewT = getDerived().TransformType(OldT);
4970    if (!NewT)
4971      return SemaRef.ExprError();
4972  }
4973
4974  OwningExprResult SubExpr
4975    = getDerived().TransformExpr(E->getSubExprAsWritten());
4976  if (SubExpr.isInvalid())
4977    return SemaRef.ExprError();
4978
4979  if (!getDerived().AlwaysRebuild() &&
4980      OldT == NewT &&
4981      SubExpr.get() == E->getSubExpr())
4982    return SemaRef.Owned(E->Retain());
4983
4984  // FIXME: Poor source location information here.
4985  SourceLocation FakeLAngleLoc
4986    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4987  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
4988  SourceLocation FakeRParenLoc
4989    = SemaRef.PP.getLocForEndOfToken(
4990                                  E->getSubExpr()->getSourceRange().getEnd());
4991  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
4992                                              E->getStmtClass(),
4993                                              FakeLAngleLoc,
4994                                              NewT,
4995                                              FakeRAngleLoc,
4996                                              FakeRAngleLoc,
4997                                              move(SubExpr),
4998                                              FakeRParenLoc);
4999}
5000
5001template<typename Derived>
5002Sema::OwningExprResult
5003TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
5004  return getDerived().TransformCXXNamedCastExpr(E);
5005}
5006
5007template<typename Derived>
5008Sema::OwningExprResult
5009TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
5010  return getDerived().TransformCXXNamedCastExpr(E);
5011}
5012
5013template<typename Derived>
5014Sema::OwningExprResult
5015TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
5016                                                      CXXReinterpretCastExpr *E) {
5017  return getDerived().TransformCXXNamedCastExpr(E);
5018}
5019
5020template<typename Derived>
5021Sema::OwningExprResult
5022TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
5023  return getDerived().TransformCXXNamedCastExpr(E);
5024}
5025
5026template<typename Derived>
5027Sema::OwningExprResult
5028TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
5029                                                     CXXFunctionalCastExpr *E) {
5030  TypeSourceInfo *OldT;
5031  TypeSourceInfo *NewT;
5032  {
5033    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5034
5035    OldT = E->getTypeInfoAsWritten();
5036    NewT = getDerived().TransformType(OldT);
5037    if (!NewT)
5038      return SemaRef.ExprError();
5039  }
5040
5041  OwningExprResult SubExpr
5042    = getDerived().TransformExpr(E->getSubExprAsWritten());
5043  if (SubExpr.isInvalid())
5044    return SemaRef.ExprError();
5045
5046  if (!getDerived().AlwaysRebuild() &&
5047      OldT == NewT &&
5048      SubExpr.get() == E->getSubExpr())
5049    return SemaRef.Owned(E->Retain());
5050
5051  // FIXME: The end of the type's source range is wrong
5052  return getDerived().RebuildCXXFunctionalCastExpr(
5053                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
5054                                                   NewT,
5055                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
5056                                                   move(SubExpr),
5057                                                   E->getRParenLoc());
5058}
5059
5060template<typename Derived>
5061Sema::OwningExprResult
5062TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
5063  if (E->isTypeOperand()) {
5064    TypeSourceInfo *TInfo
5065      = getDerived().TransformType(E->getTypeOperandSourceInfo());
5066    if (!TInfo)
5067      return SemaRef.ExprError();
5068
5069    if (!getDerived().AlwaysRebuild() &&
5070        TInfo == E->getTypeOperandSourceInfo())
5071      return SemaRef.Owned(E->Retain());
5072
5073    return getDerived().RebuildCXXTypeidExpr(E->getType(),
5074                                             E->getLocStart(),
5075                                             TInfo,
5076                                             E->getLocEnd());
5077  }
5078
5079  // We don't know whether the expression is potentially evaluated until
5080  // after we perform semantic analysis, so the expression is potentially
5081  // potentially evaluated.
5082  EnterExpressionEvaluationContext Unevaluated(SemaRef,
5083                                      Action::PotentiallyPotentiallyEvaluated);
5084
5085  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
5086  if (SubExpr.isInvalid())
5087    return SemaRef.ExprError();
5088
5089  if (!getDerived().AlwaysRebuild() &&
5090      SubExpr.get() == E->getExprOperand())
5091    return SemaRef.Owned(E->Retain());
5092
5093  return getDerived().RebuildCXXTypeidExpr(E->getType(),
5094                                           E->getLocStart(),
5095                                           move(SubExpr),
5096                                           E->getLocEnd());
5097}
5098
5099template<typename Derived>
5100Sema::OwningExprResult
5101TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
5102  return SemaRef.Owned(E->Retain());
5103}
5104
5105template<typename Derived>
5106Sema::OwningExprResult
5107TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
5108                                                     CXXNullPtrLiteralExpr *E) {
5109  return SemaRef.Owned(E->Retain());
5110}
5111
5112template<typename Derived>
5113Sema::OwningExprResult
5114TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
5115  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
5116
5117  QualType T = getDerived().TransformType(E->getType());
5118  if (T.isNull())
5119    return SemaRef.ExprError();
5120
5121  if (!getDerived().AlwaysRebuild() &&
5122      T == E->getType())
5123    return SemaRef.Owned(E->Retain());
5124
5125  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
5126}
5127
5128template<typename Derived>
5129Sema::OwningExprResult
5130TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
5131  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5132  if (SubExpr.isInvalid())
5133    return SemaRef.ExprError();
5134
5135  if (!getDerived().AlwaysRebuild() &&
5136      SubExpr.get() == E->getSubExpr())
5137    return SemaRef.Owned(E->Retain());
5138
5139  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
5140}
5141
5142template<typename Derived>
5143Sema::OwningExprResult
5144TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
5145  ParmVarDecl *Param
5146    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
5147                                                           E->getParam()));
5148  if (!Param)
5149    return SemaRef.ExprError();
5150
5151  if (!getDerived().AlwaysRebuild() &&
5152      Param == E->getParam())
5153    return SemaRef.Owned(E->Retain());
5154
5155  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
5156}
5157
5158template<typename Derived>
5159Sema::OwningExprResult
5160TreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
5161  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5162
5163  QualType T = getDerived().TransformType(E->getType());
5164  if (T.isNull())
5165    return SemaRef.ExprError();
5166
5167  if (!getDerived().AlwaysRebuild() &&
5168      T == E->getType())
5169    return SemaRef.Owned(E->Retain());
5170
5171  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
5172                                                /*FIXME:*/E->getTypeBeginLoc(),
5173                                                  T,
5174                                                  E->getRParenLoc());
5175}
5176
5177template<typename Derived>
5178Sema::OwningExprResult
5179TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
5180  // Transform the type that we're allocating
5181  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
5182  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
5183  if (AllocType.isNull())
5184    return SemaRef.ExprError();
5185
5186  // Transform the size of the array we're allocating (if any).
5187  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
5188  if (ArraySize.isInvalid())
5189    return SemaRef.ExprError();
5190
5191  // Transform the placement arguments (if any).
5192  bool ArgumentChanged = false;
5193  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
5194  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
5195    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
5196    if (Arg.isInvalid())
5197      return SemaRef.ExprError();
5198
5199    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
5200    PlacementArgs.push_back(Arg.take());
5201  }
5202
5203  // transform the constructor arguments (if any).
5204  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
5205  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
5206    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
5207    if (Arg.isInvalid())
5208      return SemaRef.ExprError();
5209
5210    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
5211    ConstructorArgs.push_back(Arg.take());
5212  }
5213
5214  // Transform constructor, new operator, and delete operator.
5215  CXXConstructorDecl *Constructor = 0;
5216  if (E->getConstructor()) {
5217    Constructor = cast_or_null<CXXConstructorDecl>(
5218                                   getDerived().TransformDecl(E->getLocStart(),
5219                                                         E->getConstructor()));
5220    if (!Constructor)
5221      return SemaRef.ExprError();
5222  }
5223
5224  FunctionDecl *OperatorNew = 0;
5225  if (E->getOperatorNew()) {
5226    OperatorNew = cast_or_null<FunctionDecl>(
5227                                 getDerived().TransformDecl(E->getLocStart(),
5228                                                         E->getOperatorNew()));
5229    if (!OperatorNew)
5230      return SemaRef.ExprError();
5231  }
5232
5233  FunctionDecl *OperatorDelete = 0;
5234  if (E->getOperatorDelete()) {
5235    OperatorDelete = cast_or_null<FunctionDecl>(
5236                                   getDerived().TransformDecl(E->getLocStart(),
5237                                                       E->getOperatorDelete()));
5238    if (!OperatorDelete)
5239      return SemaRef.ExprError();
5240  }
5241
5242  if (!getDerived().AlwaysRebuild() &&
5243      AllocType == E->getAllocatedType() &&
5244      ArraySize.get() == E->getArraySize() &&
5245      Constructor == E->getConstructor() &&
5246      OperatorNew == E->getOperatorNew() &&
5247      OperatorDelete == E->getOperatorDelete() &&
5248      !ArgumentChanged) {
5249    // Mark any declarations we need as referenced.
5250    // FIXME: instantiation-specific.
5251    if (Constructor)
5252      SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5253    if (OperatorNew)
5254      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
5255    if (OperatorDelete)
5256      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
5257    return SemaRef.Owned(E->Retain());
5258  }
5259
5260  if (!ArraySize.get()) {
5261    // If no array size was specified, but the new expression was
5262    // instantiated with an array type (e.g., "new T" where T is
5263    // instantiated with "int[4]"), extract the outer bound from the
5264    // array type as our array size. We do this with constant and
5265    // dependently-sized array types.
5266    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
5267    if (!ArrayT) {
5268      // Do nothing
5269    } else if (const ConstantArrayType *ConsArrayT
5270                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
5271      ArraySize
5272        = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
5273                                                  ConsArrayT->getSize(),
5274                                                  SemaRef.Context.getSizeType(),
5275                                                  /*FIXME:*/E->getLocStart()));
5276      AllocType = ConsArrayT->getElementType();
5277    } else if (const DependentSizedArrayType *DepArrayT
5278                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
5279      if (DepArrayT->getSizeExpr()) {
5280        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain());
5281        AllocType = DepArrayT->getElementType();
5282      }
5283    }
5284  }
5285  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
5286                                        E->isGlobalNew(),
5287                                        /*FIXME:*/E->getLocStart(),
5288                                        move_arg(PlacementArgs),
5289                                        /*FIXME:*/E->getLocStart(),
5290                                        E->isParenTypeId(),
5291                                        AllocType,
5292                                        /*FIXME:*/E->getLocStart(),
5293                                        /*FIXME:*/SourceRange(),
5294                                        move(ArraySize),
5295                                        /*FIXME:*/E->getLocStart(),
5296                                        move_arg(ConstructorArgs),
5297                                        E->getLocEnd());
5298}
5299
5300template<typename Derived>
5301Sema::OwningExprResult
5302TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
5303  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
5304  if (Operand.isInvalid())
5305    return SemaRef.ExprError();
5306
5307  // Transform the delete operator, if known.
5308  FunctionDecl *OperatorDelete = 0;
5309  if (E->getOperatorDelete()) {
5310    OperatorDelete = cast_or_null<FunctionDecl>(
5311                                   getDerived().TransformDecl(E->getLocStart(),
5312                                                       E->getOperatorDelete()));
5313    if (!OperatorDelete)
5314      return SemaRef.ExprError();
5315  }
5316
5317  if (!getDerived().AlwaysRebuild() &&
5318      Operand.get() == E->getArgument() &&
5319      OperatorDelete == E->getOperatorDelete()) {
5320    // Mark any declarations we need as referenced.
5321    // FIXME: instantiation-specific.
5322    if (OperatorDelete)
5323      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
5324    return SemaRef.Owned(E->Retain());
5325  }
5326
5327  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
5328                                           E->isGlobalDelete(),
5329                                           E->isArrayForm(),
5330                                           move(Operand));
5331}
5332
5333template<typename Derived>
5334Sema::OwningExprResult
5335TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
5336                                                     CXXPseudoDestructorExpr *E) {
5337  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
5338  if (Base.isInvalid())
5339    return SemaRef.ExprError();
5340
5341  Sema::TypeTy *ObjectTypePtr = 0;
5342  bool MayBePseudoDestructor = false;
5343  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
5344                                              E->getOperatorLoc(),
5345                                        E->isArrow()? tok::arrow : tok::period,
5346                                              ObjectTypePtr,
5347                                              MayBePseudoDestructor);
5348  if (Base.isInvalid())
5349    return SemaRef.ExprError();
5350
5351  QualType ObjectType = QualType::getFromOpaquePtr(ObjectTypePtr);
5352  NestedNameSpecifier *Qualifier
5353    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5354                                                E->getQualifierRange(),
5355                                                ObjectType);
5356  if (E->getQualifier() && !Qualifier)
5357    return SemaRef.ExprError();
5358
5359  PseudoDestructorTypeStorage Destroyed;
5360  if (E->getDestroyedTypeInfo()) {
5361    TypeSourceInfo *DestroyedTypeInfo
5362      = getDerived().TransformType(E->getDestroyedTypeInfo(), ObjectType);
5363    if (!DestroyedTypeInfo)
5364      return SemaRef.ExprError();
5365    Destroyed = DestroyedTypeInfo;
5366  } else if (ObjectType->isDependentType()) {
5367    // We aren't likely to be able to resolve the identifier down to a type
5368    // now anyway, so just retain the identifier.
5369    Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
5370                                            E->getDestroyedTypeLoc());
5371  } else {
5372    // Look for a destructor known with the given name.
5373    CXXScopeSpec SS;
5374    if (Qualifier) {
5375      SS.setScopeRep(Qualifier);
5376      SS.setRange(E->getQualifierRange());
5377    }
5378
5379    Sema::TypeTy *T = SemaRef.getDestructorName(E->getTildeLoc(),
5380                                              *E->getDestroyedTypeIdentifier(),
5381                                                E->getDestroyedTypeLoc(),
5382                                                /*Scope=*/0,
5383                                                SS, ObjectTypePtr,
5384                                                false);
5385    if (!T)
5386      return SemaRef.ExprError();
5387
5388    Destroyed
5389      = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
5390                                                 E->getDestroyedTypeLoc());
5391  }
5392
5393  TypeSourceInfo *ScopeTypeInfo = 0;
5394  if (E->getScopeTypeInfo()) {
5395    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo(),
5396                                               ObjectType);
5397    if (!ScopeTypeInfo)
5398      return SemaRef.ExprError();
5399  }
5400
5401  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
5402                                                     E->getOperatorLoc(),
5403                                                     E->isArrow(),
5404                                                     Qualifier,
5405                                                     E->getQualifierRange(),
5406                                                     ScopeTypeInfo,
5407                                                     E->getColonColonLoc(),
5408                                                     E->getTildeLoc(),
5409                                                     Destroyed);
5410}
5411
5412template<typename Derived>
5413Sema::OwningExprResult
5414TreeTransform<Derived>::TransformUnresolvedLookupExpr(
5415                                                  UnresolvedLookupExpr *Old) {
5416  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
5417
5418  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
5419                 Sema::LookupOrdinaryName);
5420
5421  // Transform all the decls.
5422  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
5423         E = Old->decls_end(); I != E; ++I) {
5424    NamedDecl *InstD = static_cast<NamedDecl*>(
5425                                 getDerived().TransformDecl(Old->getNameLoc(),
5426                                                            *I));
5427    if (!InstD) {
5428      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
5429      // This can happen because of dependent hiding.
5430      if (isa<UsingShadowDecl>(*I))
5431        continue;
5432      else
5433        return SemaRef.ExprError();
5434    }
5435
5436    // Expand using declarations.
5437    if (isa<UsingDecl>(InstD)) {
5438      UsingDecl *UD = cast<UsingDecl>(InstD);
5439      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5440             E = UD->shadow_end(); I != E; ++I)
5441        R.addDecl(*I);
5442      continue;
5443    }
5444
5445    R.addDecl(InstD);
5446  }
5447
5448  // Resolve a kind, but don't do any further analysis.  If it's
5449  // ambiguous, the callee needs to deal with it.
5450  R.resolveKind();
5451
5452  // Rebuild the nested-name qualifier, if present.
5453  CXXScopeSpec SS;
5454  NestedNameSpecifier *Qualifier = 0;
5455  if (Old->getQualifier()) {
5456    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5457                                                    Old->getQualifierRange());
5458    if (!Qualifier)
5459      return SemaRef.ExprError();
5460
5461    SS.setScopeRep(Qualifier);
5462    SS.setRange(Old->getQualifierRange());
5463  }
5464
5465  if (Old->getNamingClass()) {
5466    CXXRecordDecl *NamingClass
5467      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
5468                                                            Old->getNameLoc(),
5469                                                        Old->getNamingClass()));
5470    if (!NamingClass)
5471      return SemaRef.ExprError();
5472
5473    R.setNamingClass(NamingClass);
5474  }
5475
5476  // If we have no template arguments, it's a normal declaration name.
5477  if (!Old->hasExplicitTemplateArgs())
5478    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
5479
5480  // If we have template arguments, rebuild them, then rebuild the
5481  // templateid expression.
5482  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
5483  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5484    TemplateArgumentLoc Loc;
5485    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
5486      return SemaRef.ExprError();
5487    TransArgs.addArgument(Loc);
5488  }
5489
5490  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
5491                                            TransArgs);
5492}
5493
5494template<typename Derived>
5495Sema::OwningExprResult
5496TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
5497  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
5498
5499  QualType T = getDerived().TransformType(E->getQueriedType());
5500  if (T.isNull())
5501    return SemaRef.ExprError();
5502
5503  if (!getDerived().AlwaysRebuild() &&
5504      T == E->getQueriedType())
5505    return SemaRef.Owned(E->Retain());
5506
5507  // FIXME: Bad location information
5508  SourceLocation FakeLParenLoc
5509    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
5510
5511  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
5512                                            E->getLocStart(),
5513                                            /*FIXME:*/FakeLParenLoc,
5514                                            T,
5515                                            E->getLocEnd());
5516}
5517
5518template<typename Derived>
5519Sema::OwningExprResult
5520TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
5521                                                  DependentScopeDeclRefExpr *E) {
5522  NestedNameSpecifier *NNS
5523    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5524                                                E->getQualifierRange());
5525  if (!NNS)
5526    return SemaRef.ExprError();
5527
5528  DeclarationName Name
5529    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
5530  if (!Name)
5531    return SemaRef.ExprError();
5532
5533  if (!E->hasExplicitTemplateArgs()) {
5534    if (!getDerived().AlwaysRebuild() &&
5535        NNS == E->getQualifier() &&
5536        Name == E->getDeclName())
5537      return SemaRef.Owned(E->Retain());
5538
5539    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5540                                                         E->getQualifierRange(),
5541                                                         Name, E->getLocation(),
5542                                                         /*TemplateArgs*/ 0);
5543  }
5544
5545  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
5546  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5547    TemplateArgumentLoc Loc;
5548    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
5549      return SemaRef.ExprError();
5550    TransArgs.addArgument(Loc);
5551  }
5552
5553  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5554                                                       E->getQualifierRange(),
5555                                                       Name, E->getLocation(),
5556                                                       &TransArgs);
5557}
5558
5559template<typename Derived>
5560Sema::OwningExprResult
5561TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
5562  // CXXConstructExprs are always implicit, so when we have a
5563  // 1-argument construction we just transform that argument.
5564  if (E->getNumArgs() == 1 ||
5565      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
5566    return getDerived().TransformExpr(E->getArg(0));
5567
5568  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
5569
5570  QualType T = getDerived().TransformType(E->getType());
5571  if (T.isNull())
5572    return SemaRef.ExprError();
5573
5574  CXXConstructorDecl *Constructor
5575    = cast_or_null<CXXConstructorDecl>(
5576                                getDerived().TransformDecl(E->getLocStart(),
5577                                                         E->getConstructor()));
5578  if (!Constructor)
5579    return SemaRef.ExprError();
5580
5581  bool ArgumentChanged = false;
5582  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5583  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
5584       ArgEnd = E->arg_end();
5585       Arg != ArgEnd; ++Arg) {
5586    if (getDerived().DropCallArgument(*Arg)) {
5587      ArgumentChanged = true;
5588      break;
5589    }
5590
5591    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5592    if (TransArg.isInvalid())
5593      return SemaRef.ExprError();
5594
5595    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5596    Args.push_back(TransArg.takeAs<Expr>());
5597  }
5598
5599  if (!getDerived().AlwaysRebuild() &&
5600      T == E->getType() &&
5601      Constructor == E->getConstructor() &&
5602      !ArgumentChanged) {
5603    // Mark the constructor as referenced.
5604    // FIXME: Instantiation-specific
5605    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5606    return SemaRef.Owned(E->Retain());
5607  }
5608
5609  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
5610                                              Constructor, E->isElidable(),
5611                                              move_arg(Args));
5612}
5613
5614/// \brief Transform a C++ temporary-binding expression.
5615///
5616/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
5617/// transform the subexpression and return that.
5618template<typename Derived>
5619Sema::OwningExprResult
5620TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
5621  return getDerived().TransformExpr(E->getSubExpr());
5622}
5623
5624/// \brief Transform a C++ reference-binding expression.
5625///
5626/// Since CXXBindReferenceExpr nodes are implicitly generated, we just
5627/// transform the subexpression and return that.
5628template<typename Derived>
5629Sema::OwningExprResult
5630TreeTransform<Derived>::TransformCXXBindReferenceExpr(CXXBindReferenceExpr *E) {
5631  return getDerived().TransformExpr(E->getSubExpr());
5632}
5633
5634/// \brief Transform a C++ expression that contains temporaries that should
5635/// be destroyed after the expression is evaluated.
5636///
5637/// Since CXXExprWithTemporaries nodes are implicitly generated, we
5638/// just transform the subexpression and return that.
5639template<typename Derived>
5640Sema::OwningExprResult
5641TreeTransform<Derived>::TransformCXXExprWithTemporaries(
5642                                                    CXXExprWithTemporaries *E) {
5643  return getDerived().TransformExpr(E->getSubExpr());
5644}
5645
5646template<typename Derived>
5647Sema::OwningExprResult
5648TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
5649                                                      CXXTemporaryObjectExpr *E) {
5650  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5651  QualType T = getDerived().TransformType(E->getType());
5652  if (T.isNull())
5653    return SemaRef.ExprError();
5654
5655  CXXConstructorDecl *Constructor
5656    = cast_or_null<CXXConstructorDecl>(
5657                                  getDerived().TransformDecl(E->getLocStart(),
5658                                                         E->getConstructor()));
5659  if (!Constructor)
5660    return SemaRef.ExprError();
5661
5662  bool ArgumentChanged = false;
5663  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5664  Args.reserve(E->getNumArgs());
5665  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
5666                                         ArgEnd = E->arg_end();
5667       Arg != ArgEnd; ++Arg) {
5668    if (getDerived().DropCallArgument(*Arg)) {
5669      ArgumentChanged = true;
5670      break;
5671    }
5672
5673    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5674    if (TransArg.isInvalid())
5675      return SemaRef.ExprError();
5676
5677    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5678    Args.push_back((Expr *)TransArg.release());
5679  }
5680
5681  if (!getDerived().AlwaysRebuild() &&
5682      T == E->getType() &&
5683      Constructor == E->getConstructor() &&
5684      !ArgumentChanged) {
5685    // FIXME: Instantiation-specific
5686    SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor);
5687    return SemaRef.MaybeBindToTemporary(E->Retain());
5688  }
5689
5690  // FIXME: Bogus location information
5691  SourceLocation CommaLoc;
5692  if (Args.size() > 1) {
5693    Expr *First = (Expr *)Args[0];
5694    CommaLoc
5695      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
5696  }
5697  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
5698                                                    T,
5699                                                /*FIXME:*/E->getTypeBeginLoc(),
5700                                                    move_arg(Args),
5701                                                    &CommaLoc,
5702                                                    E->getLocEnd());
5703}
5704
5705template<typename Derived>
5706Sema::OwningExprResult
5707TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
5708                                                  CXXUnresolvedConstructExpr *E) {
5709  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5710  QualType T = getDerived().TransformType(E->getTypeAsWritten());
5711  if (T.isNull())
5712    return SemaRef.ExprError();
5713
5714  bool ArgumentChanged = false;
5715  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5716  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
5717  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
5718                                             ArgEnd = E->arg_end();
5719       Arg != ArgEnd; ++Arg) {
5720    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5721    if (TransArg.isInvalid())
5722      return SemaRef.ExprError();
5723
5724    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5725    FakeCommaLocs.push_back(
5726                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
5727    Args.push_back(TransArg.takeAs<Expr>());
5728  }
5729
5730  if (!getDerived().AlwaysRebuild() &&
5731      T == E->getTypeAsWritten() &&
5732      !ArgumentChanged)
5733    return SemaRef.Owned(E->Retain());
5734
5735  // FIXME: we're faking the locations of the commas
5736  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
5737                                                        T,
5738                                                        E->getLParenLoc(),
5739                                                        move_arg(Args),
5740                                                        FakeCommaLocs.data(),
5741                                                        E->getRParenLoc());
5742}
5743
5744template<typename Derived>
5745Sema::OwningExprResult
5746TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
5747                                                     CXXDependentScopeMemberExpr *E) {
5748  // Transform the base of the expression.
5749  OwningExprResult Base(SemaRef, (Expr*) 0);
5750  Expr *OldBase;
5751  QualType BaseType;
5752  QualType ObjectType;
5753  if (!E->isImplicitAccess()) {
5754    OldBase = E->getBase();
5755    Base = getDerived().TransformExpr(OldBase);
5756    if (Base.isInvalid())
5757      return SemaRef.ExprError();
5758
5759    // Start the member reference and compute the object's type.
5760    Sema::TypeTy *ObjectTy = 0;
5761    bool MayBePseudoDestructor = false;
5762    Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
5763                                                E->getOperatorLoc(),
5764                                      E->isArrow()? tok::arrow : tok::period,
5765                                                ObjectTy,
5766                                                MayBePseudoDestructor);
5767    if (Base.isInvalid())
5768      return SemaRef.ExprError();
5769
5770    ObjectType = QualType::getFromOpaquePtr(ObjectTy);
5771    BaseType = ((Expr*) Base.get())->getType();
5772  } else {
5773    OldBase = 0;
5774    BaseType = getDerived().TransformType(E->getBaseType());
5775    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
5776  }
5777
5778  // Transform the first part of the nested-name-specifier that qualifies
5779  // the member name.
5780  NamedDecl *FirstQualifierInScope
5781    = getDerived().TransformFirstQualifierInScope(
5782                                          E->getFirstQualifierFoundInScope(),
5783                                          E->getQualifierRange().getBegin());
5784
5785  NestedNameSpecifier *Qualifier = 0;
5786  if (E->getQualifier()) {
5787    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5788                                                      E->getQualifierRange(),
5789                                                      ObjectType,
5790                                                      FirstQualifierInScope);
5791    if (!Qualifier)
5792      return SemaRef.ExprError();
5793  }
5794
5795  DeclarationName Name
5796    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
5797                                            ObjectType);
5798  if (!Name)
5799    return SemaRef.ExprError();
5800
5801  if (!E->hasExplicitTemplateArgs()) {
5802    // This is a reference to a member without an explicitly-specified
5803    // template argument list. Optimize for this common case.
5804    if (!getDerived().AlwaysRebuild() &&
5805        Base.get() == OldBase &&
5806        BaseType == E->getBaseType() &&
5807        Qualifier == E->getQualifier() &&
5808        Name == E->getMember() &&
5809        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
5810      return SemaRef.Owned(E->Retain());
5811
5812    return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5813                                                       BaseType,
5814                                                       E->isArrow(),
5815                                                       E->getOperatorLoc(),
5816                                                       Qualifier,
5817                                                       E->getQualifierRange(),
5818                                                       FirstQualifierInScope,
5819                                                       Name,
5820                                                       E->getMemberLoc(),
5821                                                       /*TemplateArgs*/ 0);
5822  }
5823
5824  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
5825  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5826    TemplateArgumentLoc Loc;
5827    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
5828      return SemaRef.ExprError();
5829    TransArgs.addArgument(Loc);
5830  }
5831
5832  return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5833                                                     BaseType,
5834                                                     E->isArrow(),
5835                                                     E->getOperatorLoc(),
5836                                                     Qualifier,
5837                                                     E->getQualifierRange(),
5838                                                     FirstQualifierInScope,
5839                                                     Name,
5840                                                     E->getMemberLoc(),
5841                                                     &TransArgs);
5842}
5843
5844template<typename Derived>
5845Sema::OwningExprResult
5846TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
5847  // Transform the base of the expression.
5848  OwningExprResult Base(SemaRef, (Expr*) 0);
5849  QualType BaseType;
5850  if (!Old->isImplicitAccess()) {
5851    Base = getDerived().TransformExpr(Old->getBase());
5852    if (Base.isInvalid())
5853      return SemaRef.ExprError();
5854    BaseType = ((Expr*) Base.get())->getType();
5855  } else {
5856    BaseType = getDerived().TransformType(Old->getBaseType());
5857  }
5858
5859  NestedNameSpecifier *Qualifier = 0;
5860  if (Old->getQualifier()) {
5861    Qualifier
5862      = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5863                                                  Old->getQualifierRange());
5864    if (Qualifier == 0)
5865      return SemaRef.ExprError();
5866  }
5867
5868  LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(),
5869                 Sema::LookupOrdinaryName);
5870
5871  // Transform all the decls.
5872  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
5873         E = Old->decls_end(); I != E; ++I) {
5874    NamedDecl *InstD = static_cast<NamedDecl*>(
5875                                getDerived().TransformDecl(Old->getMemberLoc(),
5876                                                           *I));
5877    if (!InstD) {
5878      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
5879      // This can happen because of dependent hiding.
5880      if (isa<UsingShadowDecl>(*I))
5881        continue;
5882      else
5883        return SemaRef.ExprError();
5884    }
5885
5886    // Expand using declarations.
5887    if (isa<UsingDecl>(InstD)) {
5888      UsingDecl *UD = cast<UsingDecl>(InstD);
5889      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5890             E = UD->shadow_end(); I != E; ++I)
5891        R.addDecl(*I);
5892      continue;
5893    }
5894
5895    R.addDecl(InstD);
5896  }
5897
5898  R.resolveKind();
5899
5900  // Determine the naming class.
5901  if (!Old->getNamingClass()) {
5902    CXXRecordDecl *NamingClass
5903      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
5904                                                          Old->getMemberLoc(),
5905                                                        Old->getNamingClass()));
5906    if (!NamingClass)
5907      return SemaRef.ExprError();
5908
5909    R.setNamingClass(NamingClass);
5910  }
5911
5912  TemplateArgumentListInfo TransArgs;
5913  if (Old->hasExplicitTemplateArgs()) {
5914    TransArgs.setLAngleLoc(Old->getLAngleLoc());
5915    TransArgs.setRAngleLoc(Old->getRAngleLoc());
5916    for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5917      TemplateArgumentLoc Loc;
5918      if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I],
5919                                                 Loc))
5920        return SemaRef.ExprError();
5921      TransArgs.addArgument(Loc);
5922    }
5923  }
5924
5925  // FIXME: to do this check properly, we will need to preserve the
5926  // first-qualifier-in-scope here, just in case we had a dependent
5927  // base (and therefore couldn't do the check) and a
5928  // nested-name-qualifier (and therefore could do the lookup).
5929  NamedDecl *FirstQualifierInScope = 0;
5930
5931  return getDerived().RebuildUnresolvedMemberExpr(move(Base),
5932                                                  BaseType,
5933                                                  Old->getOperatorLoc(),
5934                                                  Old->isArrow(),
5935                                                  Qualifier,
5936                                                  Old->getQualifierRange(),
5937                                                  FirstQualifierInScope,
5938                                                  R,
5939                                              (Old->hasExplicitTemplateArgs()
5940                                                  ? &TransArgs : 0));
5941}
5942
5943template<typename Derived>
5944Sema::OwningExprResult
5945TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
5946  return SemaRef.Owned(E->Retain());
5947}
5948
5949template<typename Derived>
5950Sema::OwningExprResult
5951TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
5952  TypeSourceInfo *EncodedTypeInfo
5953    = getDerived().TransformType(E->getEncodedTypeSourceInfo());
5954  if (!EncodedTypeInfo)
5955    return SemaRef.ExprError();
5956
5957  if (!getDerived().AlwaysRebuild() &&
5958      EncodedTypeInfo == E->getEncodedTypeSourceInfo())
5959    return SemaRef.Owned(E->Retain());
5960
5961  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
5962                                            EncodedTypeInfo,
5963                                            E->getRParenLoc());
5964}
5965
5966template<typename Derived>
5967Sema::OwningExprResult
5968TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
5969  // Transform arguments.
5970  bool ArgChanged = false;
5971  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5972  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
5973    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
5974    if (Arg.isInvalid())
5975      return SemaRef.ExprError();
5976
5977    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
5978    Args.push_back(Arg.takeAs<Expr>());
5979  }
5980
5981  if (E->getReceiverKind() == ObjCMessageExpr::Class) {
5982    // Class message: transform the receiver type.
5983    TypeSourceInfo *ReceiverTypeInfo
5984      = getDerived().TransformType(E->getClassReceiverTypeInfo());
5985    if (!ReceiverTypeInfo)
5986      return SemaRef.ExprError();
5987
5988    // If nothing changed, just retain the existing message send.
5989    if (!getDerived().AlwaysRebuild() &&
5990        ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
5991      return SemaRef.Owned(E->Retain());
5992
5993    // Build a new class message send.
5994    return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
5995                                               E->getSelector(),
5996                                               E->getMethodDecl(),
5997                                               E->getLeftLoc(),
5998                                               move_arg(Args),
5999                                               E->getRightLoc());
6000  }
6001
6002  // Instance message: transform the receiver
6003  assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
6004         "Only class and instance messages may be instantiated");
6005  OwningExprResult Receiver
6006    = getDerived().TransformExpr(E->getInstanceReceiver());
6007  if (Receiver.isInvalid())
6008    return SemaRef.ExprError();
6009
6010  // If nothing changed, just retain the existing message send.
6011  if (!getDerived().AlwaysRebuild() &&
6012      Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
6013    return SemaRef.Owned(E->Retain());
6014
6015  // Build a new instance message send.
6016  return getDerived().RebuildObjCMessageExpr(move(Receiver),
6017                                             E->getSelector(),
6018                                             E->getMethodDecl(),
6019                                             E->getLeftLoc(),
6020                                             move_arg(Args),
6021                                             E->getRightLoc());
6022}
6023
6024template<typename Derived>
6025Sema::OwningExprResult
6026TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
6027  return SemaRef.Owned(E->Retain());
6028}
6029
6030template<typename Derived>
6031Sema::OwningExprResult
6032TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
6033  return SemaRef.Owned(E->Retain());
6034}
6035
6036template<typename Derived>
6037Sema::OwningExprResult
6038TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
6039  // Transform the base expression.
6040  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6041  if (Base.isInvalid())
6042    return SemaRef.ExprError();
6043
6044  // We don't need to transform the ivar; it will never change.
6045
6046  // If nothing changed, just retain the existing expression.
6047  if (!getDerived().AlwaysRebuild() &&
6048      Base.get() == E->getBase())
6049    return SemaRef.Owned(E->Retain());
6050
6051  return getDerived().RebuildObjCIvarRefExpr(move(Base), E->getDecl(),
6052                                             E->getLocation(),
6053                                             E->isArrow(), E->isFreeIvar());
6054}
6055
6056template<typename Derived>
6057Sema::OwningExprResult
6058TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
6059  // Transform the base expression.
6060  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6061  if (Base.isInvalid())
6062    return SemaRef.ExprError();
6063
6064  // We don't need to transform the property; it will never change.
6065
6066  // If nothing changed, just retain the existing expression.
6067  if (!getDerived().AlwaysRebuild() &&
6068      Base.get() == E->getBase())
6069    return SemaRef.Owned(E->Retain());
6070
6071  return getDerived().RebuildObjCPropertyRefExpr(move(Base), E->getProperty(),
6072                                                 E->getLocation());
6073}
6074
6075template<typename Derived>
6076Sema::OwningExprResult
6077TreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
6078                                          ObjCImplicitSetterGetterRefExpr *E) {
6079  // If this implicit setter/getter refers to class methods, it cannot have any
6080  // dependent parts. Just retain the existing declaration.
6081  if (E->getInterfaceDecl())
6082    return SemaRef.Owned(E->Retain());
6083
6084  // Transform the base expression.
6085  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6086  if (Base.isInvalid())
6087    return SemaRef.ExprError();
6088
6089  // We don't need to transform the getters/setters; they will never change.
6090
6091  // If nothing changed, just retain the existing expression.
6092  if (!getDerived().AlwaysRebuild() &&
6093      Base.get() == E->getBase())
6094    return SemaRef.Owned(E->Retain());
6095
6096  return getDerived().RebuildObjCImplicitSetterGetterRefExpr(
6097                                                          E->getGetterMethod(),
6098                                                             E->getType(),
6099                                                          E->getSetterMethod(),
6100                                                             E->getLocation(),
6101                                                             move(Base));
6102
6103}
6104
6105template<typename Derived>
6106Sema::OwningExprResult
6107TreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
6108  // Can never occur in a dependent context.
6109  return SemaRef.Owned(E->Retain());
6110}
6111
6112template<typename Derived>
6113Sema::OwningExprResult
6114TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
6115  // Transform the base expression.
6116  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6117  if (Base.isInvalid())
6118    return SemaRef.ExprError();
6119
6120  // If nothing changed, just retain the existing expression.
6121  if (!getDerived().AlwaysRebuild() &&
6122      Base.get() == E->getBase())
6123    return SemaRef.Owned(E->Retain());
6124
6125  return getDerived().RebuildObjCIsaExpr(move(Base), E->getIsaMemberLoc(),
6126                                         E->isArrow());
6127}
6128
6129template<typename Derived>
6130Sema::OwningExprResult
6131TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
6132  bool ArgumentChanged = false;
6133  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
6134  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
6135    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
6136    if (SubExpr.isInvalid())
6137      return SemaRef.ExprError();
6138
6139    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
6140    SubExprs.push_back(SubExpr.takeAs<Expr>());
6141  }
6142
6143  if (!getDerived().AlwaysRebuild() &&
6144      !ArgumentChanged)
6145    return SemaRef.Owned(E->Retain());
6146
6147  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
6148                                               move_arg(SubExprs),
6149                                               E->getRParenLoc());
6150}
6151
6152template<typename Derived>
6153Sema::OwningExprResult
6154TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
6155  // FIXME: Implement this!
6156  assert(false && "Cannot transform block expressions yet");
6157  return SemaRef.Owned(E->Retain());
6158}
6159
6160template<typename Derived>
6161Sema::OwningExprResult
6162TreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
6163  // FIXME: Implement this!
6164  assert(false && "Cannot transform block-related expressions yet");
6165  return SemaRef.Owned(E->Retain());
6166}
6167
6168//===----------------------------------------------------------------------===//
6169// Type reconstruction
6170//===----------------------------------------------------------------------===//
6171
6172template<typename Derived>
6173QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
6174                                                    SourceLocation Star) {
6175  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star,
6176                                  getDerived().getBaseEntity());
6177}
6178
6179template<typename Derived>
6180QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
6181                                                         SourceLocation Star) {
6182  return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star,
6183                                       getDerived().getBaseEntity());
6184}
6185
6186template<typename Derived>
6187QualType
6188TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
6189                                             bool WrittenAsLValue,
6190                                             SourceLocation Sigil) {
6191  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(),
6192                                    Sigil, getDerived().getBaseEntity());
6193}
6194
6195template<typename Derived>
6196QualType
6197TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
6198                                                 QualType ClassType,
6199                                                 SourceLocation Sigil) {
6200  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
6201                                        Sigil, getDerived().getBaseEntity());
6202}
6203
6204template<typename Derived>
6205QualType
6206TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
6207                                         ArrayType::ArraySizeModifier SizeMod,
6208                                         const llvm::APInt *Size,
6209                                         Expr *SizeExpr,
6210                                         unsigned IndexTypeQuals,
6211                                         SourceRange BracketsRange) {
6212  if (SizeExpr || !Size)
6213    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
6214                                  IndexTypeQuals, BracketsRange,
6215                                  getDerived().getBaseEntity());
6216
6217  QualType Types[] = {
6218    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
6219    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
6220    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
6221  };
6222  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
6223  QualType SizeType;
6224  for (unsigned I = 0; I != NumTypes; ++I)
6225    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
6226      SizeType = Types[I];
6227      break;
6228    }
6229
6230  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
6231  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
6232                                IndexTypeQuals, BracketsRange,
6233                                getDerived().getBaseEntity());
6234}
6235
6236template<typename Derived>
6237QualType
6238TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
6239                                                 ArrayType::ArraySizeModifier SizeMod,
6240                                                 const llvm::APInt &Size,
6241                                                 unsigned IndexTypeQuals,
6242                                                 SourceRange BracketsRange) {
6243  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
6244                                        IndexTypeQuals, BracketsRange);
6245}
6246
6247template<typename Derived>
6248QualType
6249TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
6250                                          ArrayType::ArraySizeModifier SizeMod,
6251                                                 unsigned IndexTypeQuals,
6252                                                   SourceRange BracketsRange) {
6253  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
6254                                       IndexTypeQuals, BracketsRange);
6255}
6256
6257template<typename Derived>
6258QualType
6259TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
6260                                          ArrayType::ArraySizeModifier SizeMod,
6261                                                 ExprArg SizeExpr,
6262                                                 unsigned IndexTypeQuals,
6263                                                 SourceRange BracketsRange) {
6264  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
6265                                       SizeExpr.takeAs<Expr>(),
6266                                       IndexTypeQuals, BracketsRange);
6267}
6268
6269template<typename Derived>
6270QualType
6271TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
6272                                          ArrayType::ArraySizeModifier SizeMod,
6273                                                       ExprArg SizeExpr,
6274                                                       unsigned IndexTypeQuals,
6275                                                   SourceRange BracketsRange) {
6276  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
6277                                       SizeExpr.takeAs<Expr>(),
6278                                       IndexTypeQuals, BracketsRange);
6279}
6280
6281template<typename Derived>
6282QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
6283                                       unsigned NumElements,
6284                                       bool IsAltiVec, bool IsPixel) {
6285  // FIXME: semantic checking!
6286  return SemaRef.Context.getVectorType(ElementType, NumElements,
6287                                       IsAltiVec, IsPixel);
6288}
6289
6290template<typename Derived>
6291QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
6292                                                      unsigned NumElements,
6293                                                 SourceLocation AttributeLoc) {
6294  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
6295                          NumElements, true);
6296  IntegerLiteral *VectorSize
6297    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
6298                                           AttributeLoc);
6299  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
6300                                    AttributeLoc);
6301}
6302
6303template<typename Derived>
6304QualType
6305TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
6306                                                           ExprArg SizeExpr,
6307                                                  SourceLocation AttributeLoc) {
6308  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
6309}
6310
6311template<typename Derived>
6312QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
6313                                                          QualType *ParamTypes,
6314                                                        unsigned NumParamTypes,
6315                                                          bool Variadic,
6316                                                          unsigned Quals) {
6317  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
6318                                   Quals,
6319                                   getDerived().getBaseLocation(),
6320                                   getDerived().getBaseEntity());
6321}
6322
6323template<typename Derived>
6324QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
6325  return SemaRef.Context.getFunctionNoProtoType(T);
6326}
6327
6328template<typename Derived>
6329QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
6330  assert(D && "no decl found");
6331  if (D->isInvalidDecl()) return QualType();
6332
6333  // FIXME: Doesn't account for ObjCInterfaceDecl!
6334  TypeDecl *Ty;
6335  if (isa<UsingDecl>(D)) {
6336    UsingDecl *Using = cast<UsingDecl>(D);
6337    assert(Using->isTypeName() &&
6338           "UnresolvedUsingTypenameDecl transformed to non-typename using");
6339
6340    // A valid resolved using typename decl points to exactly one type decl.
6341    assert(++Using->shadow_begin() == Using->shadow_end());
6342    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
6343
6344  } else {
6345    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
6346           "UnresolvedUsingTypenameDecl transformed to non-using decl");
6347    Ty = cast<UnresolvedUsingTypenameDecl>(D);
6348  }
6349
6350  return SemaRef.Context.getTypeDeclType(Ty);
6351}
6352
6353template<typename Derived>
6354QualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
6355  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
6356}
6357
6358template<typename Derived>
6359QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
6360  return SemaRef.Context.getTypeOfType(Underlying);
6361}
6362
6363template<typename Derived>
6364QualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
6365  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
6366}
6367
6368template<typename Derived>
6369QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
6370                                                      TemplateName Template,
6371                                             SourceLocation TemplateNameLoc,
6372                               const TemplateArgumentListInfo &TemplateArgs) {
6373  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
6374}
6375
6376template<typename Derived>
6377NestedNameSpecifier *
6378TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6379                                                   SourceRange Range,
6380                                                   IdentifierInfo &II,
6381                                                   QualType ObjectType,
6382                                                   NamedDecl *FirstQualifierInScope) {
6383  CXXScopeSpec SS;
6384  // FIXME: The source location information is all wrong.
6385  SS.setRange(Range);
6386  SS.setScopeRep(Prefix);
6387  return static_cast<NestedNameSpecifier *>(
6388                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
6389                                                        Range.getEnd(), II,
6390                                                        ObjectType,
6391                                                        FirstQualifierInScope,
6392                                                        false, false));
6393}
6394
6395template<typename Derived>
6396NestedNameSpecifier *
6397TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6398                                                   SourceRange Range,
6399                                                   NamespaceDecl *NS) {
6400  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
6401}
6402
6403template<typename Derived>
6404NestedNameSpecifier *
6405TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6406                                                   SourceRange Range,
6407                                                   bool TemplateKW,
6408                                                   QualType T) {
6409  if (T->isDependentType() || T->isRecordType() ||
6410      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
6411    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
6412    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
6413                                       T.getTypePtr());
6414  }
6415
6416  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
6417  return 0;
6418}
6419
6420template<typename Derived>
6421TemplateName
6422TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6423                                            bool TemplateKW,
6424                                            TemplateDecl *Template) {
6425  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
6426                                                  Template);
6427}
6428
6429template<typename Derived>
6430TemplateName
6431TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6432                                            const IdentifierInfo &II,
6433                                            QualType ObjectType) {
6434  CXXScopeSpec SS;
6435  SS.setRange(SourceRange(getDerived().getBaseLocation()));
6436  SS.setScopeRep(Qualifier);
6437  UnqualifiedId Name;
6438  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
6439  return getSema().ActOnDependentTemplateName(
6440                                      /*FIXME:*/getDerived().getBaseLocation(),
6441                                              SS,
6442                                              Name,
6443                                              ObjectType.getAsOpaquePtr(),
6444                                              /*EnteringContext=*/false)
6445           .template getAsVal<TemplateName>();
6446}
6447
6448template<typename Derived>
6449TemplateName
6450TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6451                                            OverloadedOperatorKind Operator,
6452                                            QualType ObjectType) {
6453  CXXScopeSpec SS;
6454  SS.setRange(SourceRange(getDerived().getBaseLocation()));
6455  SS.setScopeRep(Qualifier);
6456  UnqualifiedId Name;
6457  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
6458  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
6459                             Operator, SymbolLocations);
6460  return getSema().ActOnDependentTemplateName(
6461                                       /*FIXME:*/getDerived().getBaseLocation(),
6462                                              SS,
6463                                              Name,
6464                                              ObjectType.getAsOpaquePtr(),
6465                                              /*EnteringContext=*/false)
6466           .template getAsVal<TemplateName>();
6467}
6468
6469template<typename Derived>
6470Sema::OwningExprResult
6471TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
6472                                                   SourceLocation OpLoc,
6473                                                   ExprArg Callee,
6474                                                   ExprArg First,
6475                                                   ExprArg Second) {
6476  Expr *FirstExpr = (Expr *)First.get();
6477  Expr *SecondExpr = (Expr *)Second.get();
6478  Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts();
6479  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
6480
6481  // Determine whether this should be a builtin operation.
6482  if (Op == OO_Subscript) {
6483    if (!FirstExpr->getType()->isOverloadableType() &&
6484        !SecondExpr->getType()->isOverloadableType())
6485      return getSema().CreateBuiltinArraySubscriptExpr(move(First),
6486                                                 CalleeExpr->getLocStart(),
6487                                                       move(Second), OpLoc);
6488  } else if (Op == OO_Arrow) {
6489    // -> is never a builtin operation.
6490    return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc);
6491  } else if (SecondExpr == 0 || isPostIncDec) {
6492    if (!FirstExpr->getType()->isOverloadableType()) {
6493      // The argument is not of overloadable type, so try to create a
6494      // built-in unary operation.
6495      UnaryOperator::Opcode Opc
6496        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
6497
6498      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
6499    }
6500  } else {
6501    if (!FirstExpr->getType()->isOverloadableType() &&
6502        !SecondExpr->getType()->isOverloadableType()) {
6503      // Neither of the arguments is an overloadable type, so try to
6504      // create a built-in binary operation.
6505      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
6506      OwningExprResult Result
6507        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
6508      if (Result.isInvalid())
6509        return SemaRef.ExprError();
6510
6511      First.release();
6512      Second.release();
6513      return move(Result);
6514    }
6515  }
6516
6517  // Compute the transformed set of functions (and function templates) to be
6518  // used during overload resolution.
6519  UnresolvedSet<16> Functions;
6520
6521  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) {
6522    assert(ULE->requiresADL());
6523
6524    // FIXME: Do we have to check
6525    // IsAcceptableNonMemberOperatorCandidate for each of these?
6526    Functions.append(ULE->decls_begin(), ULE->decls_end());
6527  } else {
6528    Functions.addDecl(cast<DeclRefExpr>(CalleeExpr)->getDecl());
6529  }
6530
6531  // Add any functions found via argument-dependent lookup.
6532  Expr *Args[2] = { FirstExpr, SecondExpr };
6533  unsigned NumArgs = 1 + (SecondExpr != 0);
6534
6535  // Create the overloaded operator invocation for unary operators.
6536  if (NumArgs == 1 || isPostIncDec) {
6537    UnaryOperator::Opcode Opc
6538      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
6539    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
6540  }
6541
6542  if (Op == OO_Subscript)
6543    return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(),
6544                                                      OpLoc,
6545                                                      move(First),
6546                                                      move(Second));
6547
6548  // Create the overloaded operator invocation for binary operators.
6549  BinaryOperator::Opcode Opc =
6550    BinaryOperator::getOverloadedOpcode(Op);
6551  OwningExprResult Result
6552    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
6553  if (Result.isInvalid())
6554    return SemaRef.ExprError();
6555
6556  First.release();
6557  Second.release();
6558  return move(Result);
6559}
6560
6561template<typename Derived>
6562Sema::OwningExprResult
6563TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(ExprArg Base,
6564                                                     SourceLocation OperatorLoc,
6565                                                       bool isArrow,
6566                                                 NestedNameSpecifier *Qualifier,
6567                                                     SourceRange QualifierRange,
6568                                                     TypeSourceInfo *ScopeType,
6569                                                       SourceLocation CCLoc,
6570                                                       SourceLocation TildeLoc,
6571                                        PseudoDestructorTypeStorage Destroyed) {
6572  CXXScopeSpec SS;
6573  if (Qualifier) {
6574    SS.setRange(QualifierRange);
6575    SS.setScopeRep(Qualifier);
6576  }
6577
6578  Expr *BaseE = (Expr *)Base.get();
6579  QualType BaseType = BaseE->getType();
6580  if (BaseE->isTypeDependent() || Destroyed.getIdentifier() ||
6581      (!isArrow && !BaseType->getAs<RecordType>()) ||
6582      (isArrow && BaseType->getAs<PointerType>() &&
6583       !BaseType->getAs<PointerType>()->getPointeeType()
6584                                              ->template getAs<RecordType>())){
6585    // This pseudo-destructor expression is still a pseudo-destructor.
6586    return SemaRef.BuildPseudoDestructorExpr(move(Base), OperatorLoc,
6587                                             isArrow? tok::arrow : tok::period,
6588                                             SS, ScopeType, CCLoc, TildeLoc,
6589                                             Destroyed,
6590                                             /*FIXME?*/true);
6591  }
6592
6593  TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
6594  DeclarationName Name
6595    = SemaRef.Context.DeclarationNames.getCXXDestructorName(
6596                SemaRef.Context.getCanonicalType(DestroyedType->getType()));
6597
6598  // FIXME: the ScopeType should be tacked onto SS.
6599
6600  return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
6601                                            OperatorLoc, isArrow,
6602                                            SS, /*FIXME: FirstQualifier*/ 0,
6603                                            Name, Destroyed.getLocation(),
6604                                            /*TemplateArgs*/ 0);
6605}
6606
6607} // end namespace clang
6608
6609#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
6610