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