blob: 258993e72e860bec1b8b1d1adcf5daa82dd3382e [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) {
Chris Lattner88650c32009-08-24 05:19:01 +00001167 void *Sub = SubExpr.takeAs<Expr>();
Douglas Gregorb98b1992009-08-11 05:31:07 +00001168 return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1169 T.getAsOpaquePtr(),
1170 LParenLoc,
Chris Lattner88650c32009-08-24 05:19:01 +00001171 Sema::MultiExprArg(getSema(), &Sub, 1),
Douglas Gregorb98b1992009-08-11 05:31:07 +00001172 /*CommaLocs=*/0,
1173 RParenLoc);
1174 }
1175
1176 /// \brief Build a new C++ typeid(type) expression.
1177 ///
1178 /// By default, performs semantic analysis to build the new expression.
1179 /// Subclasses may override this routine to provide different behavior.
1180 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1181 SourceLocation LParenLoc,
1182 QualType T,
1183 SourceLocation RParenLoc) {
1184 return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
1185 T.getAsOpaquePtr(), RParenLoc);
1186 }
1187
1188 /// \brief Build a new C++ typeid(expr) expression.
1189 ///
1190 /// By default, performs semantic analysis to build the new expression.
1191 /// Subclasses may override this routine to provide different behavior.
1192 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1193 SourceLocation LParenLoc,
1194 ExprArg Operand,
1195 SourceLocation RParenLoc) {
1196 OwningExprResult Result
1197 = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1198 RParenLoc);
1199 if (Result.isInvalid())
1200 return getSema().ExprError();
1201
1202 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1203 return move(Result);
1204 }
1205
1206 /// \brief Build a new C++ "this" expression.
1207 ///
1208 /// By default, builds a new "this" expression without performing any
1209 /// semantic analysis. Subclasses may override this routine to provide
1210 /// different behavior.
1211 OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1212 QualType ThisType) {
1213 return getSema().Owned(
1214 new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1215 }
1216
1217 /// \brief Build a new C++ throw expression.
1218 ///
1219 /// By default, performs semantic analysis to build the new expression.
1220 /// Subclasses may override this routine to provide different behavior.
1221 OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1222 return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1223 }
1224
1225 /// \brief Build a new C++ default-argument expression.
1226 ///
1227 /// By default, builds a new default-argument expression, which does not
1228 /// require any semantic analysis. Subclasses may override this routine to
1229 /// provide different behavior.
1230 OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
Anders Carlssonf1480ee2009-08-14 18:30:22 +00001231 return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
Douglas Gregorb98b1992009-08-11 05:31:07 +00001232 }
1233
1234 /// \brief Build a new C++ zero-initialization expression.
1235 ///
1236 /// By default, performs semantic analysis to build the new expression.
1237 /// Subclasses may override this routine to provide different behavior.
1238 OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1239 SourceLocation LParenLoc,
1240 QualType T,
1241 SourceLocation RParenLoc) {
1242 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1243 T.getAsOpaquePtr(), LParenLoc,
1244 MultiExprArg(getSema(), 0, 0),
1245 0, RParenLoc);
1246 }
1247
1248 /// \brief Build a new C++ conditional declaration expression.
1249 ///
1250 /// By default, performs semantic analysis to build the new expression.
1251 /// Subclasses may override this routine to provide different behavior.
1252 OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
1253 SourceLocation EqLoc,
1254 VarDecl *Var) {
1255 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1256 EqLoc,
1257 Var));
1258 }
1259
1260 /// \brief Build a new C++ "new" expression.
1261 ///
1262 /// By default, performs semantic analysis to build the new expression.
1263 /// Subclasses may override this routine to provide different behavior.
1264 OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1265 bool UseGlobal,
1266 SourceLocation PlacementLParen,
1267 MultiExprArg PlacementArgs,
1268 SourceLocation PlacementRParen,
1269 bool ParenTypeId,
1270 QualType AllocType,
1271 SourceLocation TypeLoc,
1272 SourceRange TypeRange,
1273 ExprArg ArraySize,
1274 SourceLocation ConstructorLParen,
1275 MultiExprArg ConstructorArgs,
1276 SourceLocation ConstructorRParen) {
1277 return getSema().BuildCXXNew(StartLoc, UseGlobal,
1278 PlacementLParen,
1279 move(PlacementArgs),
1280 PlacementRParen,
1281 ParenTypeId,
1282 AllocType,
1283 TypeLoc,
1284 TypeRange,
1285 move(ArraySize),
1286 ConstructorLParen,
1287 move(ConstructorArgs),
1288 ConstructorRParen);
1289 }
1290
1291 /// \brief Build a new C++ "delete" expression.
1292 ///
1293 /// By default, performs semantic analysis to build the new expression.
1294 /// Subclasses may override this routine to provide different behavior.
1295 OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1296 bool IsGlobalDelete,
1297 bool IsArrayForm,
1298 ExprArg Operand) {
1299 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1300 move(Operand));
1301 }
1302
1303 /// \brief Build a new unary type trait expression.
1304 ///
1305 /// By default, performs semantic analysis to build the new expression.
1306 /// Subclasses may override this routine to provide different behavior.
1307 OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1308 SourceLocation StartLoc,
1309 SourceLocation LParenLoc,
1310 QualType T,
1311 SourceLocation RParenLoc) {
1312 return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1313 T.getAsOpaquePtr(), RParenLoc);
1314 }
1315
1316 /// \brief Build a new qualified declaration reference expression.
1317 ///
1318 /// By default, performs semantic analysis to build the new expression.
1319 /// Subclasses may override this routine to provide different behavior.
1320 OwningExprResult RebuildQualifiedDeclRefExpr(NestedNameSpecifier *NNS,
1321 SourceRange QualifierRange,
1322 NamedDecl *ND,
1323 SourceLocation Location,
1324 bool IsAddressOfOperand) {
1325 CXXScopeSpec SS;
1326 SS.setRange(QualifierRange);
1327 SS.setScopeRep(NNS);
1328 return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1329 Location,
1330 ND->getDeclName(),
1331 /*Trailing lparen=*/false,
1332 &SS,
1333 IsAddressOfOperand);
1334 }
1335
1336 /// \brief Build a new (previously unresolved) declaration reference
1337 /// expression.
1338 ///
1339 /// By default, performs semantic analysis to build the new expression.
1340 /// Subclasses may override this routine to provide different behavior.
1341 OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1342 SourceRange QualifierRange,
1343 DeclarationName Name,
1344 SourceLocation Location,
1345 bool IsAddressOfOperand) {
1346 CXXScopeSpec SS;
1347 SS.setRange(QualifierRange);
1348 SS.setScopeRep(NNS);
1349 return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1350 Location,
1351 Name,
1352 /*Trailing lparen=*/false,
1353 &SS,
1354 IsAddressOfOperand);
1355 }
1356
1357 /// \brief Build a new template-id expression.
1358 ///
1359 /// By default, performs semantic analysis to build the new expression.
1360 /// Subclasses may override this routine to provide different behavior.
1361 OwningExprResult RebuildTemplateIdExpr(TemplateName Template,
1362 SourceLocation TemplateLoc,
1363 SourceLocation LAngleLoc,
1364 TemplateArgument *TemplateArgs,
1365 unsigned NumTemplateArgs,
1366 SourceLocation RAngleLoc) {
1367 return getSema().BuildTemplateIdExpr(Template, TemplateLoc,
1368 LAngleLoc,
1369 TemplateArgs, NumTemplateArgs,
1370 RAngleLoc);
1371 }
1372
1373 /// \brief Build a new object-construction expression.
1374 ///
1375 /// By default, performs semantic analysis to build the new expression.
1376 /// Subclasses may override this routine to provide different behavior.
1377 OwningExprResult RebuildCXXConstructExpr(QualType T,
1378 CXXConstructorDecl *Constructor,
1379 bool IsElidable,
1380 MultiExprArg Args) {
1381 unsigned NumArgs = Args.size();
1382 Expr **ArgsExprs = (Expr **)Args.release();
Anders Carlsson089c2602009-08-15 23:41:35 +00001383 return getSema().Owned(SemaRef.BuildCXXConstructExpr(T, Constructor,
Douglas Gregorb98b1992009-08-11 05:31:07 +00001384 IsElidable,
1385 ArgsExprs,
1386 NumArgs));
1387 }
1388
1389 /// \brief Build a new object-construction expression.
1390 ///
1391 /// By default, performs semantic analysis to build the new expression.
1392 /// Subclasses may override this routine to provide different behavior.
1393 OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1394 QualType T,
1395 SourceLocation LParenLoc,
1396 MultiExprArg Args,
1397 SourceLocation *Commas,
1398 SourceLocation RParenLoc) {
1399 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1400 T.getAsOpaquePtr(),
1401 LParenLoc,
1402 move(Args),
1403 Commas,
1404 RParenLoc);
1405 }
1406
1407 /// \brief Build a new object-construction expression.
1408 ///
1409 /// By default, performs semantic analysis to build the new expression.
1410 /// Subclasses may override this routine to provide different behavior.
1411 OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1412 QualType T,
1413 SourceLocation LParenLoc,
1414 MultiExprArg Args,
1415 SourceLocation *Commas,
1416 SourceLocation RParenLoc) {
1417 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1418 /*FIXME*/LParenLoc),
1419 T.getAsOpaquePtr(),
1420 LParenLoc,
1421 move(Args),
1422 Commas,
1423 RParenLoc);
1424 }
1425
1426 /// \brief Build a new member reference expression.
1427 ///
1428 /// By default, performs semantic analysis to build the new expression.
1429 /// Subclasses may override this routine to provide different behavior.
Douglas Gregor0dec56d2009-08-11 15:56:57 +00001430 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
Douglas Gregorb98b1992009-08-11 05:31:07 +00001431 bool IsArrow,
1432 SourceLocation OperatorLoc,
1433 DeclarationName Name,
1434 SourceLocation MemberLoc) {
Douglas Gregor0dec56d2009-08-11 15:56:57 +00001435 OwningExprResult Base = move(BaseE);
Douglas Gregorb98b1992009-08-11 05:31:07 +00001436 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
1437 CXXScopeSpec SS;
1438 Base = SemaRef.ActOnCXXEnterMemberScope(0, SS, move(Base), OpKind);
1439 if (Base.isInvalid())
1440 return SemaRef.ExprError();
1441
1442 assert(Name.getAsIdentifierInfo() &&
1443 "Cannot transform member references with non-identifier members");
1444 Base = SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1445 move(Base), OperatorLoc, OpKind,
1446 MemberLoc,
1447 *Name.getAsIdentifierInfo(),
1448 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1449 SemaRef.ActOnCXXExitMemberScope(0, SS);
1450 return move(Base);
1451 }
1452
1453 /// \brief Build a new Objective-C @encode expression.
1454 ///
1455 /// By default, performs semantic analysis to build the new expression.
1456 /// Subclasses may override this routine to provide different behavior.
1457 OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1458 QualType T,
1459 SourceLocation RParenLoc) {
1460 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1461 RParenLoc));
1462 }
1463
1464 /// \brief Build a new Objective-C protocol expression.
1465 ///
1466 /// By default, performs semantic analysis to build the new expression.
1467 /// Subclasses may override this routine to provide different behavior.
1468 OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1469 SourceLocation AtLoc,
1470 SourceLocation ProtoLoc,
1471 SourceLocation LParenLoc,
1472 SourceLocation RParenLoc) {
1473 return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1474 Protocol->getIdentifier(),
1475 AtLoc,
1476 ProtoLoc,
1477 LParenLoc,
1478 RParenLoc));
1479 }
1480
1481 /// \brief Build a new shuffle vector expression.
1482 ///
1483 /// By default, performs semantic analysis to build the new expression.
1484 /// Subclasses may override this routine to provide different behavior.
1485 OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1486 MultiExprArg SubExprs,
1487 SourceLocation RParenLoc) {
1488 // Find the declaration for __builtin_shufflevector
1489 const IdentifierInfo &Name
1490 = SemaRef.Context.Idents.get("__builtin_shufflevector");
1491 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1492 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1493 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
1494
1495 // Build a reference to the __builtin_shufflevector builtin
1496 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
1497 Expr *Callee
1498 = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1499 BuiltinLoc, false, false);
1500 SemaRef.UsualUnaryConversions(Callee);
1501
1502 // Build the CallExpr
1503 unsigned NumSubExprs = SubExprs.size();
1504 Expr **Subs = (Expr **)SubExprs.release();
1505 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1506 Subs, NumSubExprs,
1507 Builtin->getResultType(),
1508 RParenLoc);
1509 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
1510
1511 // Type-check the __builtin_shufflevector expression.
1512 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1513 if (Result.isInvalid())
1514 return SemaRef.ExprError();
1515
1516 OwnedCall.release();
1517 return move(Result);
1518 }
Douglas Gregor577f75a2009-08-04 16:50:30 +00001519};
Douglas Gregorb98b1992009-08-11 05:31:07 +00001520
Douglas Gregor43959a92009-08-20 07:17:43 +00001521template<typename Derived>
1522Sema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
1523 if (!S)
1524 return SemaRef.Owned(S);
1525
1526 switch (S->getStmtClass()) {
1527 case Stmt::NoStmtClass: break;
1528
1529 // Transform individual statement nodes
1530#define STMT(Node, Parent) \
1531 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
1532#define EXPR(Node, Parent)
1533#include "clang/AST/StmtNodes.def"
1534
1535 // Transform expressions by calling TransformExpr.
1536#define STMT(Node, Parent)
1537#define EXPR(Node, Parent) case Stmt::Node##Class:
1538#include "clang/AST/StmtNodes.def"
1539 {
1540 Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
1541 if (E.isInvalid())
1542 return getSema().StmtError();
1543
1544 return getSema().Owned(E.takeAs<Stmt>());
1545 }
1546 }
1547
1548 return SemaRef.Owned(S->Retain());
1549}
1550
Douglas Gregor577f75a2009-08-04 16:50:30 +00001551
Douglas Gregor670444e2009-08-04 22:27:00 +00001552template<typename Derived>
Douglas Gregorb98b1992009-08-11 05:31:07 +00001553Sema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1554 bool isAddressOfOperand) {
1555 if (!E)
1556 return SemaRef.Owned(E);
1557
1558 switch (E->getStmtClass()) {
1559 case Stmt::NoStmtClass: break;
1560#define STMT(Node, Parent) case Stmt::Node##Class: break;
1561#define EXPR(Node, Parent) \
1562 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1563#include "clang/AST/StmtNodes.def"
1564 }
1565
1566 return SemaRef.Owned(E->Retain());
Douglas Gregor657c1ac2009-08-06 22:17:10 +00001567}
1568
1569template<typename Derived>
Douglas Gregordcee1a12009-08-06 05:28:30 +00001570NestedNameSpecifier *
1571TreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1572 SourceRange Range) {
Douglas Gregor43959a92009-08-20 07:17:43 +00001573 // Transform the prefix of this nested name specifier.
Douglas Gregordcee1a12009-08-06 05:28:30 +00001574 NestedNameSpecifier *Prefix = NNS->getPrefix();
1575 if (Prefix) {
1576 Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range);
1577 if (!Prefix)
1578 return 0;
1579 }
1580
1581 switch (NNS->getKind()) {
1582 case NestedNameSpecifier::Identifier:
1583 assert(Prefix &&
1584 "Can't have an identifier nested-name-specifier with no prefix");
1585 if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix())
1586 return NNS;
1587
1588 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1589 *NNS->getAsIdentifier());
1590
1591 case NestedNameSpecifier::Namespace: {
1592 NamespaceDecl *NS
1593 = cast_or_null<NamespaceDecl>(
1594 getDerived().TransformDecl(NNS->getAsNamespace()));
1595 if (!getDerived().AlwaysRebuild() &&
1596 Prefix == NNS->getPrefix() &&
1597 NS == NNS->getAsNamespace())
1598 return NNS;
1599
1600 return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1601 }
1602
1603 case NestedNameSpecifier::Global:
1604 // There is no meaningful transformation that one could perform on the
1605 // global scope.
1606 return NNS;
1607
1608 case NestedNameSpecifier::TypeSpecWithTemplate:
1609 case NestedNameSpecifier::TypeSpec: {
1610 QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
Douglas Gregord1067e52009-08-06 06:41:21 +00001611 if (T.isNull())
1612 return 0;
1613
Douglas Gregordcee1a12009-08-06 05:28:30 +00001614 if (!getDerived().AlwaysRebuild() &&
1615 Prefix == NNS->getPrefix() &&
1616 T == QualType(NNS->getAsType(), 0))
1617 return NNS;
1618
1619 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1620 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1621 T);
1622 }
1623 }
1624
1625 // Required to silence a GCC warning
1626 return 0;
1627}
1628
1629template<typename Derived>
Douglas Gregord1067e52009-08-06 06:41:21 +00001630TemplateName
1631TreeTransform<Derived>::TransformTemplateName(TemplateName Name) {
1632 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
1633 NestedNameSpecifier *NNS
1634 = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1635 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1636 if (!NNS)
1637 return TemplateName();
1638
1639 if (TemplateDecl *Template = QTN->getTemplateDecl()) {
1640 TemplateDecl *TransTemplate
1641 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1642 if (!TransTemplate)
1643 return TemplateName();
1644
1645 if (!getDerived().AlwaysRebuild() &&
1646 NNS == QTN->getQualifier() &&
1647 TransTemplate == Template)
1648 return Name;
1649
1650 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1651 TransTemplate);
1652 }
1653
1654 OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1655 assert(Ovl && "Not a template name or an overload set?");
1656 OverloadedFunctionDecl *TransOvl
1657 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1658 if (!TransOvl)
1659 return TemplateName();
1660
1661 if (!getDerived().AlwaysRebuild() &&
1662 NNS == QTN->getQualifier() &&
1663 TransOvl == Ovl)
1664 return Name;
1665
1666 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1667 TransOvl);
1668 }
1669
1670 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
1671 NestedNameSpecifier *NNS
1672 = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1673 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1674 if (!NNS)
1675 return TemplateName();
1676
1677 if (!getDerived().AlwaysRebuild() &&
1678 NNS == DTN->getQualifier())
1679 return Name;
1680
1681 return getDerived().RebuildTemplateName(NNS, *DTN->getName());
1682 }
1683
1684 if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
1685 TemplateDecl *TransTemplate
1686 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1687 if (!TransTemplate)
1688 return TemplateName();
1689
1690 if (!getDerived().AlwaysRebuild() &&
1691 TransTemplate == Template)
1692 return Name;
1693
1694 return TemplateName(TransTemplate);
1695 }
1696
1697 OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1698 assert(Ovl && "Not a template name or an overload set?");
1699 OverloadedFunctionDecl *TransOvl
1700 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1701 if (!TransOvl)
1702 return TemplateName();
1703
1704 if (!getDerived().AlwaysRebuild() &&
1705 TransOvl == Ovl)
1706 return Name;
1707
1708 return TemplateName(TransOvl);
1709}
1710
1711template<typename Derived>
Douglas Gregor670444e2009-08-04 22:27:00 +00001712TemplateArgument
1713TreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) {
1714 switch (Arg.getKind()) {
1715 case TemplateArgument::Null:
1716 case TemplateArgument::Integral:
1717 return Arg;
1718
1719 case TemplateArgument::Type: {
1720 QualType T = getDerived().TransformType(Arg.getAsType());
1721 if (T.isNull())
1722 return TemplateArgument();
1723 return TemplateArgument(Arg.getLocation(), T);
1724 }
1725
1726 case TemplateArgument::Declaration: {
1727 Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1728 if (!D)
1729 return TemplateArgument();
1730 return TemplateArgument(Arg.getLocation(), D);
1731 }
1732
1733 case TemplateArgument::Expression: {
1734 // Template argument expressions are not potentially evaluated.
1735 EnterExpressionEvaluationContext Unevaluated(getSema(),
1736 Action::Unevaluated);
1737
1738 Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr());
1739 if (E.isInvalid())
1740 return TemplateArgument();
1741 return TemplateArgument(E.takeAs<Expr>());
1742 }
1743
1744 case TemplateArgument::Pack: {
1745 llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
1746 TransformedArgs.reserve(Arg.pack_size());
1747 for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
1748 AEnd = Arg.pack_end();
1749 A != AEnd; ++A) {
1750 TemplateArgument TA = getDerived().TransformTemplateArgument(*A);
1751 if (TA.isNull())
1752 return TA;
1753
1754 TransformedArgs.push_back(TA);
1755 }
1756 TemplateArgument Result;
1757 Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
1758 true);
1759 return Result;
1760 }
1761 }
1762
1763 // Work around bogus GCC warning
1764 return TemplateArgument();
1765}
1766
Douglas Gregor577f75a2009-08-04 16:50:30 +00001767//===----------------------------------------------------------------------===//
1768// Type transformation
1769//===----------------------------------------------------------------------===//
1770
1771template<typename Derived>
1772QualType TreeTransform<Derived>::TransformType(QualType T) {
1773 if (getDerived().AlreadyTransformed(T))
1774 return T;
1775
1776 QualType Result;
1777 switch (T->getTypeClass()) {
1778#define ABSTRACT_TYPE(CLASS, PARENT)
1779#define TYPE(CLASS, PARENT) \
1780 case Type::CLASS: \
1781 Result = getDerived().Transform##CLASS##Type( \
1782 static_cast<CLASS##Type*>(T.getTypePtr())); \
1783 break;
1784#include "clang/AST/TypeNodes.def"
1785 }
1786
1787 if (Result.isNull() || T == Result)
1788 return Result;
1789
1790 return getDerived().AddTypeQualifiers(Result, T.getCVRQualifiers());
1791}
1792
1793template<typename Derived>
1794QualType
1795TreeTransform<Derived>::AddTypeQualifiers(QualType T, unsigned CVRQualifiers) {
1796 if (CVRQualifiers && !T->isFunctionType() && !T->isReferenceType())
1797 return T.getWithAdditionalQualifiers(CVRQualifiers);
1798
1799 return T;
1800}
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00001801
Douglas Gregor577f75a2009-08-04 16:50:30 +00001802template<typename Derived>
1803QualType TreeTransform<Derived>::TransformExtQualType(const ExtQualType *T) {
1804 // FIXME: Implement
1805 return QualType(T, 0);
1806}
1807
1808template<typename Derived>
1809QualType TreeTransform<Derived>::TransformBuiltinType(const BuiltinType *T) {
1810 // Nothing to do
1811 return QualType(T, 0);
1812}
1813
1814template<typename Derived>
1815QualType TreeTransform<Derived>::TransformFixedWidthIntType(
1816 const FixedWidthIntType *T) {
1817 // FIXME: Implement
1818 return QualType(T, 0);
1819}
1820
1821template<typename Derived>
1822QualType TreeTransform<Derived>::TransformComplexType(const ComplexType *T) {
1823 // FIXME: Implement
1824 return QualType(T, 0);
1825}
1826
1827template<typename Derived>
1828QualType TreeTransform<Derived>::TransformPointerType(const PointerType *T) {
1829 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1830 if (PointeeType.isNull())
1831 return QualType();
1832
1833 if (!getDerived().AlwaysRebuild() &&
1834 PointeeType == T->getPointeeType())
1835 return QualType(T, 0);
1836
1837 return getDerived().RebuildPointerType(PointeeType);
1838}
1839
1840template<typename Derived>
1841QualType
1842TreeTransform<Derived>::TransformBlockPointerType(const BlockPointerType *T) {
1843 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1844 if (PointeeType.isNull())
1845 return QualType();
1846
1847 if (!getDerived().AlwaysRebuild() &&
1848 PointeeType == T->getPointeeType())
1849 return QualType(T, 0);
1850
1851 return getDerived().RebuildBlockPointerType(PointeeType);
1852}
1853
1854template<typename Derived>
1855QualType
1856TreeTransform<Derived>::TransformLValueReferenceType(
1857 const LValueReferenceType *T) {
1858 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1859 if (PointeeType.isNull())
1860 return QualType();
1861
1862 if (!getDerived().AlwaysRebuild() &&
1863 PointeeType == T->getPointeeType())
1864 return QualType(T, 0);
1865
1866 return getDerived().RebuildLValueReferenceType(PointeeType);
1867}
1868
1869template<typename Derived>
1870QualType
1871TreeTransform<Derived>::TransformRValueReferenceType(
1872 const RValueReferenceType *T) {
1873 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1874 if (PointeeType.isNull())
1875 return QualType();
1876
1877 if (!getDerived().AlwaysRebuild() &&
1878 PointeeType == T->getPointeeType())
1879 return QualType(T, 0);
1880
1881 return getDerived().RebuildRValueReferenceType(PointeeType);
1882}
1883
1884template<typename Derived>
1885QualType
1886TreeTransform<Derived>::TransformMemberPointerType(const MemberPointerType *T) {
1887 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1888 if (PointeeType.isNull())
1889 return QualType();
1890
1891 QualType ClassType = getDerived().TransformType(QualType(T->getClass(), 0));
1892 if (ClassType.isNull())
1893 return QualType();
1894
1895 if (!getDerived().AlwaysRebuild() &&
1896 PointeeType == T->getPointeeType() &&
1897 ClassType == QualType(T->getClass(), 0))
1898 return QualType(T, 0);
1899
1900 return getDerived().RebuildMemberPointerType(PointeeType, ClassType);
1901}
1902
1903template<typename Derived>
1904QualType
1905TreeTransform<Derived>::TransformConstantArrayType(const ConstantArrayType *T) {
1906 QualType ElementType = getDerived().TransformType(T->getElementType());
1907 if (ElementType.isNull())
1908 return QualType();
1909
1910 if (!getDerived().AlwaysRebuild() &&
1911 ElementType == T->getElementType())
1912 return QualType(T, 0);
1913
1914 return getDerived().RebuildConstantArrayType(ElementType,
1915 T->getSizeModifier(),
1916 T->getSize(),
1917 T->getIndexTypeQualifier());
1918}
1919
1920template<typename Derived>
1921QualType
1922TreeTransform<Derived>::TransformConstantArrayWithExprType(
1923 const ConstantArrayWithExprType *T) {
1924 QualType ElementType = getDerived().TransformType(T->getElementType());
1925 if (ElementType.isNull())
1926 return QualType();
1927
Douglas Gregor670444e2009-08-04 22:27:00 +00001928 // Array bounds are not potentially evaluated contexts
1929 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1930
1931 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
1932 if (Size.isInvalid())
1933 return QualType();
1934
Douglas Gregor577f75a2009-08-04 16:50:30 +00001935 if (!getDerived().AlwaysRebuild() &&
Douglas Gregor670444e2009-08-04 22:27:00 +00001936 ElementType == T->getElementType() &&
1937 Size.get() == T->getSizeExpr())
Douglas Gregor577f75a2009-08-04 16:50:30 +00001938 return QualType(T, 0);
1939
1940 return getDerived().RebuildConstantArrayWithExprType(ElementType,
1941 T->getSizeModifier(),
1942 T->getSize(),
Douglas Gregor670444e2009-08-04 22:27:00 +00001943 Size.takeAs<Expr>(),
Douglas Gregor577f75a2009-08-04 16:50:30 +00001944 T->getIndexTypeQualifier(),
1945 T->getBracketsRange());
1946}
1947
1948template<typename Derived>
1949QualType
1950TreeTransform<Derived>::TransformConstantArrayWithoutExprType(
1951 const ConstantArrayWithoutExprType *T) {
1952 QualType ElementType = getDerived().TransformType(T->getElementType());
1953 if (ElementType.isNull())
1954 return QualType();
1955
1956 if (!getDerived().AlwaysRebuild() &&
1957 ElementType == T->getElementType())
1958 return QualType(T, 0);
1959
1960 return getDerived().RebuildConstantArrayWithoutExprType(ElementType,
1961 T->getSizeModifier(),
1962 T->getSize(),
1963 T->getIndexTypeQualifier());
1964}
1965
1966template<typename Derived>
1967QualType TreeTransform<Derived>::TransformIncompleteArrayType(
1968 const IncompleteArrayType *T) {
1969 QualType ElementType = getDerived().TransformType(T->getElementType());
1970 if (ElementType.isNull())
1971 return QualType();
1972
1973 if (!getDerived().AlwaysRebuild() &&
1974 ElementType == T->getElementType())
1975 return QualType(T, 0);
1976
1977 return getDerived().RebuildIncompleteArrayType(ElementType,
1978 T->getSizeModifier(),
1979 T->getIndexTypeQualifier());
1980}
1981
1982template<typename Derived>
1983QualType TreeTransform<Derived>::TransformVariableArrayType(
1984 const VariableArrayType *T) {
1985 QualType ElementType = getDerived().TransformType(T->getElementType());
1986 if (ElementType.isNull())
1987 return QualType();
1988
Douglas Gregor670444e2009-08-04 22:27:00 +00001989 // Array bounds are not potentially evaluated contexts
1990 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1991
Douglas Gregor577f75a2009-08-04 16:50:30 +00001992 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
1993 if (Size.isInvalid())
1994 return QualType();
1995
1996 if (!getDerived().AlwaysRebuild() &&
1997 ElementType == T->getElementType() &&
1998 Size.get() == T->getSizeExpr()) {
1999 Size.take();
2000 return QualType(T, 0);
2001 }
2002
2003 return getDerived().RebuildVariableArrayType(ElementType,
2004 T->getSizeModifier(),
2005 move(Size),
2006 T->getIndexTypeQualifier(),
2007 T->getBracketsRange());
2008}
2009
2010template<typename Derived>
2011QualType TreeTransform<Derived>::TransformDependentSizedArrayType(
2012 const DependentSizedArrayType *T) {
2013 QualType ElementType = getDerived().TransformType(T->getElementType());
2014 if (ElementType.isNull())
2015 return QualType();
2016
Douglas Gregor670444e2009-08-04 22:27:00 +00002017 // Array bounds are not potentially evaluated contexts
2018 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2019
Douglas Gregor577f75a2009-08-04 16:50:30 +00002020 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2021 if (Size.isInvalid())
2022 return QualType();
2023
2024 if (!getDerived().AlwaysRebuild() &&
2025 ElementType == T->getElementType() &&
2026 Size.get() == T->getSizeExpr()) {
2027 Size.take();
2028 return QualType(T, 0);
2029 }
2030
2031 return getDerived().RebuildDependentSizedArrayType(ElementType,
2032 T->getSizeModifier(),
2033 move(Size),
2034 T->getIndexTypeQualifier(),
2035 T->getBracketsRange());
2036}
2037
2038template<typename Derived>
2039QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2040 const DependentSizedExtVectorType *T) {
2041 QualType ElementType = getDerived().TransformType(T->getElementType());
2042 if (ElementType.isNull())
2043 return QualType();
2044
Douglas Gregor670444e2009-08-04 22:27:00 +00002045 // Vector sizes are not potentially evaluated contexts
2046 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2047
Douglas Gregor577f75a2009-08-04 16:50:30 +00002048 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2049 if (Size.isInvalid())
2050 return QualType();
2051
2052 if (!getDerived().AlwaysRebuild() &&
2053 ElementType == T->getElementType() &&
2054 Size.get() == T->getSizeExpr()) {
2055 Size.take();
2056 return QualType(T, 0);
2057 }
2058
2059 return getDerived().RebuildDependentSizedExtVectorType(ElementType,
2060 move(Size),
2061 T->getAttributeLoc());
2062}
2063
2064template<typename Derived>
2065QualType TreeTransform<Derived>::TransformVectorType(const VectorType *T) {
2066 QualType ElementType = getDerived().TransformType(T->getElementType());
2067 if (ElementType.isNull())
2068 return QualType();
2069
2070 if (!getDerived().AlwaysRebuild() &&
2071 ElementType == T->getElementType())
2072 return QualType(T, 0);
2073
2074 return getDerived().RebuildVectorType(ElementType, T->getNumElements());
2075}
2076
2077template<typename Derived>
2078QualType
2079TreeTransform<Derived>::TransformExtVectorType(const ExtVectorType *T) {
2080 QualType ElementType = getDerived().TransformType(T->getElementType());
2081 if (ElementType.isNull())
2082 return QualType();
2083
2084 if (!getDerived().AlwaysRebuild() &&
2085 ElementType == T->getElementType())
2086 return QualType(T, 0);
2087
2088 return getDerived().RebuildExtVectorType(ElementType, T->getNumElements(),
2089 /*FIXME*/SourceLocation());
2090}
2091
2092template<typename Derived>
2093QualType TreeTransform<Derived>::TransformFunctionProtoType(
2094 const FunctionProtoType *T) {
2095 QualType ResultType = getDerived().TransformType(T->getResultType());
2096 if (ResultType.isNull())
2097 return QualType();
2098
2099 llvm::SmallVector<QualType, 4> ParamTypes;
2100 for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
2101 ParamEnd = T->arg_type_end();
2102 Param != ParamEnd; ++Param) {
2103 QualType P = getDerived().TransformType(*Param);
2104 if (P.isNull())
2105 return QualType();
2106
2107 ParamTypes.push_back(P);
2108 }
2109
2110 if (!getDerived().AlwaysRebuild() &&
2111 ResultType == T->getResultType() &&
2112 std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin()))
2113 return QualType(T, 0);
2114
2115 return getDerived().RebuildFunctionProtoType(ResultType, ParamTypes.data(),
2116 ParamTypes.size(), T->isVariadic(),
2117 T->getTypeQuals());
2118}
2119
2120template<typename Derived>
2121QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2122 const FunctionNoProtoType *T) {
2123 // FIXME: Implement
2124 return QualType(T, 0);
2125}
2126
2127template<typename Derived>
2128QualType TreeTransform<Derived>::TransformTypedefType(const TypedefType *T) {
2129 TypedefDecl *Typedef
2130 = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2131 if (!Typedef)
2132 return QualType();
2133
2134 if (!getDerived().AlwaysRebuild() &&
2135 Typedef == T->getDecl())
2136 return QualType(T, 0);
2137
2138 return getDerived().RebuildTypedefType(Typedef);
2139}
2140
2141template<typename Derived>
2142QualType TreeTransform<Derived>::TransformTypeOfExprType(
2143 const TypeOfExprType *T) {
Douglas Gregor670444e2009-08-04 22:27:00 +00002144 // typeof expressions are not potentially evaluated contexts
2145 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2146
Douglas Gregor577f75a2009-08-04 16:50:30 +00002147 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2148 if (E.isInvalid())
2149 return QualType();
2150
2151 if (!getDerived().AlwaysRebuild() &&
2152 E.get() == T->getUnderlyingExpr()) {
2153 E.take();
2154 return QualType(T, 0);
2155 }
2156
2157 return getDerived().RebuildTypeOfExprType(move(E));
2158}
2159
2160template<typename Derived>
2161QualType TreeTransform<Derived>::TransformTypeOfType(const TypeOfType *T) {
2162 QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2163 if (Underlying.isNull())
2164 return QualType();
2165
2166 if (!getDerived().AlwaysRebuild() &&
2167 Underlying == T->getUnderlyingType())
2168 return QualType(T, 0);
2169
2170 return getDerived().RebuildTypeOfType(Underlying);
2171}
2172
2173template<typename Derived>
2174QualType TreeTransform<Derived>::TransformDecltypeType(const DecltypeType *T) {
Douglas Gregor670444e2009-08-04 22:27:00 +00002175 // decltype expressions are not potentially evaluated contexts
2176 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2177
Douglas Gregor577f75a2009-08-04 16:50:30 +00002178 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2179 if (E.isInvalid())
2180 return QualType();
2181
2182 if (!getDerived().AlwaysRebuild() &&
2183 E.get() == T->getUnderlyingExpr()) {
2184 E.take();
2185 return QualType(T, 0);
2186 }
2187
2188 return getDerived().RebuildDecltypeType(move(E));
2189}
2190
2191template<typename Derived>
2192QualType TreeTransform<Derived>::TransformRecordType(const RecordType *T) {
2193 RecordDecl *Record
2194 = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
2195 if (!Record)
2196 return QualType();
2197
2198 if (!getDerived().AlwaysRebuild() &&
2199 Record == T->getDecl())
2200 return QualType(T, 0);
2201
2202 return getDerived().RebuildRecordType(Record);
2203}
2204
2205template<typename Derived>
2206QualType TreeTransform<Derived>::TransformEnumType(const EnumType *T) {
2207 EnumDecl *Enum
2208 = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
2209 if (!Enum)
2210 return QualType();
2211
2212 if (!getDerived().AlwaysRebuild() &&
2213 Enum == T->getDecl())
2214 return QualType(T, 0);
2215
2216 return getDerived().RebuildEnumType(Enum);
2217}
2218
2219template<typename Derived>
2220QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
2221 const TemplateTypeParmType *T) {
2222 // Nothing to do
2223 return QualType(T, 0);
2224}
2225
2226template<typename Derived>
2227QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2228 const TemplateSpecializationType *T) {
2229 TemplateName Template
2230 = getDerived().TransformTemplateName(T->getTemplateName());
2231 if (Template.isNull())
2232 return QualType();
2233
2234 llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs;
2235 NewTemplateArgs.reserve(T->getNumArgs());
2236 for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end();
2237 Arg != ArgEnd; ++Arg) {
2238 TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg);
2239 if (NewArg.isNull())
2240 return QualType();
2241
2242 NewTemplateArgs.push_back(NewArg);
2243 }
2244
2245 // FIXME: early abort if all of the template arguments and such are the
2246 // same.
2247
2248 // FIXME: We're missing the locations of the template name, '<', and '>'.
2249 return getDerived().RebuildTemplateSpecializationType(Template,
2250 NewTemplateArgs.data(),
2251 NewTemplateArgs.size());
2252}
2253
2254template<typename Derived>
2255QualType TreeTransform<Derived>::TransformQualifiedNameType(
2256 const QualifiedNameType *T) {
2257 NestedNameSpecifier *NNS
2258 = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2259 SourceRange());
2260 if (!NNS)
2261 return QualType();
2262
2263 QualType Named = getDerived().TransformType(T->getNamedType());
2264 if (Named.isNull())
2265 return QualType();
2266
2267 if (!getDerived().AlwaysRebuild() &&
2268 NNS == T->getQualifier() &&
2269 Named == T->getNamedType())
2270 return QualType(T, 0);
2271
2272 return getDerived().RebuildQualifiedNameType(NNS, Named);
2273}
2274
2275template<typename Derived>
2276QualType TreeTransform<Derived>::TransformTypenameType(const TypenameType *T) {
2277 NestedNameSpecifier *NNS
2278 = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
Douglas Gregor4a959d82009-08-06 16:20:37 +00002279 SourceRange(/*FIXME:*/getDerived().getBaseLocation()));
Douglas Gregor577f75a2009-08-04 16:50:30 +00002280 if (!NNS)
2281 return QualType();
2282
2283 if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
2284 QualType NewTemplateId
2285 = getDerived().TransformType(QualType(TemplateId, 0));
2286 if (NewTemplateId.isNull())
2287 return QualType();
2288
2289 if (!getDerived().AlwaysRebuild() &&
2290 NNS == T->getQualifier() &&
2291 NewTemplateId == QualType(TemplateId, 0))
2292 return QualType(T, 0);
2293
2294 return getDerived().RebuildTypenameType(NNS, NewTemplateId);
2295 }
2296
2297 return getDerived().RebuildTypenameType(NNS, T->getIdentifier());
2298}
2299
2300template<typename Derived>
2301QualType TreeTransform<Derived>::TransformObjCInterfaceType(
2302 const ObjCInterfaceType *T) {
2303 // FIXME: Implement
2304 return QualType(T, 0);
2305}
2306
2307template<typename Derived>
2308QualType TreeTransform<Derived>::TransformObjCObjectPointerType(
2309 const ObjCObjectPointerType *T) {
2310 // FIXME: Implement
2311 return QualType(T, 0);
2312}
2313
2314//===----------------------------------------------------------------------===//
Douglas Gregor43959a92009-08-20 07:17:43 +00002315// Statement transformation
2316//===----------------------------------------------------------------------===//
2317template<typename Derived>
2318Sema::OwningStmtResult
2319TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
2320 return SemaRef.Owned(S->Retain());
2321}
2322
2323template<typename Derived>
2324Sema::OwningStmtResult
2325TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
2326 return getDerived().TransformCompoundStmt(S, false);
2327}
2328
2329template<typename Derived>
2330Sema::OwningStmtResult
2331TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
2332 bool IsStmtExpr) {
2333 bool SubStmtChanged = false;
2334 ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
2335 for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
2336 B != BEnd; ++B) {
2337 OwningStmtResult Result = getDerived().TransformStmt(*B);
2338 if (Result.isInvalid())
2339 return getSema().StmtError();
2340
2341 SubStmtChanged = SubStmtChanged || Result.get() != *B;
2342 Statements.push_back(Result.takeAs<Stmt>());
2343 }
2344
2345 if (!getDerived().AlwaysRebuild() &&
2346 !SubStmtChanged)
2347 return SemaRef.Owned(S->Retain());
2348
2349 return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
2350 move_arg(Statements),
2351 S->getRBracLoc(),
2352 IsStmtExpr);
2353}
2354
2355template<typename Derived>
2356Sema::OwningStmtResult
2357TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
2358 // The case value expressions are not potentially evaluated.
2359 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2360
2361 // Transform the left-hand case value.
2362 OwningExprResult LHS = getDerived().TransformExpr(S->getLHS());
2363 if (LHS.isInvalid())
2364 return SemaRef.StmtError();
2365
2366 // Transform the right-hand case value (for the GNU case-range extension).
2367 OwningExprResult RHS = getDerived().TransformExpr(S->getRHS());
2368 if (RHS.isInvalid())
2369 return SemaRef.StmtError();
2370
2371 // Build the case statement.
2372 // Case statements are always rebuilt so that they will attached to their
2373 // transformed switch statement.
2374 OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
2375 move(LHS),
2376 S->getEllipsisLoc(),
2377 move(RHS),
2378 S->getColonLoc());
2379 if (Case.isInvalid())
2380 return SemaRef.StmtError();
2381
2382 // Transform the statement following the case
2383 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
2384 if (SubStmt.isInvalid())
2385 return SemaRef.StmtError();
2386
2387 // Attach the body to the case statement
2388 return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
2389}
2390
2391template<typename Derived>
2392Sema::OwningStmtResult
2393TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
2394 // Transform the statement following the default case
2395 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
2396 if (SubStmt.isInvalid())
2397 return SemaRef.StmtError();
2398
2399 // Default statements are always rebuilt
2400 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
2401 move(SubStmt));
2402}
2403
2404template<typename Derived>
2405Sema::OwningStmtResult
2406TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
2407 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
2408 if (SubStmt.isInvalid())
2409 return SemaRef.StmtError();
2410
2411 // FIXME: Pass the real colon location in.
2412 SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
2413 return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
2414 move(SubStmt));
2415}
2416
2417template<typename Derived>
2418Sema::OwningStmtResult
2419TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
2420 // Transform the condition
2421 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2422 if (Cond.isInvalid())
2423 return SemaRef.StmtError();
2424
2425 Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
2426
2427 // Transform the "then" branch.
2428 OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
2429 if (Then.isInvalid())
2430 return SemaRef.StmtError();
2431
2432 // Transform the "else" branch.
2433 OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
2434 if (Else.isInvalid())
2435 return SemaRef.StmtError();
2436
2437 if (!getDerived().AlwaysRebuild() &&
2438 FullCond->get() == S->getCond() &&
2439 Then.get() == S->getThen() &&
2440 Else.get() == S->getElse())
2441 return SemaRef.Owned(S->Retain());
2442
2443 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then),
2444 S->getElseLoc(), move(Else));
2445}
2446
2447template<typename Derived>
2448Sema::OwningStmtResult
2449TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
2450 // Transform the condition.
2451 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2452 if (Cond.isInvalid())
2453 return SemaRef.StmtError();
2454
2455 // Rebuild the switch statement.
2456 OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond));
2457 if (Switch.isInvalid())
2458 return SemaRef.StmtError();
2459
2460 // Transform the body of the switch statement.
2461 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2462 if (Body.isInvalid())
2463 return SemaRef.StmtError();
2464
2465 // Complete the switch statement.
2466 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
2467 move(Body));
2468}
2469
2470template<typename Derived>
2471Sema::OwningStmtResult
2472TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
2473 // Transform the condition
2474 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2475 if (Cond.isInvalid())
2476 return SemaRef.StmtError();
2477
2478 Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
2479
2480 // Transform the body
2481 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2482 if (Body.isInvalid())
2483 return SemaRef.StmtError();
2484
2485 if (!getDerived().AlwaysRebuild() &&
2486 FullCond->get() == S->getCond() &&
2487 Body.get() == S->getBody())
2488 return SemaRef.Owned(S->Retain());
2489
2490 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body));
2491}
2492
2493template<typename Derived>
2494Sema::OwningStmtResult
2495TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
2496 // Transform the condition
2497 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2498 if (Cond.isInvalid())
2499 return SemaRef.StmtError();
2500
2501 // Transform the body
2502 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2503 if (Body.isInvalid())
2504 return SemaRef.StmtError();
2505
2506 if (!getDerived().AlwaysRebuild() &&
2507 Cond.get() == S->getCond() &&
2508 Body.get() == S->getBody())
2509 return SemaRef.Owned(S->Retain());
2510
2511 return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
2512 /*FIXME:*/S->getWhileLoc(), move(Cond),
2513 S->getRParenLoc());
2514}
2515
2516template<typename Derived>
2517Sema::OwningStmtResult
2518TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
2519 // Transform the initialization statement
2520 OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
2521 if (Init.isInvalid())
2522 return SemaRef.StmtError();
2523
2524 // Transform the condition
2525 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2526 if (Cond.isInvalid())
2527 return SemaRef.StmtError();
2528
2529 // Transform the increment
2530 OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
2531 if (Inc.isInvalid())
2532 return SemaRef.StmtError();
2533
2534 // Transform the body
2535 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2536 if (Body.isInvalid())
2537 return SemaRef.StmtError();
2538
2539 if (!getDerived().AlwaysRebuild() &&
2540 Init.get() == S->getInit() &&
2541 Cond.get() == S->getCond() &&
2542 Inc.get() == S->getInc() &&
2543 Body.get() == S->getBody())
2544 return SemaRef.Owned(S->Retain());
2545
2546 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
2547 move(Init), move(Cond), move(Inc),
2548 S->getRParenLoc(), move(Body));
2549}
2550
2551template<typename Derived>
2552Sema::OwningStmtResult
2553TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
2554 // Goto statements must always be rebuilt, to resolve the label.
2555 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
2556 S->getLabel());
2557}
2558
2559template<typename Derived>
2560Sema::OwningStmtResult
2561TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
2562 OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
2563 if (Target.isInvalid())
2564 return SemaRef.StmtError();
2565
2566 if (!getDerived().AlwaysRebuild() &&
2567 Target.get() == S->getTarget())
2568 return SemaRef.Owned(S->Retain());
2569
2570 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
2571 move(Target));
2572}
2573
2574template<typename Derived>
2575Sema::OwningStmtResult
2576TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
2577 return SemaRef.Owned(S->Retain());
2578}
2579
2580template<typename Derived>
2581Sema::OwningStmtResult
2582TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
2583 return SemaRef.Owned(S->Retain());
2584}
2585
2586template<typename Derived>
2587Sema::OwningStmtResult
2588TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
2589 Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
2590 if (Result.isInvalid())
2591 return SemaRef.StmtError();
2592
2593 // FIXME: We always rebuild the return statement because there is no way
2594 // to tell whether the return type of the function has changed.
2595 return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
2596}
2597
2598template<typename Derived>
2599Sema::OwningStmtResult
2600TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
2601 bool DeclChanged = false;
2602 llvm::SmallVector<Decl *, 4> Decls;
2603 for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
2604 D != DEnd; ++D) {
2605 Decl *Transformed = getDerived().TransformDefinition(*D);
2606 if (!Transformed)
2607 return SemaRef.StmtError();
2608
2609 if (Transformed != *D)
2610 DeclChanged = true;
2611
2612 Decls.push_back(Transformed);
2613 }
2614
2615 if (!getDerived().AlwaysRebuild() && !DeclChanged)
2616 return SemaRef.Owned(S->Retain());
2617
2618 return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
2619 S->getStartLoc(), S->getEndLoc());
2620}
2621
2622template<typename Derived>
2623Sema::OwningStmtResult
2624TreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
2625 assert(false && "SwitchCase is abstract and cannot be transformed");
2626 return SemaRef.Owned(S->Retain());
2627}
2628
2629template<typename Derived>
2630Sema::OwningStmtResult
2631TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
2632 // FIXME: Implement!
2633 assert(false && "Inline assembly cannot be transformed");
2634 return SemaRef.Owned(S->Retain());
2635}
2636
2637
2638template<typename Derived>
2639Sema::OwningStmtResult
2640TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
2641 // FIXME: Implement this
2642 assert(false && "Cannot transform an Objective-C @try statement");
2643 return SemaRef.Owned(S->Retain());
2644}
2645
2646template<typename Derived>
2647Sema::OwningStmtResult
2648TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
2649 // FIXME: Implement this
2650 assert(false && "Cannot transform an Objective-C @catch statement");
2651 return SemaRef.Owned(S->Retain());
2652}
2653
2654template<typename Derived>
2655Sema::OwningStmtResult
2656TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
2657 // FIXME: Implement this
2658 assert(false && "Cannot transform an Objective-C @finally statement");
2659 return SemaRef.Owned(S->Retain());
2660}
2661
2662template<typename Derived>
2663Sema::OwningStmtResult
2664TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
2665 // FIXME: Implement this
2666 assert(false && "Cannot transform an Objective-C @throw statement");
2667 return SemaRef.Owned(S->Retain());
2668}
2669
2670template<typename Derived>
2671Sema::OwningStmtResult
2672TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
2673 ObjCAtSynchronizedStmt *S) {
2674 // FIXME: Implement this
2675 assert(false && "Cannot transform an Objective-C @synchronized statement");
2676 return SemaRef.Owned(S->Retain());
2677}
2678
2679template<typename Derived>
2680Sema::OwningStmtResult
2681TreeTransform<Derived>::TransformObjCForCollectionStmt(
2682 ObjCForCollectionStmt *S) {
2683 // FIXME: Implement this
2684 assert(false && "Cannot transform an Objective-C for-each statement");
2685 return SemaRef.Owned(S->Retain());
2686}
2687
2688
2689template<typename Derived>
2690Sema::OwningStmtResult
2691TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
2692 // Transform the exception declaration, if any.
2693 VarDecl *Var = 0;
2694 if (S->getExceptionDecl()) {
2695 VarDecl *ExceptionDecl = S->getExceptionDecl();
2696 TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
2697 ExceptionDecl->getDeclName());
2698
2699 QualType T = getDerived().TransformType(ExceptionDecl->getType());
2700 if (T.isNull())
2701 return SemaRef.StmtError();
2702
2703 Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
2704 T,
2705 ExceptionDecl->getDeclaratorInfo(),
2706 ExceptionDecl->getIdentifier(),
2707 ExceptionDecl->getLocation(),
2708 /*FIXME: Inaccurate*/
2709 SourceRange(ExceptionDecl->getLocation()));
2710 if (!Var || Var->isInvalidDecl()) {
2711 if (Var)
2712 Var->Destroy(SemaRef.Context);
2713 return SemaRef.StmtError();
2714 }
2715 }
2716
2717 // Transform the actual exception handler.
2718 OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
2719 if (Handler.isInvalid()) {
2720 if (Var)
2721 Var->Destroy(SemaRef.Context);
2722 return SemaRef.StmtError();
2723 }
2724
2725 if (!getDerived().AlwaysRebuild() &&
2726 !Var &&
2727 Handler.get() == S->getHandlerBlock())
2728 return SemaRef.Owned(S->Retain());
2729
2730 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
2731 Var,
2732 move(Handler));
2733}
2734
2735template<typename Derived>
2736Sema::OwningStmtResult
2737TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
2738 // Transform the try block itself.
2739 OwningStmtResult TryBlock
2740 = getDerived().TransformCompoundStmt(S->getTryBlock());
2741 if (TryBlock.isInvalid())
2742 return SemaRef.StmtError();
2743
2744 // Transform the handlers.
2745 bool HandlerChanged = false;
2746 ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
2747 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
2748 OwningStmtResult Handler
2749 = getDerived().TransformCXXCatchStmt(S->getHandler(I));
2750 if (Handler.isInvalid())
2751 return SemaRef.StmtError();
2752
2753 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
2754 Handlers.push_back(Handler.takeAs<Stmt>());
2755 }
2756
2757 if (!getDerived().AlwaysRebuild() &&
2758 TryBlock.get() == S->getTryBlock() &&
2759 !HandlerChanged)
2760 return SemaRef.Owned(S->Retain());
2761
2762 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
2763 move_arg(Handlers));
2764}
2765
2766//===----------------------------------------------------------------------===//
Douglas Gregorb98b1992009-08-11 05:31:07 +00002767// Expression transformation
2768//===----------------------------------------------------------------------===//
2769template<typename Derived>
2770Sema::OwningExprResult
2771TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
2772 return SemaRef.Owned(E->Retain());
2773}
2774
2775template<typename Derived>
2776Sema::OwningExprResult
2777TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
2778 NamedDecl *ND
2779 = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
2780 if (!ND)
2781 return SemaRef.ExprError();
2782
2783 if (!getDerived().AlwaysRebuild() && ND == E->getDecl())
2784 return SemaRef.Owned(E->Retain());
2785
2786 return getDerived().RebuildDeclRefExpr(ND, E->getLocation());
2787}
2788
2789template<typename Derived>
2790Sema::OwningExprResult
2791TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
2792 return SemaRef.Owned(E->Retain());
2793}
2794
2795template<typename Derived>
2796Sema::OwningExprResult
2797TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
2798 return SemaRef.Owned(E->Retain());
2799}
2800
2801template<typename Derived>
2802Sema::OwningExprResult
2803TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
2804 return SemaRef.Owned(E->Retain());
2805}
2806
2807template<typename Derived>
2808Sema::OwningExprResult
2809TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
2810 return SemaRef.Owned(E->Retain());
2811}
2812
2813template<typename Derived>
2814Sema::OwningExprResult
2815TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
2816 return SemaRef.Owned(E->Retain());
2817}
2818
2819template<typename Derived>
2820Sema::OwningExprResult
2821TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
2822 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2823 if (SubExpr.isInvalid())
2824 return SemaRef.ExprError();
2825
2826 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
2827 return SemaRef.Owned(E->Retain());
2828
2829 return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
2830 E->getRParen());
2831}
2832
2833template<typename Derived>
2834Sema::OwningExprResult
2835TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
2836 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2837 if (SubExpr.isInvalid())
2838 return SemaRef.ExprError();
2839
2840 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
2841 return SemaRef.Owned(E->Retain());
2842
2843 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
2844 E->getOpcode(),
2845 move(SubExpr));
2846}
2847
2848template<typename Derived>
2849Sema::OwningExprResult
2850TreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
2851 if (E->isArgumentType()) {
2852 QualType T = getDerived().TransformType(E->getArgumentType());
2853 if (T.isNull())
2854 return SemaRef.ExprError();
2855
2856 if (!getDerived().AlwaysRebuild() && T == E->getArgumentType())
2857 return SemaRef.Owned(E->Retain());
2858
2859 return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(),
2860 E->isSizeOf(),
2861 E->getSourceRange());
2862 }
2863
2864 Sema::OwningExprResult SubExpr(SemaRef);
2865 {
2866 // C++0x [expr.sizeof]p1:
2867 // The operand is either an expression, which is an unevaluated operand
2868 // [...]
2869 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2870
2871 SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
2872 if (SubExpr.isInvalid())
2873 return SemaRef.ExprError();
2874
2875 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
2876 return SemaRef.Owned(E->Retain());
2877 }
2878
2879 return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
2880 E->isSizeOf(),
2881 E->getSourceRange());
2882}
2883
2884template<typename Derived>
2885Sema::OwningExprResult
2886TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
2887 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
2888 if (LHS.isInvalid())
2889 return SemaRef.ExprError();
2890
2891 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
2892 if (RHS.isInvalid())
2893 return SemaRef.ExprError();
2894
2895
2896 if (!getDerived().AlwaysRebuild() &&
2897 LHS.get() == E->getLHS() &&
2898 RHS.get() == E->getRHS())
2899 return SemaRef.Owned(E->Retain());
2900
2901 return getDerived().RebuildArraySubscriptExpr(move(LHS),
2902 /*FIXME:*/E->getLHS()->getLocStart(),
2903 move(RHS),
2904 E->getRBracketLoc());
2905}
2906
2907template<typename Derived>
2908Sema::OwningExprResult
2909TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
2910 // Transform the callee.
2911 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
2912 if (Callee.isInvalid())
2913 return SemaRef.ExprError();
2914
2915 // Transform arguments.
2916 bool ArgChanged = false;
2917 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
2918 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
2919 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
2920 OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
2921 if (Arg.isInvalid())
2922 return SemaRef.ExprError();
2923
2924 // FIXME: Wrong source location information for the ','.
2925 FakeCommaLocs.push_back(
2926 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
2927
2928 ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
2929 Args.push_back(Arg.takeAs<Expr>());
2930 }
2931
2932 if (!getDerived().AlwaysRebuild() &&
2933 Callee.get() == E->getCallee() &&
2934 !ArgChanged)
2935 return SemaRef.Owned(E->Retain());
2936
2937 // FIXME: Wrong source location information for the '('.
2938 SourceLocation FakeLParenLoc
2939 = ((Expr *)Callee.get())->getSourceRange().getBegin();
2940 return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
2941 move_arg(Args),
2942 FakeCommaLocs.data(),
2943 E->getRParenLoc());
2944}
2945
2946template<typename Derived>
2947Sema::OwningExprResult
2948TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
2949 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
2950 if (Base.isInvalid())
2951 return SemaRef.ExprError();
2952
2953 NamedDecl *Member
2954 = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
2955 if (!Member)
2956 return SemaRef.ExprError();
2957
2958 if (!getDerived().AlwaysRebuild() &&
2959 Base.get() == E->getBase() &&
2960 Member == E->getMemberDecl())
2961 return SemaRef.Owned(E->Retain());
2962
2963 // FIXME: Bogus source location for the operator
2964 SourceLocation FakeOperatorLoc
2965 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
2966
2967 return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
2968 E->isArrow(),
2969 E->getMemberLoc(),
2970 Member);
2971}
2972
2973template<typename Derived>
2974Sema::OwningExprResult
2975TreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
2976 assert(false && "Cannot transform abstract class");
2977 return SemaRef.Owned(E->Retain());
2978}
2979
2980template<typename Derived>
2981Sema::OwningExprResult
2982TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
2983 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
2984 if (LHS.isInvalid())
2985 return SemaRef.ExprError();
2986
2987 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
2988 if (RHS.isInvalid())
2989 return SemaRef.ExprError();
2990
2991 if (!getDerived().AlwaysRebuild() &&
2992 LHS.get() == E->getLHS() &&
2993 RHS.get() == E->getRHS())
2994 return SemaRef.Owned(E->Retain());
2995
2996 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
2997 move(LHS), move(RHS));
2998}
2999
3000template<typename Derived>
3001Sema::OwningExprResult
3002TreeTransform<Derived>::TransformCompoundAssignOperator(
3003 CompoundAssignOperator *E) {
3004 return getDerived().TransformBinaryOperator(E);
3005}
3006
3007template<typename Derived>
3008Sema::OwningExprResult
3009TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
3010 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3011 if (Cond.isInvalid())
3012 return SemaRef.ExprError();
3013
3014 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3015 if (LHS.isInvalid())
3016 return SemaRef.ExprError();
3017
3018 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3019 if (RHS.isInvalid())
3020 return SemaRef.ExprError();
3021
3022 if (!getDerived().AlwaysRebuild() &&
3023 Cond.get() == E->getCond() &&
3024 LHS.get() == E->getLHS() &&
3025 RHS.get() == E->getRHS())
3026 return SemaRef.Owned(E->Retain());
3027
3028 // FIXM: ? and : locations are broken.
3029 SourceLocation FakeQuestionLoc = E->getCond()->getLocEnd();
3030 SourceLocation FakeColonLoc = E->getFalseExpr()->getLocStart();
3031 return getDerived().RebuildConditionalOperator(move(Cond),
3032 FakeQuestionLoc,
3033 move(LHS),
3034 FakeColonLoc,
3035 move(RHS));
3036}
3037
3038template<typename Derived>
3039Sema::OwningExprResult
3040TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
3041 QualType T = getDerived().TransformType(E->getType());
3042 if (T.isNull())
3043 return SemaRef.ExprError();
3044
3045 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3046 if (SubExpr.isInvalid())
3047 return SemaRef.ExprError();
3048
3049 if (!getDerived().AlwaysRebuild() &&
3050 T == E->getType() &&
3051 SubExpr.get() == E->getSubExpr())
3052 return SemaRef.Owned(E->Retain());
3053
3054 return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
3055 move(SubExpr),
3056 E->isLvalueCast());
3057}
3058
3059template<typename Derived>
3060Sema::OwningExprResult
3061TreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
3062 assert(false && "Cannot transform abstract class");
3063 return SemaRef.Owned(E->Retain());
3064}
3065
3066template<typename Derived>
3067Sema::OwningExprResult
3068TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
3069 QualType T;
3070 {
3071 // FIXME: Source location isn't quite accurate.
3072 SourceLocation TypeStartLoc
3073 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3074 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
3075
3076 T = getDerived().TransformType(E->getTypeAsWritten());
3077 if (T.isNull())
3078 return SemaRef.ExprError();
3079 }
3080
3081 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3082 if (SubExpr.isInvalid())
3083 return SemaRef.ExprError();
3084
3085 if (!getDerived().AlwaysRebuild() &&
3086 T == E->getTypeAsWritten() &&
3087 SubExpr.get() == E->getSubExpr())
3088 return SemaRef.Owned(E->Retain());
3089
3090 return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
3091 E->getRParenLoc(),
3092 move(SubExpr));
3093}
3094
3095template<typename Derived>
3096Sema::OwningExprResult
3097TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
3098 QualType T;
3099 {
3100 // FIXME: Source location isn't quite accurate.
3101 SourceLocation FakeTypeLoc
3102 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3103 TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
3104
3105 T = getDerived().TransformType(E->getType());
3106 if (T.isNull())
3107 return SemaRef.ExprError();
3108 }
3109
3110 OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3111 if (Init.isInvalid())
3112 return SemaRef.ExprError();
3113
3114 if (!getDerived().AlwaysRebuild() &&
3115 T == E->getType() &&
3116 Init.get() == E->getInitializer())
3117 return SemaRef.Owned(E->Retain());
3118
3119 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3120 /*FIXME:*/E->getInitializer()->getLocEnd(),
3121 move(Init));
3122}
3123
3124template<typename Derived>
3125Sema::OwningExprResult
3126TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
3127 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3128 if (Base.isInvalid())
3129 return SemaRef.ExprError();
3130
3131 if (!getDerived().AlwaysRebuild() &&
3132 Base.get() == E->getBase())
3133 return SemaRef.Owned(E->Retain());
3134
3135 // FIXME: Bad source location
3136 SourceLocation FakeOperatorLoc
3137 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3138 return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3139 E->getAccessorLoc(),
3140 E->getAccessor());
3141}
3142
3143template<typename Derived>
3144Sema::OwningExprResult
3145TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
3146 bool InitChanged = false;
3147
3148 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3149 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3150 OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3151 if (Init.isInvalid())
3152 return SemaRef.ExprError();
3153
3154 InitChanged = InitChanged || Init.get() != E->getInit(I);
3155 Inits.push_back(Init.takeAs<Expr>());
3156 }
3157
3158 if (!getDerived().AlwaysRebuild() && !InitChanged)
3159 return SemaRef.Owned(E->Retain());
3160
3161 return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3162 E->getRBraceLoc());
3163}
3164
3165template<typename Derived>
3166Sema::OwningExprResult
3167TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
3168 Designation Desig;
3169
Douglas Gregor43959a92009-08-20 07:17:43 +00003170 // transform the initializer value
Douglas Gregorb98b1992009-08-11 05:31:07 +00003171 OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3172 if (Init.isInvalid())
3173 return SemaRef.ExprError();
3174
Douglas Gregor43959a92009-08-20 07:17:43 +00003175 // transform the designators.
Douglas Gregorb98b1992009-08-11 05:31:07 +00003176 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3177 bool ExprChanged = false;
3178 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3179 DEnd = E->designators_end();
3180 D != DEnd; ++D) {
3181 if (D->isFieldDesignator()) {
3182 Desig.AddDesignator(Designator::getField(D->getFieldName(),
3183 D->getDotLoc(),
3184 D->getFieldLoc()));
3185 continue;
3186 }
3187
3188 if (D->isArrayDesignator()) {
3189 OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3190 if (Index.isInvalid())
3191 return SemaRef.ExprError();
3192
3193 Desig.AddDesignator(Designator::getArray(Index.get(),
3194 D->getLBracketLoc()));
3195
3196 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3197 ArrayExprs.push_back(Index.release());
3198 continue;
3199 }
3200
3201 assert(D->isArrayRangeDesignator() && "New kind of designator?");
3202 OwningExprResult Start
3203 = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3204 if (Start.isInvalid())
3205 return SemaRef.ExprError();
3206
3207 OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3208 if (End.isInvalid())
3209 return SemaRef.ExprError();
3210
3211 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
3212 End.get(),
3213 D->getLBracketLoc(),
3214 D->getEllipsisLoc()));
3215
3216 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3217 End.get() != E->getArrayRangeEnd(*D);
3218
3219 ArrayExprs.push_back(Start.release());
3220 ArrayExprs.push_back(End.release());
3221 }
3222
3223 if (!getDerived().AlwaysRebuild() &&
3224 Init.get() == E->getInit() &&
3225 !ExprChanged)
3226 return SemaRef.Owned(E->Retain());
3227
3228 return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3229 E->getEqualOrColonLoc(),
3230 E->usesGNUSyntax(), move(Init));
3231}
3232
3233template<typename Derived>
3234Sema::OwningExprResult
3235TreeTransform<Derived>::TransformImplicitValueInitExpr(
3236 ImplicitValueInitExpr *E) {
3237 QualType T = getDerived().TransformType(E->getType());
3238 if (T.isNull())
3239 return SemaRef.ExprError();
3240
3241 if (!getDerived().AlwaysRebuild() &&
3242 T == E->getType())
3243 return SemaRef.Owned(E->Retain());
3244
3245 return getDerived().RebuildImplicitValueInitExpr(T);
3246}
3247
3248template<typename Derived>
3249Sema::OwningExprResult
3250TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
3251 // FIXME: Do we want the type as written?
3252 QualType T;
3253
3254 {
3255 // FIXME: Source location isn't quite accurate.
3256 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3257 T = getDerived().TransformType(E->getType());
3258 if (T.isNull())
3259 return SemaRef.ExprError();
3260 }
3261
3262 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3263 if (SubExpr.isInvalid())
3264 return SemaRef.ExprError();
3265
3266 if (!getDerived().AlwaysRebuild() &&
3267 T == E->getType() &&
3268 SubExpr.get() == E->getSubExpr())
3269 return SemaRef.Owned(E->Retain());
3270
3271 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
3272 T, E->getRParenLoc());
3273}
3274
3275template<typename Derived>
3276Sema::OwningExprResult
3277TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
3278 bool ArgumentChanged = false;
3279 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3280 for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
3281 OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
3282 if (Init.isInvalid())
3283 return SemaRef.ExprError();
3284
3285 ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
3286 Inits.push_back(Init.takeAs<Expr>());
3287 }
3288
3289 return getDerived().RebuildParenListExpr(E->getLParenLoc(),
3290 move_arg(Inits),
3291 E->getRParenLoc());
3292}
3293
3294/// \brief Transform an address-of-label expression.
3295///
3296/// By default, the transformation of an address-of-label expression always
3297/// rebuilds the expression, so that the label identifier can be resolved to
3298/// the corresponding label statement by semantic analysis.
3299template<typename Derived>
3300Sema::OwningExprResult
3301TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
3302 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
3303 E->getLabel());
3304}
3305
3306template<typename Derived>
3307Sema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
3308 OwningStmtResult SubStmt
3309 = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
3310 if (SubStmt.isInvalid())
3311 return SemaRef.ExprError();
3312
3313 if (!getDerived().AlwaysRebuild() &&
3314 SubStmt.get() == E->getSubStmt())
3315 return SemaRef.Owned(E->Retain());
3316
3317 return getDerived().RebuildStmtExpr(E->getLParenLoc(),
3318 move(SubStmt),
3319 E->getRParenLoc());
3320}
3321
3322template<typename Derived>
3323Sema::OwningExprResult
3324TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
3325 QualType T1, T2;
3326 {
3327 // FIXME: Source location isn't quite accurate.
3328 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3329
3330 T1 = getDerived().TransformType(E->getArgType1());
3331 if (T1.isNull())
3332 return SemaRef.ExprError();
3333
3334 T2 = getDerived().TransformType(E->getArgType2());
3335 if (T2.isNull())
3336 return SemaRef.ExprError();
3337 }
3338
3339 if (!getDerived().AlwaysRebuild() &&
3340 T1 == E->getArgType1() &&
3341 T2 == E->getArgType2())
3342 return SemaRef.Owned(E->Retain());
3343
3344 return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
3345 T1, T2, E->getRParenLoc());
3346}
3347
3348template<typename Derived>
3349Sema::OwningExprResult
3350TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
3351 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3352 if (Cond.isInvalid())
3353 return SemaRef.ExprError();
3354
3355 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3356 if (LHS.isInvalid())
3357 return SemaRef.ExprError();
3358
3359 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3360 if (RHS.isInvalid())
3361 return SemaRef.ExprError();
3362
3363 if (!getDerived().AlwaysRebuild() &&
3364 Cond.get() == E->getCond() &&
3365 LHS.get() == E->getLHS() &&
3366 RHS.get() == E->getRHS())
3367 return SemaRef.Owned(E->Retain());
3368
3369 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
3370 move(Cond), move(LHS), move(RHS),
3371 E->getRParenLoc());
3372}
3373
3374template<typename Derived>
3375Sema::OwningExprResult
3376TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
3377 return SemaRef.Owned(E->Retain());
3378}
3379
3380template<typename Derived>
3381Sema::OwningExprResult
3382TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
3383 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3384 if (Callee.isInvalid())
3385 return SemaRef.ExprError();
3386
3387 OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
3388 if (First.isInvalid())
3389 return SemaRef.ExprError();
3390
3391 OwningExprResult Second(SemaRef);
3392 if (E->getNumArgs() == 2) {
3393 Second = getDerived().TransformExpr(E->getArg(1));
3394 if (Second.isInvalid())
3395 return SemaRef.ExprError();
3396 }
3397
3398 if (!getDerived().AlwaysRebuild() &&
3399 Callee.get() == E->getCallee() &&
3400 First.get() == E->getArg(0) &&
3401 (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
3402 return SemaRef.Owned(E->Retain());
3403
3404 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
3405 E->getOperatorLoc(),
3406 move(Callee),
3407 move(First),
3408 move(Second));
3409}
3410
3411template<typename Derived>
3412Sema::OwningExprResult
3413TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
3414 return getDerived().TransformCallExpr(E);
3415}
3416
3417template<typename Derived>
3418Sema::OwningExprResult
3419TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
3420 QualType ExplicitTy;
3421 {
3422 // FIXME: Source location isn't quite accurate.
3423 SourceLocation TypeStartLoc
3424 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3425 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
3426
3427 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
3428 if (ExplicitTy.isNull())
3429 return SemaRef.ExprError();
3430 }
3431
3432 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3433 if (SubExpr.isInvalid())
3434 return SemaRef.ExprError();
3435
3436 if (!getDerived().AlwaysRebuild() &&
3437 ExplicitTy == E->getTypeAsWritten() &&
3438 SubExpr.get() == E->getSubExpr())
3439 return SemaRef.Owned(E->Retain());
3440
3441 // FIXME: Poor source location information here.
3442 SourceLocation FakeLAngleLoc
3443 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3444 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
3445 SourceLocation FakeRParenLoc
3446 = SemaRef.PP.getLocForEndOfToken(
3447 E->getSubExpr()->getSourceRange().getEnd());
3448 return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
3449 E->getStmtClass(),
3450 FakeLAngleLoc,
3451 ExplicitTy,
3452 FakeRAngleLoc,
3453 FakeRAngleLoc,
3454 move(SubExpr),
3455 FakeRParenLoc);
3456}
3457
3458template<typename Derived>
3459Sema::OwningExprResult
3460TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
3461 return getDerived().TransformCXXNamedCastExpr(E);
3462}
3463
3464template<typename Derived>
3465Sema::OwningExprResult
3466TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
3467 return getDerived().TransformCXXNamedCastExpr(E);
3468}
3469
3470template<typename Derived>
3471Sema::OwningExprResult
3472TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
3473 CXXReinterpretCastExpr *E) {
3474 return getDerived().TransformCXXNamedCastExpr(E);
3475}
3476
3477template<typename Derived>
3478Sema::OwningExprResult
3479TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
3480 return getDerived().TransformCXXNamedCastExpr(E);
3481}
3482
3483template<typename Derived>
3484Sema::OwningExprResult
3485TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
3486 CXXFunctionalCastExpr *E) {
3487 QualType ExplicitTy;
3488 {
3489 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3490
3491 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
3492 if (ExplicitTy.isNull())
3493 return SemaRef.ExprError();
3494 }
3495
3496 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3497 if (SubExpr.isInvalid())
3498 return SemaRef.ExprError();
3499
3500 if (!getDerived().AlwaysRebuild() &&
3501 ExplicitTy == E->getTypeAsWritten() &&
3502 SubExpr.get() == E->getSubExpr())
3503 return SemaRef.Owned(E->Retain());
3504
3505 // FIXME: The end of the type's source range is wrong
3506 return getDerived().RebuildCXXFunctionalCastExpr(
3507 /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
3508 ExplicitTy,
3509 /*FIXME:*/E->getSubExpr()->getLocStart(),
3510 move(SubExpr),
3511 E->getRParenLoc());
3512}
3513
3514template<typename Derived>
3515Sema::OwningExprResult
3516TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
3517 if (E->isTypeOperand()) {
3518 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
3519
3520 QualType T = getDerived().TransformType(E->getTypeOperand());
3521 if (T.isNull())
3522 return SemaRef.ExprError();
3523
3524 if (!getDerived().AlwaysRebuild() &&
3525 T == E->getTypeOperand())
3526 return SemaRef.Owned(E->Retain());
3527
3528 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
3529 /*FIXME:*/E->getLocStart(),
3530 T,
3531 E->getLocEnd());
3532 }
3533
3534 // We don't know whether the expression is potentially evaluated until
3535 // after we perform semantic analysis, so the expression is potentially
3536 // potentially evaluated.
3537 EnterExpressionEvaluationContext Unevaluated(SemaRef,
3538 Action::PotentiallyPotentiallyEvaluated);
3539
3540 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
3541 if (SubExpr.isInvalid())
3542 return SemaRef.ExprError();
3543
3544 if (!getDerived().AlwaysRebuild() &&
3545 SubExpr.get() == E->getExprOperand())
3546 return SemaRef.Owned(E->Retain());
3547
3548 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
3549 /*FIXME:*/E->getLocStart(),
3550 move(SubExpr),
3551 E->getLocEnd());
3552}
3553
3554template<typename Derived>
3555Sema::OwningExprResult
3556TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
3557 return SemaRef.Owned(E->Retain());
3558}
3559
3560template<typename Derived>
3561Sema::OwningExprResult
3562TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
3563 CXXNullPtrLiteralExpr *E) {
3564 return SemaRef.Owned(E->Retain());
3565}
3566
3567template<typename Derived>
3568Sema::OwningExprResult
3569TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
3570 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3571
3572 QualType T = getDerived().TransformType(E->getType());
3573 if (T.isNull())
3574 return SemaRef.ExprError();
3575
3576 if (!getDerived().AlwaysRebuild() &&
3577 T == E->getType())
3578 return SemaRef.Owned(E->Retain());
3579
3580 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
3581}
3582
3583template<typename Derived>
3584Sema::OwningExprResult
3585TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
3586 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3587 if (SubExpr.isInvalid())
3588 return SemaRef.ExprError();
3589
3590 if (!getDerived().AlwaysRebuild() &&
3591 SubExpr.get() == E->getSubExpr())
3592 return SemaRef.Owned(E->Retain());
3593
3594 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
3595}
3596
3597template<typename Derived>
3598Sema::OwningExprResult
3599TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
3600 ParmVarDecl *Param
3601 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
3602 if (!Param)
3603 return SemaRef.ExprError();
3604
3605 if (getDerived().AlwaysRebuild() &&
3606 Param == E->getParam())
3607 return SemaRef.Owned(E->Retain());
3608
3609 return getDerived().RebuildCXXDefaultArgExpr(Param);
3610}
3611
3612template<typename Derived>
3613Sema::OwningExprResult
3614TreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
3615 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3616
3617 QualType T = getDerived().TransformType(E->getType());
3618 if (T.isNull())
3619 return SemaRef.ExprError();
3620
3621 if (!getDerived().AlwaysRebuild() &&
3622 T == E->getType())
3623 return SemaRef.Owned(E->Retain());
3624
3625 return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
3626 /*FIXME:*/E->getTypeBeginLoc(),
3627 T,
3628 E->getRParenLoc());
3629}
3630
3631template<typename Derived>
3632Sema::OwningExprResult
3633TreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
3634 VarDecl *Var
Douglas Gregor43959a92009-08-20 07:17:43 +00003635 = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl()));
Douglas Gregorb98b1992009-08-11 05:31:07 +00003636 if (!Var)
3637 return SemaRef.ExprError();
3638
3639 if (!getDerived().AlwaysRebuild() &&
3640 Var == E->getVarDecl())
3641 return SemaRef.Owned(E->Retain());
3642
3643 return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
3644 /*FIXME:*/E->getStartLoc(),
3645 Var);
3646}
3647
3648template<typename Derived>
3649Sema::OwningExprResult
3650TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
3651 // Transform the type that we're allocating
3652 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3653 QualType AllocType = getDerived().TransformType(E->getAllocatedType());
3654 if (AllocType.isNull())
3655 return SemaRef.ExprError();
3656
3657 // Transform the size of the array we're allocating (if any).
3658 OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
3659 if (ArraySize.isInvalid())
3660 return SemaRef.ExprError();
3661
3662 // Transform the placement arguments (if any).
3663 bool ArgumentChanged = false;
3664 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
3665 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
3666 OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
3667 if (Arg.isInvalid())
3668 return SemaRef.ExprError();
3669
3670 ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
3671 PlacementArgs.push_back(Arg.take());
3672 }
3673
Douglas Gregor43959a92009-08-20 07:17:43 +00003674 // transform the constructor arguments (if any).
Douglas Gregorb98b1992009-08-11 05:31:07 +00003675 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
3676 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
3677 OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
3678 if (Arg.isInvalid())
3679 return SemaRef.ExprError();
3680
3681 ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
3682 ConstructorArgs.push_back(Arg.take());
3683 }
3684
3685 if (!getDerived().AlwaysRebuild() &&
3686 AllocType == E->getAllocatedType() &&
3687 ArraySize.get() == E->getArraySize() &&
3688 !ArgumentChanged)
3689 return SemaRef.Owned(E->Retain());
3690
3691 return getDerived().RebuildCXXNewExpr(E->getLocStart(),
3692 E->isGlobalNew(),
3693 /*FIXME:*/E->getLocStart(),
3694 move_arg(PlacementArgs),
3695 /*FIXME:*/E->getLocStart(),
3696 E->isParenTypeId(),
3697 AllocType,
3698 /*FIXME:*/E->getLocStart(),
3699 /*FIXME:*/SourceRange(),
3700 move(ArraySize),
3701 /*FIXME:*/E->getLocStart(),
3702 move_arg(ConstructorArgs),
3703 E->getLocEnd());
3704}
3705
3706template<typename Derived>
3707Sema::OwningExprResult
3708TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
3709 OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
3710 if (Operand.isInvalid())
3711 return SemaRef.ExprError();
3712
3713 if (!getDerived().AlwaysRebuild() &&
3714 Operand.get() == E->getArgument())
3715 return SemaRef.Owned(E->Retain());
3716
3717 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
3718 E->isGlobalDelete(),
3719 E->isArrayForm(),
3720 move(Operand));
3721}
3722
3723template<typename Derived>
3724Sema::OwningExprResult
3725TreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
3726 UnresolvedFunctionNameExpr *E) {
3727 // There is no transformation we can apply to an unresolved function name.
3728 return SemaRef.Owned(E->Retain());
3729}
3730
3731template<typename Derived>
3732Sema::OwningExprResult
3733TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
3734 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
3735
3736 QualType T = getDerived().TransformType(E->getQueriedType());
3737 if (T.isNull())
3738 return SemaRef.ExprError();
3739
3740 if (!getDerived().AlwaysRebuild() &&
3741 T == E->getQueriedType())
3742 return SemaRef.Owned(E->Retain());
3743
3744 // FIXME: Bad location information
3745 SourceLocation FakeLParenLoc
3746 = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
3747
3748 return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
3749 E->getLocStart(),
3750 /*FIXME:*/FakeLParenLoc,
3751 T,
3752 E->getLocEnd());
3753}
3754
3755template<typename Derived>
3756Sema::OwningExprResult
3757TreeTransform<Derived>::TransformQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
3758 NestedNameSpecifier *NNS
3759 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3760 E->getQualifierRange());
3761 if (!NNS)
3762 return SemaRef.ExprError();
3763
3764 NamedDecl *ND
3765 = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3766 if (!ND)
3767 return SemaRef.ExprError();
3768
3769 if (!getDerived().AlwaysRebuild() &&
3770 NNS == E->getQualifier() &&
3771 ND == E->getDecl())
3772 return SemaRef.Owned(E->Retain());
3773
3774 return getDerived().RebuildQualifiedDeclRefExpr(NNS,
3775 E->getQualifierRange(),
3776 ND,
3777 E->getLocation(),
3778 /*FIXME:*/false);
3779}
3780
3781template<typename Derived>
3782Sema::OwningExprResult
3783TreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
3784 UnresolvedDeclRefExpr *E) {
3785 NestedNameSpecifier *NNS
3786 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3787 E->getQualifierRange());
3788 if (!NNS)
3789 return SemaRef.ExprError();
3790
3791 // FIXME: Transform the declaration name
3792 DeclarationName Name = E->getDeclName();
3793
3794 if (!getDerived().AlwaysRebuild() &&
3795 NNS == E->getQualifier() &&
3796 Name == E->getDeclName())
3797 return SemaRef.Owned(E->Retain());
3798
3799 return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
3800 E->getQualifierRange(),
3801 Name,
3802 E->getLocation(),
3803 /*FIXME:*/false);
3804}
3805
3806template<typename Derived>
3807Sema::OwningExprResult
3808TreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) {
3809 TemplateName Template
3810 = getDerived().TransformTemplateName(E->getTemplateName());
3811 if (Template.isNull())
3812 return SemaRef.ExprError();
3813
3814 llvm::SmallVector<TemplateArgument, 4> TransArgs;
3815 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3816 TemplateArgument TransArg
3817 = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
3818 if (TransArg.isNull())
3819 return SemaRef.ExprError();
3820
3821 TransArgs.push_back(TransArg);
3822 }
3823
3824 // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
3825 // compare template arguments (yet).
3826
3827 // FIXME: It's possible that we'll find out now that the template name
3828 // actually refers to a type, in which case the caller is actually dealing
3829 // with a functional cast. Give a reasonable error message!
3830 return getDerived().RebuildTemplateIdExpr(Template, E->getTemplateNameLoc(),
3831 E->getLAngleLoc(),
3832 TransArgs.data(),
3833 TransArgs.size(),
3834 E->getRAngleLoc());
3835}
3836
3837template<typename Derived>
3838Sema::OwningExprResult
3839TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
3840 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
3841
3842 QualType T = getDerived().TransformType(E->getType());
3843 if (T.isNull())
3844 return SemaRef.ExprError();
3845
3846 CXXConstructorDecl *Constructor
3847 = cast_or_null<CXXConstructorDecl>(
3848 getDerived().TransformDecl(E->getConstructor()));
3849 if (!Constructor)
3850 return SemaRef.ExprError();
3851
3852 bool ArgumentChanged = false;
3853 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3854 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
3855 ArgEnd = E->arg_end();
3856 Arg != ArgEnd; ++Arg) {
3857 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
3858 if (TransArg.isInvalid())
3859 return SemaRef.ExprError();
3860
3861 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
3862 Args.push_back(TransArg.takeAs<Expr>());
3863 }
3864
3865 if (!getDerived().AlwaysRebuild() &&
3866 T == E->getType() &&
3867 Constructor == E->getConstructor() &&
3868 !ArgumentChanged)
3869 return SemaRef.Owned(E->Retain());
3870
3871 return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
3872 move_arg(Args));
3873}
3874
3875/// \brief Transform a C++ temporary-binding expression.
3876///
3877/// The transformation of a temporary-binding expression always attempts to
3878/// bind a new temporary variable to its subexpression, even if the
3879/// subexpression itself did not change, because the temporary variable itself
3880/// must be unique.
3881template<typename Derived>
3882Sema::OwningExprResult
3883TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
3884 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3885 if (SubExpr.isInvalid())
3886 return SemaRef.ExprError();
3887
3888 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
3889}
3890
3891/// \brief Transform a C++ expression that contains temporaries that should
3892/// be destroyed after the expression is evaluated.
3893///
3894/// The transformation of a full expression always attempts to build a new
3895/// CXXExprWithTemporaries expression, even if the
3896/// subexpression itself did not change, because it will need to capture the
3897/// the new temporary variables introduced in the subexpression.
3898template<typename Derived>
3899Sema::OwningExprResult
3900TreeTransform<Derived>::TransformCXXExprWithTemporaries(
3901 CXXExprWithTemporaries *E) {
3902 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3903 if (SubExpr.isInvalid())
3904 return SemaRef.ExprError();
3905
3906 return SemaRef.Owned(
3907 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
3908 E->shouldDestroyTemporaries()));
3909}
3910
3911template<typename Derived>
3912Sema::OwningExprResult
3913TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
3914 CXXTemporaryObjectExpr *E) {
3915 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3916 QualType T = getDerived().TransformType(E->getType());
3917 if (T.isNull())
3918 return SemaRef.ExprError();
3919
3920 CXXConstructorDecl *Constructor
3921 = cast_or_null<CXXConstructorDecl>(
3922 getDerived().TransformDecl(E->getConstructor()));
3923 if (!Constructor)
3924 return SemaRef.ExprError();
3925
3926 bool ArgumentChanged = false;
3927 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3928 Args.reserve(E->getNumArgs());
3929 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
3930 ArgEnd = E->arg_end();
3931 Arg != ArgEnd; ++Arg) {
3932 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
3933 if (TransArg.isInvalid())
3934 return SemaRef.ExprError();
3935
3936 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
3937 Args.push_back((Expr *)TransArg.release());
3938 }
3939
3940 if (!getDerived().AlwaysRebuild() &&
3941 T == E->getType() &&
3942 Constructor == E->getConstructor() &&
3943 !ArgumentChanged)
3944 return SemaRef.Owned(E->Retain());
3945
3946 // FIXME: Bogus location information
3947 SourceLocation CommaLoc;
3948 if (Args.size() > 1) {
3949 Expr *First = (Expr *)Args[0];
3950 CommaLoc
3951 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
3952 }
3953 return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
3954 T,
3955 /*FIXME:*/E->getTypeBeginLoc(),
3956 move_arg(Args),
3957 &CommaLoc,
3958 E->getLocEnd());
3959}
3960
3961template<typename Derived>
3962Sema::OwningExprResult
3963TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
3964 CXXUnresolvedConstructExpr *E) {
3965 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3966 QualType T = getDerived().TransformType(E->getTypeAsWritten());
3967 if (T.isNull())
3968 return SemaRef.ExprError();
3969
3970 bool ArgumentChanged = false;
3971 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3972 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
3973 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
3974 ArgEnd = E->arg_end();
3975 Arg != ArgEnd; ++Arg) {
3976 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
3977 if (TransArg.isInvalid())
3978 return SemaRef.ExprError();
3979
3980 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
3981 FakeCommaLocs.push_back(
3982 SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
3983 Args.push_back(TransArg.takeAs<Expr>());
3984 }
3985
3986 if (!getDerived().AlwaysRebuild() &&
3987 T == E->getTypeAsWritten() &&
3988 !ArgumentChanged)
3989 return SemaRef.Owned(E->Retain());
3990
3991 // FIXME: we're faking the locations of the commas
3992 return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
3993 T,
3994 E->getLParenLoc(),
3995 move_arg(Args),
3996 FakeCommaLocs.data(),
3997 E->getRParenLoc());
3998}
3999
4000template<typename Derived>
4001Sema::OwningExprResult
4002TreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
4003 CXXUnresolvedMemberExpr *E) {
4004 // Transform the base of the expression.
4005 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4006 if (Base.isInvalid())
4007 return SemaRef.ExprError();
4008
4009 // FIXME: Transform the declaration name
4010 DeclarationName Name = E->getMember();
4011
4012 if (!getDerived().AlwaysRebuild() &&
4013 Base.get() == E->getBase() &&
4014 Name == E->getMember())
4015 return SemaRef.Owned(E->Retain());
4016
4017 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4018 E->isArrow(),
4019 E->getOperatorLoc(),
4020 E->getMember(),
4021 E->getMemberLoc());
4022}
4023
4024template<typename Derived>
4025Sema::OwningExprResult
4026TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
4027 return SemaRef.Owned(E->Retain());
4028}
4029
4030template<typename Derived>
4031Sema::OwningExprResult
4032TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
4033 // FIXME: poor source location
4034 TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
4035 QualType EncodedType = getDerived().TransformType(E->getEncodedType());
4036 if (EncodedType.isNull())
4037 return SemaRef.ExprError();
4038
4039 if (!getDerived().AlwaysRebuild() &&
4040 EncodedType == E->getEncodedType())
4041 return SemaRef.Owned(E->Retain());
4042
4043 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
4044 EncodedType,
4045 E->getRParenLoc());
4046}
4047
4048template<typename Derived>
4049Sema::OwningExprResult
4050TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
4051 // FIXME: Implement this!
4052 assert(false && "Cannot transform Objective-C expressions yet");
4053 return SemaRef.Owned(E->Retain());
4054}
4055
4056template<typename Derived>
4057Sema::OwningExprResult
4058TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
4059 return SemaRef.Owned(E->Retain());
4060}
4061
4062template<typename Derived>
4063Sema::OwningExprResult
4064TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
4065 ObjCProtocolDecl *Protocol
4066 = cast_or_null<ObjCProtocolDecl>(
4067 getDerived().TransformDecl(E->getProtocol()));
4068 if (!Protocol)
4069 return SemaRef.ExprError();
4070
4071 if (!getDerived().AlwaysRebuild() &&
4072 Protocol == E->getProtocol())
4073 return SemaRef.Owned(E->Retain());
4074
4075 return getDerived().RebuildObjCProtocolExpr(Protocol,
4076 E->getAtLoc(),
4077 /*FIXME:*/E->getAtLoc(),
4078 /*FIXME:*/E->getAtLoc(),
4079 E->getRParenLoc());
4080
4081}
4082
4083template<typename Derived>
4084Sema::OwningExprResult
4085TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
4086 // FIXME: Implement this!
4087 assert(false && "Cannot transform Objective-C expressions yet");
4088 return SemaRef.Owned(E->Retain());
4089}
4090
4091template<typename Derived>
4092Sema::OwningExprResult
4093TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
4094 // FIXME: Implement this!
4095 assert(false && "Cannot transform Objective-C expressions yet");
4096 return SemaRef.Owned(E->Retain());
4097}
4098
4099template<typename Derived>
4100Sema::OwningExprResult
Fariborz Jahanian09105f52009-08-20 17:02:02 +00004101TreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
4102 ObjCImplicitSetterGetterRefExpr *E) {
Douglas Gregorb98b1992009-08-11 05:31:07 +00004103 // FIXME: Implement this!
4104 assert(false && "Cannot transform Objective-C expressions yet");
4105 return SemaRef.Owned(E->Retain());
4106}
4107
4108template<typename Derived>
4109Sema::OwningExprResult
4110TreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
4111 // FIXME: Implement this!
4112 assert(false && "Cannot transform Objective-C expressions yet");
4113 return SemaRef.Owned(E->Retain());
4114}
4115
4116template<typename Derived>
4117Sema::OwningExprResult
4118TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
4119 // FIXME: Implement this!
4120 assert(false && "Cannot transform Objective-C expressions yet");
4121 return SemaRef.Owned(E->Retain());
4122}
4123
4124template<typename Derived>
4125Sema::OwningExprResult
4126TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
4127 bool ArgumentChanged = false;
4128 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
4129 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
4130 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
4131 if (SubExpr.isInvalid())
4132 return SemaRef.ExprError();
4133
4134 ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
4135 SubExprs.push_back(SubExpr.takeAs<Expr>());
4136 }
4137
4138 if (!getDerived().AlwaysRebuild() &&
4139 !ArgumentChanged)
4140 return SemaRef.Owned(E->Retain());
4141
4142 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
4143 move_arg(SubExprs),
4144 E->getRParenLoc());
4145}
4146
4147template<typename Derived>
4148Sema::OwningExprResult
4149TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
4150 // FIXME: Implement this!
4151 assert(false && "Cannot transform block expressions yet");
4152 return SemaRef.Owned(E->Retain());
4153}
4154
4155template<typename Derived>
4156Sema::OwningExprResult
4157TreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
4158 // FIXME: Implement this!
4159 assert(false && "Cannot transform block-related expressions yet");
4160 return SemaRef.Owned(E->Retain());
4161}
4162
4163//===----------------------------------------------------------------------===//
Douglas Gregor577f75a2009-08-04 16:50:30 +00004164// Type reconstruction
4165//===----------------------------------------------------------------------===//
4166
4167template<typename Derived>
4168QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) {
4169 return SemaRef.BuildPointerType(PointeeType, 0,
4170 getDerived().getBaseLocation(),
4171 getDerived().getBaseEntity());
4172}
4173
4174template<typename Derived>
4175QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) {
4176 return SemaRef.BuildBlockPointerType(PointeeType, 0,
4177 getDerived().getBaseLocation(),
4178 getDerived().getBaseEntity());
4179}
4180
4181template<typename Derived>
4182QualType
4183TreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) {
4184 return SemaRef.BuildReferenceType(ReferentType, true, 0,
4185 getDerived().getBaseLocation(),
4186 getDerived().getBaseEntity());
4187}
4188
4189template<typename Derived>
4190QualType
4191TreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) {
4192 return SemaRef.BuildReferenceType(ReferentType, false, 0,
4193 getDerived().getBaseLocation(),
4194 getDerived().getBaseEntity());
4195}
4196
4197template<typename Derived>
4198QualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
4199 QualType ClassType) {
4200 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 0,
4201 getDerived().getBaseLocation(),
4202 getDerived().getBaseEntity());
4203}
4204
4205template<typename Derived>
4206QualType
4207TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
4208 ArrayType::ArraySizeModifier SizeMod,
4209 const llvm::APInt *Size,
4210 Expr *SizeExpr,
4211 unsigned IndexTypeQuals,
4212 SourceRange BracketsRange) {
4213 if (SizeExpr || !Size)
4214 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
4215 IndexTypeQuals, BracketsRange,
4216 getDerived().getBaseEntity());
4217
4218 QualType Types[] = {
4219 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
4220 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
4221 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
4222 };
4223 const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
4224 QualType SizeType;
4225 for (unsigned I = 0; I != NumTypes; ++I)
4226 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
4227 SizeType = Types[I];
4228 break;
4229 }
4230
4231 if (SizeType.isNull())
4232 SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
4233
4234 IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
4235 return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
4236 IndexTypeQuals, BracketsRange,
4237 getDerived().getBaseEntity());
4238}
4239
4240template<typename Derived>
4241QualType
4242TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
4243 ArrayType::ArraySizeModifier SizeMod,
4244 const llvm::APInt &Size,
4245 unsigned IndexTypeQuals) {
4246 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
4247 IndexTypeQuals, SourceRange());
4248}
4249
4250template<typename Derived>
4251QualType
4252TreeTransform<Derived>::RebuildConstantArrayWithExprType(QualType ElementType,
4253 ArrayType::ArraySizeModifier SizeMod,
4254 const llvm::APInt &Size,
4255 Expr *SizeExpr,
4256 unsigned IndexTypeQuals,
4257 SourceRange BracketsRange) {
4258 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
4259 IndexTypeQuals, BracketsRange);
4260}
4261
4262template<typename Derived>
4263QualType
4264TreeTransform<Derived>::RebuildConstantArrayWithoutExprType(
4265 QualType ElementType,
4266 ArrayType::ArraySizeModifier SizeMod,
4267 const llvm::APInt &Size,
4268 unsigned IndexTypeQuals) {
4269 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
4270 IndexTypeQuals, SourceRange());
4271}
4272
4273template<typename Derived>
4274QualType
4275TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
4276 ArrayType::ArraySizeModifier SizeMod,
4277 unsigned IndexTypeQuals) {
4278 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
4279 IndexTypeQuals, SourceRange());
4280}
4281
4282template<typename Derived>
4283QualType
4284TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
4285 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregorb98b1992009-08-11 05:31:07 +00004286 ExprArg SizeExpr,
Douglas Gregor577f75a2009-08-04 16:50:30 +00004287 unsigned IndexTypeQuals,
4288 SourceRange BracketsRange) {
4289 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
4290 SizeExpr.takeAs<Expr>(),
4291 IndexTypeQuals, BracketsRange);
4292}
4293
4294template<typename Derived>
4295QualType
4296TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
4297 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregorb98b1992009-08-11 05:31:07 +00004298 ExprArg SizeExpr,
Douglas Gregor577f75a2009-08-04 16:50:30 +00004299 unsigned IndexTypeQuals,
4300 SourceRange BracketsRange) {
4301 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
4302 SizeExpr.takeAs<Expr>(),
4303 IndexTypeQuals, BracketsRange);
4304}
4305
4306template<typename Derived>
4307QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
4308 unsigned NumElements) {
4309 // FIXME: semantic checking!
4310 return SemaRef.Context.getVectorType(ElementType, NumElements);
4311}
4312
4313template<typename Derived>
4314QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
4315 unsigned NumElements,
4316 SourceLocation AttributeLoc) {
4317 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
4318 NumElements, true);
4319 IntegerLiteral *VectorSize
4320 = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
4321 AttributeLoc);
4322 return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
4323 AttributeLoc);
4324}
4325
4326template<typename Derived>
4327QualType
4328TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
Douglas Gregorb98b1992009-08-11 05:31:07 +00004329 ExprArg SizeExpr,
Douglas Gregor577f75a2009-08-04 16:50:30 +00004330 SourceLocation AttributeLoc) {
4331 return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
4332}
4333
4334template<typename Derived>
4335QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
4336 QualType *ParamTypes,
4337 unsigned NumParamTypes,
4338 bool Variadic,
4339 unsigned Quals) {
4340 return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
4341 Quals,
4342 getDerived().getBaseLocation(),
4343 getDerived().getBaseEntity());
4344}
4345
4346template<typename Derived>
Douglas Gregorb98b1992009-08-11 05:31:07 +00004347QualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
Douglas Gregor577f75a2009-08-04 16:50:30 +00004348 return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
4349}
4350
4351template<typename Derived>
4352QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
4353 return SemaRef.Context.getTypeOfType(Underlying);
4354}
4355
4356template<typename Derived>
Douglas Gregorb98b1992009-08-11 05:31:07 +00004357QualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
Douglas Gregor577f75a2009-08-04 16:50:30 +00004358 return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
4359}
4360
4361template<typename Derived>
4362QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
4363 TemplateName Template,
4364 const TemplateArgument *Args,
4365 unsigned NumArgs) {
4366 // FIXME: Missing source locations for the template name, <, >.
4367 return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(),
4368 SourceLocation(), Args, NumArgs,
4369 SourceLocation());
4370}
4371
Douglas Gregordcee1a12009-08-06 05:28:30 +00004372template<typename Derived>
4373NestedNameSpecifier *
4374TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4375 SourceRange Range,
4376 IdentifierInfo &II) {
4377 CXXScopeSpec SS;
4378 // FIXME: The source location information is all wrong.
4379 SS.setRange(Range);
4380 SS.setScopeRep(Prefix);
4381 return static_cast<NestedNameSpecifier *>(
4382 SemaRef.ActOnCXXNestedNameSpecifier(0, SS, Range.getEnd(),
4383 Range.getEnd(), II));
4384}
4385
4386template<typename Derived>
4387NestedNameSpecifier *
4388TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4389 SourceRange Range,
4390 NamespaceDecl *NS) {
4391 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
4392}
4393
4394template<typename Derived>
4395NestedNameSpecifier *
4396TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4397 SourceRange Range,
4398 bool TemplateKW,
4399 QualType T) {
4400 if (T->isDependentType() || T->isRecordType() ||
4401 (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
4402 assert(T.getCVRQualifiers() == 0 && "Can't get cv-qualifiers here");
4403 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
4404 T.getTypePtr());
4405 }
4406
4407 SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
4408 return 0;
4409}
4410
Douglas Gregord1067e52009-08-06 06:41:21 +00004411template<typename Derived>
4412TemplateName
4413TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4414 bool TemplateKW,
4415 TemplateDecl *Template) {
4416 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
4417 Template);
4418}
4419
4420template<typename Derived>
4421TemplateName
4422TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4423 bool TemplateKW,
4424 OverloadedFunctionDecl *Ovl) {
4425 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
4426}
4427
4428template<typename Derived>
4429TemplateName
4430TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4431 const IdentifierInfo &II) {
4432 if (Qualifier->isDependent())
4433 return SemaRef.Context.getDependentTemplateName(Qualifier, &II);
4434
4435 // Somewhat redundant with ActOnDependentTemplateName.
4436 CXXScopeSpec SS;
4437 SS.setRange(SourceRange(getDerived().getBaseLocation()));
4438 SS.setScopeRep(Qualifier);
4439 Sema::TemplateTy Template;
4440 TemplateNameKind TNK = SemaRef.isTemplateName(II, 0, Template, &SS);
4441 if (TNK == TNK_Non_template) {
4442 SemaRef.Diag(getDerived().getBaseLocation(),
4443 diag::err_template_kw_refers_to_non_template)
4444 << &II;
4445 return TemplateName();
4446 } else if (TNK == TNK_Function_template) {
4447 SemaRef.Diag(getDerived().getBaseLocation(),
4448 diag::err_template_kw_refers_to_non_template)
4449 << &II;
4450 return TemplateName();
4451 }
4452
4453 return Template.getAsVal<TemplateName>();
4454}
Douglas Gregorb98b1992009-08-11 05:31:07 +00004455
4456template<typename Derived>
4457Sema::OwningExprResult
4458TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
4459 SourceLocation OpLoc,
4460 ExprArg Callee,
4461 ExprArg First,
4462 ExprArg Second) {
4463 Expr *FirstExpr = (Expr *)First.get();
4464 Expr *SecondExpr = (Expr *)Second.get();
4465 bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
4466
4467 // Determine whether this should be a builtin operation.
4468 if (SecondExpr == 0 || isPostIncDec) {
4469 if (!FirstExpr->getType()->isOverloadableType()) {
4470 // The argument is not of overloadable type, so try to create a
4471 // built-in unary operation.
4472 UnaryOperator::Opcode Opc
4473 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
4474
4475 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
4476 }
4477 } else {
4478 if (!FirstExpr->getType()->isOverloadableType() &&
4479 !SecondExpr->getType()->isOverloadableType()) {
4480 // Neither of the arguments is an overloadable type, so try to
4481 // create a built-in binary operation.
4482 BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
4483 OwningExprResult Result
4484 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
4485 if (Result.isInvalid())
4486 return SemaRef.ExprError();
4487
4488 First.release();
4489 Second.release();
4490 return move(Result);
4491 }
4492 }
4493
4494 // Compute the transformed set of functions (and function templates) to be
4495 // used during overload resolution.
4496 Sema::FunctionSet Functions;
4497
4498 DeclRefExpr *DRE = cast<DeclRefExpr>((Expr *)Callee.get());
4499 OverloadedFunctionDecl *Overloads
4500 = cast<OverloadedFunctionDecl>(DRE->getDecl());
4501
4502 // FIXME: Do we have to check
4503 // IsAcceptableNonMemberOperatorCandidate for each of these?
4504 for (OverloadedFunctionDecl::function_iterator
4505 F = Overloads->function_begin(),
4506 FEnd = Overloads->function_end();
4507 F != FEnd; ++F)
4508 Functions.insert(*F);
4509
4510 // Add any functions found via argument-dependent lookup.
4511 Expr *Args[2] = { FirstExpr, SecondExpr };
4512 unsigned NumArgs = 1 + (SecondExpr != 0);
4513 DeclarationName OpName
4514 = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
4515 SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions);
4516
4517 // Create the overloaded operator invocation for unary operators.
4518 if (NumArgs == 1 || isPostIncDec) {
4519 UnaryOperator::Opcode Opc
4520 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
4521 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
4522 }
4523
4524 // Create the overloaded operator invocation for binary operators.
4525 BinaryOperator::Opcode Opc =
4526 BinaryOperator::getOverloadedOpcode(Op);
4527 OwningExprResult Result
4528 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
4529 if (Result.isInvalid())
4530 return SemaRef.ExprError();
4531
4532 First.release();
4533 Second.release();
4534 return move(Result);
4535}
Douglas Gregord1067e52009-08-06 06:41:21 +00004536
Douglas Gregor577f75a2009-08-04 16:50:30 +00004537} // end namespace clang
4538
4539#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H