TreeTransform.h revision dd62b15665a4144c45c1f7c53665414ad5f7f4f2
1//===------- TreeTransform.h - Semantic Tree Transformation ---------------===/
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 "clang/Sema/SemaDiagnostic.h"
18#include "clang/AST/Decl.h"
19#include "clang/AST/Expr.h"
20#include "clang/AST/ExprCXX.h"
21#include "clang/AST/ExprObjC.h"
22#include "clang/AST/Stmt.h"
23#include "clang/AST/StmtCXX.h"
24#include "clang/AST/StmtObjC.h"
25#include "clang/Parse/Ownership.h"
26#include "clang/Parse/Designator.h"
27#include "clang/Lex/Preprocessor.h"
28#include <algorithm>
29
30namespace clang {
31
32/// \brief A semantic tree transformation that allows one to transform one
33/// abstract syntax tree into another.
34///
35/// A new tree transformation is defined by creating a new subclass \c X of
36/// \c TreeTransform<X> and then overriding certain operations to provide
37/// behavior specific to that transformation. For example, template
38/// instantiation is implemented as a tree transformation where the
39/// transformation of TemplateTypeParmType nodes involves substituting the
40/// template arguments for their corresponding template parameters; a similar
41/// transformation is performed for non-type template parameters and
42/// template template parameters.
43///
44/// This tree-transformation template uses static polymorphism to allow
45/// subclasses to customize any of its operations. Thus, a subclass can
46/// override any of the transformation or rebuild operators by providing an
47/// operation with the same signature as the default implementation. The
48/// overridding function should not be virtual.
49///
50/// Semantic tree transformations are split into two stages, either of which
51/// can be replaced by a subclass. The "transform" step transforms an AST node
52/// or the parts of an AST node using the various transformation functions,
53/// then passes the pieces on to the "rebuild" step, which constructs a new AST
54/// node of the appropriate kind from the pieces. The default transformation
55/// routines recursively transform the operands to composite AST nodes (e.g.,
56/// the pointee type of a PointerType node) and, if any of those operand nodes
57/// were changed by the transformation, invokes the rebuild operation to create
58/// a new AST node.
59///
60/// Subclasses can customize the transformation at various levels. The
61/// most coarse-grained transformations involve replacing TransformType(),
62/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
63/// TransformTemplateName(), or TransformTemplateArgument() with entirely
64/// new implementations.
65///
66/// For more fine-grained transformations, subclasses can replace any of the
67/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
68/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
69/// replacing TransformTemplateTypeParmType() allows template instantiation
70/// to substitute template arguments for their corresponding template
71/// parameters. Additionally, subclasses can override the \c RebuildXXX
72/// functions to control how AST nodes are rebuilt when their operands change.
73/// By default, \c TreeTransform will invoke semantic analysis to rebuild
74/// AST nodes. However, certain other tree transformations (e.g, cloning) may
75/// be able to use more efficient rebuild steps.
76///
77/// There are a handful of other functions that can be overridden, allowing one
78/// to avoid traversing nodes that don't need any transformation
79/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
80/// operands have not changed (\c AlwaysRebuild()), and customize the
81/// default locations and entity names used for type-checking
82/// (\c getBaseLocation(), \c getBaseEntity()).
83template<typename Derived>
84class TreeTransform {
85protected:
86  Sema &SemaRef;
87
88public:
89  typedef Sema::OwningStmtResult OwningStmtResult;
90  typedef Sema::OwningExprResult OwningExprResult;
91  typedef Sema::StmtArg StmtArg;
92  typedef Sema::ExprArg ExprArg;
93  typedef Sema::MultiExprArg MultiExprArg;
94  typedef Sema::MultiStmtArg MultiStmtArg;
95
96  /// \brief Initializes a new tree transformer.
97  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
98
99  /// \brief Retrieves a reference to the derived class.
100  Derived &getDerived() { return static_cast<Derived&>(*this); }
101
102  /// \brief Retrieves a reference to the derived class.
103  const Derived &getDerived() const {
104    return static_cast<const Derived&>(*this);
105  }
106
107  /// \brief Retrieves a reference to the semantic analysis object used for
108  /// this tree transform.
109  Sema &getSema() const { return SemaRef; }
110
111  /// \brief Whether the transformation should always rebuild AST nodes, even
112  /// if none of the children have changed.
113  ///
114  /// Subclasses may override this function to specify when the transformation
115  /// should rebuild all AST nodes.
116  bool AlwaysRebuild() { return false; }
117
118  /// \brief Returns the location of the entity being transformed, if that
119  /// information was not available elsewhere in the AST.
120  ///
121  /// By default, returns no source-location information. Subclasses can
122  /// provide an alternative implementation that provides better location
123  /// information.
124  SourceLocation getBaseLocation() { return SourceLocation(); }
125
126  /// \brief Returns the name of the entity being transformed, if that
127  /// information was not available elsewhere in the AST.
128  ///
129  /// By default, returns an empty name. Subclasses can provide an alternative
130  /// implementation with a more precise name.
131  DeclarationName getBaseEntity() { return DeclarationName(); }
132
133  /// \brief Sets the "base" location and entity when that
134  /// information is known based on another transformation.
135  ///
136  /// By default, the source location and entity are ignored. Subclasses can
137  /// override this function to provide a customized implementation.
138  void setBase(SourceLocation Loc, DeclarationName Entity) { }
139
140  /// \brief RAII object that temporarily sets the base location and entity
141  /// used for reporting diagnostics in types.
142  class TemporaryBase {
143    TreeTransform &Self;
144    SourceLocation OldLocation;
145    DeclarationName OldEntity;
146
147  public:
148    TemporaryBase(TreeTransform &Self, SourceLocation Location,
149                  DeclarationName Entity) : Self(Self) {
150      OldLocation = Self.getDerived().getBaseLocation();
151      OldEntity = Self.getDerived().getBaseEntity();
152      Self.getDerived().setBase(Location, Entity);
153    }
154
155    ~TemporaryBase() {
156      Self.getDerived().setBase(OldLocation, OldEntity);
157    }
158  };
159
160  /// \brief Determine whether the given type \p T has already been
161  /// transformed.
162  ///
163  /// Subclasses can provide an alternative implementation of this routine
164  /// to short-circuit evaluation when it is known that a given type will
165  /// not change. For example, template instantiation need not traverse
166  /// non-dependent types.
167  bool AlreadyTransformed(QualType T) {
168    return T.isNull();
169  }
170
171  /// \brief Transforms the given type into another type.
172  ///
173  /// By default, this routine transforms a type by delegating to the
174  /// appropriate TransformXXXType to build a new type, then applying
175  /// the qualifiers on \p T to the resulting type with AddTypeQualifiers.
176  /// Subclasses may override this function (to take over all type
177  /// transformations), some set of the TransformXXXType functions, or
178  /// the AddTypeQualifiers function to alter the transformation.
179  ///
180  /// \returns the transformed type.
181  QualType TransformType(QualType T);
182
183  /// \brief Transform the given type by adding the given set of qualifiers
184  /// and returning the result.
185  ///
186  /// FIXME: By default, this routine adds type qualifiers only to types that
187  /// can have qualifiers, and silently suppresses those qualifiers that are
188  /// not permitted (e.g., qualifiers on reference or function types). This
189  /// is the right thing for template instantiation, but probably not for
190  /// other clients.
191  QualType AddTypeQualifiers(QualType T, Qualifiers Qs);
192
193  /// \brief Transform the given statement.
194  ///
195  /// By default, this routine transforms a statement by delegating to the
196  /// appropriate TransformXXXStmt function to transform a specific kind of
197  /// statement or the TransformExpr() function to transform an expression.
198  /// Subclasses may override this function to transform statements using some
199  /// other mechanism.
200  ///
201  /// \returns the transformed statement.
202  OwningStmtResult TransformStmt(Stmt *S);
203
204  /// \brief Transform the given expression.
205  ///
206  /// By default, this routine transforms an expression by delegating to the
207  /// appropriate TransformXXXExpr function to build a new expression.
208  /// Subclasses may override this function to transform expressions using some
209  /// other mechanism.
210  ///
211  /// \returns the transformed expression.
212  OwningExprResult TransformExpr(Expr *E) {
213    return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false);
214  }
215
216  /// \brief Transform the given expression.
217  ///
218  /// By default, this routine transforms an expression by delegating to the
219  /// appropriate TransformXXXExpr function to build a new expression.
220  /// Subclasses may override this function to transform expressions using some
221  /// other mechanism.
222  ///
223  /// \returns the transformed expression.
224  OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand);
225
226  /// \brief Transform the given declaration, which is referenced from a type
227  /// or expression.
228  ///
229  /// By default, acts as the identity function on declarations. Subclasses
230  /// may override this function to provide alternate behavior.
231  Decl *TransformDecl(Decl *D) { return D; }
232
233  /// \brief Transform the definition of the given declaration.
234  ///
235  /// By default, invokes TransformDecl() to transform the declaration.
236  /// Subclasses may override this function to provide alternate behavior.
237  Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); }
238
239  /// \brief Transform the given nested-name-specifier.
240  ///
241  /// By default, transforms all of the types and declarations within the
242  /// nested-name-specifier. Subclasses may override this function to provide
243  /// alternate behavior.
244  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
245                                                    SourceRange Range,
246                                              QualType ObjectType = QualType(),
247                                          NamedDecl *FirstQualifierInScope = 0);
248
249  /// \brief Transform the given declaration name.
250  ///
251  /// By default, transforms the types of conversion function, constructor,
252  /// and destructor names and then (if needed) rebuilds the declaration name.
253  /// Identifiers and selectors are returned unmodified. Sublcasses may
254  /// override this function to provide alternate behavior.
255  DeclarationName TransformDeclarationName(DeclarationName Name,
256                                           SourceLocation Loc,
257                                           QualType ObjectType = QualType());
258
259  /// \brief Transform the given template name.
260  ///
261  /// By default, transforms the template name by transforming the declarations
262  /// and nested-name-specifiers that occur within the template name.
263  /// Subclasses may override this function to provide alternate behavior.
264  TemplateName TransformTemplateName(TemplateName Name,
265                                     QualType ObjectType = QualType());
266
267  /// \brief Transform the given template argument.
268  ///
269  /// By default, this operation transforms the type, expression, or
270  /// declaration stored within the template argument and constructs a
271  /// new template argument from the transformed result. Subclasses may
272  /// override this function to provide alternate behavior.
273  TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg);
274
275#define ABSTRACT_TYPE(CLASS, PARENT)
276#define TYPE(CLASS, PARENT)                                   \
277  QualType Transform##CLASS##Type(const CLASS##Type *T);
278#include "clang/AST/TypeNodes.def"
279
280  QualType
281  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
282                                      QualType ObjectType);
283
284  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
285
286#define STMT(Node, Parent)                        \
287  OwningStmtResult Transform##Node(Node *S);
288#define EXPR(Node, Parent)                        \
289  OwningExprResult Transform##Node(Node *E);
290#define ABSTRACT_EXPR(Node, Parent)
291#include "clang/AST/StmtNodes.def"
292
293  /// \brief Build a new pointer type given its pointee type.
294  ///
295  /// By default, performs semantic analysis when building the pointer type.
296  /// Subclasses may override this routine to provide different behavior.
297  QualType RebuildPointerType(QualType PointeeType);
298
299  /// \brief Build a new block pointer type given its pointee type.
300  ///
301  /// By default, performs semantic analysis when building the block pointer
302  /// type. Subclasses may override this routine to provide different behavior.
303  QualType RebuildBlockPointerType(QualType PointeeType);
304
305  /// \brief Build a new lvalue reference type given the type it references.
306  ///
307  /// By default, performs semantic analysis when building the lvalue reference
308  /// type. Subclasses may override this routine to provide different behavior.
309  QualType RebuildLValueReferenceType(QualType ReferentType);
310
311  /// \brief Build a new rvalue reference type given the type it references.
312  ///
313  /// By default, performs semantic analysis when building the rvalue reference
314  /// type. Subclasses may override this routine to provide different behavior.
315  QualType RebuildRValueReferenceType(QualType ReferentType);
316
317  /// \brief Build a new member pointer type given the pointee type and the
318  /// class type it refers into.
319  ///
320  /// By default, performs semantic analysis when building the member pointer
321  /// type. Subclasses may override this routine to provide different behavior.
322  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType);
323
324  /// \brief Build a new array type given the element type, size
325  /// modifier, size of the array (if known), size expression, and index type
326  /// qualifiers.
327  ///
328  /// By default, performs semantic analysis when building the array type.
329  /// Subclasses may override this routine to provide different behavior.
330  /// Also by default, all of the other Rebuild*Array
331  QualType RebuildArrayType(QualType ElementType,
332                            ArrayType::ArraySizeModifier SizeMod,
333                            const llvm::APInt *Size,
334                            Expr *SizeExpr,
335                            unsigned IndexTypeQuals,
336                            SourceRange BracketsRange);
337
338  /// \brief Build a new constant array type given the element type, size
339  /// modifier, (known) size of the array, and index type qualifiers.
340  ///
341  /// By default, performs semantic analysis when building the array type.
342  /// Subclasses may override this routine to provide different behavior.
343  QualType RebuildConstantArrayType(QualType ElementType,
344                                    ArrayType::ArraySizeModifier SizeMod,
345                                    const llvm::APInt &Size,
346                                    unsigned IndexTypeQuals);
347
348  /// \brief Build a new incomplete array type given the element type, size
349  /// modifier, and index type qualifiers.
350  ///
351  /// By default, performs semantic analysis when building the array type.
352  /// Subclasses may override this routine to provide different behavior.
353  QualType RebuildIncompleteArrayType(QualType ElementType,
354                                      ArrayType::ArraySizeModifier SizeMod,
355                                      unsigned IndexTypeQuals);
356
357  /// \brief Build a new variable-length array type given the element type,
358  /// size modifier, size expression, and index type qualifiers.
359  ///
360  /// By default, performs semantic analysis when building the array type.
361  /// Subclasses may override this routine to provide different behavior.
362  QualType RebuildVariableArrayType(QualType ElementType,
363                                    ArrayType::ArraySizeModifier SizeMod,
364                                    ExprArg SizeExpr,
365                                    unsigned IndexTypeQuals,
366                                    SourceRange BracketsRange);
367
368  /// \brief Build a new dependent-sized array type given the element type,
369  /// size modifier, size expression, and index type qualifiers.
370  ///
371  /// By default, performs semantic analysis when building the array type.
372  /// Subclasses may override this routine to provide different behavior.
373  QualType RebuildDependentSizedArrayType(QualType ElementType,
374                                          ArrayType::ArraySizeModifier SizeMod,
375                                          ExprArg SizeExpr,
376                                          unsigned IndexTypeQuals,
377                                          SourceRange BracketsRange);
378
379  /// \brief Build a new vector type given the element type and
380  /// number of elements.
381  ///
382  /// By default, performs semantic analysis when building the vector type.
383  /// Subclasses may override this routine to provide different behavior.
384  QualType RebuildVectorType(QualType ElementType, unsigned NumElements);
385
386  /// \brief Build a new extended vector type given the element type and
387  /// number of elements.
388  ///
389  /// By default, performs semantic analysis when building the vector type.
390  /// Subclasses may override this routine to provide different behavior.
391  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
392                                SourceLocation AttributeLoc);
393
394  /// \brief Build a new potentially dependently-sized extended vector type
395  /// given the element type and number of elements.
396  ///
397  /// By default, performs semantic analysis when building the vector type.
398  /// Subclasses may override this routine to provide different behavior.
399  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
400                                              ExprArg SizeExpr,
401                                              SourceLocation AttributeLoc);
402
403  /// \brief Build a new function type.
404  ///
405  /// By default, performs semantic analysis when building the function type.
406  /// Subclasses may override this routine to provide different behavior.
407  QualType RebuildFunctionProtoType(QualType T,
408                                    QualType *ParamTypes,
409                                    unsigned NumParamTypes,
410                                    bool Variadic, unsigned Quals);
411
412  /// \brief Build a new typedef type.
413  QualType RebuildTypedefType(TypedefDecl *Typedef) {
414    return SemaRef.Context.getTypeDeclType(Typedef);
415  }
416
417  /// \brief Build a new class/struct/union type.
418  QualType RebuildRecordType(RecordDecl *Record) {
419    return SemaRef.Context.getTypeDeclType(Record);
420  }
421
422  /// \brief Build a new Enum type.
423  QualType RebuildEnumType(EnumDecl *Enum) {
424    return SemaRef.Context.getTypeDeclType(Enum);
425  }
426
427  /// \brief Build a new elaborated type.
428  QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
429    return SemaRef.Context.getElaboratedType(T, Tag);
430  }
431
432  /// \brief Build a new typeof(expr) type.
433  ///
434  /// By default, performs semantic analysis when building the typeof type.
435  /// Subclasses may override this routine to provide different behavior.
436  QualType RebuildTypeOfExprType(ExprArg Underlying);
437
438  /// \brief Build a new typeof(type) type.
439  ///
440  /// By default, builds a new TypeOfType with the given underlying type.
441  QualType RebuildTypeOfType(QualType Underlying);
442
443  /// \brief Build a new C++0x decltype type.
444  ///
445  /// By default, performs semantic analysis when building the decltype type.
446  /// Subclasses may override this routine to provide different behavior.
447  QualType RebuildDecltypeType(ExprArg Underlying);
448
449  /// \brief Build a new template specialization type.
450  ///
451  /// By default, performs semantic analysis when building the template
452  /// specialization type. Subclasses may override this routine to provide
453  /// different behavior.
454  QualType RebuildTemplateSpecializationType(TemplateName Template,
455                                             const TemplateArgument *Args,
456                                             unsigned NumArgs);
457
458  /// \brief Build a new qualified name type.
459  ///
460  /// By default, builds a new QualifiedNameType type from the
461  /// nested-name-specifier and the named type. Subclasses may override
462  /// this routine to provide different behavior.
463  QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
464    return SemaRef.Context.getQualifiedNameType(NNS, Named);
465  }
466
467  /// \brief Build a new typename type that refers to a template-id.
468  ///
469  /// By default, builds a new TypenameType type from the nested-name-specifier
470  /// and the given type. Subclasses may override this routine to provide
471  /// different behavior.
472  QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
473    if (NNS->isDependent())
474      return SemaRef.Context.getTypenameType(NNS,
475                                          cast<TemplateSpecializationType>(T));
476
477    return SemaRef.Context.getQualifiedNameType(NNS, T);
478  }
479
480  /// \brief Build a new typename type that refers to an identifier.
481  ///
482  /// By default, performs semantic analysis when building the typename type
483  /// (or qualified name type). Subclasses may override this routine to provide
484  /// different behavior.
485  QualType RebuildTypenameType(NestedNameSpecifier *NNS,
486                               const IdentifierInfo *Id) {
487    return SemaRef.CheckTypenameType(NNS, *Id,
488                                  SourceRange(getDerived().getBaseLocation()));
489  }
490
491  /// \brief Build a new nested-name-specifier given the prefix and an
492  /// identifier that names the next step in the nested-name-specifier.
493  ///
494  /// By default, performs semantic analysis when building the new
495  /// nested-name-specifier. Subclasses may override this routine to provide
496  /// different behavior.
497  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
498                                                  SourceRange Range,
499                                                  IdentifierInfo &II,
500                                                  QualType ObjectType,
501                                              NamedDecl *FirstQualifierInScope);
502
503  /// \brief Build a new nested-name-specifier given the prefix and the
504  /// namespace named in the next step in the nested-name-specifier.
505  ///
506  /// By default, performs semantic analysis when building the new
507  /// nested-name-specifier. Subclasses may override this routine to provide
508  /// different behavior.
509  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
510                                                  SourceRange Range,
511                                                  NamespaceDecl *NS);
512
513  /// \brief Build a new nested-name-specifier given the prefix and the
514  /// type named in the next step in the nested-name-specifier.
515  ///
516  /// By default, performs semantic analysis when building the new
517  /// nested-name-specifier. Subclasses may override this routine to provide
518  /// different behavior.
519  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
520                                                  SourceRange Range,
521                                                  bool TemplateKW,
522                                                  QualType T);
523
524  /// \brief Build a new template name given a nested name specifier, a flag
525  /// indicating whether the "template" keyword was provided, and the template
526  /// that the template name refers to.
527  ///
528  /// By default, builds the new template name directly. Subclasses may override
529  /// this routine to provide different behavior.
530  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
531                                   bool TemplateKW,
532                                   TemplateDecl *Template);
533
534  /// \brief Build a new template name given a nested name specifier, a flag
535  /// indicating whether the "template" keyword was provided, and a set of
536  /// overloaded function templates.
537  ///
538  /// By default, builds the new template name directly. Subclasses may override
539  /// this routine to provide different behavior.
540  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
541                                   bool TemplateKW,
542                                   OverloadedFunctionDecl *Ovl);
543
544  /// \brief Build a new template name given a nested name specifier and the
545  /// name that is referred to as a template.
546  ///
547  /// By default, performs semantic analysis to determine whether the name can
548  /// be resolved to a specific template, then builds the appropriate kind of
549  /// template name. Subclasses may override this routine to provide different
550  /// behavior.
551  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
552                                   const IdentifierInfo &II,
553                                   QualType ObjectType);
554
555
556  /// \brief Build a new compound statement.
557  ///
558  /// By default, performs semantic analysis to build the new statement.
559  /// Subclasses may override this routine to provide different behavior.
560  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
561                                       MultiStmtArg Statements,
562                                       SourceLocation RBraceLoc,
563                                       bool IsStmtExpr) {
564    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
565                                       IsStmtExpr);
566  }
567
568  /// \brief Build a new case statement.
569  ///
570  /// By default, performs semantic analysis to build the new statement.
571  /// Subclasses may override this routine to provide different behavior.
572  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
573                                   ExprArg LHS,
574                                   SourceLocation EllipsisLoc,
575                                   ExprArg RHS,
576                                   SourceLocation ColonLoc) {
577    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
578                                   ColonLoc);
579  }
580
581  /// \brief Attach the body to a new case statement.
582  ///
583  /// By default, performs semantic analysis to build the new statement.
584  /// Subclasses may override this routine to provide different behavior.
585  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
586    getSema().ActOnCaseStmtBody(S.get(), move(Body));
587    return move(S);
588  }
589
590  /// \brief Build a new default statement.
591  ///
592  /// By default, performs semantic analysis to build the new statement.
593  /// Subclasses may override this routine to provide different behavior.
594  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
595                                      SourceLocation ColonLoc,
596                                      StmtArg SubStmt) {
597    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
598                                      /*CurScope=*/0);
599  }
600
601  /// \brief Build a new label statement.
602  ///
603  /// By default, performs semantic analysis to build the new statement.
604  /// Subclasses may override this routine to provide different behavior.
605  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
606                                    IdentifierInfo *Id,
607                                    SourceLocation ColonLoc,
608                                    StmtArg SubStmt) {
609    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
610  }
611
612  /// \brief Build a new "if" statement.
613  ///
614  /// By default, performs semantic analysis to build the new statement.
615  /// Subclasses may override this routine to provide different behavior.
616  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
617                                 StmtArg Then, SourceLocation ElseLoc,
618                                 StmtArg Else) {
619    return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else));
620  }
621
622  /// \brief Start building a new switch statement.
623  ///
624  /// By default, performs semantic analysis to build the new statement.
625  /// Subclasses may override this routine to provide different behavior.
626  OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) {
627    return getSema().ActOnStartOfSwitchStmt(move(Cond));
628  }
629
630  /// \brief Attach the body to the switch statement.
631  ///
632  /// By default, performs semantic analysis to build the new statement.
633  /// Subclasses may override this routine to provide different behavior.
634  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
635                                         StmtArg Switch, StmtArg Body) {
636    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
637                                         move(Body));
638  }
639
640  /// \brief Build a new while statement.
641  ///
642  /// By default, performs semantic analysis to build the new statement.
643  /// Subclasses may override this routine to provide different behavior.
644  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
645                                    Sema::FullExprArg Cond,
646                                    StmtArg Body) {
647    return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body));
648  }
649
650  /// \brief Build a new do-while statement.
651  ///
652  /// By default, performs semantic analysis to build the new statement.
653  /// Subclasses may override this routine to provide different behavior.
654  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
655                                 SourceLocation WhileLoc,
656                                 SourceLocation LParenLoc,
657                                 ExprArg Cond,
658                                 SourceLocation RParenLoc) {
659    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
660                                 move(Cond), RParenLoc);
661  }
662
663  /// \brief Build a new for statement.
664  ///
665  /// By default, performs semantic analysis to build the new statement.
666  /// Subclasses may override this routine to provide different behavior.
667  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
668                                  SourceLocation LParenLoc,
669                                  StmtArg Init, ExprArg Cond, ExprArg Inc,
670                                  SourceLocation RParenLoc, StmtArg Body) {
671    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond),
672                                  move(Inc), RParenLoc, move(Body));
673  }
674
675  /// \brief Build a new goto statement.
676  ///
677  /// By default, performs semantic analysis to build the new statement.
678  /// Subclasses may override this routine to provide different behavior.
679  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
680                                   SourceLocation LabelLoc,
681                                   LabelStmt *Label) {
682    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
683  }
684
685  /// \brief Build a new indirect goto statement.
686  ///
687  /// By default, performs semantic analysis to build the new statement.
688  /// Subclasses may override this routine to provide different behavior.
689  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
690                                           SourceLocation StarLoc,
691                                           ExprArg Target) {
692    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
693  }
694
695  /// \brief Build a new return statement.
696  ///
697  /// By default, performs semantic analysis to build the new statement.
698  /// Subclasses may override this routine to provide different behavior.
699  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
700                                     ExprArg Result) {
701
702    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
703  }
704
705  /// \brief Build a new declaration statement.
706  ///
707  /// By default, performs semantic analysis to build the new statement.
708  /// Subclasses may override this routine to provide different behavior.
709  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
710                                   SourceLocation StartLoc,
711                                   SourceLocation EndLoc) {
712    return getSema().Owned(
713             new (getSema().Context) DeclStmt(
714                                        DeclGroupRef::Create(getSema().Context,
715                                                             Decls, NumDecls),
716                                              StartLoc, EndLoc));
717  }
718
719  /// \brief Build a new C++ exception declaration.
720  ///
721  /// By default, performs semantic analysis to build the new decaration.
722  /// Subclasses may override this routine to provide different behavior.
723  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
724                                DeclaratorInfo *Declarator,
725                                IdentifierInfo *Name,
726                                SourceLocation Loc,
727                                SourceRange TypeRange) {
728    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
729                                               TypeRange);
730  }
731
732  /// \brief Build a new C++ catch 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 RebuildCXXCatchStmt(SourceLocation CatchLoc,
737                                       VarDecl *ExceptionDecl,
738                                       StmtArg Handler) {
739    return getSema().Owned(
740             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
741                                                  Handler.takeAs<Stmt>()));
742  }
743
744  /// \brief Build a new C++ try statement.
745  ///
746  /// By default, performs semantic analysis to build the new statement.
747  /// Subclasses may override this routine to provide different behavior.
748  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
749                                     StmtArg TryBlock,
750                                     MultiStmtArg Handlers) {
751    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
752  }
753
754  /// \brief Build a new expression that references a declaration.
755  ///
756  /// By default, performs semantic analysis to build the new expression.
757  /// Subclasses may override this routine to provide different behavior.
758  OwningExprResult RebuildDeclRefExpr(NamedDecl *ND, SourceLocation Loc) {
759    return getSema().BuildDeclarationNameExpr(Loc, ND,
760                                              /*FIXME:*/false,
761                                              /*SS=*/0,
762                                              /*FIXME:*/false);
763  }
764
765  /// \brief Build a new expression in parentheses.
766  ///
767  /// By default, performs semantic analysis to build the new expression.
768  /// Subclasses may override this routine to provide different behavior.
769  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
770                                    SourceLocation RParen) {
771    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
772  }
773
774  /// \brief Build a new pseudo-destructor expression.
775  ///
776  /// By default, performs semantic analysis to build the new expression.
777  /// Subclasses may override this routine to provide different behavior.
778  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
779                                                  SourceLocation OperatorLoc,
780                                                  bool isArrow,
781                                              SourceLocation DestroyedTypeLoc,
782                                                  QualType DestroyedType,
783                                               NestedNameSpecifier *Qualifier,
784                                                  SourceRange QualifierRange) {
785    CXXScopeSpec SS;
786    if (Qualifier) {
787      SS.setRange(QualifierRange);
788      SS.setScopeRep(Qualifier);
789    }
790
791    DeclarationName Name
792      = SemaRef.Context.DeclarationNames.getCXXDestructorName(
793                               SemaRef.Context.getCanonicalType(DestroyedType));
794
795    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
796                                              OperatorLoc,
797                                              isArrow? tok::arrow : tok::period,
798                                              DestroyedTypeLoc,
799                                              Name,
800                                              Sema::DeclPtrTy::make((Decl *)0),
801                                              &SS);
802  }
803
804  /// \brief Build a new unary operator expression.
805  ///
806  /// By default, performs semantic analysis to build the new expression.
807  /// Subclasses may override this routine to provide different behavior.
808  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
809                                        UnaryOperator::Opcode Opc,
810                                        ExprArg SubExpr) {
811    return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr));
812  }
813
814  /// \brief Build a new sizeof or alignof expression with a type argument.
815  ///
816  /// By default, performs semantic analysis to build the new expression.
817  /// Subclasses may override this routine to provide different behavior.
818  OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc,
819                                        bool isSizeOf, SourceRange R) {
820    return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R);
821  }
822
823  /// \brief Build a new sizeof or alignof expression with an expression
824  /// argument.
825  ///
826  /// By default, performs semantic analysis to build the new expression.
827  /// Subclasses may override this routine to provide different behavior.
828  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
829                                        bool isSizeOf, SourceRange R) {
830    OwningExprResult Result
831      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
832                                          OpLoc, isSizeOf, R);
833    if (Result.isInvalid())
834      return getSema().ExprError();
835
836    SubExpr.release();
837    return move(Result);
838  }
839
840  /// \brief Build a new array subscript expression.
841  ///
842  /// By default, performs semantic analysis to build the new expression.
843  /// Subclasses may override this routine to provide different behavior.
844  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
845                                             SourceLocation LBracketLoc,
846                                             ExprArg RHS,
847                                             SourceLocation RBracketLoc) {
848    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
849                                             LBracketLoc, move(RHS),
850                                             RBracketLoc);
851  }
852
853  /// \brief Build a new call expression.
854  ///
855  /// By default, performs semantic analysis to build the new expression.
856  /// Subclasses may override this routine to provide different behavior.
857  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
858                                   MultiExprArg Args,
859                                   SourceLocation *CommaLocs,
860                                   SourceLocation RParenLoc) {
861    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
862                                   move(Args), CommaLocs, RParenLoc);
863  }
864
865  /// \brief Build a new member access expression.
866  ///
867  /// By default, performs semantic analysis to build the new expression.
868  /// Subclasses may override this routine to provide different behavior.
869  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
870                                     bool isArrow,
871                                     NestedNameSpecifier *Qualifier,
872                                     SourceRange QualifierRange,
873                                     SourceLocation MemberLoc,
874                                     NamedDecl *Member) {
875    if (!Member->getDeclName()) {
876      // We have a reference to an unnamed field.
877      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
878
879      MemberExpr *ME =
880        new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow,
881                                           Member, MemberLoc,
882                                           cast<FieldDecl>(Member)->getType());
883      return getSema().Owned(ME);
884    }
885
886    CXXScopeSpec SS;
887    if (Qualifier) {
888      SS.setRange(QualifierRange);
889      SS.setScopeRep(Qualifier);
890    }
891
892    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
893                                              isArrow? tok::arrow : tok::period,
894                                              MemberLoc,
895                                              Member->getDeclName(),
896                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
897                                              &SS);
898  }
899
900  /// \brief Build a new binary operator expression.
901  ///
902  /// By default, performs semantic analysis to build the new expression.
903  /// Subclasses may override this routine to provide different behavior.
904  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
905                                         BinaryOperator::Opcode Opc,
906                                         ExprArg LHS, ExprArg RHS) {
907    OwningExprResult Result
908      = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(),
909                                     (Expr *)RHS.get());
910    if (Result.isInvalid())
911      return SemaRef.ExprError();
912
913    LHS.release();
914    RHS.release();
915    return move(Result);
916  }
917
918  /// \brief Build a new conditional operator expression.
919  ///
920  /// By default, performs semantic analysis to build the new expression.
921  /// Subclasses may override this routine to provide different behavior.
922  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
923                                              SourceLocation QuestionLoc,
924                                              ExprArg LHS,
925                                              SourceLocation ColonLoc,
926                                              ExprArg RHS) {
927    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
928                                        move(LHS), move(RHS));
929  }
930
931  /// \brief Build a new implicit cast expression.
932  ///
933  /// By default, builds a new implicit cast without any semantic analysis.
934  /// Subclasses may override this routine to provide different behavior.
935  OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
936                                           ExprArg SubExpr, bool isLvalue) {
937    ImplicitCastExpr *ICE
938      = new (getSema().Context) ImplicitCastExpr(T, Kind,
939                                                 (Expr *)SubExpr.release(),
940                                                 isLvalue);
941    return getSema().Owned(ICE);
942  }
943
944  /// \brief Build a new C-style cast expression.
945  ///
946  /// By default, performs semantic analysis to build the new expression.
947  /// Subclasses may override this routine to provide different behavior.
948  OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
949                                         QualType ExplicitTy,
950                                         SourceLocation RParenLoc,
951                                         ExprArg SubExpr) {
952    return getSema().ActOnCastExpr(/*Scope=*/0,
953                                   LParenLoc,
954                                   ExplicitTy.getAsOpaquePtr(),
955                                   RParenLoc,
956                                   move(SubExpr));
957  }
958
959  /// \brief Build a new compound literal expression.
960  ///
961  /// By default, performs semantic analysis to build the new expression.
962  /// Subclasses may override this routine to provide different behavior.
963  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
964                                              QualType T,
965                                              SourceLocation RParenLoc,
966                                              ExprArg Init) {
967    return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
968                                          RParenLoc, move(Init));
969  }
970
971  /// \brief Build a new extended vector element access expression.
972  ///
973  /// By default, performs semantic analysis to build the new expression.
974  /// Subclasses may override this routine to provide different behavior.
975  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
976                                               SourceLocation OpLoc,
977                                               SourceLocation AccessorLoc,
978                                               IdentifierInfo &Accessor) {
979    return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
980                                              tok::period, AccessorLoc,
981                                              Accessor,
982                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
983  }
984
985  /// \brief Build a new initializer list expression.
986  ///
987  /// By default, performs semantic analysis to build the new expression.
988  /// Subclasses may override this routine to provide different behavior.
989  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
990                                   MultiExprArg Inits,
991                                   SourceLocation RBraceLoc) {
992    return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
993  }
994
995  /// \brief Build a new designated initializer expression.
996  ///
997  /// By default, performs semantic analysis to build the new expression.
998  /// Subclasses may override this routine to provide different behavior.
999  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1000                                             MultiExprArg ArrayExprs,
1001                                             SourceLocation EqualOrColonLoc,
1002                                             bool GNUSyntax,
1003                                             ExprArg Init) {
1004    OwningExprResult Result
1005      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1006                                           move(Init));
1007    if (Result.isInvalid())
1008      return SemaRef.ExprError();
1009
1010    ArrayExprs.release();
1011    return move(Result);
1012  }
1013
1014  /// \brief Build a new value-initialized expression.
1015  ///
1016  /// By default, builds the implicit value initialization without performing
1017  /// any semantic analysis. Subclasses may override this routine to provide
1018  /// different behavior.
1019  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1020    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1021  }
1022
1023  /// \brief Build a new \c va_arg expression.
1024  ///
1025  /// By default, performs semantic analysis to build the new expression.
1026  /// Subclasses may override this routine to provide different behavior.
1027  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1028                                    QualType T, SourceLocation RParenLoc) {
1029    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1030                                RParenLoc);
1031  }
1032
1033  /// \brief Build a new expression list in parentheses.
1034  ///
1035  /// By default, performs semantic analysis to build the new expression.
1036  /// Subclasses may override this routine to provide different behavior.
1037  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1038                                        MultiExprArg SubExprs,
1039                                        SourceLocation RParenLoc) {
1040    return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
1041  }
1042
1043  /// \brief Build a new address-of-label expression.
1044  ///
1045  /// By default, performs semantic analysis, using the name of the label
1046  /// rather than attempting to map the label statement itself.
1047  /// Subclasses may override this routine to provide different behavior.
1048  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1049                                        SourceLocation LabelLoc,
1050                                        LabelStmt *Label) {
1051    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1052  }
1053
1054  /// \brief Build a new GNU statement expression.
1055  ///
1056  /// By default, performs semantic analysis to build the new expression.
1057  /// Subclasses may override this routine to provide different behavior.
1058  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1059                                   StmtArg SubStmt,
1060                                   SourceLocation RParenLoc) {
1061    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1062  }
1063
1064  /// \brief Build a new __builtin_types_compatible_p expression.
1065  ///
1066  /// By default, performs semantic analysis to build the new expression.
1067  /// Subclasses may override this routine to provide different behavior.
1068  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1069                                              QualType T1, QualType T2,
1070                                              SourceLocation RParenLoc) {
1071    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1072                                              T1.getAsOpaquePtr(),
1073                                              T2.getAsOpaquePtr(),
1074                                              RParenLoc);
1075  }
1076
1077  /// \brief Build a new __builtin_choose_expr expression.
1078  ///
1079  /// By default, performs semantic analysis to build the new expression.
1080  /// Subclasses may override this routine to provide different behavior.
1081  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1082                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1083                                     SourceLocation RParenLoc) {
1084    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1085                                   move(Cond), move(LHS), move(RHS),
1086                                   RParenLoc);
1087  }
1088
1089  /// \brief Build a new overloaded operator call expression.
1090  ///
1091  /// By default, performs semantic analysis to build the new expression.
1092  /// The semantic analysis provides the behavior of template instantiation,
1093  /// copying with transformations that turn what looks like an overloaded
1094  /// operator call into a use of a builtin operator, performing
1095  /// argument-dependent lookup, etc. Subclasses may override this routine to
1096  /// provide different behavior.
1097  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1098                                              SourceLocation OpLoc,
1099                                              ExprArg Callee,
1100                                              ExprArg First,
1101                                              ExprArg Second);
1102
1103  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1104  /// reinterpret_cast.
1105  ///
1106  /// By default, this routine dispatches to one of the more-specific routines
1107  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1108  /// Subclasses may override this routine to provide different behavior.
1109  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1110                                           Stmt::StmtClass Class,
1111                                           SourceLocation LAngleLoc,
1112                                           QualType T,
1113                                           SourceLocation RAngleLoc,
1114                                           SourceLocation LParenLoc,
1115                                           ExprArg SubExpr,
1116                                           SourceLocation RParenLoc) {
1117    switch (Class) {
1118    case Stmt::CXXStaticCastExprClass:
1119      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
1120                                                   RAngleLoc, LParenLoc,
1121                                                   move(SubExpr), RParenLoc);
1122
1123    case Stmt::CXXDynamicCastExprClass:
1124      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
1125                                                    RAngleLoc, LParenLoc,
1126                                                    move(SubExpr), RParenLoc);
1127
1128    case Stmt::CXXReinterpretCastExprClass:
1129      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
1130                                                        RAngleLoc, LParenLoc,
1131                                                        move(SubExpr),
1132                                                        RParenLoc);
1133
1134    case Stmt::CXXConstCastExprClass:
1135      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
1136                                                   RAngleLoc, LParenLoc,
1137                                                   move(SubExpr), RParenLoc);
1138
1139    default:
1140      assert(false && "Invalid C++ named cast");
1141      break;
1142    }
1143
1144    return getSema().ExprError();
1145  }
1146
1147  /// \brief Build a new C++ static_cast expression.
1148  ///
1149  /// By default, performs semantic analysis to build the new expression.
1150  /// Subclasses may override this routine to provide different behavior.
1151  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1152                                            SourceLocation LAngleLoc,
1153                                            QualType T,
1154                                            SourceLocation RAngleLoc,
1155                                            SourceLocation LParenLoc,
1156                                            ExprArg SubExpr,
1157                                            SourceLocation RParenLoc) {
1158    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
1159                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1160                                       LParenLoc, move(SubExpr), RParenLoc);
1161  }
1162
1163  /// \brief Build a new C++ dynamic_cast expression.
1164  ///
1165  /// By default, performs semantic analysis to build the new expression.
1166  /// Subclasses may override this routine to provide different behavior.
1167  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1168                                             SourceLocation LAngleLoc,
1169                                             QualType T,
1170                                             SourceLocation RAngleLoc,
1171                                             SourceLocation LParenLoc,
1172                                             ExprArg SubExpr,
1173                                             SourceLocation RParenLoc) {
1174    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
1175                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1176                                       LParenLoc, move(SubExpr), RParenLoc);
1177  }
1178
1179  /// \brief Build a new C++ reinterpret_cast expression.
1180  ///
1181  /// By default, performs semantic analysis to build the new expression.
1182  /// Subclasses may override this routine to provide different behavior.
1183  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1184                                                 SourceLocation LAngleLoc,
1185                                                 QualType T,
1186                                                 SourceLocation RAngleLoc,
1187                                                 SourceLocation LParenLoc,
1188                                                 ExprArg SubExpr,
1189                                                 SourceLocation RParenLoc) {
1190    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1191                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1192                                       LParenLoc, move(SubExpr), RParenLoc);
1193  }
1194
1195  /// \brief Build a new C++ const_cast expression.
1196  ///
1197  /// By default, performs semantic analysis to build the new expression.
1198  /// Subclasses may override this routine to provide different behavior.
1199  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1200                                           SourceLocation LAngleLoc,
1201                                           QualType T,
1202                                           SourceLocation RAngleLoc,
1203                                           SourceLocation LParenLoc,
1204                                           ExprArg SubExpr,
1205                                           SourceLocation RParenLoc) {
1206    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
1207                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1208                                       LParenLoc, move(SubExpr), RParenLoc);
1209  }
1210
1211  /// \brief Build a new C++ functional-style cast expression.
1212  ///
1213  /// By default, performs semantic analysis to build the new expression.
1214  /// Subclasses may override this routine to provide different behavior.
1215  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
1216                                                QualType T,
1217                                                SourceLocation LParenLoc,
1218                                                ExprArg SubExpr,
1219                                                SourceLocation RParenLoc) {
1220    void *Sub = SubExpr.takeAs<Expr>();
1221    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1222                                               T.getAsOpaquePtr(),
1223                                               LParenLoc,
1224                                         Sema::MultiExprArg(getSema(), &Sub, 1),
1225                                               /*CommaLocs=*/0,
1226                                               RParenLoc);
1227  }
1228
1229  /// \brief Build a new C++ typeid(type) expression.
1230  ///
1231  /// By default, performs semantic analysis to build the new expression.
1232  /// Subclasses may override this routine to provide different behavior.
1233  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1234                                        SourceLocation LParenLoc,
1235                                        QualType T,
1236                                        SourceLocation RParenLoc) {
1237    return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
1238                                    T.getAsOpaquePtr(), RParenLoc);
1239  }
1240
1241  /// \brief Build a new C++ typeid(expr) expression.
1242  ///
1243  /// By default, performs semantic analysis to build the new expression.
1244  /// Subclasses may override this routine to provide different behavior.
1245  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1246                                        SourceLocation LParenLoc,
1247                                        ExprArg Operand,
1248                                        SourceLocation RParenLoc) {
1249    OwningExprResult Result
1250      = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1251                                 RParenLoc);
1252    if (Result.isInvalid())
1253      return getSema().ExprError();
1254
1255    Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1256    return move(Result);
1257  }
1258
1259  /// \brief Build a new C++ "this" expression.
1260  ///
1261  /// By default, builds a new "this" expression without performing any
1262  /// semantic analysis. Subclasses may override this routine to provide
1263  /// different behavior.
1264  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1265                                      QualType ThisType) {
1266    return getSema().Owned(
1267                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1268  }
1269
1270  /// \brief Build a new C++ throw expression.
1271  ///
1272  /// By default, performs semantic analysis to build the new expression.
1273  /// Subclasses may override this routine to provide different behavior.
1274  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1275    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1276  }
1277
1278  /// \brief Build a new C++ default-argument expression.
1279  ///
1280  /// By default, builds a new default-argument expression, which does not
1281  /// require any semantic analysis. Subclasses may override this routine to
1282  /// provide different behavior.
1283  OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
1284    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
1285  }
1286
1287  /// \brief Build a new C++ zero-initialization expression.
1288  ///
1289  /// By default, performs semantic analysis to build the new expression.
1290  /// Subclasses may override this routine to provide different behavior.
1291  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1292                                               SourceLocation LParenLoc,
1293                                               QualType T,
1294                                               SourceLocation RParenLoc) {
1295    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1296                                               T.getAsOpaquePtr(), LParenLoc,
1297                                               MultiExprArg(getSema(), 0, 0),
1298                                               0, RParenLoc);
1299  }
1300
1301  /// \brief Build a new C++ conditional declaration expression.
1302  ///
1303  /// By default, performs semantic analysis to build the new expression.
1304  /// Subclasses may override this routine to provide different behavior.
1305  OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
1306                                               SourceLocation EqLoc,
1307                                               VarDecl *Var) {
1308    return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1309                                                                    EqLoc,
1310                                                                    Var));
1311  }
1312
1313  /// \brief Build a new C++ "new" expression.
1314  ///
1315  /// By default, performs semantic analysis to build the new expression.
1316  /// Subclasses may override this routine to provide different behavior.
1317  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1318                                     bool UseGlobal,
1319                                     SourceLocation PlacementLParen,
1320                                     MultiExprArg PlacementArgs,
1321                                     SourceLocation PlacementRParen,
1322                                     bool ParenTypeId,
1323                                     QualType AllocType,
1324                                     SourceLocation TypeLoc,
1325                                     SourceRange TypeRange,
1326                                     ExprArg ArraySize,
1327                                     SourceLocation ConstructorLParen,
1328                                     MultiExprArg ConstructorArgs,
1329                                     SourceLocation ConstructorRParen) {
1330    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1331                                 PlacementLParen,
1332                                 move(PlacementArgs),
1333                                 PlacementRParen,
1334                                 ParenTypeId,
1335                                 AllocType,
1336                                 TypeLoc,
1337                                 TypeRange,
1338                                 move(ArraySize),
1339                                 ConstructorLParen,
1340                                 move(ConstructorArgs),
1341                                 ConstructorRParen);
1342  }
1343
1344  /// \brief Build a new C++ "delete" expression.
1345  ///
1346  /// By default, performs semantic analysis to build the new expression.
1347  /// Subclasses may override this routine to provide different behavior.
1348  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1349                                        bool IsGlobalDelete,
1350                                        bool IsArrayForm,
1351                                        ExprArg Operand) {
1352    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1353                                    move(Operand));
1354  }
1355
1356  /// \brief Build a new unary type trait expression.
1357  ///
1358  /// By default, performs semantic analysis to build the new expression.
1359  /// Subclasses may override this routine to provide different behavior.
1360  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1361                                         SourceLocation StartLoc,
1362                                         SourceLocation LParenLoc,
1363                                         QualType T,
1364                                         SourceLocation RParenLoc) {
1365    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1366                                         T.getAsOpaquePtr(), RParenLoc);
1367  }
1368
1369  /// \brief Build a new qualified declaration reference expression.
1370  ///
1371  /// By default, performs semantic analysis to build the new expression.
1372  /// Subclasses may override this routine to provide different behavior.
1373  OwningExprResult RebuildQualifiedDeclRefExpr(NestedNameSpecifier *NNS,
1374                                               SourceRange QualifierRange,
1375                                               NamedDecl *ND,
1376                                               SourceLocation Location,
1377                                               bool IsAddressOfOperand) {
1378    CXXScopeSpec SS;
1379    SS.setRange(QualifierRange);
1380    SS.setScopeRep(NNS);
1381    return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1382                                              Location,
1383                                              ND->getDeclName(),
1384                                              /*Trailing lparen=*/false,
1385                                              &SS,
1386                                              IsAddressOfOperand);
1387  }
1388
1389  /// \brief Build a new (previously unresolved) declaration reference
1390  /// expression.
1391  ///
1392  /// By default, performs semantic analysis to build the new expression.
1393  /// Subclasses may override this routine to provide different behavior.
1394  OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1395                                                SourceRange QualifierRange,
1396                                                DeclarationName Name,
1397                                                SourceLocation Location,
1398                                                bool IsAddressOfOperand) {
1399    CXXScopeSpec SS;
1400    SS.setRange(QualifierRange);
1401    SS.setScopeRep(NNS);
1402    return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1403                                              Location,
1404                                              Name,
1405                                              /*Trailing lparen=*/false,
1406                                              &SS,
1407                                              IsAddressOfOperand);
1408  }
1409
1410  /// \brief Build a new template-id expression.
1411  ///
1412  /// By default, performs semantic analysis to build the new expression.
1413  /// Subclasses may override this routine to provide different behavior.
1414  OwningExprResult RebuildTemplateIdExpr(TemplateName Template,
1415                                         SourceLocation TemplateLoc,
1416                                         SourceLocation LAngleLoc,
1417                                         TemplateArgument *TemplateArgs,
1418                                         unsigned NumTemplateArgs,
1419                                         SourceLocation RAngleLoc) {
1420    return getSema().BuildTemplateIdExpr(Template, TemplateLoc,
1421                                         LAngleLoc,
1422                                         TemplateArgs, NumTemplateArgs,
1423                                         RAngleLoc);
1424  }
1425
1426  /// \brief Build a new object-construction expression.
1427  ///
1428  /// By default, performs semantic analysis to build the new expression.
1429  /// Subclasses may override this routine to provide different behavior.
1430  OwningExprResult RebuildCXXConstructExpr(QualType T,
1431                                           CXXConstructorDecl *Constructor,
1432                                           bool IsElidable,
1433                                           MultiExprArg Args) {
1434    return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/
1435                                           SourceLocation(),
1436                                           T, Constructor, IsElidable,
1437                                           move(Args));
1438  }
1439
1440  /// \brief Build a new object-construction expression.
1441  ///
1442  /// By default, performs semantic analysis to build the new expression.
1443  /// Subclasses may override this routine to provide different behavior.
1444  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1445                                                 QualType T,
1446                                                 SourceLocation LParenLoc,
1447                                                 MultiExprArg Args,
1448                                                 SourceLocation *Commas,
1449                                                 SourceLocation RParenLoc) {
1450    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1451                                               T.getAsOpaquePtr(),
1452                                               LParenLoc,
1453                                               move(Args),
1454                                               Commas,
1455                                               RParenLoc);
1456  }
1457
1458  /// \brief Build a new object-construction expression.
1459  ///
1460  /// By default, performs semantic analysis to build the new expression.
1461  /// Subclasses may override this routine to provide different behavior.
1462  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1463                                                     QualType T,
1464                                                     SourceLocation LParenLoc,
1465                                                     MultiExprArg Args,
1466                                                     SourceLocation *Commas,
1467                                                     SourceLocation RParenLoc) {
1468    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1469                                                           /*FIXME*/LParenLoc),
1470                                               T.getAsOpaquePtr(),
1471                                               LParenLoc,
1472                                               move(Args),
1473                                               Commas,
1474                                               RParenLoc);
1475  }
1476
1477  /// \brief Build a new member reference expression.
1478  ///
1479  /// By default, performs semantic analysis to build the new expression.
1480  /// Subclasses may override this routine to provide different behavior.
1481  OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
1482                                                  bool IsArrow,
1483                                                  SourceLocation OperatorLoc,
1484                                              NestedNameSpecifier *Qualifier,
1485                                                  SourceRange QualifierRange,
1486                                                  DeclarationName Name,
1487                                                  SourceLocation MemberLoc,
1488                                             NamedDecl *FirstQualifierInScope) {
1489    OwningExprResult Base = move(BaseE);
1490    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
1491
1492    CXXScopeSpec SS;
1493    SS.setRange(QualifierRange);
1494    SS.setScopeRep(Qualifier);
1495
1496    return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0,
1497                                            move(Base), OperatorLoc, OpKind,
1498                                            MemberLoc,
1499                                            Name,
1500                                    /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
1501                                            &SS,
1502                                            FirstQualifierInScope);
1503  }
1504
1505  /// \brief Build a new member reference expression with explicit template
1506  /// arguments.
1507  ///
1508  /// By default, performs semantic analysis to build the new expression.
1509  /// Subclasses may override this routine to provide different behavior.
1510  OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
1511                                                  bool IsArrow,
1512                                                  SourceLocation OperatorLoc,
1513                                                NestedNameSpecifier *Qualifier,
1514                                                  SourceRange QualifierRange,
1515                                                  TemplateName Template,
1516                                                SourceLocation TemplateNameLoc,
1517                                              NamedDecl *FirstQualifierInScope,
1518                                                  SourceLocation LAngleLoc,
1519                                          const TemplateArgument *TemplateArgs,
1520                                                  unsigned NumTemplateArgs,
1521                                                  SourceLocation RAngleLoc) {
1522    OwningExprResult Base = move(BaseE);
1523    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
1524
1525    CXXScopeSpec SS;
1526    SS.setRange(QualifierRange);
1527    SS.setScopeRep(Qualifier);
1528
1529    // FIXME: We're going to end up looking up the template based on its name,
1530    // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr.
1531    DeclarationName Name;
1532    if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl())
1533      Name = ActualTemplate->getDeclName();
1534    else if (OverloadedFunctionDecl *Ovl
1535               = Template.getAsOverloadedFunctionDecl())
1536      Name = Ovl->getDeclName();
1537    else
1538      Name = Template.getAsDependentTemplateName()->getName();
1539
1540      return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
1541                                              OperatorLoc, OpKind,
1542                                              TemplateNameLoc, Name, true,
1543                                              LAngleLoc, TemplateArgs,
1544                                              NumTemplateArgs, RAngleLoc,
1545                                              Sema::DeclPtrTy(), &SS);
1546  }
1547
1548  /// \brief Build a new Objective-C @encode expression.
1549  ///
1550  /// By default, performs semantic analysis to build the new expression.
1551  /// Subclasses may override this routine to provide different behavior.
1552  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1553                                         QualType T,
1554                                         SourceLocation RParenLoc) {
1555    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1556                                                           RParenLoc));
1557  }
1558
1559  /// \brief Build a new Objective-C protocol expression.
1560  ///
1561  /// By default, performs semantic analysis to build the new expression.
1562  /// Subclasses may override this routine to provide different behavior.
1563  OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1564                                           SourceLocation AtLoc,
1565                                           SourceLocation ProtoLoc,
1566                                           SourceLocation LParenLoc,
1567                                           SourceLocation RParenLoc) {
1568    return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1569                                              Protocol->getIdentifier(),
1570                                                             AtLoc,
1571                                                             ProtoLoc,
1572                                                             LParenLoc,
1573                                                             RParenLoc));
1574  }
1575
1576  /// \brief Build a new shuffle vector expression.
1577  ///
1578  /// By default, performs semantic analysis to build the new expression.
1579  /// Subclasses may override this routine to provide different behavior.
1580  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1581                                            MultiExprArg SubExprs,
1582                                            SourceLocation RParenLoc) {
1583    // Find the declaration for __builtin_shufflevector
1584    const IdentifierInfo &Name
1585      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1586    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1587    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1588    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
1589
1590    // Build a reference to the __builtin_shufflevector builtin
1591    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
1592    Expr *Callee
1593      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1594                                          BuiltinLoc, false, false);
1595    SemaRef.UsualUnaryConversions(Callee);
1596
1597    // Build the CallExpr
1598    unsigned NumSubExprs = SubExprs.size();
1599    Expr **Subs = (Expr **)SubExprs.release();
1600    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1601                                                       Subs, NumSubExprs,
1602                                                       Builtin->getResultType(),
1603                                                       RParenLoc);
1604    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
1605
1606    // Type-check the __builtin_shufflevector expression.
1607    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1608    if (Result.isInvalid())
1609      return SemaRef.ExprError();
1610
1611    OwnedCall.release();
1612    return move(Result);
1613  }
1614};
1615
1616template<typename Derived>
1617Sema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
1618  if (!S)
1619    return SemaRef.Owned(S);
1620
1621  switch (S->getStmtClass()) {
1622  case Stmt::NoStmtClass: break;
1623
1624  // Transform individual statement nodes
1625#define STMT(Node, Parent)                                              \
1626  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
1627#define EXPR(Node, Parent)
1628#include "clang/AST/StmtNodes.def"
1629
1630  // Transform expressions by calling TransformExpr.
1631#define STMT(Node, Parent)
1632#define EXPR(Node, Parent) case Stmt::Node##Class:
1633#include "clang/AST/StmtNodes.def"
1634    {
1635      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
1636      if (E.isInvalid())
1637        return getSema().StmtError();
1638
1639      return getSema().Owned(E.takeAs<Stmt>());
1640    }
1641  }
1642
1643  return SemaRef.Owned(S->Retain());
1644}
1645
1646
1647template<typename Derived>
1648Sema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1649                                                    bool isAddressOfOperand) {
1650  if (!E)
1651    return SemaRef.Owned(E);
1652
1653  switch (E->getStmtClass()) {
1654    case Stmt::NoStmtClass: break;
1655#define STMT(Node, Parent) case Stmt::Node##Class: break;
1656#define EXPR(Node, Parent)                                              \
1657    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1658#include "clang/AST/StmtNodes.def"
1659  }
1660
1661  return SemaRef.Owned(E->Retain());
1662}
1663
1664template<typename Derived>
1665NestedNameSpecifier *
1666TreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1667                                                     SourceRange Range,
1668                                                     QualType ObjectType,
1669                                             NamedDecl *FirstQualifierInScope) {
1670  if (!NNS)
1671    return 0;
1672
1673  // Transform the prefix of this nested name specifier.
1674  NestedNameSpecifier *Prefix = NNS->getPrefix();
1675  if (Prefix) {
1676    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
1677                                                       ObjectType,
1678                                                       FirstQualifierInScope);
1679    if (!Prefix)
1680      return 0;
1681
1682    // Clear out the object type and the first qualifier in scope; they only
1683    // apply to the first element in the nested-name-specifier.
1684    ObjectType = QualType();
1685    FirstQualifierInScope = 0;
1686  }
1687
1688  switch (NNS->getKind()) {
1689  case NestedNameSpecifier::Identifier:
1690    assert((Prefix || !ObjectType.isNull()) &&
1691            "Identifier nested-name-specifier with no prefix or object type");
1692    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1693        ObjectType.isNull())
1694      return NNS;
1695
1696    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1697                                                   *NNS->getAsIdentifier(),
1698                                                   ObjectType,
1699                                                   FirstQualifierInScope);
1700
1701  case NestedNameSpecifier::Namespace: {
1702    NamespaceDecl *NS
1703      = cast_or_null<NamespaceDecl>(
1704                            getDerived().TransformDecl(NNS->getAsNamespace()));
1705    if (!getDerived().AlwaysRebuild() &&
1706        Prefix == NNS->getPrefix() &&
1707        NS == NNS->getAsNamespace())
1708      return NNS;
1709
1710    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1711  }
1712
1713  case NestedNameSpecifier::Global:
1714    // There is no meaningful transformation that one could perform on the
1715    // global scope.
1716    return NNS;
1717
1718  case NestedNameSpecifier::TypeSpecWithTemplate:
1719  case NestedNameSpecifier::TypeSpec: {
1720    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
1721    if (T.isNull())
1722      return 0;
1723
1724    if (!getDerived().AlwaysRebuild() &&
1725        Prefix == NNS->getPrefix() &&
1726        T == QualType(NNS->getAsType(), 0))
1727      return NNS;
1728
1729    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1730                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1731                                                   T);
1732  }
1733  }
1734
1735  // Required to silence a GCC warning
1736  return 0;
1737}
1738
1739template<typename Derived>
1740DeclarationName
1741TreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
1742                                                 SourceLocation Loc,
1743                                                 QualType ObjectType) {
1744  if (!Name)
1745    return Name;
1746
1747  switch (Name.getNameKind()) {
1748  case DeclarationName::Identifier:
1749  case DeclarationName::ObjCZeroArgSelector:
1750  case DeclarationName::ObjCOneArgSelector:
1751  case DeclarationName::ObjCMultiArgSelector:
1752  case DeclarationName::CXXOperatorName:
1753  case DeclarationName::CXXUsingDirective:
1754    return Name;
1755
1756  case DeclarationName::CXXConstructorName:
1757  case DeclarationName::CXXDestructorName:
1758  case DeclarationName::CXXConversionFunctionName: {
1759    TemporaryBase Rebase(*this, Loc, Name);
1760    QualType T;
1761    if (!ObjectType.isNull() &&
1762        isa<TemplateSpecializationType>(Name.getCXXNameType())) {
1763      TemplateSpecializationType *SpecType
1764        = cast<TemplateSpecializationType>(Name.getCXXNameType());
1765      T = TransformTemplateSpecializationType(SpecType, ObjectType);
1766    } else
1767      T = getDerived().TransformType(Name.getCXXNameType());
1768    if (T.isNull())
1769      return DeclarationName();
1770
1771    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
1772                                                           Name.getNameKind(),
1773                                          SemaRef.Context.getCanonicalType(T));
1774  }
1775  }
1776
1777  return DeclarationName();
1778}
1779
1780template<typename Derived>
1781TemplateName
1782TreeTransform<Derived>::TransformTemplateName(TemplateName Name,
1783                                              QualType ObjectType) {
1784  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
1785    NestedNameSpecifier *NNS
1786      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1787                      /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1788    if (!NNS)
1789      return TemplateName();
1790
1791    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
1792      TemplateDecl *TransTemplate
1793        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1794      if (!TransTemplate)
1795        return TemplateName();
1796
1797      if (!getDerived().AlwaysRebuild() &&
1798          NNS == QTN->getQualifier() &&
1799          TransTemplate == Template)
1800        return Name;
1801
1802      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1803                                              TransTemplate);
1804    }
1805
1806    OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1807    assert(Ovl && "Not a template name or an overload set?");
1808    OverloadedFunctionDecl *TransOvl
1809      = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1810    if (!TransOvl)
1811      return TemplateName();
1812
1813    if (!getDerived().AlwaysRebuild() &&
1814        NNS == QTN->getQualifier() &&
1815        TransOvl == Ovl)
1816      return Name;
1817
1818    return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1819                                            TransOvl);
1820  }
1821
1822  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
1823    NestedNameSpecifier *NNS
1824      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1825                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1826    if (!NNS && DTN->getQualifier())
1827      return TemplateName();
1828
1829    if (!getDerived().AlwaysRebuild() &&
1830        NNS == DTN->getQualifier() &&
1831        ObjectType.isNull())
1832      return Name;
1833
1834    return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType);
1835  }
1836
1837  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
1838    TemplateDecl *TransTemplate
1839      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1840    if (!TransTemplate)
1841      return TemplateName();
1842
1843    if (!getDerived().AlwaysRebuild() &&
1844        TransTemplate == Template)
1845      return Name;
1846
1847    return TemplateName(TransTemplate);
1848  }
1849
1850  OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1851  assert(Ovl && "Not a template name or an overload set?");
1852  OverloadedFunctionDecl *TransOvl
1853    = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1854  if (!TransOvl)
1855    return TemplateName();
1856
1857  if (!getDerived().AlwaysRebuild() &&
1858      TransOvl == Ovl)
1859    return Name;
1860
1861  return TemplateName(TransOvl);
1862}
1863
1864template<typename Derived>
1865TemplateArgument
1866TreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) {
1867  switch (Arg.getKind()) {
1868  case TemplateArgument::Null:
1869  case TemplateArgument::Integral:
1870    return Arg;
1871
1872  case TemplateArgument::Type: {
1873    QualType T = getDerived().TransformType(Arg.getAsType());
1874    if (T.isNull())
1875      return TemplateArgument();
1876    return TemplateArgument(Arg.getLocation(), T);
1877  }
1878
1879  case TemplateArgument::Declaration: {
1880    Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1881    if (!D)
1882      return TemplateArgument();
1883    return TemplateArgument(Arg.getLocation(), D);
1884  }
1885
1886  case TemplateArgument::Expression: {
1887    // Template argument expressions are not potentially evaluated.
1888    EnterExpressionEvaluationContext Unevaluated(getSema(),
1889                                                 Action::Unevaluated);
1890
1891    Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr());
1892    if (E.isInvalid())
1893      return TemplateArgument();
1894    return TemplateArgument(E.takeAs<Expr>());
1895  }
1896
1897  case TemplateArgument::Pack: {
1898    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
1899    TransformedArgs.reserve(Arg.pack_size());
1900    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
1901                                      AEnd = Arg.pack_end();
1902         A != AEnd; ++A) {
1903      TemplateArgument TA = getDerived().TransformTemplateArgument(*A);
1904      if (TA.isNull())
1905        return TA;
1906
1907      TransformedArgs.push_back(TA);
1908    }
1909    TemplateArgument Result;
1910    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
1911                           true);
1912    return Result;
1913  }
1914  }
1915
1916  // Work around bogus GCC warning
1917  return TemplateArgument();
1918}
1919
1920//===----------------------------------------------------------------------===//
1921// Type transformation
1922//===----------------------------------------------------------------------===//
1923
1924template<typename Derived>
1925QualType TreeTransform<Derived>::TransformType(QualType T) {
1926  if (getDerived().AlreadyTransformed(T))
1927    return T;
1928
1929  QualifierCollector Qs;
1930  const Type *Ty = Qs.strip(T);
1931
1932  QualType Result;
1933  switch (Ty->getTypeClass()) {
1934#define ABSTRACT_TYPE(CLASS, PARENT)
1935#define TYPE(CLASS, PARENT)                                                  \
1936    case Type::CLASS:                                                        \
1937      Result = getDerived().Transform##CLASS##Type(                          \
1938                                       static_cast<const CLASS##Type*>(Ty)); \
1939      break;
1940#include "clang/AST/TypeNodes.def"
1941  }
1942
1943  if (Result.isNull() || T == Result)
1944    return Result;
1945
1946  return getDerived().AddTypeQualifiers(Result, Qs);
1947}
1948
1949template<typename Derived>
1950QualType
1951TreeTransform<Derived>::AddTypeQualifiers(QualType T, Qualifiers Quals) {
1952  if (!Quals.empty() && !T->isFunctionType() && !T->isReferenceType())
1953    return SemaRef.Context.getQualifiedType(T, Quals);
1954
1955  return T;
1956}
1957
1958template<typename Derived>
1959QualType TreeTransform<Derived>::TransformBuiltinType(const BuiltinType *T) {
1960  // Nothing to do
1961  return QualType(T, 0);
1962}
1963
1964template<typename Derived>
1965QualType TreeTransform<Derived>::TransformFixedWidthIntType(
1966                                                  const FixedWidthIntType *T) {
1967  // FIXME: Implement
1968  return QualType(T, 0);
1969}
1970
1971template<typename Derived>
1972QualType TreeTransform<Derived>::TransformComplexType(const ComplexType *T) {
1973  // FIXME: Implement
1974  return QualType(T, 0);
1975}
1976
1977template<typename Derived>
1978QualType TreeTransform<Derived>::TransformPointerType(const PointerType *T) {
1979  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1980  if (PointeeType.isNull())
1981    return QualType();
1982
1983  if (!getDerived().AlwaysRebuild() &&
1984      PointeeType == T->getPointeeType())
1985    return QualType(T, 0);
1986
1987  return getDerived().RebuildPointerType(PointeeType);
1988}
1989
1990template<typename Derived>
1991QualType
1992TreeTransform<Derived>::TransformBlockPointerType(const BlockPointerType *T) {
1993  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1994  if (PointeeType.isNull())
1995    return QualType();
1996
1997  if (!getDerived().AlwaysRebuild() &&
1998      PointeeType == T->getPointeeType())
1999    return QualType(T, 0);
2000
2001  return getDerived().RebuildBlockPointerType(PointeeType);
2002}
2003
2004template<typename Derived>
2005QualType
2006TreeTransform<Derived>::TransformLValueReferenceType(
2007                                               const LValueReferenceType *T) {
2008  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2009  if (PointeeType.isNull())
2010    return QualType();
2011
2012  if (!getDerived().AlwaysRebuild() &&
2013      PointeeType == T->getPointeeType())
2014    return QualType(T, 0);
2015
2016  return getDerived().RebuildLValueReferenceType(PointeeType);
2017}
2018
2019template<typename Derived>
2020QualType
2021TreeTransform<Derived>::TransformRValueReferenceType(
2022                                              const RValueReferenceType *T) {
2023  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2024  if (PointeeType.isNull())
2025    return QualType();
2026
2027  if (!getDerived().AlwaysRebuild() &&
2028      PointeeType == T->getPointeeType())
2029    return QualType(T, 0);
2030
2031  return getDerived().RebuildRValueReferenceType(PointeeType);
2032}
2033
2034template<typename Derived>
2035QualType
2036TreeTransform<Derived>::TransformMemberPointerType(const MemberPointerType *T) {
2037  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2038  if (PointeeType.isNull())
2039    return QualType();
2040
2041  QualType ClassType = getDerived().TransformType(QualType(T->getClass(), 0));
2042  if (ClassType.isNull())
2043    return QualType();
2044
2045  if (!getDerived().AlwaysRebuild() &&
2046      PointeeType == T->getPointeeType() &&
2047      ClassType == QualType(T->getClass(), 0))
2048    return QualType(T, 0);
2049
2050  return getDerived().RebuildMemberPointerType(PointeeType, ClassType);
2051}
2052
2053template<typename Derived>
2054QualType
2055TreeTransform<Derived>::TransformConstantArrayType(const ConstantArrayType *T) {
2056  QualType ElementType = getDerived().TransformType(T->getElementType());
2057  if (ElementType.isNull())
2058    return QualType();
2059
2060  if (!getDerived().AlwaysRebuild() &&
2061      ElementType == T->getElementType())
2062    return QualType(T, 0);
2063
2064  return getDerived().RebuildConstantArrayType(ElementType,
2065                                               T->getSizeModifier(),
2066                                               T->getSize(),
2067                                               T->getIndexTypeCVRQualifiers());
2068}
2069
2070template<typename Derived>
2071QualType TreeTransform<Derived>::TransformIncompleteArrayType(
2072                                              const IncompleteArrayType *T) {
2073  QualType ElementType = getDerived().TransformType(T->getElementType());
2074  if (ElementType.isNull())
2075    return QualType();
2076
2077  if (!getDerived().AlwaysRebuild() &&
2078      ElementType == T->getElementType())
2079    return QualType(T, 0);
2080
2081  return getDerived().RebuildIncompleteArrayType(ElementType,
2082                                                 T->getSizeModifier(),
2083                                               T->getIndexTypeCVRQualifiers());
2084}
2085
2086template<typename Derived>
2087QualType TreeTransform<Derived>::TransformVariableArrayType(
2088                                                  const VariableArrayType *T) {
2089  QualType ElementType = getDerived().TransformType(T->getElementType());
2090  if (ElementType.isNull())
2091    return QualType();
2092
2093  // Array bounds are not potentially evaluated contexts
2094  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2095
2096  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2097  if (Size.isInvalid())
2098    return QualType();
2099
2100  if (!getDerived().AlwaysRebuild() &&
2101      ElementType == T->getElementType() &&
2102      Size.get() == T->getSizeExpr()) {
2103    Size.take();
2104    return QualType(T, 0);
2105  }
2106
2107  return getDerived().RebuildVariableArrayType(ElementType,
2108                                               T->getSizeModifier(),
2109                                               move(Size),
2110                                               T->getIndexTypeCVRQualifiers(),
2111                                               T->getBracketsRange());
2112}
2113
2114template<typename Derived>
2115QualType TreeTransform<Derived>::TransformDependentSizedArrayType(
2116                                          const DependentSizedArrayType *T) {
2117  QualType ElementType = getDerived().TransformType(T->getElementType());
2118  if (ElementType.isNull())
2119    return QualType();
2120
2121  // Array bounds are not potentially evaluated contexts
2122  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2123
2124  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2125  if (Size.isInvalid())
2126    return QualType();
2127
2128  if (!getDerived().AlwaysRebuild() &&
2129      ElementType == T->getElementType() &&
2130      Size.get() == T->getSizeExpr()) {
2131    Size.take();
2132    return QualType(T, 0);
2133  }
2134
2135  return getDerived().RebuildDependentSizedArrayType(ElementType,
2136                                                     T->getSizeModifier(),
2137                                                     move(Size),
2138                                            T->getIndexTypeCVRQualifiers(),
2139                                                     T->getBracketsRange());
2140}
2141
2142template<typename Derived>
2143QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2144                                      const DependentSizedExtVectorType *T) {
2145  QualType ElementType = getDerived().TransformType(T->getElementType());
2146  if (ElementType.isNull())
2147    return QualType();
2148
2149  // Vector sizes are not potentially evaluated contexts
2150  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2151
2152  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2153  if (Size.isInvalid())
2154    return QualType();
2155
2156  if (!getDerived().AlwaysRebuild() &&
2157      ElementType == T->getElementType() &&
2158      Size.get() == T->getSizeExpr()) {
2159    Size.take();
2160    return QualType(T, 0);
2161  }
2162
2163  return getDerived().RebuildDependentSizedExtVectorType(ElementType,
2164                                                         move(Size),
2165                                                         T->getAttributeLoc());
2166}
2167
2168template<typename Derived>
2169QualType TreeTransform<Derived>::TransformVectorType(const VectorType *T) {
2170  QualType ElementType = getDerived().TransformType(T->getElementType());
2171  if (ElementType.isNull())
2172    return QualType();
2173
2174  if (!getDerived().AlwaysRebuild() &&
2175      ElementType == T->getElementType())
2176    return QualType(T, 0);
2177
2178  return getDerived().RebuildVectorType(ElementType, T->getNumElements());
2179}
2180
2181template<typename Derived>
2182QualType
2183TreeTransform<Derived>::TransformExtVectorType(const ExtVectorType *T) {
2184  QualType ElementType = getDerived().TransformType(T->getElementType());
2185  if (ElementType.isNull())
2186    return QualType();
2187
2188  if (!getDerived().AlwaysRebuild() &&
2189      ElementType == T->getElementType())
2190    return QualType(T, 0);
2191
2192  return getDerived().RebuildExtVectorType(ElementType, T->getNumElements(),
2193                                           /*FIXME*/SourceLocation());
2194}
2195
2196template<typename Derived>
2197QualType TreeTransform<Derived>::TransformFunctionProtoType(
2198                                                  const FunctionProtoType *T) {
2199  QualType ResultType = getDerived().TransformType(T->getResultType());
2200  if (ResultType.isNull())
2201    return QualType();
2202
2203  llvm::SmallVector<QualType, 4> ParamTypes;
2204  for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
2205                                         ParamEnd = T->arg_type_end();
2206       Param != ParamEnd; ++Param) {
2207    QualType P = getDerived().TransformType(*Param);
2208    if (P.isNull())
2209      return QualType();
2210
2211    ParamTypes.push_back(P);
2212  }
2213
2214  if (!getDerived().AlwaysRebuild() &&
2215      ResultType == T->getResultType() &&
2216      std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin()))
2217    return QualType(T, 0);
2218
2219  return getDerived().RebuildFunctionProtoType(ResultType, ParamTypes.data(),
2220                                               ParamTypes.size(), T->isVariadic(),
2221                                               T->getTypeQuals());
2222}
2223
2224template<typename Derived>
2225QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2226                                                const FunctionNoProtoType *T) {
2227  // FIXME: Implement
2228  return QualType(T, 0);
2229}
2230
2231template<typename Derived>
2232QualType TreeTransform<Derived>::TransformTypedefType(const TypedefType *T) {
2233  TypedefDecl *Typedef
2234    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2235  if (!Typedef)
2236    return QualType();
2237
2238  if (!getDerived().AlwaysRebuild() &&
2239      Typedef == T->getDecl())
2240    return QualType(T, 0);
2241
2242  return getDerived().RebuildTypedefType(Typedef);
2243}
2244
2245template<typename Derived>
2246QualType TreeTransform<Derived>::TransformTypeOfExprType(
2247                                                    const TypeOfExprType *T) {
2248  // typeof expressions are not potentially evaluated contexts
2249  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2250
2251  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2252  if (E.isInvalid())
2253    return QualType();
2254
2255  if (!getDerived().AlwaysRebuild() &&
2256      E.get() == T->getUnderlyingExpr()) {
2257    E.take();
2258    return QualType(T, 0);
2259  }
2260
2261  return getDerived().RebuildTypeOfExprType(move(E));
2262}
2263
2264template<typename Derived>
2265QualType TreeTransform<Derived>::TransformTypeOfType(const TypeOfType *T) {
2266  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2267  if (Underlying.isNull())
2268    return QualType();
2269
2270  if (!getDerived().AlwaysRebuild() &&
2271      Underlying == T->getUnderlyingType())
2272    return QualType(T, 0);
2273
2274  return getDerived().RebuildTypeOfType(Underlying);
2275}
2276
2277template<typename Derived>
2278QualType TreeTransform<Derived>::TransformDecltypeType(const DecltypeType *T) {
2279  // decltype expressions are not potentially evaluated contexts
2280  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2281
2282  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2283  if (E.isInvalid())
2284    return QualType();
2285
2286  if (!getDerived().AlwaysRebuild() &&
2287      E.get() == T->getUnderlyingExpr()) {
2288    E.take();
2289    return QualType(T, 0);
2290  }
2291
2292  return getDerived().RebuildDecltypeType(move(E));
2293}
2294
2295template<typename Derived>
2296QualType TreeTransform<Derived>::TransformRecordType(const RecordType *T) {
2297  RecordDecl *Record
2298  = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
2299  if (!Record)
2300    return QualType();
2301
2302  if (!getDerived().AlwaysRebuild() &&
2303      Record == T->getDecl())
2304    return QualType(T, 0);
2305
2306  return getDerived().RebuildRecordType(Record);
2307}
2308
2309template<typename Derived>
2310QualType TreeTransform<Derived>::TransformEnumType(const EnumType *T) {
2311  EnumDecl *Enum
2312  = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
2313  if (!Enum)
2314    return QualType();
2315
2316  if (!getDerived().AlwaysRebuild() &&
2317      Enum == T->getDecl())
2318    return QualType(T, 0);
2319
2320  return getDerived().RebuildEnumType(Enum);
2321}
2322
2323template <typename Derived>
2324QualType TreeTransform<Derived>::TransformElaboratedType(
2325                                                    const ElaboratedType *T) {
2326  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2327  if (Underlying.isNull())
2328    return QualType();
2329
2330  if (!getDerived().AlwaysRebuild() &&
2331      Underlying == T->getUnderlyingType())
2332    return QualType(T, 0);
2333
2334  return getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
2335}
2336
2337
2338template<typename Derived>
2339QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
2340                                              const TemplateTypeParmType *T) {
2341  // Nothing to do
2342  return QualType(T, 0);
2343}
2344
2345template<typename Derived>
2346QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
2347                                         const SubstTemplateTypeParmType *T) {
2348  // Nothing to do
2349  return QualType(T, 0);
2350}
2351
2352template<typename Derived>
2353inline QualType
2354TreeTransform<Derived>::TransformTemplateSpecializationType(
2355                                          const TemplateSpecializationType *T) {
2356  return TransformTemplateSpecializationType(T, QualType());
2357}
2358
2359template<typename Derived>
2360QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2361                                        const TemplateSpecializationType *T,
2362                                                          QualType ObjectType) {
2363  TemplateName Template
2364    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
2365  if (Template.isNull())
2366    return QualType();
2367
2368  llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs;
2369  NewTemplateArgs.reserve(T->getNumArgs());
2370  for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end();
2371       Arg != ArgEnd; ++Arg) {
2372    TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg);
2373    if (NewArg.isNull())
2374      return QualType();
2375
2376    NewTemplateArgs.push_back(NewArg);
2377  }
2378
2379  // FIXME: early abort if all of the template arguments and such are the
2380  // same.
2381
2382  // FIXME: We're missing the locations of the template name, '<', and '>'.
2383  return getDerived().RebuildTemplateSpecializationType(Template,
2384                                                        NewTemplateArgs.data(),
2385                                                        NewTemplateArgs.size());
2386}
2387
2388template<typename Derived>
2389QualType TreeTransform<Derived>::TransformQualifiedNameType(
2390                                                  const QualifiedNameType *T) {
2391  NestedNameSpecifier *NNS
2392    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2393                                                SourceRange());
2394  if (!NNS)
2395    return QualType();
2396
2397  QualType Named = getDerived().TransformType(T->getNamedType());
2398  if (Named.isNull())
2399    return QualType();
2400
2401  if (!getDerived().AlwaysRebuild() &&
2402      NNS == T->getQualifier() &&
2403      Named == T->getNamedType())
2404    return QualType(T, 0);
2405
2406  return getDerived().RebuildQualifiedNameType(NNS, Named);
2407}
2408
2409template<typename Derived>
2410QualType TreeTransform<Derived>::TransformTypenameType(const TypenameType *T) {
2411  NestedNameSpecifier *NNS
2412    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2413                        SourceRange(/*FIXME:*/getDerived().getBaseLocation()));
2414  if (!NNS)
2415    return QualType();
2416
2417  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
2418    QualType NewTemplateId
2419      = getDerived().TransformType(QualType(TemplateId, 0));
2420    if (NewTemplateId.isNull())
2421      return QualType();
2422
2423    if (!getDerived().AlwaysRebuild() &&
2424        NNS == T->getQualifier() &&
2425        NewTemplateId == QualType(TemplateId, 0))
2426      return QualType(T, 0);
2427
2428    return getDerived().RebuildTypenameType(NNS, NewTemplateId);
2429  }
2430
2431  return getDerived().RebuildTypenameType(NNS, T->getIdentifier());
2432}
2433
2434template<typename Derived>
2435QualType TreeTransform<Derived>::TransformObjCInterfaceType(
2436                                                  const ObjCInterfaceType *T) {
2437  // FIXME: Implement
2438  return QualType(T, 0);
2439}
2440
2441template<typename Derived>
2442QualType TreeTransform<Derived>::TransformObjCObjectPointerType(
2443                                             const ObjCObjectPointerType *T) {
2444  // FIXME: Implement
2445  return QualType(T, 0);
2446}
2447
2448template<typename Derived>
2449QualType TreeTransform<Derived>::TransformObjCProtocolListType(
2450                                                const ObjCProtocolListType *T) {
2451  assert(false && "Should not see ObjCProtocolList types");
2452  return QualType(T, 0);
2453}
2454
2455//===----------------------------------------------------------------------===//
2456// Statement transformation
2457//===----------------------------------------------------------------------===//
2458template<typename Derived>
2459Sema::OwningStmtResult
2460TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
2461  return SemaRef.Owned(S->Retain());
2462}
2463
2464template<typename Derived>
2465Sema::OwningStmtResult
2466TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
2467  return getDerived().TransformCompoundStmt(S, false);
2468}
2469
2470template<typename Derived>
2471Sema::OwningStmtResult
2472TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
2473                                              bool IsStmtExpr) {
2474  bool SubStmtChanged = false;
2475  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
2476  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
2477       B != BEnd; ++B) {
2478    OwningStmtResult Result = getDerived().TransformStmt(*B);
2479    if (Result.isInvalid())
2480      return getSema().StmtError();
2481
2482    SubStmtChanged = SubStmtChanged || Result.get() != *B;
2483    Statements.push_back(Result.takeAs<Stmt>());
2484  }
2485
2486  if (!getDerived().AlwaysRebuild() &&
2487      !SubStmtChanged)
2488    return SemaRef.Owned(S->Retain());
2489
2490  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
2491                                          move_arg(Statements),
2492                                          S->getRBracLoc(),
2493                                          IsStmtExpr);
2494}
2495
2496template<typename Derived>
2497Sema::OwningStmtResult
2498TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
2499  // The case value expressions are not potentially evaluated.
2500  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2501
2502  // Transform the left-hand case value.
2503  OwningExprResult LHS = getDerived().TransformExpr(S->getLHS());
2504  if (LHS.isInvalid())
2505    return SemaRef.StmtError();
2506
2507  // Transform the right-hand case value (for the GNU case-range extension).
2508  OwningExprResult RHS = getDerived().TransformExpr(S->getRHS());
2509  if (RHS.isInvalid())
2510    return SemaRef.StmtError();
2511
2512  // Build the case statement.
2513  // Case statements are always rebuilt so that they will attached to their
2514  // transformed switch statement.
2515  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
2516                                                       move(LHS),
2517                                                       S->getEllipsisLoc(),
2518                                                       move(RHS),
2519                                                       S->getColonLoc());
2520  if (Case.isInvalid())
2521    return SemaRef.StmtError();
2522
2523  // Transform the statement following the case
2524  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
2525  if (SubStmt.isInvalid())
2526    return SemaRef.StmtError();
2527
2528  // Attach the body to the case statement
2529  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
2530}
2531
2532template<typename Derived>
2533Sema::OwningStmtResult
2534TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
2535  // Transform the statement following the default case
2536  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
2537  if (SubStmt.isInvalid())
2538    return SemaRef.StmtError();
2539
2540  // Default statements are always rebuilt
2541  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
2542                                         move(SubStmt));
2543}
2544
2545template<typename Derived>
2546Sema::OwningStmtResult
2547TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
2548  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
2549  if (SubStmt.isInvalid())
2550    return SemaRef.StmtError();
2551
2552  // FIXME: Pass the real colon location in.
2553  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
2554  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
2555                                       move(SubStmt));
2556}
2557
2558template<typename Derived>
2559Sema::OwningStmtResult
2560TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
2561  // Transform the condition
2562  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2563  if (Cond.isInvalid())
2564    return SemaRef.StmtError();
2565
2566  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
2567
2568  // Transform the "then" branch.
2569  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
2570  if (Then.isInvalid())
2571    return SemaRef.StmtError();
2572
2573  // Transform the "else" branch.
2574  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
2575  if (Else.isInvalid())
2576    return SemaRef.StmtError();
2577
2578  if (!getDerived().AlwaysRebuild() &&
2579      FullCond->get() == S->getCond() &&
2580      Then.get() == S->getThen() &&
2581      Else.get() == S->getElse())
2582    return SemaRef.Owned(S->Retain());
2583
2584  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then),
2585                                    S->getElseLoc(), move(Else));
2586}
2587
2588template<typename Derived>
2589Sema::OwningStmtResult
2590TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
2591  // Transform the condition.
2592  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2593  if (Cond.isInvalid())
2594    return SemaRef.StmtError();
2595
2596  // Rebuild the switch statement.
2597  OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond));
2598  if (Switch.isInvalid())
2599    return SemaRef.StmtError();
2600
2601  // Transform the body of the switch statement.
2602  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2603  if (Body.isInvalid())
2604    return SemaRef.StmtError();
2605
2606  // Complete the switch statement.
2607  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
2608                                            move(Body));
2609}
2610
2611template<typename Derived>
2612Sema::OwningStmtResult
2613TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
2614  // Transform the condition
2615  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2616  if (Cond.isInvalid())
2617    return SemaRef.StmtError();
2618
2619  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
2620
2621  // Transform the body
2622  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2623  if (Body.isInvalid())
2624    return SemaRef.StmtError();
2625
2626  if (!getDerived().AlwaysRebuild() &&
2627      FullCond->get() == S->getCond() &&
2628      Body.get() == S->getBody())
2629    return SemaRef.Owned(S->Retain());
2630
2631  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body));
2632}
2633
2634template<typename Derived>
2635Sema::OwningStmtResult
2636TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
2637  // Transform the condition
2638  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2639  if (Cond.isInvalid())
2640    return SemaRef.StmtError();
2641
2642  // Transform the body
2643  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2644  if (Body.isInvalid())
2645    return SemaRef.StmtError();
2646
2647  if (!getDerived().AlwaysRebuild() &&
2648      Cond.get() == S->getCond() &&
2649      Body.get() == S->getBody())
2650    return SemaRef.Owned(S->Retain());
2651
2652  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
2653                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
2654                                    S->getRParenLoc());
2655}
2656
2657template<typename Derived>
2658Sema::OwningStmtResult
2659TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
2660  // Transform the initialization statement
2661  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
2662  if (Init.isInvalid())
2663    return SemaRef.StmtError();
2664
2665  // Transform the condition
2666  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2667  if (Cond.isInvalid())
2668    return SemaRef.StmtError();
2669
2670  // Transform the increment
2671  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
2672  if (Inc.isInvalid())
2673    return SemaRef.StmtError();
2674
2675  // Transform the body
2676  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2677  if (Body.isInvalid())
2678    return SemaRef.StmtError();
2679
2680  if (!getDerived().AlwaysRebuild() &&
2681      Init.get() == S->getInit() &&
2682      Cond.get() == S->getCond() &&
2683      Inc.get() == S->getInc() &&
2684      Body.get() == S->getBody())
2685    return SemaRef.Owned(S->Retain());
2686
2687  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
2688                                     move(Init), move(Cond), move(Inc),
2689                                     S->getRParenLoc(), move(Body));
2690}
2691
2692template<typename Derived>
2693Sema::OwningStmtResult
2694TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
2695  // Goto statements must always be rebuilt, to resolve the label.
2696  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
2697                                      S->getLabel());
2698}
2699
2700template<typename Derived>
2701Sema::OwningStmtResult
2702TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
2703  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
2704  if (Target.isInvalid())
2705    return SemaRef.StmtError();
2706
2707  if (!getDerived().AlwaysRebuild() &&
2708      Target.get() == S->getTarget())
2709    return SemaRef.Owned(S->Retain());
2710
2711  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
2712                                              move(Target));
2713}
2714
2715template<typename Derived>
2716Sema::OwningStmtResult
2717TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
2718  return SemaRef.Owned(S->Retain());
2719}
2720
2721template<typename Derived>
2722Sema::OwningStmtResult
2723TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
2724  return SemaRef.Owned(S->Retain());
2725}
2726
2727template<typename Derived>
2728Sema::OwningStmtResult
2729TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
2730  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
2731  if (Result.isInvalid())
2732    return SemaRef.StmtError();
2733
2734  // FIXME: We always rebuild the return statement because there is no way
2735  // to tell whether the return type of the function has changed.
2736  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
2737}
2738
2739template<typename Derived>
2740Sema::OwningStmtResult
2741TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
2742  bool DeclChanged = false;
2743  llvm::SmallVector<Decl *, 4> Decls;
2744  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
2745       D != DEnd; ++D) {
2746    Decl *Transformed = getDerived().TransformDefinition(*D);
2747    if (!Transformed)
2748      return SemaRef.StmtError();
2749
2750    if (Transformed != *D)
2751      DeclChanged = true;
2752
2753    Decls.push_back(Transformed);
2754  }
2755
2756  if (!getDerived().AlwaysRebuild() && !DeclChanged)
2757    return SemaRef.Owned(S->Retain());
2758
2759  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
2760                                      S->getStartLoc(), S->getEndLoc());
2761}
2762
2763template<typename Derived>
2764Sema::OwningStmtResult
2765TreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
2766  assert(false && "SwitchCase is abstract and cannot be transformed");
2767  return SemaRef.Owned(S->Retain());
2768}
2769
2770template<typename Derived>
2771Sema::OwningStmtResult
2772TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
2773  // FIXME: Implement!
2774  assert(false && "Inline assembly cannot be transformed");
2775  return SemaRef.Owned(S->Retain());
2776}
2777
2778
2779template<typename Derived>
2780Sema::OwningStmtResult
2781TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
2782  // FIXME: Implement this
2783  assert(false && "Cannot transform an Objective-C @try statement");
2784  return SemaRef.Owned(S->Retain());
2785}
2786
2787template<typename Derived>
2788Sema::OwningStmtResult
2789TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
2790  // FIXME: Implement this
2791  assert(false && "Cannot transform an Objective-C @catch statement");
2792  return SemaRef.Owned(S->Retain());
2793}
2794
2795template<typename Derived>
2796Sema::OwningStmtResult
2797TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
2798  // FIXME: Implement this
2799  assert(false && "Cannot transform an Objective-C @finally statement");
2800  return SemaRef.Owned(S->Retain());
2801}
2802
2803template<typename Derived>
2804Sema::OwningStmtResult
2805TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
2806  // FIXME: Implement this
2807  assert(false && "Cannot transform an Objective-C @throw statement");
2808  return SemaRef.Owned(S->Retain());
2809}
2810
2811template<typename Derived>
2812Sema::OwningStmtResult
2813TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
2814                                                  ObjCAtSynchronizedStmt *S) {
2815  // FIXME: Implement this
2816  assert(false && "Cannot transform an Objective-C @synchronized statement");
2817  return SemaRef.Owned(S->Retain());
2818}
2819
2820template<typename Derived>
2821Sema::OwningStmtResult
2822TreeTransform<Derived>::TransformObjCForCollectionStmt(
2823                                                  ObjCForCollectionStmt *S) {
2824  // FIXME: Implement this
2825  assert(false && "Cannot transform an Objective-C for-each statement");
2826  return SemaRef.Owned(S->Retain());
2827}
2828
2829
2830template<typename Derived>
2831Sema::OwningStmtResult
2832TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
2833  // Transform the exception declaration, if any.
2834  VarDecl *Var = 0;
2835  if (S->getExceptionDecl()) {
2836    VarDecl *ExceptionDecl = S->getExceptionDecl();
2837    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
2838                         ExceptionDecl->getDeclName());
2839
2840    QualType T = getDerived().TransformType(ExceptionDecl->getType());
2841    if (T.isNull())
2842      return SemaRef.StmtError();
2843
2844    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
2845                                            T,
2846                                            ExceptionDecl->getDeclaratorInfo(),
2847                                            ExceptionDecl->getIdentifier(),
2848                                            ExceptionDecl->getLocation(),
2849                                            /*FIXME: Inaccurate*/
2850                                    SourceRange(ExceptionDecl->getLocation()));
2851    if (!Var || Var->isInvalidDecl()) {
2852      if (Var)
2853        Var->Destroy(SemaRef.Context);
2854      return SemaRef.StmtError();
2855    }
2856  }
2857
2858  // Transform the actual exception handler.
2859  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
2860  if (Handler.isInvalid()) {
2861    if (Var)
2862      Var->Destroy(SemaRef.Context);
2863    return SemaRef.StmtError();
2864  }
2865
2866  if (!getDerived().AlwaysRebuild() &&
2867      !Var &&
2868      Handler.get() == S->getHandlerBlock())
2869    return SemaRef.Owned(S->Retain());
2870
2871  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
2872                                          Var,
2873                                          move(Handler));
2874}
2875
2876template<typename Derived>
2877Sema::OwningStmtResult
2878TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
2879  // Transform the try block itself.
2880  OwningStmtResult TryBlock
2881    = getDerived().TransformCompoundStmt(S->getTryBlock());
2882  if (TryBlock.isInvalid())
2883    return SemaRef.StmtError();
2884
2885  // Transform the handlers.
2886  bool HandlerChanged = false;
2887  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
2888  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
2889    OwningStmtResult Handler
2890      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
2891    if (Handler.isInvalid())
2892      return SemaRef.StmtError();
2893
2894    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
2895    Handlers.push_back(Handler.takeAs<Stmt>());
2896  }
2897
2898  if (!getDerived().AlwaysRebuild() &&
2899      TryBlock.get() == S->getTryBlock() &&
2900      !HandlerChanged)
2901    return SemaRef.Owned(S->Retain());
2902
2903  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
2904                                        move_arg(Handlers));
2905}
2906
2907//===----------------------------------------------------------------------===//
2908// Expression transformation
2909//===----------------------------------------------------------------------===//
2910template<typename Derived>
2911Sema::OwningExprResult
2912TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
2913  return SemaRef.Owned(E->Retain());
2914}
2915
2916template<typename Derived>
2917Sema::OwningExprResult
2918TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
2919  NamedDecl *ND
2920    = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
2921  if (!ND)
2922    return SemaRef.ExprError();
2923
2924  if (!getDerived().AlwaysRebuild() && ND == E->getDecl())
2925    return SemaRef.Owned(E->Retain());
2926
2927  return getDerived().RebuildDeclRefExpr(ND, E->getLocation());
2928}
2929
2930template<typename Derived>
2931Sema::OwningExprResult
2932TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
2933  return SemaRef.Owned(E->Retain());
2934}
2935
2936template<typename Derived>
2937Sema::OwningExprResult
2938TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
2939  return SemaRef.Owned(E->Retain());
2940}
2941
2942template<typename Derived>
2943Sema::OwningExprResult
2944TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
2945  return SemaRef.Owned(E->Retain());
2946}
2947
2948template<typename Derived>
2949Sema::OwningExprResult
2950TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
2951  return SemaRef.Owned(E->Retain());
2952}
2953
2954template<typename Derived>
2955Sema::OwningExprResult
2956TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
2957  return SemaRef.Owned(E->Retain());
2958}
2959
2960template<typename Derived>
2961Sema::OwningExprResult
2962TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
2963  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2964  if (SubExpr.isInvalid())
2965    return SemaRef.ExprError();
2966
2967  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
2968    return SemaRef.Owned(E->Retain());
2969
2970  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
2971                                       E->getRParen());
2972}
2973
2974template<typename Derived>
2975Sema::OwningExprResult
2976TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
2977  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2978  if (SubExpr.isInvalid())
2979    return SemaRef.ExprError();
2980
2981  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
2982    return SemaRef.Owned(E->Retain());
2983
2984  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
2985                                           E->getOpcode(),
2986                                           move(SubExpr));
2987}
2988
2989template<typename Derived>
2990Sema::OwningExprResult
2991TreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
2992  if (E->isArgumentType()) {
2993    QualType T = getDerived().TransformType(E->getArgumentType());
2994    if (T.isNull())
2995      return SemaRef.ExprError();
2996
2997    if (!getDerived().AlwaysRebuild() && T == E->getArgumentType())
2998      return SemaRef.Owned(E->Retain());
2999
3000    return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(),
3001                                             E->isSizeOf(),
3002                                             E->getSourceRange());
3003  }
3004
3005  Sema::OwningExprResult SubExpr(SemaRef);
3006  {
3007    // C++0x [expr.sizeof]p1:
3008    //   The operand is either an expression, which is an unevaluated operand
3009    //   [...]
3010    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
3011
3012    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3013    if (SubExpr.isInvalid())
3014      return SemaRef.ExprError();
3015
3016    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3017      return SemaRef.Owned(E->Retain());
3018  }
3019
3020  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3021                                           E->isSizeOf(),
3022                                           E->getSourceRange());
3023}
3024
3025template<typename Derived>
3026Sema::OwningExprResult
3027TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
3028  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3029  if (LHS.isInvalid())
3030    return SemaRef.ExprError();
3031
3032  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3033  if (RHS.isInvalid())
3034    return SemaRef.ExprError();
3035
3036
3037  if (!getDerived().AlwaysRebuild() &&
3038      LHS.get() == E->getLHS() &&
3039      RHS.get() == E->getRHS())
3040    return SemaRef.Owned(E->Retain());
3041
3042  return getDerived().RebuildArraySubscriptExpr(move(LHS),
3043                                           /*FIXME:*/E->getLHS()->getLocStart(),
3044                                                move(RHS),
3045                                                E->getRBracketLoc());
3046}
3047
3048template<typename Derived>
3049Sema::OwningExprResult
3050TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
3051  // Transform the callee.
3052  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3053  if (Callee.isInvalid())
3054    return SemaRef.ExprError();
3055
3056  // Transform arguments.
3057  bool ArgChanged = false;
3058  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3059  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3060  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3061    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3062    if (Arg.isInvalid())
3063      return SemaRef.ExprError();
3064
3065    // FIXME: Wrong source location information for the ','.
3066    FakeCommaLocs.push_back(
3067       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
3068
3069    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
3070    Args.push_back(Arg.takeAs<Expr>());
3071  }
3072
3073  if (!getDerived().AlwaysRebuild() &&
3074      Callee.get() == E->getCallee() &&
3075      !ArgChanged)
3076    return SemaRef.Owned(E->Retain());
3077
3078  // FIXME: Wrong source location information for the '('.
3079  SourceLocation FakeLParenLoc
3080    = ((Expr *)Callee.get())->getSourceRange().getBegin();
3081  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3082                                      move_arg(Args),
3083                                      FakeCommaLocs.data(),
3084                                      E->getRParenLoc());
3085}
3086
3087template<typename Derived>
3088Sema::OwningExprResult
3089TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
3090  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3091  if (Base.isInvalid())
3092    return SemaRef.ExprError();
3093
3094  NestedNameSpecifier *Qualifier = 0;
3095  if (E->hasQualifier()) {
3096    Qualifier
3097      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3098                                                  E->getQualifierRange());
3099    if (Qualifier == 0)
3100      return SemaRef.ExprError();
3101  }
3102
3103  NamedDecl *Member
3104    = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
3105  if (!Member)
3106    return SemaRef.ExprError();
3107
3108  if (!getDerived().AlwaysRebuild() &&
3109      Base.get() == E->getBase() &&
3110      Qualifier == E->getQualifier() &&
3111      Member == E->getMemberDecl())
3112    return SemaRef.Owned(E->Retain());
3113
3114  // FIXME: Bogus source location for the operator
3115  SourceLocation FakeOperatorLoc
3116    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3117
3118  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3119                                        E->isArrow(),
3120                                        Qualifier,
3121                                        E->getQualifierRange(),
3122                                        E->getMemberLoc(),
3123                                        Member);
3124}
3125
3126template<typename Derived>
3127Sema::OwningExprResult
3128TreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
3129  assert(false && "Cannot transform abstract class");
3130  return SemaRef.Owned(E->Retain());
3131}
3132
3133template<typename Derived>
3134Sema::OwningExprResult
3135TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
3136  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3137  if (LHS.isInvalid())
3138    return SemaRef.ExprError();
3139
3140  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3141  if (RHS.isInvalid())
3142    return SemaRef.ExprError();
3143
3144  if (!getDerived().AlwaysRebuild() &&
3145      LHS.get() == E->getLHS() &&
3146      RHS.get() == E->getRHS())
3147    return SemaRef.Owned(E->Retain());
3148
3149  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3150                                            move(LHS), move(RHS));
3151}
3152
3153template<typename Derived>
3154Sema::OwningExprResult
3155TreeTransform<Derived>::TransformCompoundAssignOperator(
3156                                                  CompoundAssignOperator *E) {
3157  return getDerived().TransformBinaryOperator(E);
3158}
3159
3160template<typename Derived>
3161Sema::OwningExprResult
3162TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
3163  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3164  if (Cond.isInvalid())
3165    return SemaRef.ExprError();
3166
3167  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3168  if (LHS.isInvalid())
3169    return SemaRef.ExprError();
3170
3171  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3172  if (RHS.isInvalid())
3173    return SemaRef.ExprError();
3174
3175  if (!getDerived().AlwaysRebuild() &&
3176      Cond.get() == E->getCond() &&
3177      LHS.get() == E->getLHS() &&
3178      RHS.get() == E->getRHS())
3179    return SemaRef.Owned(E->Retain());
3180
3181  return getDerived().RebuildConditionalOperator(move(Cond),
3182                                                 E->getQuestionLoc(),
3183                                                 move(LHS),
3184                                                 E->getColonLoc(),
3185                                                 move(RHS));
3186}
3187
3188template<typename Derived>
3189Sema::OwningExprResult
3190TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
3191  QualType T = getDerived().TransformType(E->getType());
3192  if (T.isNull())
3193    return SemaRef.ExprError();
3194
3195  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3196  if (SubExpr.isInvalid())
3197    return SemaRef.ExprError();
3198
3199  if (!getDerived().AlwaysRebuild() &&
3200      T == E->getType() &&
3201      SubExpr.get() == E->getSubExpr())
3202    return SemaRef.Owned(E->Retain());
3203
3204  return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
3205                                              move(SubExpr),
3206                                              E->isLvalueCast());
3207}
3208
3209template<typename Derived>
3210Sema::OwningExprResult
3211TreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
3212  assert(false && "Cannot transform abstract class");
3213  return SemaRef.Owned(E->Retain());
3214}
3215
3216template<typename Derived>
3217Sema::OwningExprResult
3218TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
3219  QualType T;
3220  {
3221    // FIXME: Source location isn't quite accurate.
3222    SourceLocation TypeStartLoc
3223      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3224    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
3225
3226    T = getDerived().TransformType(E->getTypeAsWritten());
3227    if (T.isNull())
3228      return SemaRef.ExprError();
3229  }
3230
3231  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3232  if (SubExpr.isInvalid())
3233    return SemaRef.ExprError();
3234
3235  if (!getDerived().AlwaysRebuild() &&
3236      T == E->getTypeAsWritten() &&
3237      SubExpr.get() == E->getSubExpr())
3238    return SemaRef.Owned(E->Retain());
3239
3240  return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
3241                                            E->getRParenLoc(),
3242                                            move(SubExpr));
3243}
3244
3245template<typename Derived>
3246Sema::OwningExprResult
3247TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
3248  QualType T;
3249  {
3250    // FIXME: Source location isn't quite accurate.
3251    SourceLocation FakeTypeLoc
3252      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3253    TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
3254
3255    T = getDerived().TransformType(E->getType());
3256    if (T.isNull())
3257      return SemaRef.ExprError();
3258  }
3259
3260  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3261  if (Init.isInvalid())
3262    return SemaRef.ExprError();
3263
3264  if (!getDerived().AlwaysRebuild() &&
3265      T == E->getType() &&
3266      Init.get() == E->getInitializer())
3267    return SemaRef.Owned(E->Retain());
3268
3269  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3270                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
3271                                                 move(Init));
3272}
3273
3274template<typename Derived>
3275Sema::OwningExprResult
3276TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
3277  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3278  if (Base.isInvalid())
3279    return SemaRef.ExprError();
3280
3281  if (!getDerived().AlwaysRebuild() &&
3282      Base.get() == E->getBase())
3283    return SemaRef.Owned(E->Retain());
3284
3285  // FIXME: Bad source location
3286  SourceLocation FakeOperatorLoc
3287    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3288  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3289                                                  E->getAccessorLoc(),
3290                                                  E->getAccessor());
3291}
3292
3293template<typename Derived>
3294Sema::OwningExprResult
3295TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
3296  bool InitChanged = false;
3297
3298  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3299  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3300    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3301    if (Init.isInvalid())
3302      return SemaRef.ExprError();
3303
3304    InitChanged = InitChanged || Init.get() != E->getInit(I);
3305    Inits.push_back(Init.takeAs<Expr>());
3306  }
3307
3308  if (!getDerived().AlwaysRebuild() && !InitChanged)
3309    return SemaRef.Owned(E->Retain());
3310
3311  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3312                                      E->getRBraceLoc());
3313}
3314
3315template<typename Derived>
3316Sema::OwningExprResult
3317TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
3318  Designation Desig;
3319
3320  // transform the initializer value
3321  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3322  if (Init.isInvalid())
3323    return SemaRef.ExprError();
3324
3325  // transform the designators.
3326  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3327  bool ExprChanged = false;
3328  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3329                                             DEnd = E->designators_end();
3330       D != DEnd; ++D) {
3331    if (D->isFieldDesignator()) {
3332      Desig.AddDesignator(Designator::getField(D->getFieldName(),
3333                                               D->getDotLoc(),
3334                                               D->getFieldLoc()));
3335      continue;
3336    }
3337
3338    if (D->isArrayDesignator()) {
3339      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3340      if (Index.isInvalid())
3341        return SemaRef.ExprError();
3342
3343      Desig.AddDesignator(Designator::getArray(Index.get(),
3344                                               D->getLBracketLoc()));
3345
3346      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3347      ArrayExprs.push_back(Index.release());
3348      continue;
3349    }
3350
3351    assert(D->isArrayRangeDesignator() && "New kind of designator?");
3352    OwningExprResult Start
3353      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3354    if (Start.isInvalid())
3355      return SemaRef.ExprError();
3356
3357    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3358    if (End.isInvalid())
3359      return SemaRef.ExprError();
3360
3361    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
3362                                                  End.get(),
3363                                                  D->getLBracketLoc(),
3364                                                  D->getEllipsisLoc()));
3365
3366    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3367      End.get() != E->getArrayRangeEnd(*D);
3368
3369    ArrayExprs.push_back(Start.release());
3370    ArrayExprs.push_back(End.release());
3371  }
3372
3373  if (!getDerived().AlwaysRebuild() &&
3374      Init.get() == E->getInit() &&
3375      !ExprChanged)
3376    return SemaRef.Owned(E->Retain());
3377
3378  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3379                                                E->getEqualOrColonLoc(),
3380                                                E->usesGNUSyntax(), move(Init));
3381}
3382
3383template<typename Derived>
3384Sema::OwningExprResult
3385TreeTransform<Derived>::TransformImplicitValueInitExpr(
3386                                                    ImplicitValueInitExpr *E) {
3387  QualType T = getDerived().TransformType(E->getType());
3388  if (T.isNull())
3389    return SemaRef.ExprError();
3390
3391  if (!getDerived().AlwaysRebuild() &&
3392      T == E->getType())
3393    return SemaRef.Owned(E->Retain());
3394
3395  return getDerived().RebuildImplicitValueInitExpr(T);
3396}
3397
3398template<typename Derived>
3399Sema::OwningExprResult
3400TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
3401  // FIXME: Do we want the type as written?
3402  QualType T;
3403
3404  {
3405    // FIXME: Source location isn't quite accurate.
3406    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3407    T = getDerived().TransformType(E->getType());
3408    if (T.isNull())
3409      return SemaRef.ExprError();
3410  }
3411
3412  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3413  if (SubExpr.isInvalid())
3414    return SemaRef.ExprError();
3415
3416  if (!getDerived().AlwaysRebuild() &&
3417      T == E->getType() &&
3418      SubExpr.get() == E->getSubExpr())
3419    return SemaRef.Owned(E->Retain());
3420
3421  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
3422                                       T, E->getRParenLoc());
3423}
3424
3425template<typename Derived>
3426Sema::OwningExprResult
3427TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
3428  bool ArgumentChanged = false;
3429  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3430  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
3431    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
3432    if (Init.isInvalid())
3433      return SemaRef.ExprError();
3434
3435    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
3436    Inits.push_back(Init.takeAs<Expr>());
3437  }
3438
3439  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
3440                                           move_arg(Inits),
3441                                           E->getRParenLoc());
3442}
3443
3444/// \brief Transform an address-of-label expression.
3445///
3446/// By default, the transformation of an address-of-label expression always
3447/// rebuilds the expression, so that the label identifier can be resolved to
3448/// the corresponding label statement by semantic analysis.
3449template<typename Derived>
3450Sema::OwningExprResult
3451TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
3452  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
3453                                           E->getLabel());
3454}
3455
3456template<typename Derived>
3457Sema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
3458  OwningStmtResult SubStmt
3459    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
3460  if (SubStmt.isInvalid())
3461    return SemaRef.ExprError();
3462
3463  if (!getDerived().AlwaysRebuild() &&
3464      SubStmt.get() == E->getSubStmt())
3465    return SemaRef.Owned(E->Retain());
3466
3467  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
3468                                      move(SubStmt),
3469                                      E->getRParenLoc());
3470}
3471
3472template<typename Derived>
3473Sema::OwningExprResult
3474TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
3475  QualType T1, T2;
3476  {
3477    // FIXME: Source location isn't quite accurate.
3478    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3479
3480    T1 = getDerived().TransformType(E->getArgType1());
3481    if (T1.isNull())
3482      return SemaRef.ExprError();
3483
3484    T2 = getDerived().TransformType(E->getArgType2());
3485    if (T2.isNull())
3486      return SemaRef.ExprError();
3487  }
3488
3489  if (!getDerived().AlwaysRebuild() &&
3490      T1 == E->getArgType1() &&
3491      T2 == E->getArgType2())
3492    return SemaRef.Owned(E->Retain());
3493
3494  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
3495                                                 T1, T2, E->getRParenLoc());
3496}
3497
3498template<typename Derived>
3499Sema::OwningExprResult
3500TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
3501  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3502  if (Cond.isInvalid())
3503    return SemaRef.ExprError();
3504
3505  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3506  if (LHS.isInvalid())
3507    return SemaRef.ExprError();
3508
3509  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3510  if (RHS.isInvalid())
3511    return SemaRef.ExprError();
3512
3513  if (!getDerived().AlwaysRebuild() &&
3514      Cond.get() == E->getCond() &&
3515      LHS.get() == E->getLHS() &&
3516      RHS.get() == E->getRHS())
3517    return SemaRef.Owned(E->Retain());
3518
3519  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
3520                                        move(Cond), move(LHS), move(RHS),
3521                                        E->getRParenLoc());
3522}
3523
3524template<typename Derived>
3525Sema::OwningExprResult
3526TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
3527  return SemaRef.Owned(E->Retain());
3528}
3529
3530template<typename Derived>
3531Sema::OwningExprResult
3532TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
3533  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3534  if (Callee.isInvalid())
3535    return SemaRef.ExprError();
3536
3537  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
3538  if (First.isInvalid())
3539    return SemaRef.ExprError();
3540
3541  OwningExprResult Second(SemaRef);
3542  if (E->getNumArgs() == 2) {
3543    Second = getDerived().TransformExpr(E->getArg(1));
3544    if (Second.isInvalid())
3545      return SemaRef.ExprError();
3546  }
3547
3548  if (!getDerived().AlwaysRebuild() &&
3549      Callee.get() == E->getCallee() &&
3550      First.get() == E->getArg(0) &&
3551      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
3552    return SemaRef.Owned(E->Retain());
3553
3554  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
3555                                                 E->getOperatorLoc(),
3556                                                 move(Callee),
3557                                                 move(First),
3558                                                 move(Second));
3559}
3560
3561template<typename Derived>
3562Sema::OwningExprResult
3563TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
3564  return getDerived().TransformCallExpr(E);
3565}
3566
3567template<typename Derived>
3568Sema::OwningExprResult
3569TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
3570  QualType ExplicitTy;
3571  {
3572    // FIXME: Source location isn't quite accurate.
3573    SourceLocation TypeStartLoc
3574      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3575    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
3576
3577    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
3578    if (ExplicitTy.isNull())
3579      return SemaRef.ExprError();
3580  }
3581
3582  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3583  if (SubExpr.isInvalid())
3584    return SemaRef.ExprError();
3585
3586  if (!getDerived().AlwaysRebuild() &&
3587      ExplicitTy == E->getTypeAsWritten() &&
3588      SubExpr.get() == E->getSubExpr())
3589    return SemaRef.Owned(E->Retain());
3590
3591  // FIXME: Poor source location information here.
3592  SourceLocation FakeLAngleLoc
3593    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3594  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
3595  SourceLocation FakeRParenLoc
3596    = SemaRef.PP.getLocForEndOfToken(
3597                                  E->getSubExpr()->getSourceRange().getEnd());
3598  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
3599                                              E->getStmtClass(),
3600                                              FakeLAngleLoc,
3601                                              ExplicitTy,
3602                                              FakeRAngleLoc,
3603                                              FakeRAngleLoc,
3604                                              move(SubExpr),
3605                                              FakeRParenLoc);
3606}
3607
3608template<typename Derived>
3609Sema::OwningExprResult
3610TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
3611  return getDerived().TransformCXXNamedCastExpr(E);
3612}
3613
3614template<typename Derived>
3615Sema::OwningExprResult
3616TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
3617  return getDerived().TransformCXXNamedCastExpr(E);
3618}
3619
3620template<typename Derived>
3621Sema::OwningExprResult
3622TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
3623                                                CXXReinterpretCastExpr *E) {
3624  return getDerived().TransformCXXNamedCastExpr(E);
3625}
3626
3627template<typename Derived>
3628Sema::OwningExprResult
3629TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
3630  return getDerived().TransformCXXNamedCastExpr(E);
3631}
3632
3633template<typename Derived>
3634Sema::OwningExprResult
3635TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
3636                                                   CXXFunctionalCastExpr *E) {
3637  QualType ExplicitTy;
3638  {
3639    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3640
3641    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
3642    if (ExplicitTy.isNull())
3643      return SemaRef.ExprError();
3644  }
3645
3646  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3647  if (SubExpr.isInvalid())
3648    return SemaRef.ExprError();
3649
3650  if (!getDerived().AlwaysRebuild() &&
3651      ExplicitTy == E->getTypeAsWritten() &&
3652      SubExpr.get() == E->getSubExpr())
3653    return SemaRef.Owned(E->Retain());
3654
3655  // FIXME: The end of the type's source range is wrong
3656  return getDerived().RebuildCXXFunctionalCastExpr(
3657                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
3658                                                   ExplicitTy,
3659                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
3660                                                   move(SubExpr),
3661                                                   E->getRParenLoc());
3662}
3663
3664template<typename Derived>
3665Sema::OwningExprResult
3666TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
3667  if (E->isTypeOperand()) {
3668    TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
3669
3670    QualType T = getDerived().TransformType(E->getTypeOperand());
3671    if (T.isNull())
3672      return SemaRef.ExprError();
3673
3674    if (!getDerived().AlwaysRebuild() &&
3675        T == E->getTypeOperand())
3676      return SemaRef.Owned(E->Retain());
3677
3678    return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
3679                                             /*FIXME:*/E->getLocStart(),
3680                                             T,
3681                                             E->getLocEnd());
3682  }
3683
3684  // We don't know whether the expression is potentially evaluated until
3685  // after we perform semantic analysis, so the expression is potentially
3686  // potentially evaluated.
3687  EnterExpressionEvaluationContext Unevaluated(SemaRef,
3688                                      Action::PotentiallyPotentiallyEvaluated);
3689
3690  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
3691  if (SubExpr.isInvalid())
3692    return SemaRef.ExprError();
3693
3694  if (!getDerived().AlwaysRebuild() &&
3695      SubExpr.get() == E->getExprOperand())
3696    return SemaRef.Owned(E->Retain());
3697
3698  return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
3699                                           /*FIXME:*/E->getLocStart(),
3700                                           move(SubExpr),
3701                                           E->getLocEnd());
3702}
3703
3704template<typename Derived>
3705Sema::OwningExprResult
3706TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
3707  return SemaRef.Owned(E->Retain());
3708}
3709
3710template<typename Derived>
3711Sema::OwningExprResult
3712TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
3713                                                  CXXNullPtrLiteralExpr *E) {
3714  return SemaRef.Owned(E->Retain());
3715}
3716
3717template<typename Derived>
3718Sema::OwningExprResult
3719TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
3720  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3721
3722  QualType T = getDerived().TransformType(E->getType());
3723  if (T.isNull())
3724    return SemaRef.ExprError();
3725
3726  if (!getDerived().AlwaysRebuild() &&
3727      T == E->getType())
3728    return SemaRef.Owned(E->Retain());
3729
3730  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
3731}
3732
3733template<typename Derived>
3734Sema::OwningExprResult
3735TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
3736  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3737  if (SubExpr.isInvalid())
3738    return SemaRef.ExprError();
3739
3740  if (!getDerived().AlwaysRebuild() &&
3741      SubExpr.get() == E->getSubExpr())
3742    return SemaRef.Owned(E->Retain());
3743
3744  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
3745}
3746
3747template<typename Derived>
3748Sema::OwningExprResult
3749TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
3750  ParmVarDecl *Param
3751    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
3752  if (!Param)
3753    return SemaRef.ExprError();
3754
3755  if (getDerived().AlwaysRebuild() &&
3756      Param == E->getParam())
3757    return SemaRef.Owned(E->Retain());
3758
3759  return getDerived().RebuildCXXDefaultArgExpr(Param);
3760}
3761
3762template<typename Derived>
3763Sema::OwningExprResult
3764TreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
3765  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3766
3767  QualType T = getDerived().TransformType(E->getType());
3768  if (T.isNull())
3769    return SemaRef.ExprError();
3770
3771  if (!getDerived().AlwaysRebuild() &&
3772      T == E->getType())
3773    return SemaRef.Owned(E->Retain());
3774
3775  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
3776                                                /*FIXME:*/E->getTypeBeginLoc(),
3777                                                  T,
3778                                                  E->getRParenLoc());
3779}
3780
3781template<typename Derived>
3782Sema::OwningExprResult
3783TreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
3784  VarDecl *Var
3785    = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl()));
3786  if (!Var)
3787    return SemaRef.ExprError();
3788
3789  if (!getDerived().AlwaysRebuild() &&
3790      Var == E->getVarDecl())
3791    return SemaRef.Owned(E->Retain());
3792
3793  return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
3794                                                  /*FIXME:*/E->getStartLoc(),
3795                                                  Var);
3796}
3797
3798template<typename Derived>
3799Sema::OwningExprResult
3800TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
3801  // Transform the type that we're allocating
3802  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3803  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
3804  if (AllocType.isNull())
3805    return SemaRef.ExprError();
3806
3807  // Transform the size of the array we're allocating (if any).
3808  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
3809  if (ArraySize.isInvalid())
3810    return SemaRef.ExprError();
3811
3812  // Transform the placement arguments (if any).
3813  bool ArgumentChanged = false;
3814  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
3815  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
3816    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
3817    if (Arg.isInvalid())
3818      return SemaRef.ExprError();
3819
3820    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
3821    PlacementArgs.push_back(Arg.take());
3822  }
3823
3824  // transform the constructor arguments (if any).
3825  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
3826  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
3827    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
3828    if (Arg.isInvalid())
3829      return SemaRef.ExprError();
3830
3831    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
3832    ConstructorArgs.push_back(Arg.take());
3833  }
3834
3835  if (!getDerived().AlwaysRebuild() &&
3836      AllocType == E->getAllocatedType() &&
3837      ArraySize.get() == E->getArraySize() &&
3838      !ArgumentChanged)
3839    return SemaRef.Owned(E->Retain());
3840
3841  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
3842                                        E->isGlobalNew(),
3843                                        /*FIXME:*/E->getLocStart(),
3844                                        move_arg(PlacementArgs),
3845                                        /*FIXME:*/E->getLocStart(),
3846                                        E->isParenTypeId(),
3847                                        AllocType,
3848                                        /*FIXME:*/E->getLocStart(),
3849                                        /*FIXME:*/SourceRange(),
3850                                        move(ArraySize),
3851                                        /*FIXME:*/E->getLocStart(),
3852                                        move_arg(ConstructorArgs),
3853                                        E->getLocEnd());
3854}
3855
3856template<typename Derived>
3857Sema::OwningExprResult
3858TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
3859  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
3860  if (Operand.isInvalid())
3861    return SemaRef.ExprError();
3862
3863  if (!getDerived().AlwaysRebuild() &&
3864      Operand.get() == E->getArgument())
3865    return SemaRef.Owned(E->Retain());
3866
3867  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
3868                                           E->isGlobalDelete(),
3869                                           E->isArrayForm(),
3870                                           move(Operand));
3871}
3872
3873template<typename Derived>
3874Sema::OwningExprResult
3875TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
3876                                                CXXPseudoDestructorExpr *E) {
3877  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3878  if (Base.isInvalid())
3879    return SemaRef.ExprError();
3880
3881  NestedNameSpecifier *Qualifier
3882    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3883                                                E->getQualifierRange());
3884  if (E->getQualifier() && !Qualifier)
3885    return SemaRef.ExprError();
3886
3887  QualType DestroyedType;
3888  {
3889    TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
3890    DestroyedType = getDerived().TransformType(E->getDestroyedType());
3891    if (DestroyedType.isNull())
3892      return SemaRef.ExprError();
3893  }
3894
3895  if (!getDerived().AlwaysRebuild() &&
3896      Base.get() == E->getBase() &&
3897      Qualifier == E->getQualifier() &&
3898      DestroyedType == E->getDestroyedType())
3899    return SemaRef.Owned(E->Retain());
3900
3901  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
3902                                                     E->getOperatorLoc(),
3903                                                     E->isArrow(),
3904                                                     E->getDestroyedTypeLoc(),
3905                                                     DestroyedType,
3906                                                     Qualifier,
3907                                                     E->getQualifierRange());
3908}
3909
3910template<typename Derived>
3911Sema::OwningExprResult
3912TreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
3913                                              UnresolvedFunctionNameExpr *E) {
3914  // There is no transformation we can apply to an unresolved function name.
3915  return SemaRef.Owned(E->Retain());
3916}
3917
3918template<typename Derived>
3919Sema::OwningExprResult
3920TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
3921  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
3922
3923  QualType T = getDerived().TransformType(E->getQueriedType());
3924  if (T.isNull())
3925    return SemaRef.ExprError();
3926
3927  if (!getDerived().AlwaysRebuild() &&
3928      T == E->getQueriedType())
3929    return SemaRef.Owned(E->Retain());
3930
3931  // FIXME: Bad location information
3932  SourceLocation FakeLParenLoc
3933    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
3934
3935  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
3936                                            E->getLocStart(),
3937                                            /*FIXME:*/FakeLParenLoc,
3938                                            T,
3939                                            E->getLocEnd());
3940}
3941
3942template<typename Derived>
3943Sema::OwningExprResult
3944TreeTransform<Derived>::TransformQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
3945  NestedNameSpecifier *NNS
3946    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3947                                                E->getQualifierRange());
3948  if (!NNS)
3949    return SemaRef.ExprError();
3950
3951  NamedDecl *ND
3952    = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3953  if (!ND)
3954    return SemaRef.ExprError();
3955
3956  if (!getDerived().AlwaysRebuild() &&
3957      NNS == E->getQualifier() &&
3958      ND == E->getDecl())
3959    return SemaRef.Owned(E->Retain());
3960
3961  return getDerived().RebuildQualifiedDeclRefExpr(NNS,
3962                                                  E->getQualifierRange(),
3963                                                  ND,
3964                                                  E->getLocation(),
3965                                                  /*FIXME:*/false);
3966}
3967
3968template<typename Derived>
3969Sema::OwningExprResult
3970TreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
3971                                                    UnresolvedDeclRefExpr *E) {
3972  NestedNameSpecifier *NNS
3973  = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3974                                              E->getQualifierRange());
3975  if (!NNS)
3976    return SemaRef.ExprError();
3977
3978  DeclarationName Name
3979    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
3980  if (!Name)
3981    return SemaRef.ExprError();
3982
3983  if (!getDerived().AlwaysRebuild() &&
3984      NNS == E->getQualifier() &&
3985      Name == E->getDeclName())
3986    return SemaRef.Owned(E->Retain());
3987
3988  return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
3989                                                   E->getQualifierRange(),
3990                                                   Name,
3991                                                   E->getLocation(),
3992                                                   /*FIXME:*/false);
3993}
3994
3995template<typename Derived>
3996Sema::OwningExprResult
3997TreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) {
3998  TemplateName Template
3999    = getDerived().TransformTemplateName(E->getTemplateName());
4000  if (Template.isNull())
4001    return SemaRef.ExprError();
4002
4003  llvm::SmallVector<TemplateArgument, 4> TransArgs;
4004  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4005    TemplateArgument TransArg
4006      = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
4007    if (TransArg.isNull())
4008      return SemaRef.ExprError();
4009
4010    TransArgs.push_back(TransArg);
4011  }
4012
4013  // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
4014  // compare template arguments (yet).
4015
4016  // FIXME: It's possible that we'll find out now that the template name
4017  // actually refers to a type, in which case the caller is actually dealing
4018  // with a functional cast. Give a reasonable error message!
4019  return getDerived().RebuildTemplateIdExpr(Template, E->getTemplateNameLoc(),
4020                                            E->getLAngleLoc(),
4021                                            TransArgs.data(),
4022                                            TransArgs.size(),
4023                                            E->getRAngleLoc());
4024}
4025
4026template<typename Derived>
4027Sema::OwningExprResult
4028TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
4029  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4030
4031  QualType T = getDerived().TransformType(E->getType());
4032  if (T.isNull())
4033    return SemaRef.ExprError();
4034
4035  CXXConstructorDecl *Constructor
4036    = cast_or_null<CXXConstructorDecl>(
4037                              getDerived().TransformDecl(E->getConstructor()));
4038  if (!Constructor)
4039    return SemaRef.ExprError();
4040
4041  bool ArgumentChanged = false;
4042  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4043  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
4044       ArgEnd = E->arg_end();
4045       Arg != ArgEnd; ++Arg) {
4046    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4047    if (TransArg.isInvalid())
4048      return SemaRef.ExprError();
4049
4050    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4051    Args.push_back(TransArg.takeAs<Expr>());
4052  }
4053
4054  if (!getDerived().AlwaysRebuild() &&
4055      T == E->getType() &&
4056      Constructor == E->getConstructor() &&
4057      !ArgumentChanged)
4058    return SemaRef.Owned(E->Retain());
4059
4060  return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
4061                                              move_arg(Args));
4062}
4063
4064/// \brief Transform a C++ temporary-binding expression.
4065///
4066/// The transformation of a temporary-binding expression always attempts to
4067/// bind a new temporary variable to its subexpression, even if the
4068/// subexpression itself did not change, because the temporary variable itself
4069/// must be unique.
4070template<typename Derived>
4071Sema::OwningExprResult
4072TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4073  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4074  if (SubExpr.isInvalid())
4075    return SemaRef.ExprError();
4076
4077  return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
4078}
4079
4080/// \brief Transform a C++ expression that contains temporaries that should
4081/// be destroyed after the expression is evaluated.
4082///
4083/// The transformation of a full expression always attempts to build a new
4084/// CXXExprWithTemporaries expression, even if the
4085/// subexpression itself did not change, because it will need to capture the
4086/// the new temporary variables introduced in the subexpression.
4087template<typename Derived>
4088Sema::OwningExprResult
4089TreeTransform<Derived>::TransformCXXExprWithTemporaries(
4090                                                CXXExprWithTemporaries *E) {
4091  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4092  if (SubExpr.isInvalid())
4093    return SemaRef.ExprError();
4094
4095  return SemaRef.Owned(
4096           SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
4097                                               E->shouldDestroyTemporaries()));
4098}
4099
4100template<typename Derived>
4101Sema::OwningExprResult
4102TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
4103                                                  CXXTemporaryObjectExpr *E) {
4104  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4105  QualType T = getDerived().TransformType(E->getType());
4106  if (T.isNull())
4107    return SemaRef.ExprError();
4108
4109  CXXConstructorDecl *Constructor
4110    = cast_or_null<CXXConstructorDecl>(
4111                            getDerived().TransformDecl(E->getConstructor()));
4112  if (!Constructor)
4113    return SemaRef.ExprError();
4114
4115  bool ArgumentChanged = false;
4116  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4117  Args.reserve(E->getNumArgs());
4118  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
4119                                         ArgEnd = E->arg_end();
4120       Arg != ArgEnd; ++Arg) {
4121    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4122    if (TransArg.isInvalid())
4123      return SemaRef.ExprError();
4124
4125    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4126    Args.push_back((Expr *)TransArg.release());
4127  }
4128
4129  if (!getDerived().AlwaysRebuild() &&
4130      T == E->getType() &&
4131      Constructor == E->getConstructor() &&
4132      !ArgumentChanged)
4133    return SemaRef.Owned(E->Retain());
4134
4135  // FIXME: Bogus location information
4136  SourceLocation CommaLoc;
4137  if (Args.size() > 1) {
4138    Expr *First = (Expr *)Args[0];
4139    CommaLoc
4140      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4141  }
4142  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4143                                                    T,
4144                                                /*FIXME:*/E->getTypeBeginLoc(),
4145                                                    move_arg(Args),
4146                                                    &CommaLoc,
4147                                                    E->getLocEnd());
4148}
4149
4150template<typename Derived>
4151Sema::OwningExprResult
4152TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
4153                                            CXXUnresolvedConstructExpr *E) {
4154  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4155  QualType T = getDerived().TransformType(E->getTypeAsWritten());
4156  if (T.isNull())
4157    return SemaRef.ExprError();
4158
4159  bool ArgumentChanged = false;
4160  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4161  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4162  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4163                                             ArgEnd = E->arg_end();
4164       Arg != ArgEnd; ++Arg) {
4165    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4166    if (TransArg.isInvalid())
4167      return SemaRef.ExprError();
4168
4169    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4170    FakeCommaLocs.push_back(
4171                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4172    Args.push_back(TransArg.takeAs<Expr>());
4173  }
4174
4175  if (!getDerived().AlwaysRebuild() &&
4176      T == E->getTypeAsWritten() &&
4177      !ArgumentChanged)
4178    return SemaRef.Owned(E->Retain());
4179
4180  // FIXME: we're faking the locations of the commas
4181  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4182                                                        T,
4183                                                        E->getLParenLoc(),
4184                                                        move_arg(Args),
4185                                                        FakeCommaLocs.data(),
4186                                                        E->getRParenLoc());
4187}
4188
4189template<typename Derived>
4190Sema::OwningExprResult
4191TreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
4192                                                  CXXUnresolvedMemberExpr *E) {
4193  // Transform the base of the expression.
4194  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4195  if (Base.isInvalid())
4196    return SemaRef.ExprError();
4197
4198  Sema::TypeTy *ObjectType = 0;
4199  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
4200                                              E->getOperatorLoc(),
4201                                      E->isArrow()? tok::arrow : tok::period,
4202                                              ObjectType);
4203  if (Base.isInvalid())
4204    return SemaRef.ExprError();
4205
4206  // FIXME: The first qualifier found might be a template type parameter,
4207  // in which case there is no transformed declaration to refer to (it might
4208  // refer to a built-in type!).
4209  NamedDecl *FirstQualifierInScope
4210    = cast_or_null<NamedDecl>(
4211               getDerived().TransformDecl(E->getFirstQualifierFoundInScope()));
4212
4213  NestedNameSpecifier *Qualifier = 0;
4214  if (E->getQualifier()) {
4215    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4216                                                      E->getQualifierRange(),
4217                                      QualType::getFromOpaquePtr(ObjectType),
4218                                                        FirstQualifierInScope);
4219    if (!Qualifier)
4220      return SemaRef.ExprError();
4221  }
4222
4223  DeclarationName Name
4224    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
4225                                       QualType::getFromOpaquePtr(ObjectType));
4226  if (!Name)
4227    return SemaRef.ExprError();
4228
4229  if (!E->hasExplicitTemplateArgumentList()) {
4230    // This is a reference to a member without an explicitly-specified
4231    // template argument list. Optimize for this common case.
4232    if (!getDerived().AlwaysRebuild() &&
4233        Base.get() == E->getBase() &&
4234        Qualifier == E->getQualifier() &&
4235        Name == E->getMember() &&
4236        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
4237      return SemaRef.Owned(E->Retain());
4238
4239    return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4240                                                       E->isArrow(),
4241                                                       E->getOperatorLoc(),
4242                                                       Qualifier,
4243                                                       E->getQualifierRange(),
4244                                                       Name,
4245                                                       E->getMemberLoc(),
4246                                                       FirstQualifierInScope);
4247  }
4248
4249  // FIXME: This is an ugly hack, which forces the same template name to
4250  // be looked up multiple times. Yuck!
4251  // FIXME: This also won't work for, e.g., x->template operator+<int>
4252  TemplateName OrigTemplateName
4253    = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo());
4254
4255  TemplateName Template
4256    = getDerived().TransformTemplateName(OrigTemplateName,
4257                                       QualType::getFromOpaquePtr(ObjectType));
4258  if (Template.isNull())
4259    return SemaRef.ExprError();
4260
4261  llvm::SmallVector<TemplateArgument, 4> TransArgs;
4262  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4263    TemplateArgument TransArg
4264    = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
4265    if (TransArg.isNull())
4266      return SemaRef.ExprError();
4267
4268    TransArgs.push_back(TransArg);
4269  }
4270
4271  return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4272                                                     E->isArrow(),
4273                                                     E->getOperatorLoc(),
4274                                                     Qualifier,
4275                                                     E->getQualifierRange(),
4276                                                     Template,
4277                                                     E->getMemberLoc(),
4278                                                     FirstQualifierInScope,
4279                                                     E->getLAngleLoc(),
4280                                                     TransArgs.data(),
4281                                                     TransArgs.size(),
4282                                                     E->getRAngleLoc());
4283}
4284
4285template<typename Derived>
4286Sema::OwningExprResult
4287TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
4288  return SemaRef.Owned(E->Retain());
4289}
4290
4291template<typename Derived>
4292Sema::OwningExprResult
4293TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
4294  // FIXME: poor source location
4295  TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
4296  QualType EncodedType = getDerived().TransformType(E->getEncodedType());
4297  if (EncodedType.isNull())
4298    return SemaRef.ExprError();
4299
4300  if (!getDerived().AlwaysRebuild() &&
4301      EncodedType == E->getEncodedType())
4302    return SemaRef.Owned(E->Retain());
4303
4304  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
4305                                            EncodedType,
4306                                            E->getRParenLoc());
4307}
4308
4309template<typename Derived>
4310Sema::OwningExprResult
4311TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
4312  // FIXME: Implement this!
4313  assert(false && "Cannot transform Objective-C expressions yet");
4314  return SemaRef.Owned(E->Retain());
4315}
4316
4317template<typename Derived>
4318Sema::OwningExprResult
4319TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
4320  return SemaRef.Owned(E->Retain());
4321}
4322
4323template<typename Derived>
4324Sema::OwningExprResult
4325TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
4326  ObjCProtocolDecl *Protocol
4327    = cast_or_null<ObjCProtocolDecl>(
4328                                getDerived().TransformDecl(E->getProtocol()));
4329  if (!Protocol)
4330    return SemaRef.ExprError();
4331
4332  if (!getDerived().AlwaysRebuild() &&
4333      Protocol == E->getProtocol())
4334    return SemaRef.Owned(E->Retain());
4335
4336  return getDerived().RebuildObjCProtocolExpr(Protocol,
4337                                              E->getAtLoc(),
4338                                              /*FIXME:*/E->getAtLoc(),
4339                                              /*FIXME:*/E->getAtLoc(),
4340                                              E->getRParenLoc());
4341
4342}
4343
4344template<typename Derived>
4345Sema::OwningExprResult
4346TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
4347  // FIXME: Implement this!
4348  assert(false && "Cannot transform Objective-C expressions yet");
4349  return SemaRef.Owned(E->Retain());
4350}
4351
4352template<typename Derived>
4353Sema::OwningExprResult
4354TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
4355  // FIXME: Implement this!
4356  assert(false && "Cannot transform Objective-C expressions yet");
4357  return SemaRef.Owned(E->Retain());
4358}
4359
4360template<typename Derived>
4361Sema::OwningExprResult
4362TreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
4363                                          ObjCImplicitSetterGetterRefExpr *E) {
4364  // FIXME: Implement this!
4365  assert(false && "Cannot transform Objective-C expressions yet");
4366  return SemaRef.Owned(E->Retain());
4367}
4368
4369template<typename Derived>
4370Sema::OwningExprResult
4371TreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
4372  // FIXME: Implement this!
4373  assert(false && "Cannot transform Objective-C expressions yet");
4374  return SemaRef.Owned(E->Retain());
4375}
4376
4377template<typename Derived>
4378Sema::OwningExprResult
4379TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
4380  // FIXME: Implement this!
4381  assert(false && "Cannot transform Objective-C expressions yet");
4382  return SemaRef.Owned(E->Retain());
4383}
4384
4385template<typename Derived>
4386Sema::OwningExprResult
4387TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
4388  bool ArgumentChanged = false;
4389  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
4390  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
4391    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
4392    if (SubExpr.isInvalid())
4393      return SemaRef.ExprError();
4394
4395    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
4396    SubExprs.push_back(SubExpr.takeAs<Expr>());
4397  }
4398
4399  if (!getDerived().AlwaysRebuild() &&
4400      !ArgumentChanged)
4401    return SemaRef.Owned(E->Retain());
4402
4403  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
4404                                               move_arg(SubExprs),
4405                                               E->getRParenLoc());
4406}
4407
4408template<typename Derived>
4409Sema::OwningExprResult
4410TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
4411  // FIXME: Implement this!
4412  assert(false && "Cannot transform block expressions yet");
4413  return SemaRef.Owned(E->Retain());
4414}
4415
4416template<typename Derived>
4417Sema::OwningExprResult
4418TreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
4419  // FIXME: Implement this!
4420  assert(false && "Cannot transform block-related expressions yet");
4421  return SemaRef.Owned(E->Retain());
4422}
4423
4424//===----------------------------------------------------------------------===//
4425// Type reconstruction
4426//===----------------------------------------------------------------------===//
4427
4428template<typename Derived>
4429QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) {
4430  return SemaRef.BuildPointerType(PointeeType, Qualifiers(),
4431                                  getDerived().getBaseLocation(),
4432                                  getDerived().getBaseEntity());
4433}
4434
4435template<typename Derived>
4436QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) {
4437  return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(),
4438                                       getDerived().getBaseLocation(),
4439                                       getDerived().getBaseEntity());
4440}
4441
4442template<typename Derived>
4443QualType
4444TreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) {
4445  return SemaRef.BuildReferenceType(ReferentType, true, Qualifiers(),
4446                                    getDerived().getBaseLocation(),
4447                                    getDerived().getBaseEntity());
4448}
4449
4450template<typename Derived>
4451QualType
4452TreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) {
4453  return SemaRef.BuildReferenceType(ReferentType, false, Qualifiers(),
4454                                    getDerived().getBaseLocation(),
4455                                    getDerived().getBaseEntity());
4456}
4457
4458template<typename Derived>
4459QualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
4460                                                          QualType ClassType) {
4461  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
4462                                        getDerived().getBaseLocation(),
4463                                        getDerived().getBaseEntity());
4464}
4465
4466template<typename Derived>
4467QualType
4468TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
4469                                         ArrayType::ArraySizeModifier SizeMod,
4470                                         const llvm::APInt *Size,
4471                                         Expr *SizeExpr,
4472                                         unsigned IndexTypeQuals,
4473                                         SourceRange BracketsRange) {
4474  if (SizeExpr || !Size)
4475    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
4476                                  IndexTypeQuals, BracketsRange,
4477                                  getDerived().getBaseEntity());
4478
4479  QualType Types[] = {
4480    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
4481    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
4482    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
4483  };
4484  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
4485  QualType SizeType;
4486  for (unsigned I = 0; I != NumTypes; ++I)
4487    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
4488      SizeType = Types[I];
4489      break;
4490    }
4491
4492  if (SizeType.isNull())
4493    SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
4494
4495  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
4496  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
4497                                IndexTypeQuals, BracketsRange,
4498                                getDerived().getBaseEntity());
4499}
4500
4501template<typename Derived>
4502QualType
4503TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
4504                                                 ArrayType::ArraySizeModifier SizeMod,
4505                                                 const llvm::APInt &Size,
4506                                                 unsigned IndexTypeQuals) {
4507  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
4508                                        IndexTypeQuals, SourceRange());
4509}
4510
4511template<typename Derived>
4512QualType
4513TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
4514                                          ArrayType::ArraySizeModifier SizeMod,
4515                                                 unsigned IndexTypeQuals) {
4516  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
4517                                       IndexTypeQuals, SourceRange());
4518}
4519
4520template<typename Derived>
4521QualType
4522TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
4523                                          ArrayType::ArraySizeModifier SizeMod,
4524                                                 ExprArg SizeExpr,
4525                                                 unsigned IndexTypeQuals,
4526                                                 SourceRange BracketsRange) {
4527  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
4528                                       SizeExpr.takeAs<Expr>(),
4529                                       IndexTypeQuals, BracketsRange);
4530}
4531
4532template<typename Derived>
4533QualType
4534TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
4535                                          ArrayType::ArraySizeModifier SizeMod,
4536                                                       ExprArg SizeExpr,
4537                                                       unsigned IndexTypeQuals,
4538                                                   SourceRange BracketsRange) {
4539  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
4540                                       SizeExpr.takeAs<Expr>(),
4541                                       IndexTypeQuals, BracketsRange);
4542}
4543
4544template<typename Derived>
4545QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
4546                                                   unsigned NumElements) {
4547  // FIXME: semantic checking!
4548  return SemaRef.Context.getVectorType(ElementType, NumElements);
4549}
4550
4551template<typename Derived>
4552QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
4553                                                      unsigned NumElements,
4554                                                 SourceLocation AttributeLoc) {
4555  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
4556                          NumElements, true);
4557  IntegerLiteral *VectorSize
4558    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
4559                                           AttributeLoc);
4560  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
4561                                    AttributeLoc);
4562}
4563
4564template<typename Derived>
4565QualType
4566TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
4567                                                           ExprArg SizeExpr,
4568                                                  SourceLocation AttributeLoc) {
4569  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
4570}
4571
4572template<typename Derived>
4573QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
4574                                                          QualType *ParamTypes,
4575                                                        unsigned NumParamTypes,
4576                                                          bool Variadic,
4577                                                          unsigned Quals) {
4578  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
4579                                   Quals,
4580                                   getDerived().getBaseLocation(),
4581                                   getDerived().getBaseEntity());
4582}
4583
4584template<typename Derived>
4585QualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
4586  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
4587}
4588
4589template<typename Derived>
4590QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
4591  return SemaRef.Context.getTypeOfType(Underlying);
4592}
4593
4594template<typename Derived>
4595QualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
4596  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
4597}
4598
4599template<typename Derived>
4600QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
4601                                                        TemplateName Template,
4602                                                 const TemplateArgument *Args,
4603                                                           unsigned NumArgs) {
4604  // FIXME: Missing source locations for the template name, <, >.
4605  return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(),
4606                                     SourceLocation(), Args, NumArgs,
4607                                     SourceLocation());
4608}
4609
4610template<typename Derived>
4611NestedNameSpecifier *
4612TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4613                                                   SourceRange Range,
4614                                                   IdentifierInfo &II,
4615                                                   QualType ObjectType,
4616                                             NamedDecl *FirstQualifierInScope) {
4617  CXXScopeSpec SS;
4618  // FIXME: The source location information is all wrong.
4619  SS.setRange(Range);
4620  SS.setScopeRep(Prefix);
4621  return static_cast<NestedNameSpecifier *>(
4622                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
4623                                                        Range.getEnd(), II,
4624                                                        ObjectType,
4625                                                        FirstQualifierInScope,
4626                                                        false));
4627}
4628
4629template<typename Derived>
4630NestedNameSpecifier *
4631TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4632                                                   SourceRange Range,
4633                                                   NamespaceDecl *NS) {
4634  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
4635}
4636
4637template<typename Derived>
4638NestedNameSpecifier *
4639TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4640                                                   SourceRange Range,
4641                                                   bool TemplateKW,
4642                                                   QualType T) {
4643  if (T->isDependentType() || T->isRecordType() ||
4644      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
4645    assert(!T.hasQualifiers() && "Can't get cv-qualifiers here");
4646    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
4647                                       T.getTypePtr());
4648  }
4649
4650  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
4651  return 0;
4652}
4653
4654template<typename Derived>
4655TemplateName
4656TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4657                                            bool TemplateKW,
4658                                            TemplateDecl *Template) {
4659  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
4660                                                  Template);
4661}
4662
4663template<typename Derived>
4664TemplateName
4665TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4666                                            bool TemplateKW,
4667                                            OverloadedFunctionDecl *Ovl) {
4668  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
4669}
4670
4671template<typename Derived>
4672TemplateName
4673TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4674                                            const IdentifierInfo &II,
4675                                            QualType ObjectType) {
4676  CXXScopeSpec SS;
4677  SS.setRange(SourceRange(getDerived().getBaseLocation()));
4678  SS.setScopeRep(Qualifier);
4679  return getSema().ActOnDependentTemplateName(
4680                                      /*FIXME:*/getDerived().getBaseLocation(),
4681                                              II,
4682                                      /*FIXME:*/getDerived().getBaseLocation(),
4683                                              SS,
4684                                              ObjectType.getAsOpaquePtr())
4685           .template getAsVal<TemplateName>();
4686}
4687
4688template<typename Derived>
4689Sema::OwningExprResult
4690TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
4691                                                   SourceLocation OpLoc,
4692                                                   ExprArg Callee,
4693                                                   ExprArg First,
4694                                                   ExprArg Second) {
4695  Expr *FirstExpr = (Expr *)First.get();
4696  Expr *SecondExpr = (Expr *)Second.get();
4697  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
4698
4699  // Determine whether this should be a builtin operation.
4700  if (SecondExpr == 0 || isPostIncDec) {
4701    if (!FirstExpr->getType()->isOverloadableType()) {
4702      // The argument is not of overloadable type, so try to create a
4703      // built-in unary operation.
4704      UnaryOperator::Opcode Opc
4705        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
4706
4707      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
4708    }
4709  } else {
4710    if (!FirstExpr->getType()->isOverloadableType() &&
4711        !SecondExpr->getType()->isOverloadableType()) {
4712      // Neither of the arguments is an overloadable type, so try to
4713      // create a built-in binary operation.
4714      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
4715      OwningExprResult Result
4716        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
4717      if (Result.isInvalid())
4718        return SemaRef.ExprError();
4719
4720      First.release();
4721      Second.release();
4722      return move(Result);
4723    }
4724  }
4725
4726  // Compute the transformed set of functions (and function templates) to be
4727  // used during overload resolution.
4728  Sema::FunctionSet Functions;
4729
4730  DeclRefExpr *DRE
4731    = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts());
4732
4733  // FIXME: Do we have to check
4734  // IsAcceptableNonMemberOperatorCandidate for each of these?
4735  for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F)
4736    Functions.insert(*F);
4737
4738  // Add any functions found via argument-dependent lookup.
4739  Expr *Args[2] = { FirstExpr, SecondExpr };
4740  unsigned NumArgs = 1 + (SecondExpr != 0);
4741  DeclarationName OpName
4742    = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
4743  SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions);
4744
4745  // Create the overloaded operator invocation for unary operators.
4746  if (NumArgs == 1 || isPostIncDec) {
4747    UnaryOperator::Opcode Opc
4748      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
4749    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
4750  }
4751
4752  // Create the overloaded operator invocation for binary operators.
4753  BinaryOperator::Opcode Opc =
4754    BinaryOperator::getOverloadedOpcode(Op);
4755  OwningExprResult Result
4756    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
4757  if (Result.isInvalid())
4758    return SemaRef.ExprError();
4759
4760  First.release();
4761  Second.release();
4762  return move(Result);
4763}
4764
4765} // end namespace clang
4766
4767#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
4768