blob: 51db2167d9e02a6488b0c2ca4c6165f9e0e2d845 [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"
21#include "clang/Parse/Ownership.h"
22#include "clang/Parse/Designator.h"
23#include "clang/Lex/Preprocessor.h"
Douglas Gregor577f75a2009-08-04 16:50:30 +000024#include <algorithm>
25
26namespace clang {
27
28/// \brief A semantic tree transformation that allows one to transform one
29/// abstract syntax tree into another.
30///
31/// A new tree transformation is defined by creating a new subclass \c X of
32/// \c TreeTransform<X> and then overriding certain operations to provide
33/// behavior specific to that transformation. For example, template
34/// instantiation is implemented as a tree transformation where the
35/// transformation of TemplateTypeParmType nodes involves substituting the
36/// template arguments for their corresponding template parameters; a similar
37/// transformation is performed for non-type template parameters and
38/// template template parameters.
39///
40/// This tree-transformation template uses static polymorphism to allow
41/// subclasses to customize any of its operations. Thus, a subclass can
42/// override any of the transformation or rebuild operators by providing an
43/// operation with the same signature as the default implementation. The
44/// overridding function should not be virtual.
45///
46/// Semantic tree transformations are split into two stages, either of which
47/// can be replaced by a subclass. The "transform" step transforms an AST node
48/// or the parts of an AST node using the various transformation functions,
49/// then passes the pieces on to the "rebuild" step, which constructs a new AST
50/// node of the appropriate kind from the pieces. The default transformation
51/// routines recursively transform the operands to composite AST nodes (e.g.,
52/// the pointee type of a PointerType node) and, if any of those operand nodes
53/// were changed by the transformation, invokes the rebuild operation to create
54/// a new AST node.
55///
56/// Subclasses can customize the transformation at various levels. The
Douglas Gregor670444e2009-08-04 22:27:00 +000057/// most coarse-grained transformations involve replacing TransformType(),
Douglas Gregor577f75a2009-08-04 16:50:30 +000058/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
59/// TransformTemplateName(), or TransformTemplateArgument() with entirely
60/// new implementations.
61///
62/// For more fine-grained transformations, subclasses can replace any of the
63/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
64/// PointerType) to alter the transformation. As mentioned previously,
65/// replacing TransformTemplateTypeParmType() allows template instantiation
66/// to substitute template arguments for their corresponding template
67/// parameters. Additionally, subclasses can override the \c RebuildXXX
68/// functions to control how AST nodes are rebuilt when their operands change.
69/// By default, \c TreeTransform will invoke semantic analysis to rebuild
70/// AST nodes. However, certain other tree transformations (e.g, cloning) may
71/// be able to use more efficient rebuild steps.
72///
73/// There are a handful of other functions that can be overridden, allowing one
74/// to avoid traversing nodes that don't need any transformation
75/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
76/// operands have not changed (\c AlwaysRebuild()), and customize the
77/// default locations and entity names used for type-checking
78/// (\c getBaseLocation(), \c getBaseEntity()).
79///
80/// FIXME: In the future, TreeTransform will support transformation of
81/// statements and expressions as well as types.
82template<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;
93
Douglas Gregor577f75a2009-08-04 16:50:30 +000094 /// \brief Initializes a new tree transformer.
95 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
96
97 /// \brief Retrieves a reference to the derived class.
98 Derived &getDerived() { return static_cast<Derived&>(*this); }
99
100 /// \brief Retrieves a reference to the derived class.
101 const Derived &getDerived() const {
102 return static_cast<const Derived&>(*this);
103 }
104
105 /// \brief Retrieves a reference to the semantic analysis object used for
106 /// this tree transform.
107 Sema &getSema() const { return SemaRef; }
108
109 /// \brief Whether the transformation should always rebuild AST nodes, even
110 /// if none of the children have changed.
111 ///
112 /// Subclasses may override this function to specify when the transformation
113 /// should rebuild all AST nodes.
114 bool AlwaysRebuild() { return false; }
115
116 /// \brief Returns the location of the entity being transformed, if that
117 /// information was not available elsewhere in the AST.
118 ///
119 /// By default, returns no source-location information. Subclasses can
120 /// provide an alternative implementation that provides better location
121 /// information.
122 SourceLocation getBaseLocation() { return SourceLocation(); }
123
124 /// \brief Returns the name of the entity being transformed, if that
125 /// information was not available elsewhere in the AST.
126 ///
127 /// By default, returns an empty name. Subclasses can provide an alternative
128 /// implementation with a more precise name.
129 DeclarationName getBaseEntity() { return DeclarationName(); }
130
Douglas Gregorb98b1992009-08-11 05:31:07 +0000131 /// \brief Sets the "base" location and entity when that
132 /// information is known based on another transformation.
133 ///
134 /// By default, the source location and entity are ignored. Subclasses can
135 /// override this function to provide a customized implementation.
136 void setBase(SourceLocation Loc, DeclarationName Entity) { }
137
138 /// \brief RAII object that temporarily sets the base location and entity
139 /// used for reporting diagnostics in types.
140 class TemporaryBase {
141 TreeTransform &Self;
142 SourceLocation OldLocation;
143 DeclarationName OldEntity;
144
145 public:
146 TemporaryBase(TreeTransform &Self, SourceLocation Location,
147 DeclarationName Entity) : Self(Self)
148 {
149 OldLocation = Self.getDerived().getBaseLocation();
150 OldEntity = Self.getDerived().getBaseEntity();
151 Self.getDerived().setBase(Location, Entity);
152 }
153
154 ~TemporaryBase() {
155 Self.getDerived().setBase(OldLocation, OldEntity);
156 }
157 };
158
Douglas Gregor577f75a2009-08-04 16:50:30 +0000159 /// \brief Determine whether the given type \p T has already been
160 /// transformed.
161 ///
162 /// Subclasses can provide an alternative implementation of this routine
163 /// to short-circuit evaluation when it is known that a given type will
164 /// not change. For example, template instantiation need not traverse
165 /// non-dependent types.
166 bool AlreadyTransformed(QualType T) {
167 return T.isNull();
168 }
169
170 /// \brief Transforms the given type into another type.
171 ///
172 /// By default, this routine transforms a type by delegating to the
173 /// appropriate TransformXXXType to build a new type, then applying
174 /// the qualifiers on \p T to the resulting type with AddTypeQualifiers.
175 /// Subclasses may override this function (to take over all type
176 /// transformations), some set of the TransformXXXType functions, or
177 /// the AddTypeQualifiers function to alter the transformation.
178 ///
179 /// \returns the transformed type.
180 QualType TransformType(QualType T);
181
182 /// \brief Transform the given type by adding the given set of qualifiers
183 /// and returning the result.
184 ///
185 /// FIXME: By default, this routine adds type qualifiers only to types that
186 /// can have qualifiers, and silently suppresses those qualifiers that are
187 /// not permitted (e.g., qualifiers on reference or function types). This
188 /// is the right thing for template instantiation, but probably not for
189 /// other clients.
190 QualType AddTypeQualifiers(QualType T, unsigned CVRQualifiers);
191
Douglas Gregor657c1ac2009-08-06 22:17:10 +0000192 /// \brief Transform the given statement.
Douglas Gregor577f75a2009-08-04 16:50:30 +0000193 ///
194 /// FIXME: At the moment, subclasses must override this.
Douglas Gregorb98b1992009-08-11 05:31:07 +0000195 OwningStmtResult TransformStmt(Stmt *S);
Douglas Gregor657c1ac2009-08-06 22:17:10 +0000196
197 /// \brief Transform the given expression.
198 ///
Douglas Gregorb98b1992009-08-11 05:31:07 +0000199 /// By default, this routine transforms an expression by delegating to the
200 /// appropriate TransformXXXExpr function to build a new expression.
201 /// Subclasses may override this function to transform expressions using some
202 /// other mechanism.
203 ///
204 /// \returns the transformed expression.
205 OwningExprResult TransformExpr(Expr *E) {
206 return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false);
207 }
208
209 /// \brief Transform the given expression.
210 ///
211 /// By default, this routine transforms an expression by delegating to the
212 /// appropriate TransformXXXExpr function to build a new expression.
213 /// Subclasses may override this function to transform expressions using some
214 /// other mechanism.
215 ///
216 /// \returns the transformed expression.
217 OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand);
Douglas Gregor577f75a2009-08-04 16:50:30 +0000218
219 /// \brief Transform the given declaration, which is referenced from a type
220 /// or expression.
221 ///
Douglas Gregordcee1a12009-08-06 05:28:30 +0000222 /// By default, acts as the identity function on declarations. Subclasses
223 /// may override this function to provide alternate behavior.
224 Decl *TransformDecl(Decl *D) { return D; }
Douglas Gregor577f75a2009-08-04 16:50:30 +0000225
226 /// \brief Transform the given nested-name-specifier.
227 ///
Douglas Gregordcee1a12009-08-06 05:28:30 +0000228 /// By default, transforms all of the types and declarations within the
229 /// nested-name-specifier. Subclasses may override this function to provide
230 /// alternate behavior.
Douglas Gregor577f75a2009-08-04 16:50:30 +0000231 NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
232 SourceRange Range);
233
234 /// \brief Transform the given template name.
235 ///
Douglas Gregord1067e52009-08-06 06:41:21 +0000236 /// By default, transforms the template name by transforming the declarations
237 /// and nested-name-specifiers that occur within the template name.
238 /// Subclasses may override this function to provide alternate behavior.
239 TemplateName TransformTemplateName(TemplateName Name);
Douglas Gregor577f75a2009-08-04 16:50:30 +0000240
241 /// \brief Transform the given template argument.
242 ///
Douglas Gregor670444e2009-08-04 22:27:00 +0000243 /// By default, this operation transforms the type, expression, or
244 /// declaration stored within the template argument and constructs a
245 /// new template argument from the transformed result. Subclasses may
246 /// override this function to provide alternate behavior.
Douglas Gregor577f75a2009-08-04 16:50:30 +0000247 TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg);
248
249#define ABSTRACT_TYPE(CLASS, PARENT)
250#define TYPE(CLASS, PARENT) \
251 QualType Transform##CLASS##Type(const CLASS##Type *T);
252#include "clang/AST/TypeNodes.def"
253
Douglas Gregorb98b1992009-08-11 05:31:07 +0000254 OwningStmtResult TransformCompoundStmt(Stmt *S, bool IsStmtExpr) {
255 // FIXME: Actually handle this transformation properly.
256 return getDerived().TransformStmt(S);
257 }
258
259#define STMT(Node, Parent)
260#define EXPR(Node, Parent) \
261 OwningExprResult Transform##Node(Node *E);
262#define ABSTRACT_EXPR(Node, Parent)
263#include "clang/AST/StmtNodes.def"
264
Douglas Gregor577f75a2009-08-04 16:50:30 +0000265 /// \brief Build a new pointer type given its pointee type.
266 ///
267 /// By default, performs semantic analysis when building the pointer type.
268 /// Subclasses may override this routine to provide different behavior.
269 QualType RebuildPointerType(QualType PointeeType);
270
271 /// \brief Build a new block pointer type given its pointee type.
272 ///
273 /// By default, performs semantic analysis when building the block pointer
274 /// type. Subclasses may override this routine to provide different behavior.
275 QualType RebuildBlockPointerType(QualType PointeeType);
276
277 /// \brief Build a new lvalue reference type given the type it references.
278 ///
279 /// By default, performs semantic analysis when building the lvalue reference
280 /// type. Subclasses may override this routine to provide different behavior.
281 QualType RebuildLValueReferenceType(QualType ReferentType);
282
283 /// \brief Build a new rvalue reference type given the type it references.
284 ///
285 /// By default, performs semantic analysis when building the rvalue reference
286 /// type. Subclasses may override this routine to provide different behavior.
287 QualType RebuildRValueReferenceType(QualType ReferentType);
288
289 /// \brief Build a new member pointer type given the pointee type and the
290 /// class type it refers into.
291 ///
292 /// By default, performs semantic analysis when building the member pointer
293 /// type. Subclasses may override this routine to provide different behavior.
294 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType);
295
296 /// \brief Build a new array type given the element type, size
297 /// modifier, size of the array (if known), size expression, and index type
298 /// qualifiers.
299 ///
300 /// By default, performs semantic analysis when building the array type.
301 /// Subclasses may override this routine to provide different behavior.
302 /// Also by default, all of the other Rebuild*Array
303 QualType RebuildArrayType(QualType ElementType,
304 ArrayType::ArraySizeModifier SizeMod,
305 const llvm::APInt *Size,
306 Expr *SizeExpr,
307 unsigned IndexTypeQuals,
308 SourceRange BracketsRange);
309
310 /// \brief Build a new constant array type given the element type, size
311 /// modifier, (known) size of the array, and index type qualifiers.
312 ///
313 /// By default, performs semantic analysis when building the array type.
314 /// Subclasses may override this routine to provide different behavior.
315 QualType RebuildConstantArrayType(QualType ElementType,
316 ArrayType::ArraySizeModifier SizeMod,
317 const llvm::APInt &Size,
318 unsigned IndexTypeQuals);
319
320 /// \brief Build a new constant array type given the element type, size
321 /// modifier, (known) size of the array, size expression, and index type
322 /// 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 RebuildConstantArrayWithExprType(QualType ElementType,
327 ArrayType::ArraySizeModifier SizeMod,
328 const llvm::APInt &Size,
329 Expr *SizeExpr,
330 unsigned IndexTypeQuals,
331 SourceRange BracketsRange);
332
333 /// \brief Build a new constant array type given the element type, size
334 /// modifier, (known) size of the array, and index type qualifiers.
335 ///
336 /// By default, performs semantic analysis when building the array type.
337 /// Subclasses may override this routine to provide different behavior.
338 QualType RebuildConstantArrayWithoutExprType(QualType ElementType,
339 ArrayType::ArraySizeModifier SizeMod,
340 const llvm::APInt &Size,
341 unsigned IndexTypeQuals);
342
343 /// \brief Build a new incomplete array type given the element type, size
344 /// modifier, and index type qualifiers.
345 ///
346 /// By default, performs semantic analysis when building the array type.
347 /// Subclasses may override this routine to provide different behavior.
348 QualType RebuildIncompleteArrayType(QualType ElementType,
349 ArrayType::ArraySizeModifier SizeMod,
350 unsigned IndexTypeQuals);
351
352 /// \brief Build a new variable-length array type given the element type,
353 /// size modifier, size expression, and index type qualifiers.
354 ///
355 /// By default, performs semantic analysis when building the array type.
356 /// Subclasses may override this routine to provide different behavior.
357 QualType RebuildVariableArrayType(QualType ElementType,
358 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregorb98b1992009-08-11 05:31:07 +0000359 ExprArg SizeExpr,
Douglas Gregor577f75a2009-08-04 16:50:30 +0000360 unsigned IndexTypeQuals,
361 SourceRange BracketsRange);
362
363 /// \brief Build a new dependent-sized 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 RebuildDependentSizedArrayType(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 vector type given the element type and
375 /// number of elements.
376 ///
377 /// By default, performs semantic analysis when building the vector type.
378 /// Subclasses may override this routine to provide different behavior.
379 QualType RebuildVectorType(QualType ElementType, unsigned NumElements);
380
381 /// \brief Build a new extended vector type given the element type and
382 /// number of elements.
383 ///
384 /// By default, performs semantic analysis when building the vector type.
385 /// Subclasses may override this routine to provide different behavior.
386 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
387 SourceLocation AttributeLoc);
388
389 /// \brief Build a new potentially dependently-sized extended vector type
390 /// given the element type and number of elements.
391 ///
392 /// By default, performs semantic analysis when building the vector type.
393 /// Subclasses may override this routine to provide different behavior.
394 QualType RebuildDependentSizedExtVectorType(QualType ElementType,
Douglas Gregorb98b1992009-08-11 05:31:07 +0000395 ExprArg SizeExpr,
Douglas Gregor577f75a2009-08-04 16:50:30 +0000396 SourceLocation AttributeLoc);
397
398 /// \brief Build a new function type.
399 ///
400 /// By default, performs semantic analysis when building the function type.
401 /// Subclasses may override this routine to provide different behavior.
402 QualType RebuildFunctionProtoType(QualType T,
403 QualType *ParamTypes,
404 unsigned NumParamTypes,
405 bool Variadic, unsigned Quals);
406
407 /// \brief Build a new typedef type.
408 QualType RebuildTypedefType(TypedefDecl *Typedef) {
409 return SemaRef.Context.getTypeDeclType(Typedef);
410 }
411
412 /// \brief Build a new class/struct/union type.
413 QualType RebuildRecordType(RecordDecl *Record) {
414 return SemaRef.Context.getTypeDeclType(Record);
415 }
416
417 /// \brief Build a new Enum type.
418 QualType RebuildEnumType(EnumDecl *Enum) {
419 return SemaRef.Context.getTypeDeclType(Enum);
420 }
421
422 /// \brief Build a new typeof(expr) type.
423 ///
424 /// By default, performs semantic analysis when building the typeof type.
425 /// Subclasses may override this routine to provide different behavior.
Douglas Gregorb98b1992009-08-11 05:31:07 +0000426 QualType RebuildTypeOfExprType(ExprArg Underlying);
Douglas Gregor577f75a2009-08-04 16:50:30 +0000427
428 /// \brief Build a new typeof(type) type.
429 ///
430 /// By default, builds a new TypeOfType with the given underlying type.
431 QualType RebuildTypeOfType(QualType Underlying);
432
433 /// \brief Build a new C++0x decltype type.
434 ///
435 /// By default, performs semantic analysis when building the decltype type.
436 /// Subclasses may override this routine to provide different behavior.
Douglas Gregorb98b1992009-08-11 05:31:07 +0000437 QualType RebuildDecltypeType(ExprArg Underlying);
Douglas Gregor577f75a2009-08-04 16:50:30 +0000438
439 /// \brief Build a new template specialization type.
440 ///
441 /// By default, performs semantic analysis when building the template
442 /// specialization type. Subclasses may override this routine to provide
443 /// different behavior.
444 QualType RebuildTemplateSpecializationType(TemplateName Template,
445 const TemplateArgument *Args,
446 unsigned NumArgs);
447
448 /// \brief Build a new qualified name type.
449 ///
450 /// By default, builds a new QualifiedNameType type from the
451 /// nested-name-specifier and the named type. Subclasses may override
452 /// this routine to provide different behavior.
453 QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
454 return SemaRef.Context.getQualifiedNameType(NNS, Named);
455 }
456
457 /// \brief Build a new typename type that refers to a template-id.
458 ///
459 /// By default, builds a new TypenameType type from the nested-name-specifier
460 /// and the given type. Subclasses may override this routine to provide
461 /// different behavior.
462 QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
463 if (NNS->isDependent())
464 return SemaRef.Context.getTypenameType(NNS,
465 cast<TemplateSpecializationType>(T));
466
467 return SemaRef.Context.getQualifiedNameType(NNS, T);
468 }
469
470 /// \brief Build a new typename type that refers to an identifier.
471 ///
472 /// By default, performs semantic analysis when building the typename type
473 /// (or qualified name type). Subclasses may override this routine to provide
474 /// different behavior.
475 QualType RebuildTypenameType(NestedNameSpecifier *NNS,
476 const IdentifierInfo *Id) {
477 return SemaRef.CheckTypenameType(NNS, *Id,
478 SourceRange(getDerived().getBaseLocation()));
Douglas Gregordcee1a12009-08-06 05:28:30 +0000479 }
480
481 /// \brief Build a new nested-name-specifier given the prefix and an
482 /// identifier that names the next step in the nested-name-specifier.
483 ///
484 /// By default, performs semantic analysis when building the new
485 /// nested-name-specifier. Subclasses may override this routine to provide
486 /// different behavior.
487 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
488 SourceRange Range,
489 IdentifierInfo &II);
490
491 /// \brief Build a new nested-name-specifier given the prefix and the
492 /// namespace named in the next step in the nested-name-specifier.
493 ///
494 /// By default, performs semantic analysis when building the new
495 /// nested-name-specifier. Subclasses may override this routine to provide
496 /// different behavior.
497 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
498 SourceRange Range,
499 NamespaceDecl *NS);
500
501 /// \brief Build a new nested-name-specifier given the prefix and the
502 /// type named in the next step in the nested-name-specifier.
503 ///
504 /// By default, performs semantic analysis when building the new
505 /// nested-name-specifier. Subclasses may override this routine to provide
506 /// different behavior.
507 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
508 SourceRange Range,
509 bool TemplateKW,
510 QualType T);
Douglas Gregord1067e52009-08-06 06:41:21 +0000511
512 /// \brief Build a new template name given a nested name specifier, a flag
513 /// indicating whether the "template" keyword was provided, and the template
514 /// that the template name refers to.
515 ///
516 /// By default, builds the new template name directly. Subclasses may override
517 /// this routine to provide different behavior.
518 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
519 bool TemplateKW,
520 TemplateDecl *Template);
521
522 /// \brief Build a new template name given a nested name specifier, a flag
523 /// indicating whether the "template" keyword was provided, and a set of
524 /// overloaded function templates.
525 ///
526 /// By default, builds the new template name directly. Subclasses may override
527 /// this routine to provide different behavior.
528 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
529 bool TemplateKW,
530 OverloadedFunctionDecl *Ovl);
531
532 /// \brief Build a new template name given a nested name specifier and the
533 /// name that is referred to as a template.
534 ///
535 /// By default, performs semantic analysis to determine whether the name can
536 /// be resolved to a specific template, then builds the appropriate kind of
537 /// template name. Subclasses may override this routine to provide different
538 /// behavior.
539 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
540 const IdentifierInfo &II);
Douglas Gregorb98b1992009-08-11 05:31:07 +0000541
542
543 /// \brief Build a new expression that references a declaration.
544 ///
545 /// By default, performs semantic analysis to build the new expression.
546 /// Subclasses may override this routine to provide different behavior.
547 OwningExprResult RebuildDeclRefExpr(NamedDecl *ND, SourceLocation Loc) {
548 return getSema().BuildDeclarationNameExpr(Loc, ND,
549 /*FIXME:*/false,
550 /*SS=*/0,
551 /*FIXME:*/false);
552 }
553
554 /// \brief Build a new expression in parentheses.
555 ///
556 /// By default, performs semantic analysis to build the new expression.
557 /// Subclasses may override this routine to provide different behavior.
558 OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
559 SourceLocation RParen) {
560 return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
561 }
562
563 /// \brief Build a new unary operator expression.
564 ///
565 /// By default, performs semantic analysis to build the new expression.
566 /// Subclasses may override this routine to provide different behavior.
567 OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
568 UnaryOperator::Opcode Opc,
569 ExprArg SubExpr) {
570 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr));
571 }
572
573 /// \brief Build a new sizeof or alignof expression with a type argument.
574 ///
575 /// By default, performs semantic analysis to build the new expression.
576 /// Subclasses may override this routine to provide different behavior.
577 OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc,
578 bool isSizeOf, SourceRange R) {
579 return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R);
580 }
581
582 /// \brief Build a new sizeof or alignof expression with an expression
583 /// argument.
584 ///
585 /// By default, performs semantic analysis to build the new expression.
586 /// Subclasses may override this routine to provide different behavior.
587 OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
588 bool isSizeOf, SourceRange R) {
589 OwningExprResult Result
590 = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
591 OpLoc, isSizeOf, R);
592 if (Result.isInvalid())
593 return getSema().ExprError();
594
595 SubExpr.release();
596 return move(Result);
597 }
598
599 /// \brief Build a new array subscript expression.
600 ///
601 /// By default, performs semantic analysis to build the new expression.
602 /// Subclasses may override this routine to provide different behavior.
603 OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
604 SourceLocation LBracketLoc,
605 ExprArg RHS,
606 SourceLocation RBracketLoc) {
607 return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
608 LBracketLoc, move(RHS),
609 RBracketLoc);
610 }
611
612 /// \brief Build a new call expression.
613 ///
614 /// By default, performs semantic analysis to build the new expression.
615 /// Subclasses may override this routine to provide different behavior.
616 OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
617 MultiExprArg Args,
618 SourceLocation *CommaLocs,
619 SourceLocation RParenLoc) {
620 return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
621 move(Args), CommaLocs, RParenLoc);
622 }
623
624 /// \brief Build a new member access expression.
625 ///
626 /// By default, performs semantic analysis to build the new expression.
627 /// Subclasses may override this routine to provide different behavior.
628 OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
629 bool isArrow, SourceLocation MemberLoc,
630 NamedDecl *Member) {
631 return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
632 isArrow? tok::arrow : tok::period,
633 MemberLoc,
634 /*FIXME*/*Member->getIdentifier(),
635 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
636 }
637
638 /// \brief Build a new binary operator expression.
639 ///
640 /// By default, performs semantic analysis to build the new expression.
641 /// Subclasses may override this routine to provide different behavior.
642 OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
643 BinaryOperator::Opcode Opc,
644 ExprArg LHS, ExprArg RHS) {
645 OwningExprResult Result
646 = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(),
647 (Expr *)RHS.get());
648 if (Result.isInvalid())
649 return SemaRef.ExprError();
650
651 LHS.release();
652 RHS.release();
653 return move(Result);
654 }
655
656 /// \brief Build a new conditional operator expression.
657 ///
658 /// By default, performs semantic analysis to build the new expression.
659 /// Subclasses may override this routine to provide different behavior.
660 OwningExprResult RebuildConditionalOperator(ExprArg Cond,
661 SourceLocation QuestionLoc,
662 ExprArg LHS,
663 SourceLocation ColonLoc,
664 ExprArg RHS) {
665 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
666 move(LHS), move(RHS));
667 }
668
669 /// \brief Build a new implicit cast expression.
670 ///
671 /// By default, builds a new implicit cast without any semantic analysis.
672 /// Subclasses may override this routine to provide different behavior.
673 OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
674 ExprArg SubExpr, bool isLvalue) {
675 ImplicitCastExpr *ICE
676 = new (getSema().Context) ImplicitCastExpr(T, Kind,
677 (Expr *)SubExpr.release(),
678 isLvalue);
679 return getSema().Owned(ICE);
680 }
681
682 /// \brief Build a new C-style cast expression.
683 ///
684 /// By default, performs semantic analysis to build the new expression.
685 /// Subclasses may override this routine to provide different behavior.
686 OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
687 QualType ExplicitTy,
688 SourceLocation RParenLoc,
689 ExprArg SubExpr) {
690 return getSema().ActOnCastExpr(/*Scope=*/0,
691 LParenLoc,
692 ExplicitTy.getAsOpaquePtr(),
693 RParenLoc,
694 move(SubExpr));
695 }
696
697 /// \brief Build a new compound literal expression.
698 ///
699 /// By default, performs semantic analysis to build the new expression.
700 /// Subclasses may override this routine to provide different behavior.
701 OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
702 QualType T,
703 SourceLocation RParenLoc,
704 ExprArg Init) {
705 return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
706 RParenLoc, move(Init));
707 }
708
709 /// \brief Build a new extended vector element access expression.
710 ///
711 /// By default, performs semantic analysis to build the new expression.
712 /// Subclasses may override this routine to provide different behavior.
713 OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
714 SourceLocation OpLoc,
715 SourceLocation AccessorLoc,
716 IdentifierInfo &Accessor) {
717 return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
718 tok::period, AccessorLoc,
719 Accessor,
720 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
721 }
722
723 /// \brief Build a new initializer list expression.
724 ///
725 /// By default, performs semantic analysis to build the new expression.
726 /// Subclasses may override this routine to provide different behavior.
727 OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
728 MultiExprArg Inits,
729 SourceLocation RBraceLoc) {
730 return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
731 }
732
733 /// \brief Build a new designated initializer expression.
734 ///
735 /// By default, performs semantic analysis to build the new expression.
736 /// Subclasses may override this routine to provide different behavior.
737 OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
738 MultiExprArg ArrayExprs,
739 SourceLocation EqualOrColonLoc,
740 bool GNUSyntax,
741 ExprArg Init) {
742 OwningExprResult Result
743 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
744 move(Init));
745 if (Result.isInvalid())
746 return SemaRef.ExprError();
747
748 ArrayExprs.release();
749 return move(Result);
750 }
751
752 /// \brief Build a new value-initialized expression.
753 ///
754 /// By default, builds the implicit value initialization without performing
755 /// any semantic analysis. Subclasses may override this routine to provide
756 /// different behavior.
757 OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
758 return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
759 }
760
761 /// \brief Build a new \c va_arg expression.
762 ///
763 /// By default, performs semantic analysis to build the new expression.
764 /// Subclasses may override this routine to provide different behavior.
765 OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
766 QualType T, SourceLocation RParenLoc) {
767 return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
768 RParenLoc);
769 }
770
771 /// \brief Build a new expression list in parentheses.
772 ///
773 /// By default, performs semantic analysis to build the new expression.
774 /// Subclasses may override this routine to provide different behavior.
775 OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
776 MultiExprArg SubExprs,
777 SourceLocation RParenLoc) {
778 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
779 }
780
781 /// \brief Build a new address-of-label expression.
782 ///
783 /// By default, performs semantic analysis, using the name of the label
784 /// rather than attempting to map the label statement itself.
785 /// Subclasses may override this routine to provide different behavior.
786 OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
787 SourceLocation LabelLoc,
788 LabelStmt *Label) {
789 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
790 }
791
792 /// \brief Build a new GNU statement expression.
793 ///
794 /// By default, performs semantic analysis to build the new expression.
795 /// Subclasses may override this routine to provide different behavior.
796 OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
797 StmtArg SubStmt,
798 SourceLocation RParenLoc) {
799 return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
800 }
801
802 /// \brief Build a new __builtin_types_compatible_p expression.
803 ///
804 /// By default, performs semantic analysis to build the new expression.
805 /// Subclasses may override this routine to provide different behavior.
806 OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
807 QualType T1, QualType T2,
808 SourceLocation RParenLoc) {
809 return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
810 T1.getAsOpaquePtr(),
811 T2.getAsOpaquePtr(),
812 RParenLoc);
813 }
814
815 /// \brief Build a new __builtin_choose_expr expression.
816 ///
817 /// By default, performs semantic analysis to build the new expression.
818 /// Subclasses may override this routine to provide different behavior.
819 OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
820 ExprArg Cond, ExprArg LHS, ExprArg RHS,
821 SourceLocation RParenLoc) {
822 return SemaRef.ActOnChooseExpr(BuiltinLoc,
823 move(Cond), move(LHS), move(RHS),
824 RParenLoc);
825 }
826
827 /// \brief Build a new overloaded operator call expression.
828 ///
829 /// By default, performs semantic analysis to build the new expression.
830 /// The semantic analysis provides the behavior of template instantiation,
831 /// copying with transformations that turn what looks like an overloaded
832 /// operator call into a use of a builtin operator, performing
833 /// argument-dependent lookup, etc. Subclasses may override this routine to
834 /// provide different behavior.
835 OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
836 SourceLocation OpLoc,
837 ExprArg Callee,
838 ExprArg First,
839 ExprArg Second);
840
841 /// \brief Build a new C++ "named" cast expression, such as static_cast or
842 /// reinterpret_cast.
843 ///
844 /// By default, this routine dispatches to one of the more-specific routines
845 /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
846 /// Subclasses may override this routine to provide different behavior.
847 OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
848 Stmt::StmtClass Class,
849 SourceLocation LAngleLoc,
850 QualType T,
851 SourceLocation RAngleLoc,
852 SourceLocation LParenLoc,
853 ExprArg SubExpr,
854 SourceLocation RParenLoc) {
855 switch (Class) {
856 case Stmt::CXXStaticCastExprClass:
857 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
858 RAngleLoc, LParenLoc,
859 move(SubExpr), RParenLoc);
860
861 case Stmt::CXXDynamicCastExprClass:
862 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
863 RAngleLoc, LParenLoc,
864 move(SubExpr), RParenLoc);
865
866 case Stmt::CXXReinterpretCastExprClass:
867 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
868 RAngleLoc, LParenLoc,
869 move(SubExpr),
870 RParenLoc);
871
872 case Stmt::CXXConstCastExprClass:
873 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
874 RAngleLoc, LParenLoc,
875 move(SubExpr), RParenLoc);
876
877 default:
878 assert(false && "Invalid C++ named cast");
879 break;
880 }
881
882 return getSema().ExprError();
883 }
884
885 /// \brief Build a new C++ static_cast expression.
886 ///
887 /// By default, performs semantic analysis to build the new expression.
888 /// Subclasses may override this routine to provide different behavior.
889 OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
890 SourceLocation LAngleLoc,
891 QualType T,
892 SourceLocation RAngleLoc,
893 SourceLocation LParenLoc,
894 ExprArg SubExpr,
895 SourceLocation RParenLoc) {
896 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
897 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
898 LParenLoc, move(SubExpr), RParenLoc);
899 }
900
901 /// \brief Build a new C++ dynamic_cast expression.
902 ///
903 /// By default, performs semantic analysis to build the new expression.
904 /// Subclasses may override this routine to provide different behavior.
905 OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
906 SourceLocation LAngleLoc,
907 QualType T,
908 SourceLocation RAngleLoc,
909 SourceLocation LParenLoc,
910 ExprArg SubExpr,
911 SourceLocation RParenLoc) {
912 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
913 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
914 LParenLoc, move(SubExpr), RParenLoc);
915 }
916
917 /// \brief Build a new C++ reinterpret_cast expression.
918 ///
919 /// By default, performs semantic analysis to build the new expression.
920 /// Subclasses may override this routine to provide different behavior.
921 OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
922 SourceLocation LAngleLoc,
923 QualType T,
924 SourceLocation RAngleLoc,
925 SourceLocation LParenLoc,
926 ExprArg SubExpr,
927 SourceLocation RParenLoc) {
928 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
929 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
930 LParenLoc, move(SubExpr), RParenLoc);
931 }
932
933 /// \brief Build a new C++ const_cast expression.
934 ///
935 /// By default, performs semantic analysis to build the new expression.
936 /// Subclasses may override this routine to provide different behavior.
937 OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
938 SourceLocation LAngleLoc,
939 QualType T,
940 SourceLocation RAngleLoc,
941 SourceLocation LParenLoc,
942 ExprArg SubExpr,
943 SourceLocation RParenLoc) {
944 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
945 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
946 LParenLoc, move(SubExpr), RParenLoc);
947 }
948
949 /// \brief Build a new C++ functional-style cast expression.
950 ///
951 /// By default, performs semantic analysis to build the new expression.
952 /// Subclasses may override this routine to provide different behavior.
953 OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
954 QualType T,
955 SourceLocation LParenLoc,
956 ExprArg SubExpr,
957 SourceLocation RParenLoc) {
958 Expr *Sub = SubExpr.takeAs<Expr>();
959 return getSema().ActOnCXXTypeConstructExpr(TypeRange,
960 T.getAsOpaquePtr(),
961 LParenLoc,
962 Sema::MultiExprArg(getSema(),
963 (void **)&Sub,
964 1),
965 /*CommaLocs=*/0,
966 RParenLoc);
967 }
968
969 /// \brief Build a new C++ typeid(type) expression.
970 ///
971 /// By default, performs semantic analysis to build the new expression.
972 /// Subclasses may override this routine to provide different behavior.
973 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
974 SourceLocation LParenLoc,
975 QualType T,
976 SourceLocation RParenLoc) {
977 return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
978 T.getAsOpaquePtr(), RParenLoc);
979 }
980
981 /// \brief Build a new C++ typeid(expr) expression.
982 ///
983 /// By default, performs semantic analysis to build the new expression.
984 /// Subclasses may override this routine to provide different behavior.
985 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
986 SourceLocation LParenLoc,
987 ExprArg Operand,
988 SourceLocation RParenLoc) {
989 OwningExprResult Result
990 = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
991 RParenLoc);
992 if (Result.isInvalid())
993 return getSema().ExprError();
994
995 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
996 return move(Result);
997 }
998
999 /// \brief Build a new C++ "this" expression.
1000 ///
1001 /// By default, builds a new "this" expression without performing any
1002 /// semantic analysis. Subclasses may override this routine to provide
1003 /// different behavior.
1004 OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1005 QualType ThisType) {
1006 return getSema().Owned(
1007 new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1008 }
1009
1010 /// \brief Build a new C++ throw expression.
1011 ///
1012 /// By default, performs semantic analysis to build the new expression.
1013 /// Subclasses may override this routine to provide different behavior.
1014 OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1015 return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1016 }
1017
1018 /// \brief Build a new C++ default-argument expression.
1019 ///
1020 /// By default, builds a new default-argument expression, which does not
1021 /// require any semantic analysis. Subclasses may override this routine to
1022 /// provide different behavior.
1023 OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
Anders Carlssonf1480ee2009-08-14 18:30:22 +00001024 return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
Douglas Gregorb98b1992009-08-11 05:31:07 +00001025 }
1026
1027 /// \brief Build a new C++ zero-initialization expression.
1028 ///
1029 /// By default, performs semantic analysis to build the new expression.
1030 /// Subclasses may override this routine to provide different behavior.
1031 OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1032 SourceLocation LParenLoc,
1033 QualType T,
1034 SourceLocation RParenLoc) {
1035 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1036 T.getAsOpaquePtr(), LParenLoc,
1037 MultiExprArg(getSema(), 0, 0),
1038 0, RParenLoc);
1039 }
1040
1041 /// \brief Build a new C++ conditional declaration expression.
1042 ///
1043 /// By default, performs semantic analysis to build the new expression.
1044 /// Subclasses may override this routine to provide different behavior.
1045 OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
1046 SourceLocation EqLoc,
1047 VarDecl *Var) {
1048 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1049 EqLoc,
1050 Var));
1051 }
1052
1053 /// \brief Build a new C++ "new" expression.
1054 ///
1055 /// By default, performs semantic analysis to build the new expression.
1056 /// Subclasses may override this routine to provide different behavior.
1057 OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1058 bool UseGlobal,
1059 SourceLocation PlacementLParen,
1060 MultiExprArg PlacementArgs,
1061 SourceLocation PlacementRParen,
1062 bool ParenTypeId,
1063 QualType AllocType,
1064 SourceLocation TypeLoc,
1065 SourceRange TypeRange,
1066 ExprArg ArraySize,
1067 SourceLocation ConstructorLParen,
1068 MultiExprArg ConstructorArgs,
1069 SourceLocation ConstructorRParen) {
1070 return getSema().BuildCXXNew(StartLoc, UseGlobal,
1071 PlacementLParen,
1072 move(PlacementArgs),
1073 PlacementRParen,
1074 ParenTypeId,
1075 AllocType,
1076 TypeLoc,
1077 TypeRange,
1078 move(ArraySize),
1079 ConstructorLParen,
1080 move(ConstructorArgs),
1081 ConstructorRParen);
1082 }
1083
1084 /// \brief Build a new C++ "delete" expression.
1085 ///
1086 /// By default, performs semantic analysis to build the new expression.
1087 /// Subclasses may override this routine to provide different behavior.
1088 OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1089 bool IsGlobalDelete,
1090 bool IsArrayForm,
1091 ExprArg Operand) {
1092 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1093 move(Operand));
1094 }
1095
1096 /// \brief Build a new unary type trait expression.
1097 ///
1098 /// By default, performs semantic analysis to build the new expression.
1099 /// Subclasses may override this routine to provide different behavior.
1100 OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1101 SourceLocation StartLoc,
1102 SourceLocation LParenLoc,
1103 QualType T,
1104 SourceLocation RParenLoc) {
1105 return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1106 T.getAsOpaquePtr(), RParenLoc);
1107 }
1108
1109 /// \brief Build a new qualified declaration reference expression.
1110 ///
1111 /// By default, performs semantic analysis to build the new expression.
1112 /// Subclasses may override this routine to provide different behavior.
1113 OwningExprResult RebuildQualifiedDeclRefExpr(NestedNameSpecifier *NNS,
1114 SourceRange QualifierRange,
1115 NamedDecl *ND,
1116 SourceLocation Location,
1117 bool IsAddressOfOperand) {
1118 CXXScopeSpec SS;
1119 SS.setRange(QualifierRange);
1120 SS.setScopeRep(NNS);
1121 return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1122 Location,
1123 ND->getDeclName(),
1124 /*Trailing lparen=*/false,
1125 &SS,
1126 IsAddressOfOperand);
1127 }
1128
1129 /// \brief Build a new (previously unresolved) declaration reference
1130 /// expression.
1131 ///
1132 /// By default, performs semantic analysis to build the new expression.
1133 /// Subclasses may override this routine to provide different behavior.
1134 OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1135 SourceRange QualifierRange,
1136 DeclarationName Name,
1137 SourceLocation Location,
1138 bool IsAddressOfOperand) {
1139 CXXScopeSpec SS;
1140 SS.setRange(QualifierRange);
1141 SS.setScopeRep(NNS);
1142 return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1143 Location,
1144 Name,
1145 /*Trailing lparen=*/false,
1146 &SS,
1147 IsAddressOfOperand);
1148 }
1149
1150 /// \brief Build a new template-id expression.
1151 ///
1152 /// By default, performs semantic analysis to build the new expression.
1153 /// Subclasses may override this routine to provide different behavior.
1154 OwningExprResult RebuildTemplateIdExpr(TemplateName Template,
1155 SourceLocation TemplateLoc,
1156 SourceLocation LAngleLoc,
1157 TemplateArgument *TemplateArgs,
1158 unsigned NumTemplateArgs,
1159 SourceLocation RAngleLoc) {
1160 return getSema().BuildTemplateIdExpr(Template, TemplateLoc,
1161 LAngleLoc,
1162 TemplateArgs, NumTemplateArgs,
1163 RAngleLoc);
1164 }
1165
1166 /// \brief Build a new object-construction expression.
1167 ///
1168 /// By default, performs semantic analysis to build the new expression.
1169 /// Subclasses may override this routine to provide different behavior.
1170 OwningExprResult RebuildCXXConstructExpr(QualType T,
1171 CXXConstructorDecl *Constructor,
1172 bool IsElidable,
1173 MultiExprArg Args) {
1174 unsigned NumArgs = Args.size();
1175 Expr **ArgsExprs = (Expr **)Args.release();
Anders Carlsson089c2602009-08-15 23:41:35 +00001176 return getSema().Owned(SemaRef.BuildCXXConstructExpr(T, Constructor,
Douglas Gregorb98b1992009-08-11 05:31:07 +00001177 IsElidable,
1178 ArgsExprs,
1179 NumArgs));
1180 }
1181
1182 /// \brief Build a new object-construction expression.
1183 ///
1184 /// By default, performs semantic analysis to build the new expression.
1185 /// Subclasses may override this routine to provide different behavior.
1186 OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1187 QualType T,
1188 SourceLocation LParenLoc,
1189 MultiExprArg Args,
1190 SourceLocation *Commas,
1191 SourceLocation RParenLoc) {
1192 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1193 T.getAsOpaquePtr(),
1194 LParenLoc,
1195 move(Args),
1196 Commas,
1197 RParenLoc);
1198 }
1199
1200 /// \brief Build a new object-construction expression.
1201 ///
1202 /// By default, performs semantic analysis to build the new expression.
1203 /// Subclasses may override this routine to provide different behavior.
1204 OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1205 QualType T,
1206 SourceLocation LParenLoc,
1207 MultiExprArg Args,
1208 SourceLocation *Commas,
1209 SourceLocation RParenLoc) {
1210 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1211 /*FIXME*/LParenLoc),
1212 T.getAsOpaquePtr(),
1213 LParenLoc,
1214 move(Args),
1215 Commas,
1216 RParenLoc);
1217 }
1218
1219 /// \brief Build a new member reference expression.
1220 ///
1221 /// By default, performs semantic analysis to build the new expression.
1222 /// Subclasses may override this routine to provide different behavior.
Douglas Gregor0dec56d2009-08-11 15:56:57 +00001223 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
Douglas Gregorb98b1992009-08-11 05:31:07 +00001224 bool IsArrow,
1225 SourceLocation OperatorLoc,
1226 DeclarationName Name,
1227 SourceLocation MemberLoc) {
Douglas Gregor0dec56d2009-08-11 15:56:57 +00001228 OwningExprResult Base = move(BaseE);
Douglas Gregorb98b1992009-08-11 05:31:07 +00001229 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
1230 CXXScopeSpec SS;
1231 Base = SemaRef.ActOnCXXEnterMemberScope(0, SS, move(Base), OpKind);
1232 if (Base.isInvalid())
1233 return SemaRef.ExprError();
1234
1235 assert(Name.getAsIdentifierInfo() &&
1236 "Cannot transform member references with non-identifier members");
1237 Base = SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1238 move(Base), OperatorLoc, OpKind,
1239 MemberLoc,
1240 *Name.getAsIdentifierInfo(),
1241 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1242 SemaRef.ActOnCXXExitMemberScope(0, SS);
1243 return move(Base);
1244 }
1245
1246 /// \brief Build a new Objective-C @encode expression.
1247 ///
1248 /// By default, performs semantic analysis to build the new expression.
1249 /// Subclasses may override this routine to provide different behavior.
1250 OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1251 QualType T,
1252 SourceLocation RParenLoc) {
1253 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1254 RParenLoc));
1255 }
1256
1257 /// \brief Build a new Objective-C protocol expression.
1258 ///
1259 /// By default, performs semantic analysis to build the new expression.
1260 /// Subclasses may override this routine to provide different behavior.
1261 OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1262 SourceLocation AtLoc,
1263 SourceLocation ProtoLoc,
1264 SourceLocation LParenLoc,
1265 SourceLocation RParenLoc) {
1266 return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1267 Protocol->getIdentifier(),
1268 AtLoc,
1269 ProtoLoc,
1270 LParenLoc,
1271 RParenLoc));
1272 }
1273
1274 /// \brief Build a new shuffle vector expression.
1275 ///
1276 /// By default, performs semantic analysis to build the new expression.
1277 /// Subclasses may override this routine to provide different behavior.
1278 OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1279 MultiExprArg SubExprs,
1280 SourceLocation RParenLoc) {
1281 // Find the declaration for __builtin_shufflevector
1282 const IdentifierInfo &Name
1283 = SemaRef.Context.Idents.get("__builtin_shufflevector");
1284 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1285 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1286 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
1287
1288 // Build a reference to the __builtin_shufflevector builtin
1289 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
1290 Expr *Callee
1291 = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1292 BuiltinLoc, false, false);
1293 SemaRef.UsualUnaryConversions(Callee);
1294
1295 // Build the CallExpr
1296 unsigned NumSubExprs = SubExprs.size();
1297 Expr **Subs = (Expr **)SubExprs.release();
1298 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1299 Subs, NumSubExprs,
1300 Builtin->getResultType(),
1301 RParenLoc);
1302 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
1303
1304 // Type-check the __builtin_shufflevector expression.
1305 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1306 if (Result.isInvalid())
1307 return SemaRef.ExprError();
1308
1309 OwnedCall.release();
1310 return move(Result);
1311 }
Douglas Gregor577f75a2009-08-04 16:50:30 +00001312};
Douglas Gregorb98b1992009-08-11 05:31:07 +00001313
Douglas Gregor577f75a2009-08-04 16:50:30 +00001314
Douglas Gregor670444e2009-08-04 22:27:00 +00001315template<typename Derived>
Douglas Gregorb98b1992009-08-11 05:31:07 +00001316Sema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1317 bool isAddressOfOperand) {
1318 if (!E)
1319 return SemaRef.Owned(E);
1320
1321 switch (E->getStmtClass()) {
1322 case Stmt::NoStmtClass: break;
1323#define STMT(Node, Parent) case Stmt::Node##Class: break;
1324#define EXPR(Node, Parent) \
1325 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1326#include "clang/AST/StmtNodes.def"
1327 }
1328
1329 return SemaRef.Owned(E->Retain());
Douglas Gregor657c1ac2009-08-06 22:17:10 +00001330}
1331
1332template<typename Derived>
Douglas Gregordcee1a12009-08-06 05:28:30 +00001333NestedNameSpecifier *
1334TreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1335 SourceRange Range) {
1336 // Instantiate the prefix of this nested name specifier.
1337 NestedNameSpecifier *Prefix = NNS->getPrefix();
1338 if (Prefix) {
1339 Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range);
1340 if (!Prefix)
1341 return 0;
1342 }
1343
1344 switch (NNS->getKind()) {
1345 case NestedNameSpecifier::Identifier:
1346 assert(Prefix &&
1347 "Can't have an identifier nested-name-specifier with no prefix");
1348 if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix())
1349 return NNS;
1350
1351 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1352 *NNS->getAsIdentifier());
1353
1354 case NestedNameSpecifier::Namespace: {
1355 NamespaceDecl *NS
1356 = cast_or_null<NamespaceDecl>(
1357 getDerived().TransformDecl(NNS->getAsNamespace()));
1358 if (!getDerived().AlwaysRebuild() &&
1359 Prefix == NNS->getPrefix() &&
1360 NS == NNS->getAsNamespace())
1361 return NNS;
1362
1363 return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1364 }
1365
1366 case NestedNameSpecifier::Global:
1367 // There is no meaningful transformation that one could perform on the
1368 // global scope.
1369 return NNS;
1370
1371 case NestedNameSpecifier::TypeSpecWithTemplate:
1372 case NestedNameSpecifier::TypeSpec: {
1373 QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
Douglas Gregord1067e52009-08-06 06:41:21 +00001374 if (T.isNull())
1375 return 0;
1376
Douglas Gregordcee1a12009-08-06 05:28:30 +00001377 if (!getDerived().AlwaysRebuild() &&
1378 Prefix == NNS->getPrefix() &&
1379 T == QualType(NNS->getAsType(), 0))
1380 return NNS;
1381
1382 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1383 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1384 T);
1385 }
1386 }
1387
1388 // Required to silence a GCC warning
1389 return 0;
1390}
1391
1392template<typename Derived>
Douglas Gregord1067e52009-08-06 06:41:21 +00001393TemplateName
1394TreeTransform<Derived>::TransformTemplateName(TemplateName Name) {
1395 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
1396 NestedNameSpecifier *NNS
1397 = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1398 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1399 if (!NNS)
1400 return TemplateName();
1401
1402 if (TemplateDecl *Template = QTN->getTemplateDecl()) {
1403 TemplateDecl *TransTemplate
1404 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1405 if (!TransTemplate)
1406 return TemplateName();
1407
1408 if (!getDerived().AlwaysRebuild() &&
1409 NNS == QTN->getQualifier() &&
1410 TransTemplate == Template)
1411 return Name;
1412
1413 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1414 TransTemplate);
1415 }
1416
1417 OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1418 assert(Ovl && "Not a template name or an overload set?");
1419 OverloadedFunctionDecl *TransOvl
1420 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1421 if (!TransOvl)
1422 return TemplateName();
1423
1424 if (!getDerived().AlwaysRebuild() &&
1425 NNS == QTN->getQualifier() &&
1426 TransOvl == Ovl)
1427 return Name;
1428
1429 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1430 TransOvl);
1431 }
1432
1433 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
1434 NestedNameSpecifier *NNS
1435 = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1436 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1437 if (!NNS)
1438 return TemplateName();
1439
1440 if (!getDerived().AlwaysRebuild() &&
1441 NNS == DTN->getQualifier())
1442 return Name;
1443
1444 return getDerived().RebuildTemplateName(NNS, *DTN->getName());
1445 }
1446
1447 if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
1448 TemplateDecl *TransTemplate
1449 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1450 if (!TransTemplate)
1451 return TemplateName();
1452
1453 if (!getDerived().AlwaysRebuild() &&
1454 TransTemplate == Template)
1455 return Name;
1456
1457 return TemplateName(TransTemplate);
1458 }
1459
1460 OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1461 assert(Ovl && "Not a template name or an overload set?");
1462 OverloadedFunctionDecl *TransOvl
1463 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1464 if (!TransOvl)
1465 return TemplateName();
1466
1467 if (!getDerived().AlwaysRebuild() &&
1468 TransOvl == Ovl)
1469 return Name;
1470
1471 return TemplateName(TransOvl);
1472}
1473
1474template<typename Derived>
Douglas Gregor670444e2009-08-04 22:27:00 +00001475TemplateArgument
1476TreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) {
1477 switch (Arg.getKind()) {
1478 case TemplateArgument::Null:
1479 case TemplateArgument::Integral:
1480 return Arg;
1481
1482 case TemplateArgument::Type: {
1483 QualType T = getDerived().TransformType(Arg.getAsType());
1484 if (T.isNull())
1485 return TemplateArgument();
1486 return TemplateArgument(Arg.getLocation(), T);
1487 }
1488
1489 case TemplateArgument::Declaration: {
1490 Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1491 if (!D)
1492 return TemplateArgument();
1493 return TemplateArgument(Arg.getLocation(), D);
1494 }
1495
1496 case TemplateArgument::Expression: {
1497 // Template argument expressions are not potentially evaluated.
1498 EnterExpressionEvaluationContext Unevaluated(getSema(),
1499 Action::Unevaluated);
1500
1501 Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr());
1502 if (E.isInvalid())
1503 return TemplateArgument();
1504 return TemplateArgument(E.takeAs<Expr>());
1505 }
1506
1507 case TemplateArgument::Pack: {
1508 llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
1509 TransformedArgs.reserve(Arg.pack_size());
1510 for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
1511 AEnd = Arg.pack_end();
1512 A != AEnd; ++A) {
1513 TemplateArgument TA = getDerived().TransformTemplateArgument(*A);
1514 if (TA.isNull())
1515 return TA;
1516
1517 TransformedArgs.push_back(TA);
1518 }
1519 TemplateArgument Result;
1520 Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
1521 true);
1522 return Result;
1523 }
1524 }
1525
1526 // Work around bogus GCC warning
1527 return TemplateArgument();
1528}
1529
Douglas Gregor577f75a2009-08-04 16:50:30 +00001530//===----------------------------------------------------------------------===//
1531// Type transformation
1532//===----------------------------------------------------------------------===//
1533
1534template<typename Derived>
1535QualType TreeTransform<Derived>::TransformType(QualType T) {
1536 if (getDerived().AlreadyTransformed(T))
1537 return T;
1538
1539 QualType Result;
1540 switch (T->getTypeClass()) {
1541#define ABSTRACT_TYPE(CLASS, PARENT)
1542#define TYPE(CLASS, PARENT) \
1543 case Type::CLASS: \
1544 Result = getDerived().Transform##CLASS##Type( \
1545 static_cast<CLASS##Type*>(T.getTypePtr())); \
1546 break;
1547#include "clang/AST/TypeNodes.def"
1548 }
1549
1550 if (Result.isNull() || T == Result)
1551 return Result;
1552
1553 return getDerived().AddTypeQualifiers(Result, T.getCVRQualifiers());
1554}
1555
1556template<typename Derived>
1557QualType
1558TreeTransform<Derived>::AddTypeQualifiers(QualType T, unsigned CVRQualifiers) {
1559 if (CVRQualifiers && !T->isFunctionType() && !T->isReferenceType())
1560 return T.getWithAdditionalQualifiers(CVRQualifiers);
1561
1562 return T;
1563}
1564
1565template<typename Derived>
1566QualType TreeTransform<Derived>::TransformExtQualType(const ExtQualType *T) {
1567 // FIXME: Implement
1568 return QualType(T, 0);
1569}
1570
1571template<typename Derived>
1572QualType TreeTransform<Derived>::TransformBuiltinType(const BuiltinType *T) {
1573 // Nothing to do
1574 return QualType(T, 0);
1575}
1576
1577template<typename Derived>
1578QualType TreeTransform<Derived>::TransformFixedWidthIntType(
1579 const FixedWidthIntType *T) {
1580 // FIXME: Implement
1581 return QualType(T, 0);
1582}
1583
1584template<typename Derived>
1585QualType TreeTransform<Derived>::TransformComplexType(const ComplexType *T) {
1586 // FIXME: Implement
1587 return QualType(T, 0);
1588}
1589
1590template<typename Derived>
1591QualType TreeTransform<Derived>::TransformPointerType(const PointerType *T) {
1592 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1593 if (PointeeType.isNull())
1594 return QualType();
1595
1596 if (!getDerived().AlwaysRebuild() &&
1597 PointeeType == T->getPointeeType())
1598 return QualType(T, 0);
1599
1600 return getDerived().RebuildPointerType(PointeeType);
1601}
1602
1603template<typename Derived>
1604QualType
1605TreeTransform<Derived>::TransformBlockPointerType(const BlockPointerType *T) {
1606 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1607 if (PointeeType.isNull())
1608 return QualType();
1609
1610 if (!getDerived().AlwaysRebuild() &&
1611 PointeeType == T->getPointeeType())
1612 return QualType(T, 0);
1613
1614 return getDerived().RebuildBlockPointerType(PointeeType);
1615}
1616
1617template<typename Derived>
1618QualType
1619TreeTransform<Derived>::TransformLValueReferenceType(
1620 const LValueReferenceType *T) {
1621 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1622 if (PointeeType.isNull())
1623 return QualType();
1624
1625 if (!getDerived().AlwaysRebuild() &&
1626 PointeeType == T->getPointeeType())
1627 return QualType(T, 0);
1628
1629 return getDerived().RebuildLValueReferenceType(PointeeType);
1630}
1631
1632template<typename Derived>
1633QualType
1634TreeTransform<Derived>::TransformRValueReferenceType(
1635 const RValueReferenceType *T) {
1636 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1637 if (PointeeType.isNull())
1638 return QualType();
1639
1640 if (!getDerived().AlwaysRebuild() &&
1641 PointeeType == T->getPointeeType())
1642 return QualType(T, 0);
1643
1644 return getDerived().RebuildRValueReferenceType(PointeeType);
1645}
1646
1647template<typename Derived>
1648QualType
1649TreeTransform<Derived>::TransformMemberPointerType(const MemberPointerType *T) {
1650 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1651 if (PointeeType.isNull())
1652 return QualType();
1653
1654 QualType ClassType = getDerived().TransformType(QualType(T->getClass(), 0));
1655 if (ClassType.isNull())
1656 return QualType();
1657
1658 if (!getDerived().AlwaysRebuild() &&
1659 PointeeType == T->getPointeeType() &&
1660 ClassType == QualType(T->getClass(), 0))
1661 return QualType(T, 0);
1662
1663 return getDerived().RebuildMemberPointerType(PointeeType, ClassType);
1664}
1665
1666template<typename Derived>
1667QualType
1668TreeTransform<Derived>::TransformConstantArrayType(const ConstantArrayType *T) {
1669 QualType ElementType = getDerived().TransformType(T->getElementType());
1670 if (ElementType.isNull())
1671 return QualType();
1672
1673 if (!getDerived().AlwaysRebuild() &&
1674 ElementType == T->getElementType())
1675 return QualType(T, 0);
1676
1677 return getDerived().RebuildConstantArrayType(ElementType,
1678 T->getSizeModifier(),
1679 T->getSize(),
1680 T->getIndexTypeQualifier());
1681}
1682
1683template<typename Derived>
1684QualType
1685TreeTransform<Derived>::TransformConstantArrayWithExprType(
1686 const ConstantArrayWithExprType *T) {
1687 QualType ElementType = getDerived().TransformType(T->getElementType());
1688 if (ElementType.isNull())
1689 return QualType();
1690
Douglas Gregor670444e2009-08-04 22:27:00 +00001691 // Array bounds are not potentially evaluated contexts
1692 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1693
1694 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
1695 if (Size.isInvalid())
1696 return QualType();
1697
Douglas Gregor577f75a2009-08-04 16:50:30 +00001698 if (!getDerived().AlwaysRebuild() &&
Douglas Gregor670444e2009-08-04 22:27:00 +00001699 ElementType == T->getElementType() &&
1700 Size.get() == T->getSizeExpr())
Douglas Gregor577f75a2009-08-04 16:50:30 +00001701 return QualType(T, 0);
1702
1703 return getDerived().RebuildConstantArrayWithExprType(ElementType,
1704 T->getSizeModifier(),
1705 T->getSize(),
Douglas Gregor670444e2009-08-04 22:27:00 +00001706 Size.takeAs<Expr>(),
Douglas Gregor577f75a2009-08-04 16:50:30 +00001707 T->getIndexTypeQualifier(),
1708 T->getBracketsRange());
1709}
1710
1711template<typename Derived>
1712QualType
1713TreeTransform<Derived>::TransformConstantArrayWithoutExprType(
1714 const ConstantArrayWithoutExprType *T) {
1715 QualType ElementType = getDerived().TransformType(T->getElementType());
1716 if (ElementType.isNull())
1717 return QualType();
1718
1719 if (!getDerived().AlwaysRebuild() &&
1720 ElementType == T->getElementType())
1721 return QualType(T, 0);
1722
1723 return getDerived().RebuildConstantArrayWithoutExprType(ElementType,
1724 T->getSizeModifier(),
1725 T->getSize(),
1726 T->getIndexTypeQualifier());
1727}
1728
1729template<typename Derived>
1730QualType TreeTransform<Derived>::TransformIncompleteArrayType(
1731 const IncompleteArrayType *T) {
1732 QualType ElementType = getDerived().TransformType(T->getElementType());
1733 if (ElementType.isNull())
1734 return QualType();
1735
1736 if (!getDerived().AlwaysRebuild() &&
1737 ElementType == T->getElementType())
1738 return QualType(T, 0);
1739
1740 return getDerived().RebuildIncompleteArrayType(ElementType,
1741 T->getSizeModifier(),
1742 T->getIndexTypeQualifier());
1743}
1744
1745template<typename Derived>
1746QualType TreeTransform<Derived>::TransformVariableArrayType(
1747 const VariableArrayType *T) {
1748 QualType ElementType = getDerived().TransformType(T->getElementType());
1749 if (ElementType.isNull())
1750 return QualType();
1751
Douglas Gregor670444e2009-08-04 22:27:00 +00001752 // Array bounds are not potentially evaluated contexts
1753 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1754
Douglas Gregor577f75a2009-08-04 16:50:30 +00001755 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
1756 if (Size.isInvalid())
1757 return QualType();
1758
1759 if (!getDerived().AlwaysRebuild() &&
1760 ElementType == T->getElementType() &&
1761 Size.get() == T->getSizeExpr()) {
1762 Size.take();
1763 return QualType(T, 0);
1764 }
1765
1766 return getDerived().RebuildVariableArrayType(ElementType,
1767 T->getSizeModifier(),
1768 move(Size),
1769 T->getIndexTypeQualifier(),
1770 T->getBracketsRange());
1771}
1772
1773template<typename Derived>
1774QualType TreeTransform<Derived>::TransformDependentSizedArrayType(
1775 const DependentSizedArrayType *T) {
1776 QualType ElementType = getDerived().TransformType(T->getElementType());
1777 if (ElementType.isNull())
1778 return QualType();
1779
Douglas Gregor670444e2009-08-04 22:27:00 +00001780 // Array bounds are not potentially evaluated contexts
1781 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1782
Douglas Gregor577f75a2009-08-04 16:50:30 +00001783 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
1784 if (Size.isInvalid())
1785 return QualType();
1786
1787 if (!getDerived().AlwaysRebuild() &&
1788 ElementType == T->getElementType() &&
1789 Size.get() == T->getSizeExpr()) {
1790 Size.take();
1791 return QualType(T, 0);
1792 }
1793
1794 return getDerived().RebuildDependentSizedArrayType(ElementType,
1795 T->getSizeModifier(),
1796 move(Size),
1797 T->getIndexTypeQualifier(),
1798 T->getBracketsRange());
1799}
1800
1801template<typename Derived>
1802QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
1803 const DependentSizedExtVectorType *T) {
1804 QualType ElementType = getDerived().TransformType(T->getElementType());
1805 if (ElementType.isNull())
1806 return QualType();
1807
Douglas Gregor670444e2009-08-04 22:27:00 +00001808 // Vector sizes are not potentially evaluated contexts
1809 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1810
Douglas Gregor577f75a2009-08-04 16:50:30 +00001811 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
1812 if (Size.isInvalid())
1813 return QualType();
1814
1815 if (!getDerived().AlwaysRebuild() &&
1816 ElementType == T->getElementType() &&
1817 Size.get() == T->getSizeExpr()) {
1818 Size.take();
1819 return QualType(T, 0);
1820 }
1821
1822 return getDerived().RebuildDependentSizedExtVectorType(ElementType,
1823 move(Size),
1824 T->getAttributeLoc());
1825}
1826
1827template<typename Derived>
1828QualType TreeTransform<Derived>::TransformVectorType(const VectorType *T) {
1829 QualType ElementType = getDerived().TransformType(T->getElementType());
1830 if (ElementType.isNull())
1831 return QualType();
1832
1833 if (!getDerived().AlwaysRebuild() &&
1834 ElementType == T->getElementType())
1835 return QualType(T, 0);
1836
1837 return getDerived().RebuildVectorType(ElementType, T->getNumElements());
1838}
1839
1840template<typename Derived>
1841QualType
1842TreeTransform<Derived>::TransformExtVectorType(const ExtVectorType *T) {
1843 QualType ElementType = getDerived().TransformType(T->getElementType());
1844 if (ElementType.isNull())
1845 return QualType();
1846
1847 if (!getDerived().AlwaysRebuild() &&
1848 ElementType == T->getElementType())
1849 return QualType(T, 0);
1850
1851 return getDerived().RebuildExtVectorType(ElementType, T->getNumElements(),
1852 /*FIXME*/SourceLocation());
1853}
1854
1855template<typename Derived>
1856QualType TreeTransform<Derived>::TransformFunctionProtoType(
1857 const FunctionProtoType *T) {
1858 QualType ResultType = getDerived().TransformType(T->getResultType());
1859 if (ResultType.isNull())
1860 return QualType();
1861
1862 llvm::SmallVector<QualType, 4> ParamTypes;
1863 for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
1864 ParamEnd = T->arg_type_end();
1865 Param != ParamEnd; ++Param) {
1866 QualType P = getDerived().TransformType(*Param);
1867 if (P.isNull())
1868 return QualType();
1869
1870 ParamTypes.push_back(P);
1871 }
1872
1873 if (!getDerived().AlwaysRebuild() &&
1874 ResultType == T->getResultType() &&
1875 std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin()))
1876 return QualType(T, 0);
1877
1878 return getDerived().RebuildFunctionProtoType(ResultType, ParamTypes.data(),
1879 ParamTypes.size(), T->isVariadic(),
1880 T->getTypeQuals());
1881}
1882
1883template<typename Derived>
1884QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
1885 const FunctionNoProtoType *T) {
1886 // FIXME: Implement
1887 return QualType(T, 0);
1888}
1889
1890template<typename Derived>
1891QualType TreeTransform<Derived>::TransformTypedefType(const TypedefType *T) {
1892 TypedefDecl *Typedef
1893 = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
1894 if (!Typedef)
1895 return QualType();
1896
1897 if (!getDerived().AlwaysRebuild() &&
1898 Typedef == T->getDecl())
1899 return QualType(T, 0);
1900
1901 return getDerived().RebuildTypedefType(Typedef);
1902}
1903
1904template<typename Derived>
1905QualType TreeTransform<Derived>::TransformTypeOfExprType(
1906 const TypeOfExprType *T) {
Douglas Gregor670444e2009-08-04 22:27:00 +00001907 // typeof expressions are not potentially evaluated contexts
1908 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1909
Douglas Gregor577f75a2009-08-04 16:50:30 +00001910 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
1911 if (E.isInvalid())
1912 return QualType();
1913
1914 if (!getDerived().AlwaysRebuild() &&
1915 E.get() == T->getUnderlyingExpr()) {
1916 E.take();
1917 return QualType(T, 0);
1918 }
1919
1920 return getDerived().RebuildTypeOfExprType(move(E));
1921}
1922
1923template<typename Derived>
1924QualType TreeTransform<Derived>::TransformTypeOfType(const TypeOfType *T) {
1925 QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
1926 if (Underlying.isNull())
1927 return QualType();
1928
1929 if (!getDerived().AlwaysRebuild() &&
1930 Underlying == T->getUnderlyingType())
1931 return QualType(T, 0);
1932
1933 return getDerived().RebuildTypeOfType(Underlying);
1934}
1935
1936template<typename Derived>
1937QualType TreeTransform<Derived>::TransformDecltypeType(const DecltypeType *T) {
Douglas Gregor670444e2009-08-04 22:27:00 +00001938 // decltype expressions are not potentially evaluated contexts
1939 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1940
Douglas Gregor577f75a2009-08-04 16:50:30 +00001941 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
1942 if (E.isInvalid())
1943 return QualType();
1944
1945 if (!getDerived().AlwaysRebuild() &&
1946 E.get() == T->getUnderlyingExpr()) {
1947 E.take();
1948 return QualType(T, 0);
1949 }
1950
1951 return getDerived().RebuildDecltypeType(move(E));
1952}
1953
1954template<typename Derived>
1955QualType TreeTransform<Derived>::TransformRecordType(const RecordType *T) {
1956 RecordDecl *Record
1957 = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
1958 if (!Record)
1959 return QualType();
1960
1961 if (!getDerived().AlwaysRebuild() &&
1962 Record == T->getDecl())
1963 return QualType(T, 0);
1964
1965 return getDerived().RebuildRecordType(Record);
1966}
1967
1968template<typename Derived>
1969QualType TreeTransform<Derived>::TransformEnumType(const EnumType *T) {
1970 EnumDecl *Enum
1971 = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
1972 if (!Enum)
1973 return QualType();
1974
1975 if (!getDerived().AlwaysRebuild() &&
1976 Enum == T->getDecl())
1977 return QualType(T, 0);
1978
1979 return getDerived().RebuildEnumType(Enum);
1980}
1981
1982template<typename Derived>
1983QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
1984 const TemplateTypeParmType *T) {
1985 // Nothing to do
1986 return QualType(T, 0);
1987}
1988
1989template<typename Derived>
1990QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
1991 const TemplateSpecializationType *T) {
1992 TemplateName Template
1993 = getDerived().TransformTemplateName(T->getTemplateName());
1994 if (Template.isNull())
1995 return QualType();
1996
1997 llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs;
1998 NewTemplateArgs.reserve(T->getNumArgs());
1999 for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end();
2000 Arg != ArgEnd; ++Arg) {
2001 TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg);
2002 if (NewArg.isNull())
2003 return QualType();
2004
2005 NewTemplateArgs.push_back(NewArg);
2006 }
2007
2008 // FIXME: early abort if all of the template arguments and such are the
2009 // same.
2010
2011 // FIXME: We're missing the locations of the template name, '<', and '>'.
2012 return getDerived().RebuildTemplateSpecializationType(Template,
2013 NewTemplateArgs.data(),
2014 NewTemplateArgs.size());
2015}
2016
2017template<typename Derived>
2018QualType TreeTransform<Derived>::TransformQualifiedNameType(
2019 const QualifiedNameType *T) {
2020 NestedNameSpecifier *NNS
2021 = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2022 SourceRange());
2023 if (!NNS)
2024 return QualType();
2025
2026 QualType Named = getDerived().TransformType(T->getNamedType());
2027 if (Named.isNull())
2028 return QualType();
2029
2030 if (!getDerived().AlwaysRebuild() &&
2031 NNS == T->getQualifier() &&
2032 Named == T->getNamedType())
2033 return QualType(T, 0);
2034
2035 return getDerived().RebuildQualifiedNameType(NNS, Named);
2036}
2037
2038template<typename Derived>
2039QualType TreeTransform<Derived>::TransformTypenameType(const TypenameType *T) {
2040 NestedNameSpecifier *NNS
2041 = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
Douglas Gregor4a959d82009-08-06 16:20:37 +00002042 SourceRange(/*FIXME:*/getDerived().getBaseLocation()));
Douglas Gregor577f75a2009-08-04 16:50:30 +00002043 if (!NNS)
2044 return QualType();
2045
2046 if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
2047 QualType NewTemplateId
2048 = getDerived().TransformType(QualType(TemplateId, 0));
2049 if (NewTemplateId.isNull())
2050 return QualType();
2051
2052 if (!getDerived().AlwaysRebuild() &&
2053 NNS == T->getQualifier() &&
2054 NewTemplateId == QualType(TemplateId, 0))
2055 return QualType(T, 0);
2056
2057 return getDerived().RebuildTypenameType(NNS, NewTemplateId);
2058 }
2059
2060 return getDerived().RebuildTypenameType(NNS, T->getIdentifier());
2061}
2062
2063template<typename Derived>
2064QualType TreeTransform<Derived>::TransformObjCInterfaceType(
2065 const ObjCInterfaceType *T) {
2066 // FIXME: Implement
2067 return QualType(T, 0);
2068}
2069
2070template<typename Derived>
2071QualType TreeTransform<Derived>::TransformObjCObjectPointerType(
2072 const ObjCObjectPointerType *T) {
2073 // FIXME: Implement
2074 return QualType(T, 0);
2075}
2076
2077//===----------------------------------------------------------------------===//
Douglas Gregorb98b1992009-08-11 05:31:07 +00002078// Expression transformation
2079//===----------------------------------------------------------------------===//
2080template<typename Derived>
2081Sema::OwningExprResult
2082TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
2083 return SemaRef.Owned(E->Retain());
2084}
2085
2086template<typename Derived>
2087Sema::OwningExprResult
2088TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
2089 NamedDecl *ND
2090 = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
2091 if (!ND)
2092 return SemaRef.ExprError();
2093
2094 if (!getDerived().AlwaysRebuild() && ND == E->getDecl())
2095 return SemaRef.Owned(E->Retain());
2096
2097 return getDerived().RebuildDeclRefExpr(ND, E->getLocation());
2098}
2099
2100template<typename Derived>
2101Sema::OwningExprResult
2102TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
2103 return SemaRef.Owned(E->Retain());
2104}
2105
2106template<typename Derived>
2107Sema::OwningExprResult
2108TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
2109 return SemaRef.Owned(E->Retain());
2110}
2111
2112template<typename Derived>
2113Sema::OwningExprResult
2114TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
2115 return SemaRef.Owned(E->Retain());
2116}
2117
2118template<typename Derived>
2119Sema::OwningExprResult
2120TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
2121 return SemaRef.Owned(E->Retain());
2122}
2123
2124template<typename Derived>
2125Sema::OwningExprResult
2126TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
2127 return SemaRef.Owned(E->Retain());
2128}
2129
2130template<typename Derived>
2131Sema::OwningExprResult
2132TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
2133 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2134 if (SubExpr.isInvalid())
2135 return SemaRef.ExprError();
2136
2137 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
2138 return SemaRef.Owned(E->Retain());
2139
2140 return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
2141 E->getRParen());
2142}
2143
2144template<typename Derived>
2145Sema::OwningExprResult
2146TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
2147 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2148 if (SubExpr.isInvalid())
2149 return SemaRef.ExprError();
2150
2151 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
2152 return SemaRef.Owned(E->Retain());
2153
2154 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
2155 E->getOpcode(),
2156 move(SubExpr));
2157}
2158
2159template<typename Derived>
2160Sema::OwningExprResult
2161TreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
2162 if (E->isArgumentType()) {
2163 QualType T = getDerived().TransformType(E->getArgumentType());
2164 if (T.isNull())
2165 return SemaRef.ExprError();
2166
2167 if (!getDerived().AlwaysRebuild() && T == E->getArgumentType())
2168 return SemaRef.Owned(E->Retain());
2169
2170 return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(),
2171 E->isSizeOf(),
2172 E->getSourceRange());
2173 }
2174
2175 Sema::OwningExprResult SubExpr(SemaRef);
2176 {
2177 // C++0x [expr.sizeof]p1:
2178 // The operand is either an expression, which is an unevaluated operand
2179 // [...]
2180 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2181
2182 SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
2183 if (SubExpr.isInvalid())
2184 return SemaRef.ExprError();
2185
2186 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
2187 return SemaRef.Owned(E->Retain());
2188 }
2189
2190 return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
2191 E->isSizeOf(),
2192 E->getSourceRange());
2193}
2194
2195template<typename Derived>
2196Sema::OwningExprResult
2197TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
2198 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
2199 if (LHS.isInvalid())
2200 return SemaRef.ExprError();
2201
2202 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
2203 if (RHS.isInvalid())
2204 return SemaRef.ExprError();
2205
2206
2207 if (!getDerived().AlwaysRebuild() &&
2208 LHS.get() == E->getLHS() &&
2209 RHS.get() == E->getRHS())
2210 return SemaRef.Owned(E->Retain());
2211
2212 return getDerived().RebuildArraySubscriptExpr(move(LHS),
2213 /*FIXME:*/E->getLHS()->getLocStart(),
2214 move(RHS),
2215 E->getRBracketLoc());
2216}
2217
2218template<typename Derived>
2219Sema::OwningExprResult
2220TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
2221 // Transform the callee.
2222 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
2223 if (Callee.isInvalid())
2224 return SemaRef.ExprError();
2225
2226 // Transform arguments.
2227 bool ArgChanged = false;
2228 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
2229 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
2230 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
2231 OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
2232 if (Arg.isInvalid())
2233 return SemaRef.ExprError();
2234
2235 // FIXME: Wrong source location information for the ','.
2236 FakeCommaLocs.push_back(
2237 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
2238
2239 ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
2240 Args.push_back(Arg.takeAs<Expr>());
2241 }
2242
2243 if (!getDerived().AlwaysRebuild() &&
2244 Callee.get() == E->getCallee() &&
2245 !ArgChanged)
2246 return SemaRef.Owned(E->Retain());
2247
2248 // FIXME: Wrong source location information for the '('.
2249 SourceLocation FakeLParenLoc
2250 = ((Expr *)Callee.get())->getSourceRange().getBegin();
2251 return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
2252 move_arg(Args),
2253 FakeCommaLocs.data(),
2254 E->getRParenLoc());
2255}
2256
2257template<typename Derived>
2258Sema::OwningExprResult
2259TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
2260 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
2261 if (Base.isInvalid())
2262 return SemaRef.ExprError();
2263
2264 NamedDecl *Member
2265 = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
2266 if (!Member)
2267 return SemaRef.ExprError();
2268
2269 if (!getDerived().AlwaysRebuild() &&
2270 Base.get() == E->getBase() &&
2271 Member == E->getMemberDecl())
2272 return SemaRef.Owned(E->Retain());
2273
2274 // FIXME: Bogus source location for the operator
2275 SourceLocation FakeOperatorLoc
2276 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
2277
2278 return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
2279 E->isArrow(),
2280 E->getMemberLoc(),
2281 Member);
2282}
2283
2284template<typename Derived>
2285Sema::OwningExprResult
2286TreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
2287 assert(false && "Cannot transform abstract class");
2288 return SemaRef.Owned(E->Retain());
2289}
2290
2291template<typename Derived>
2292Sema::OwningExprResult
2293TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
2294 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
2295 if (LHS.isInvalid())
2296 return SemaRef.ExprError();
2297
2298 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
2299 if (RHS.isInvalid())
2300 return SemaRef.ExprError();
2301
2302 if (!getDerived().AlwaysRebuild() &&
2303 LHS.get() == E->getLHS() &&
2304 RHS.get() == E->getRHS())
2305 return SemaRef.Owned(E->Retain());
2306
2307 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
2308 move(LHS), move(RHS));
2309}
2310
2311template<typename Derived>
2312Sema::OwningExprResult
2313TreeTransform<Derived>::TransformCompoundAssignOperator(
2314 CompoundAssignOperator *E) {
2315 return getDerived().TransformBinaryOperator(E);
2316}
2317
2318template<typename Derived>
2319Sema::OwningExprResult
2320TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
2321 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
2322 if (Cond.isInvalid())
2323 return SemaRef.ExprError();
2324
2325 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
2326 if (LHS.isInvalid())
2327 return SemaRef.ExprError();
2328
2329 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
2330 if (RHS.isInvalid())
2331 return SemaRef.ExprError();
2332
2333 if (!getDerived().AlwaysRebuild() &&
2334 Cond.get() == E->getCond() &&
2335 LHS.get() == E->getLHS() &&
2336 RHS.get() == E->getRHS())
2337 return SemaRef.Owned(E->Retain());
2338
2339 // FIXM: ? and : locations are broken.
2340 SourceLocation FakeQuestionLoc = E->getCond()->getLocEnd();
2341 SourceLocation FakeColonLoc = E->getFalseExpr()->getLocStart();
2342 return getDerived().RebuildConditionalOperator(move(Cond),
2343 FakeQuestionLoc,
2344 move(LHS),
2345 FakeColonLoc,
2346 move(RHS));
2347}
2348
2349template<typename Derived>
2350Sema::OwningExprResult
2351TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
2352 QualType T = getDerived().TransformType(E->getType());
2353 if (T.isNull())
2354 return SemaRef.ExprError();
2355
2356 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2357 if (SubExpr.isInvalid())
2358 return SemaRef.ExprError();
2359
2360 if (!getDerived().AlwaysRebuild() &&
2361 T == E->getType() &&
2362 SubExpr.get() == E->getSubExpr())
2363 return SemaRef.Owned(E->Retain());
2364
2365 return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
2366 move(SubExpr),
2367 E->isLvalueCast());
2368}
2369
2370template<typename Derived>
2371Sema::OwningExprResult
2372TreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
2373 assert(false && "Cannot transform abstract class");
2374 return SemaRef.Owned(E->Retain());
2375}
2376
2377template<typename Derived>
2378Sema::OwningExprResult
2379TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
2380 QualType T;
2381 {
2382 // FIXME: Source location isn't quite accurate.
2383 SourceLocation TypeStartLoc
2384 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
2385 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
2386
2387 T = getDerived().TransformType(E->getTypeAsWritten());
2388 if (T.isNull())
2389 return SemaRef.ExprError();
2390 }
2391
2392 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2393 if (SubExpr.isInvalid())
2394 return SemaRef.ExprError();
2395
2396 if (!getDerived().AlwaysRebuild() &&
2397 T == E->getTypeAsWritten() &&
2398 SubExpr.get() == E->getSubExpr())
2399 return SemaRef.Owned(E->Retain());
2400
2401 return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
2402 E->getRParenLoc(),
2403 move(SubExpr));
2404}
2405
2406template<typename Derived>
2407Sema::OwningExprResult
2408TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
2409 QualType T;
2410 {
2411 // FIXME: Source location isn't quite accurate.
2412 SourceLocation FakeTypeLoc
2413 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
2414 TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
2415
2416 T = getDerived().TransformType(E->getType());
2417 if (T.isNull())
2418 return SemaRef.ExprError();
2419 }
2420
2421 OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
2422 if (Init.isInvalid())
2423 return SemaRef.ExprError();
2424
2425 if (!getDerived().AlwaysRebuild() &&
2426 T == E->getType() &&
2427 Init.get() == E->getInitializer())
2428 return SemaRef.Owned(E->Retain());
2429
2430 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
2431 /*FIXME:*/E->getInitializer()->getLocEnd(),
2432 move(Init));
2433}
2434
2435template<typename Derived>
2436Sema::OwningExprResult
2437TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
2438 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
2439 if (Base.isInvalid())
2440 return SemaRef.ExprError();
2441
2442 if (!getDerived().AlwaysRebuild() &&
2443 Base.get() == E->getBase())
2444 return SemaRef.Owned(E->Retain());
2445
2446 // FIXME: Bad source location
2447 SourceLocation FakeOperatorLoc
2448 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
2449 return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
2450 E->getAccessorLoc(),
2451 E->getAccessor());
2452}
2453
2454template<typename Derived>
2455Sema::OwningExprResult
2456TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
2457 bool InitChanged = false;
2458
2459 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
2460 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
2461 OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
2462 if (Init.isInvalid())
2463 return SemaRef.ExprError();
2464
2465 InitChanged = InitChanged || Init.get() != E->getInit(I);
2466 Inits.push_back(Init.takeAs<Expr>());
2467 }
2468
2469 if (!getDerived().AlwaysRebuild() && !InitChanged)
2470 return SemaRef.Owned(E->Retain());
2471
2472 return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
2473 E->getRBraceLoc());
2474}
2475
2476template<typename Derived>
2477Sema::OwningExprResult
2478TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
2479 Designation Desig;
2480
2481 // Instantiate the initializer value
2482 OwningExprResult Init = getDerived().TransformExpr(E->getInit());
2483 if (Init.isInvalid())
2484 return SemaRef.ExprError();
2485
2486 // Instantiate the designators.
2487 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
2488 bool ExprChanged = false;
2489 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
2490 DEnd = E->designators_end();
2491 D != DEnd; ++D) {
2492 if (D->isFieldDesignator()) {
2493 Desig.AddDesignator(Designator::getField(D->getFieldName(),
2494 D->getDotLoc(),
2495 D->getFieldLoc()));
2496 continue;
2497 }
2498
2499 if (D->isArrayDesignator()) {
2500 OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
2501 if (Index.isInvalid())
2502 return SemaRef.ExprError();
2503
2504 Desig.AddDesignator(Designator::getArray(Index.get(),
2505 D->getLBracketLoc()));
2506
2507 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
2508 ArrayExprs.push_back(Index.release());
2509 continue;
2510 }
2511
2512 assert(D->isArrayRangeDesignator() && "New kind of designator?");
2513 OwningExprResult Start
2514 = getDerived().TransformExpr(E->getArrayRangeStart(*D));
2515 if (Start.isInvalid())
2516 return SemaRef.ExprError();
2517
2518 OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
2519 if (End.isInvalid())
2520 return SemaRef.ExprError();
2521
2522 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
2523 End.get(),
2524 D->getLBracketLoc(),
2525 D->getEllipsisLoc()));
2526
2527 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
2528 End.get() != E->getArrayRangeEnd(*D);
2529
2530 ArrayExprs.push_back(Start.release());
2531 ArrayExprs.push_back(End.release());
2532 }
2533
2534 if (!getDerived().AlwaysRebuild() &&
2535 Init.get() == E->getInit() &&
2536 !ExprChanged)
2537 return SemaRef.Owned(E->Retain());
2538
2539 return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
2540 E->getEqualOrColonLoc(),
2541 E->usesGNUSyntax(), move(Init));
2542}
2543
2544template<typename Derived>
2545Sema::OwningExprResult
2546TreeTransform<Derived>::TransformImplicitValueInitExpr(
2547 ImplicitValueInitExpr *E) {
2548 QualType T = getDerived().TransformType(E->getType());
2549 if (T.isNull())
2550 return SemaRef.ExprError();
2551
2552 if (!getDerived().AlwaysRebuild() &&
2553 T == E->getType())
2554 return SemaRef.Owned(E->Retain());
2555
2556 return getDerived().RebuildImplicitValueInitExpr(T);
2557}
2558
2559template<typename Derived>
2560Sema::OwningExprResult
2561TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
2562 // FIXME: Do we want the type as written?
2563 QualType T;
2564
2565 {
2566 // FIXME: Source location isn't quite accurate.
2567 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
2568 T = getDerived().TransformType(E->getType());
2569 if (T.isNull())
2570 return SemaRef.ExprError();
2571 }
2572
2573 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2574 if (SubExpr.isInvalid())
2575 return SemaRef.ExprError();
2576
2577 if (!getDerived().AlwaysRebuild() &&
2578 T == E->getType() &&
2579 SubExpr.get() == E->getSubExpr())
2580 return SemaRef.Owned(E->Retain());
2581
2582 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
2583 T, E->getRParenLoc());
2584}
2585
2586template<typename Derived>
2587Sema::OwningExprResult
2588TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
2589 bool ArgumentChanged = false;
2590 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
2591 for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
2592 OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
2593 if (Init.isInvalid())
2594 return SemaRef.ExprError();
2595
2596 ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
2597 Inits.push_back(Init.takeAs<Expr>());
2598 }
2599
2600 return getDerived().RebuildParenListExpr(E->getLParenLoc(),
2601 move_arg(Inits),
2602 E->getRParenLoc());
2603}
2604
2605/// \brief Transform an address-of-label expression.
2606///
2607/// By default, the transformation of an address-of-label expression always
2608/// rebuilds the expression, so that the label identifier can be resolved to
2609/// the corresponding label statement by semantic analysis.
2610template<typename Derived>
2611Sema::OwningExprResult
2612TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
2613 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
2614 E->getLabel());
2615}
2616
2617template<typename Derived>
2618Sema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
2619 OwningStmtResult SubStmt
2620 = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
2621 if (SubStmt.isInvalid())
2622 return SemaRef.ExprError();
2623
2624 if (!getDerived().AlwaysRebuild() &&
2625 SubStmt.get() == E->getSubStmt())
2626 return SemaRef.Owned(E->Retain());
2627
2628 return getDerived().RebuildStmtExpr(E->getLParenLoc(),
2629 move(SubStmt),
2630 E->getRParenLoc());
2631}
2632
2633template<typename Derived>
2634Sema::OwningExprResult
2635TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
2636 QualType T1, T2;
2637 {
2638 // FIXME: Source location isn't quite accurate.
2639 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
2640
2641 T1 = getDerived().TransformType(E->getArgType1());
2642 if (T1.isNull())
2643 return SemaRef.ExprError();
2644
2645 T2 = getDerived().TransformType(E->getArgType2());
2646 if (T2.isNull())
2647 return SemaRef.ExprError();
2648 }
2649
2650 if (!getDerived().AlwaysRebuild() &&
2651 T1 == E->getArgType1() &&
2652 T2 == E->getArgType2())
2653 return SemaRef.Owned(E->Retain());
2654
2655 return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
2656 T1, T2, E->getRParenLoc());
2657}
2658
2659template<typename Derived>
2660Sema::OwningExprResult
2661TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
2662 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
2663 if (Cond.isInvalid())
2664 return SemaRef.ExprError();
2665
2666 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
2667 if (LHS.isInvalid())
2668 return SemaRef.ExprError();
2669
2670 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
2671 if (RHS.isInvalid())
2672 return SemaRef.ExprError();
2673
2674 if (!getDerived().AlwaysRebuild() &&
2675 Cond.get() == E->getCond() &&
2676 LHS.get() == E->getLHS() &&
2677 RHS.get() == E->getRHS())
2678 return SemaRef.Owned(E->Retain());
2679
2680 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
2681 move(Cond), move(LHS), move(RHS),
2682 E->getRParenLoc());
2683}
2684
2685template<typename Derived>
2686Sema::OwningExprResult
2687TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
2688 return SemaRef.Owned(E->Retain());
2689}
2690
2691template<typename Derived>
2692Sema::OwningExprResult
2693TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
2694 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
2695 if (Callee.isInvalid())
2696 return SemaRef.ExprError();
2697
2698 OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
2699 if (First.isInvalid())
2700 return SemaRef.ExprError();
2701
2702 OwningExprResult Second(SemaRef);
2703 if (E->getNumArgs() == 2) {
2704 Second = getDerived().TransformExpr(E->getArg(1));
2705 if (Second.isInvalid())
2706 return SemaRef.ExprError();
2707 }
2708
2709 if (!getDerived().AlwaysRebuild() &&
2710 Callee.get() == E->getCallee() &&
2711 First.get() == E->getArg(0) &&
2712 (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
2713 return SemaRef.Owned(E->Retain());
2714
2715 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
2716 E->getOperatorLoc(),
2717 move(Callee),
2718 move(First),
2719 move(Second));
2720}
2721
2722template<typename Derived>
2723Sema::OwningExprResult
2724TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
2725 return getDerived().TransformCallExpr(E);
2726}
2727
2728template<typename Derived>
2729Sema::OwningExprResult
2730TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
2731 QualType ExplicitTy;
2732 {
2733 // FIXME: Source location isn't quite accurate.
2734 SourceLocation TypeStartLoc
2735 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
2736 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
2737
2738 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
2739 if (ExplicitTy.isNull())
2740 return SemaRef.ExprError();
2741 }
2742
2743 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2744 if (SubExpr.isInvalid())
2745 return SemaRef.ExprError();
2746
2747 if (!getDerived().AlwaysRebuild() &&
2748 ExplicitTy == E->getTypeAsWritten() &&
2749 SubExpr.get() == E->getSubExpr())
2750 return SemaRef.Owned(E->Retain());
2751
2752 // FIXME: Poor source location information here.
2753 SourceLocation FakeLAngleLoc
2754 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
2755 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
2756 SourceLocation FakeRParenLoc
2757 = SemaRef.PP.getLocForEndOfToken(
2758 E->getSubExpr()->getSourceRange().getEnd());
2759 return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
2760 E->getStmtClass(),
2761 FakeLAngleLoc,
2762 ExplicitTy,
2763 FakeRAngleLoc,
2764 FakeRAngleLoc,
2765 move(SubExpr),
2766 FakeRParenLoc);
2767}
2768
2769template<typename Derived>
2770Sema::OwningExprResult
2771TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
2772 return getDerived().TransformCXXNamedCastExpr(E);
2773}
2774
2775template<typename Derived>
2776Sema::OwningExprResult
2777TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
2778 return getDerived().TransformCXXNamedCastExpr(E);
2779}
2780
2781template<typename Derived>
2782Sema::OwningExprResult
2783TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
2784 CXXReinterpretCastExpr *E) {
2785 return getDerived().TransformCXXNamedCastExpr(E);
2786}
2787
2788template<typename Derived>
2789Sema::OwningExprResult
2790TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
2791 return getDerived().TransformCXXNamedCastExpr(E);
2792}
2793
2794template<typename Derived>
2795Sema::OwningExprResult
2796TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
2797 CXXFunctionalCastExpr *E) {
2798 QualType ExplicitTy;
2799 {
2800 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
2801
2802 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
2803 if (ExplicitTy.isNull())
2804 return SemaRef.ExprError();
2805 }
2806
2807 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2808 if (SubExpr.isInvalid())
2809 return SemaRef.ExprError();
2810
2811 if (!getDerived().AlwaysRebuild() &&
2812 ExplicitTy == E->getTypeAsWritten() &&
2813 SubExpr.get() == E->getSubExpr())
2814 return SemaRef.Owned(E->Retain());
2815
2816 // FIXME: The end of the type's source range is wrong
2817 return getDerived().RebuildCXXFunctionalCastExpr(
2818 /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
2819 ExplicitTy,
2820 /*FIXME:*/E->getSubExpr()->getLocStart(),
2821 move(SubExpr),
2822 E->getRParenLoc());
2823}
2824
2825template<typename Derived>
2826Sema::OwningExprResult
2827TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
2828 if (E->isTypeOperand()) {
2829 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
2830
2831 QualType T = getDerived().TransformType(E->getTypeOperand());
2832 if (T.isNull())
2833 return SemaRef.ExprError();
2834
2835 if (!getDerived().AlwaysRebuild() &&
2836 T == E->getTypeOperand())
2837 return SemaRef.Owned(E->Retain());
2838
2839 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
2840 /*FIXME:*/E->getLocStart(),
2841 T,
2842 E->getLocEnd());
2843 }
2844
2845 // We don't know whether the expression is potentially evaluated until
2846 // after we perform semantic analysis, so the expression is potentially
2847 // potentially evaluated.
2848 EnterExpressionEvaluationContext Unevaluated(SemaRef,
2849 Action::PotentiallyPotentiallyEvaluated);
2850
2851 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
2852 if (SubExpr.isInvalid())
2853 return SemaRef.ExprError();
2854
2855 if (!getDerived().AlwaysRebuild() &&
2856 SubExpr.get() == E->getExprOperand())
2857 return SemaRef.Owned(E->Retain());
2858
2859 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
2860 /*FIXME:*/E->getLocStart(),
2861 move(SubExpr),
2862 E->getLocEnd());
2863}
2864
2865template<typename Derived>
2866Sema::OwningExprResult
2867TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
2868 return SemaRef.Owned(E->Retain());
2869}
2870
2871template<typename Derived>
2872Sema::OwningExprResult
2873TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
2874 CXXNullPtrLiteralExpr *E) {
2875 return SemaRef.Owned(E->Retain());
2876}
2877
2878template<typename Derived>
2879Sema::OwningExprResult
2880TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
2881 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
2882
2883 QualType T = getDerived().TransformType(E->getType());
2884 if (T.isNull())
2885 return SemaRef.ExprError();
2886
2887 if (!getDerived().AlwaysRebuild() &&
2888 T == E->getType())
2889 return SemaRef.Owned(E->Retain());
2890
2891 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
2892}
2893
2894template<typename Derived>
2895Sema::OwningExprResult
2896TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
2897 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2898 if (SubExpr.isInvalid())
2899 return SemaRef.ExprError();
2900
2901 if (!getDerived().AlwaysRebuild() &&
2902 SubExpr.get() == E->getSubExpr())
2903 return SemaRef.Owned(E->Retain());
2904
2905 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
2906}
2907
2908template<typename Derived>
2909Sema::OwningExprResult
2910TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
2911 ParmVarDecl *Param
2912 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
2913 if (!Param)
2914 return SemaRef.ExprError();
2915
2916 if (getDerived().AlwaysRebuild() &&
2917 Param == E->getParam())
2918 return SemaRef.Owned(E->Retain());
2919
2920 return getDerived().RebuildCXXDefaultArgExpr(Param);
2921}
2922
2923template<typename Derived>
2924Sema::OwningExprResult
2925TreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
2926 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
2927
2928 QualType T = getDerived().TransformType(E->getType());
2929 if (T.isNull())
2930 return SemaRef.ExprError();
2931
2932 if (!getDerived().AlwaysRebuild() &&
2933 T == E->getType())
2934 return SemaRef.Owned(E->Retain());
2935
2936 return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
2937 /*FIXME:*/E->getTypeBeginLoc(),
2938 T,
2939 E->getRParenLoc());
2940}
2941
2942template<typename Derived>
2943Sema::OwningExprResult
2944TreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
2945 VarDecl *Var
2946 = cast_or_null<VarDecl>(getDerived().TransformDecl(E->getVarDecl()));
2947 if (!Var)
2948 return SemaRef.ExprError();
2949
2950 if (!getDerived().AlwaysRebuild() &&
2951 Var == E->getVarDecl())
2952 return SemaRef.Owned(E->Retain());
2953
2954 return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
2955 /*FIXME:*/E->getStartLoc(),
2956 Var);
2957}
2958
2959template<typename Derived>
2960Sema::OwningExprResult
2961TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
2962 // Transform the type that we're allocating
2963 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
2964 QualType AllocType = getDerived().TransformType(E->getAllocatedType());
2965 if (AllocType.isNull())
2966 return SemaRef.ExprError();
2967
2968 // Transform the size of the array we're allocating (if any).
2969 OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
2970 if (ArraySize.isInvalid())
2971 return SemaRef.ExprError();
2972
2973 // Transform the placement arguments (if any).
2974 bool ArgumentChanged = false;
2975 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
2976 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
2977 OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
2978 if (Arg.isInvalid())
2979 return SemaRef.ExprError();
2980
2981 ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
2982 PlacementArgs.push_back(Arg.take());
2983 }
2984
2985 // Instantiate the constructor arguments (if any).
2986 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
2987 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
2988 OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
2989 if (Arg.isInvalid())
2990 return SemaRef.ExprError();
2991
2992 ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
2993 ConstructorArgs.push_back(Arg.take());
2994 }
2995
2996 if (!getDerived().AlwaysRebuild() &&
2997 AllocType == E->getAllocatedType() &&
2998 ArraySize.get() == E->getArraySize() &&
2999 !ArgumentChanged)
3000 return SemaRef.Owned(E->Retain());
3001
3002 return getDerived().RebuildCXXNewExpr(E->getLocStart(),
3003 E->isGlobalNew(),
3004 /*FIXME:*/E->getLocStart(),
3005 move_arg(PlacementArgs),
3006 /*FIXME:*/E->getLocStart(),
3007 E->isParenTypeId(),
3008 AllocType,
3009 /*FIXME:*/E->getLocStart(),
3010 /*FIXME:*/SourceRange(),
3011 move(ArraySize),
3012 /*FIXME:*/E->getLocStart(),
3013 move_arg(ConstructorArgs),
3014 E->getLocEnd());
3015}
3016
3017template<typename Derived>
3018Sema::OwningExprResult
3019TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
3020 OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
3021 if (Operand.isInvalid())
3022 return SemaRef.ExprError();
3023
3024 if (!getDerived().AlwaysRebuild() &&
3025 Operand.get() == E->getArgument())
3026 return SemaRef.Owned(E->Retain());
3027
3028 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
3029 E->isGlobalDelete(),
3030 E->isArrayForm(),
3031 move(Operand));
3032}
3033
3034template<typename Derived>
3035Sema::OwningExprResult
3036TreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
3037 UnresolvedFunctionNameExpr *E) {
3038 // There is no transformation we can apply to an unresolved function name.
3039 return SemaRef.Owned(E->Retain());
3040}
3041
3042template<typename Derived>
3043Sema::OwningExprResult
3044TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
3045 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
3046
3047 QualType T = getDerived().TransformType(E->getQueriedType());
3048 if (T.isNull())
3049 return SemaRef.ExprError();
3050
3051 if (!getDerived().AlwaysRebuild() &&
3052 T == E->getQueriedType())
3053 return SemaRef.Owned(E->Retain());
3054
3055 // FIXME: Bad location information
3056 SourceLocation FakeLParenLoc
3057 = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
3058
3059 return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
3060 E->getLocStart(),
3061 /*FIXME:*/FakeLParenLoc,
3062 T,
3063 E->getLocEnd());
3064}
3065
3066template<typename Derived>
3067Sema::OwningExprResult
3068TreeTransform<Derived>::TransformQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
3069 NestedNameSpecifier *NNS
3070 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3071 E->getQualifierRange());
3072 if (!NNS)
3073 return SemaRef.ExprError();
3074
3075 NamedDecl *ND
3076 = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3077 if (!ND)
3078 return SemaRef.ExprError();
3079
3080 if (!getDerived().AlwaysRebuild() &&
3081 NNS == E->getQualifier() &&
3082 ND == E->getDecl())
3083 return SemaRef.Owned(E->Retain());
3084
3085 return getDerived().RebuildQualifiedDeclRefExpr(NNS,
3086 E->getQualifierRange(),
3087 ND,
3088 E->getLocation(),
3089 /*FIXME:*/false);
3090}
3091
3092template<typename Derived>
3093Sema::OwningExprResult
3094TreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
3095 UnresolvedDeclRefExpr *E) {
3096 NestedNameSpecifier *NNS
3097 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3098 E->getQualifierRange());
3099 if (!NNS)
3100 return SemaRef.ExprError();
3101
3102 // FIXME: Transform the declaration name
3103 DeclarationName Name = E->getDeclName();
3104
3105 if (!getDerived().AlwaysRebuild() &&
3106 NNS == E->getQualifier() &&
3107 Name == E->getDeclName())
3108 return SemaRef.Owned(E->Retain());
3109
3110 return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
3111 E->getQualifierRange(),
3112 Name,
3113 E->getLocation(),
3114 /*FIXME:*/false);
3115}
3116
3117template<typename Derived>
3118Sema::OwningExprResult
3119TreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) {
3120 TemplateName Template
3121 = getDerived().TransformTemplateName(E->getTemplateName());
3122 if (Template.isNull())
3123 return SemaRef.ExprError();
3124
3125 llvm::SmallVector<TemplateArgument, 4> TransArgs;
3126 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3127 TemplateArgument TransArg
3128 = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
3129 if (TransArg.isNull())
3130 return SemaRef.ExprError();
3131
3132 TransArgs.push_back(TransArg);
3133 }
3134
3135 // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
3136 // compare template arguments (yet).
3137
3138 // FIXME: It's possible that we'll find out now that the template name
3139 // actually refers to a type, in which case the caller is actually dealing
3140 // with a functional cast. Give a reasonable error message!
3141 return getDerived().RebuildTemplateIdExpr(Template, E->getTemplateNameLoc(),
3142 E->getLAngleLoc(),
3143 TransArgs.data(),
3144 TransArgs.size(),
3145 E->getRAngleLoc());
3146}
3147
3148template<typename Derived>
3149Sema::OwningExprResult
3150TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
3151 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
3152
3153 QualType T = getDerived().TransformType(E->getType());
3154 if (T.isNull())
3155 return SemaRef.ExprError();
3156
3157 CXXConstructorDecl *Constructor
3158 = cast_or_null<CXXConstructorDecl>(
3159 getDerived().TransformDecl(E->getConstructor()));
3160 if (!Constructor)
3161 return SemaRef.ExprError();
3162
3163 bool ArgumentChanged = false;
3164 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3165 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
3166 ArgEnd = E->arg_end();
3167 Arg != ArgEnd; ++Arg) {
3168 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
3169 if (TransArg.isInvalid())
3170 return SemaRef.ExprError();
3171
3172 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
3173 Args.push_back(TransArg.takeAs<Expr>());
3174 }
3175
3176 if (!getDerived().AlwaysRebuild() &&
3177 T == E->getType() &&
3178 Constructor == E->getConstructor() &&
3179 !ArgumentChanged)
3180 return SemaRef.Owned(E->Retain());
3181
3182 return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
3183 move_arg(Args));
3184}
3185
3186/// \brief Transform a C++ temporary-binding expression.
3187///
3188/// The transformation of a temporary-binding expression always attempts to
3189/// bind a new temporary variable to its subexpression, even if the
3190/// subexpression itself did not change, because the temporary variable itself
3191/// must be unique.
3192template<typename Derived>
3193Sema::OwningExprResult
3194TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
3195 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3196 if (SubExpr.isInvalid())
3197 return SemaRef.ExprError();
3198
3199 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
3200}
3201
3202/// \brief Transform a C++ expression that contains temporaries that should
3203/// be destroyed after the expression is evaluated.
3204///
3205/// The transformation of a full expression always attempts to build a new
3206/// CXXExprWithTemporaries expression, even if the
3207/// subexpression itself did not change, because it will need to capture the
3208/// the new temporary variables introduced in the subexpression.
3209template<typename Derived>
3210Sema::OwningExprResult
3211TreeTransform<Derived>::TransformCXXExprWithTemporaries(
3212 CXXExprWithTemporaries *E) {
3213 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3214 if (SubExpr.isInvalid())
3215 return SemaRef.ExprError();
3216
3217 return SemaRef.Owned(
3218 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
3219 E->shouldDestroyTemporaries()));
3220}
3221
3222template<typename Derived>
3223Sema::OwningExprResult
3224TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
3225 CXXTemporaryObjectExpr *E) {
3226 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3227 QualType T = getDerived().TransformType(E->getType());
3228 if (T.isNull())
3229 return SemaRef.ExprError();
3230
3231 CXXConstructorDecl *Constructor
3232 = cast_or_null<CXXConstructorDecl>(
3233 getDerived().TransformDecl(E->getConstructor()));
3234 if (!Constructor)
3235 return SemaRef.ExprError();
3236
3237 bool ArgumentChanged = false;
3238 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3239 Args.reserve(E->getNumArgs());
3240 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
3241 ArgEnd = E->arg_end();
3242 Arg != ArgEnd; ++Arg) {
3243 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
3244 if (TransArg.isInvalid())
3245 return SemaRef.ExprError();
3246
3247 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
3248 Args.push_back((Expr *)TransArg.release());
3249 }
3250
3251 if (!getDerived().AlwaysRebuild() &&
3252 T == E->getType() &&
3253 Constructor == E->getConstructor() &&
3254 !ArgumentChanged)
3255 return SemaRef.Owned(E->Retain());
3256
3257 // FIXME: Bogus location information
3258 SourceLocation CommaLoc;
3259 if (Args.size() > 1) {
3260 Expr *First = (Expr *)Args[0];
3261 CommaLoc
3262 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
3263 }
3264 return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
3265 T,
3266 /*FIXME:*/E->getTypeBeginLoc(),
3267 move_arg(Args),
3268 &CommaLoc,
3269 E->getLocEnd());
3270}
3271
3272template<typename Derived>
3273Sema::OwningExprResult
3274TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
3275 CXXUnresolvedConstructExpr *E) {
3276 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3277 QualType T = getDerived().TransformType(E->getTypeAsWritten());
3278 if (T.isNull())
3279 return SemaRef.ExprError();
3280
3281 bool ArgumentChanged = false;
3282 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3283 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
3284 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
3285 ArgEnd = E->arg_end();
3286 Arg != ArgEnd; ++Arg) {
3287 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
3288 if (TransArg.isInvalid())
3289 return SemaRef.ExprError();
3290
3291 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
3292 FakeCommaLocs.push_back(
3293 SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
3294 Args.push_back(TransArg.takeAs<Expr>());
3295 }
3296
3297 if (!getDerived().AlwaysRebuild() &&
3298 T == E->getTypeAsWritten() &&
3299 !ArgumentChanged)
3300 return SemaRef.Owned(E->Retain());
3301
3302 // FIXME: we're faking the locations of the commas
3303 return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
3304 T,
3305 E->getLParenLoc(),
3306 move_arg(Args),
3307 FakeCommaLocs.data(),
3308 E->getRParenLoc());
3309}
3310
3311template<typename Derived>
3312Sema::OwningExprResult
3313TreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
3314 CXXUnresolvedMemberExpr *E) {
3315 // Transform the base of the expression.
3316 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3317 if (Base.isInvalid())
3318 return SemaRef.ExprError();
3319
3320 // FIXME: Transform the declaration name
3321 DeclarationName Name = E->getMember();
3322
3323 if (!getDerived().AlwaysRebuild() &&
3324 Base.get() == E->getBase() &&
3325 Name == E->getMember())
3326 return SemaRef.Owned(E->Retain());
3327
3328 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
3329 E->isArrow(),
3330 E->getOperatorLoc(),
3331 E->getMember(),
3332 E->getMemberLoc());
3333}
3334
3335template<typename Derived>
3336Sema::OwningExprResult
3337TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
3338 return SemaRef.Owned(E->Retain());
3339}
3340
3341template<typename Derived>
3342Sema::OwningExprResult
3343TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
3344 // FIXME: poor source location
3345 TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
3346 QualType EncodedType = getDerived().TransformType(E->getEncodedType());
3347 if (EncodedType.isNull())
3348 return SemaRef.ExprError();
3349
3350 if (!getDerived().AlwaysRebuild() &&
3351 EncodedType == E->getEncodedType())
3352 return SemaRef.Owned(E->Retain());
3353
3354 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
3355 EncodedType,
3356 E->getRParenLoc());
3357}
3358
3359template<typename Derived>
3360Sema::OwningExprResult
3361TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
3362 // FIXME: Implement this!
3363 assert(false && "Cannot transform Objective-C expressions yet");
3364 return SemaRef.Owned(E->Retain());
3365}
3366
3367template<typename Derived>
3368Sema::OwningExprResult
3369TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
3370 return SemaRef.Owned(E->Retain());
3371}
3372
3373template<typename Derived>
3374Sema::OwningExprResult
3375TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
3376 ObjCProtocolDecl *Protocol
3377 = cast_or_null<ObjCProtocolDecl>(
3378 getDerived().TransformDecl(E->getProtocol()));
3379 if (!Protocol)
3380 return SemaRef.ExprError();
3381
3382 if (!getDerived().AlwaysRebuild() &&
3383 Protocol == E->getProtocol())
3384 return SemaRef.Owned(E->Retain());
3385
3386 return getDerived().RebuildObjCProtocolExpr(Protocol,
3387 E->getAtLoc(),
3388 /*FIXME:*/E->getAtLoc(),
3389 /*FIXME:*/E->getAtLoc(),
3390 E->getRParenLoc());
3391
3392}
3393
3394template<typename Derived>
3395Sema::OwningExprResult
3396TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
3397 // FIXME: Implement this!
3398 assert(false && "Cannot transform Objective-C expressions yet");
3399 return SemaRef.Owned(E->Retain());
3400}
3401
3402template<typename Derived>
3403Sema::OwningExprResult
3404TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
3405 // FIXME: Implement this!
3406 assert(false && "Cannot transform Objective-C expressions yet");
3407 return SemaRef.Owned(E->Retain());
3408}
3409
3410template<typename Derived>
3411Sema::OwningExprResult
3412TreeTransform<Derived>::TransformObjCKVCRefExpr(ObjCKVCRefExpr *E) {
3413 // FIXME: Implement this!
3414 assert(false && "Cannot transform Objective-C expressions yet");
3415 return SemaRef.Owned(E->Retain());
3416}
3417
3418template<typename Derived>
3419Sema::OwningExprResult
3420TreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
3421 // FIXME: Implement this!
3422 assert(false && "Cannot transform Objective-C expressions yet");
3423 return SemaRef.Owned(E->Retain());
3424}
3425
3426template<typename Derived>
3427Sema::OwningExprResult
3428TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
3429 // FIXME: Implement this!
3430 assert(false && "Cannot transform Objective-C expressions yet");
3431 return SemaRef.Owned(E->Retain());
3432}
3433
3434template<typename Derived>
3435Sema::OwningExprResult
3436TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
3437 bool ArgumentChanged = false;
3438 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
3439 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
3440 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
3441 if (SubExpr.isInvalid())
3442 return SemaRef.ExprError();
3443
3444 ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
3445 SubExprs.push_back(SubExpr.takeAs<Expr>());
3446 }
3447
3448 if (!getDerived().AlwaysRebuild() &&
3449 !ArgumentChanged)
3450 return SemaRef.Owned(E->Retain());
3451
3452 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
3453 move_arg(SubExprs),
3454 E->getRParenLoc());
3455}
3456
3457template<typename Derived>
3458Sema::OwningExprResult
3459TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
3460 // FIXME: Implement this!
3461 assert(false && "Cannot transform block expressions yet");
3462 return SemaRef.Owned(E->Retain());
3463}
3464
3465template<typename Derived>
3466Sema::OwningExprResult
3467TreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
3468 // FIXME: Implement this!
3469 assert(false && "Cannot transform block-related expressions yet");
3470 return SemaRef.Owned(E->Retain());
3471}
3472
3473//===----------------------------------------------------------------------===//
Douglas Gregor577f75a2009-08-04 16:50:30 +00003474// Type reconstruction
3475//===----------------------------------------------------------------------===//
3476
3477template<typename Derived>
3478QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) {
3479 return SemaRef.BuildPointerType(PointeeType, 0,
3480 getDerived().getBaseLocation(),
3481 getDerived().getBaseEntity());
3482}
3483
3484template<typename Derived>
3485QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) {
3486 return SemaRef.BuildBlockPointerType(PointeeType, 0,
3487 getDerived().getBaseLocation(),
3488 getDerived().getBaseEntity());
3489}
3490
3491template<typename Derived>
3492QualType
3493TreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) {
3494 return SemaRef.BuildReferenceType(ReferentType, true, 0,
3495 getDerived().getBaseLocation(),
3496 getDerived().getBaseEntity());
3497}
3498
3499template<typename Derived>
3500QualType
3501TreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) {
3502 return SemaRef.BuildReferenceType(ReferentType, false, 0,
3503 getDerived().getBaseLocation(),
3504 getDerived().getBaseEntity());
3505}
3506
3507template<typename Derived>
3508QualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
3509 QualType ClassType) {
3510 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 0,
3511 getDerived().getBaseLocation(),
3512 getDerived().getBaseEntity());
3513}
3514
3515template<typename Derived>
3516QualType
3517TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
3518 ArrayType::ArraySizeModifier SizeMod,
3519 const llvm::APInt *Size,
3520 Expr *SizeExpr,
3521 unsigned IndexTypeQuals,
3522 SourceRange BracketsRange) {
3523 if (SizeExpr || !Size)
3524 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
3525 IndexTypeQuals, BracketsRange,
3526 getDerived().getBaseEntity());
3527
3528 QualType Types[] = {
3529 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
3530 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
3531 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
3532 };
3533 const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
3534 QualType SizeType;
3535 for (unsigned I = 0; I != NumTypes; ++I)
3536 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
3537 SizeType = Types[I];
3538 break;
3539 }
3540
3541 if (SizeType.isNull())
3542 SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
3543
3544 IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
3545 return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
3546 IndexTypeQuals, BracketsRange,
3547 getDerived().getBaseEntity());
3548}
3549
3550template<typename Derived>
3551QualType
3552TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
3553 ArrayType::ArraySizeModifier SizeMod,
3554 const llvm::APInt &Size,
3555 unsigned IndexTypeQuals) {
3556 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
3557 IndexTypeQuals, SourceRange());
3558}
3559
3560template<typename Derived>
3561QualType
3562TreeTransform<Derived>::RebuildConstantArrayWithExprType(QualType ElementType,
3563 ArrayType::ArraySizeModifier SizeMod,
3564 const llvm::APInt &Size,
3565 Expr *SizeExpr,
3566 unsigned IndexTypeQuals,
3567 SourceRange BracketsRange) {
3568 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
3569 IndexTypeQuals, BracketsRange);
3570}
3571
3572template<typename Derived>
3573QualType
3574TreeTransform<Derived>::RebuildConstantArrayWithoutExprType(
3575 QualType ElementType,
3576 ArrayType::ArraySizeModifier SizeMod,
3577 const llvm::APInt &Size,
3578 unsigned IndexTypeQuals) {
3579 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
3580 IndexTypeQuals, SourceRange());
3581}
3582
3583template<typename Derived>
3584QualType
3585TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
3586 ArrayType::ArraySizeModifier SizeMod,
3587 unsigned IndexTypeQuals) {
3588 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
3589 IndexTypeQuals, SourceRange());
3590}
3591
3592template<typename Derived>
3593QualType
3594TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
3595 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregorb98b1992009-08-11 05:31:07 +00003596 ExprArg SizeExpr,
Douglas Gregor577f75a2009-08-04 16:50:30 +00003597 unsigned IndexTypeQuals,
3598 SourceRange BracketsRange) {
3599 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
3600 SizeExpr.takeAs<Expr>(),
3601 IndexTypeQuals, BracketsRange);
3602}
3603
3604template<typename Derived>
3605QualType
3606TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
3607 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregorb98b1992009-08-11 05:31:07 +00003608 ExprArg SizeExpr,
Douglas Gregor577f75a2009-08-04 16:50:30 +00003609 unsigned IndexTypeQuals,
3610 SourceRange BracketsRange) {
3611 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
3612 SizeExpr.takeAs<Expr>(),
3613 IndexTypeQuals, BracketsRange);
3614}
3615
3616template<typename Derived>
3617QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
3618 unsigned NumElements) {
3619 // FIXME: semantic checking!
3620 return SemaRef.Context.getVectorType(ElementType, NumElements);
3621}
3622
3623template<typename Derived>
3624QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
3625 unsigned NumElements,
3626 SourceLocation AttributeLoc) {
3627 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
3628 NumElements, true);
3629 IntegerLiteral *VectorSize
3630 = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
3631 AttributeLoc);
3632 return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
3633 AttributeLoc);
3634}
3635
3636template<typename Derived>
3637QualType
3638TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
Douglas Gregorb98b1992009-08-11 05:31:07 +00003639 ExprArg SizeExpr,
Douglas Gregor577f75a2009-08-04 16:50:30 +00003640 SourceLocation AttributeLoc) {
3641 return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
3642}
3643
3644template<typename Derived>
3645QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
3646 QualType *ParamTypes,
3647 unsigned NumParamTypes,
3648 bool Variadic,
3649 unsigned Quals) {
3650 return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
3651 Quals,
3652 getDerived().getBaseLocation(),
3653 getDerived().getBaseEntity());
3654}
3655
3656template<typename Derived>
Douglas Gregorb98b1992009-08-11 05:31:07 +00003657QualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
Douglas Gregor577f75a2009-08-04 16:50:30 +00003658 return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
3659}
3660
3661template<typename Derived>
3662QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
3663 return SemaRef.Context.getTypeOfType(Underlying);
3664}
3665
3666template<typename Derived>
Douglas Gregorb98b1992009-08-11 05:31:07 +00003667QualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
Douglas Gregor577f75a2009-08-04 16:50:30 +00003668 return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
3669}
3670
3671template<typename Derived>
3672QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
3673 TemplateName Template,
3674 const TemplateArgument *Args,
3675 unsigned NumArgs) {
3676 // FIXME: Missing source locations for the template name, <, >.
3677 return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(),
3678 SourceLocation(), Args, NumArgs,
3679 SourceLocation());
3680}
3681
Douglas Gregordcee1a12009-08-06 05:28:30 +00003682template<typename Derived>
3683NestedNameSpecifier *
3684TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
3685 SourceRange Range,
3686 IdentifierInfo &II) {
3687 CXXScopeSpec SS;
3688 // FIXME: The source location information is all wrong.
3689 SS.setRange(Range);
3690 SS.setScopeRep(Prefix);
3691 return static_cast<NestedNameSpecifier *>(
3692 SemaRef.ActOnCXXNestedNameSpecifier(0, SS, Range.getEnd(),
3693 Range.getEnd(), II));
3694}
3695
3696template<typename Derived>
3697NestedNameSpecifier *
3698TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
3699 SourceRange Range,
3700 NamespaceDecl *NS) {
3701 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
3702}
3703
3704template<typename Derived>
3705NestedNameSpecifier *
3706TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
3707 SourceRange Range,
3708 bool TemplateKW,
3709 QualType T) {
3710 if (T->isDependentType() || T->isRecordType() ||
3711 (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
3712 assert(T.getCVRQualifiers() == 0 && "Can't get cv-qualifiers here");
3713 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
3714 T.getTypePtr());
3715 }
3716
3717 SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
3718 return 0;
3719}
3720
Douglas Gregord1067e52009-08-06 06:41:21 +00003721template<typename Derived>
3722TemplateName
3723TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
3724 bool TemplateKW,
3725 TemplateDecl *Template) {
3726 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
3727 Template);
3728}
3729
3730template<typename Derived>
3731TemplateName
3732TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
3733 bool TemplateKW,
3734 OverloadedFunctionDecl *Ovl) {
3735 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
3736}
3737
3738template<typename Derived>
3739TemplateName
3740TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
3741 const IdentifierInfo &II) {
3742 if (Qualifier->isDependent())
3743 return SemaRef.Context.getDependentTemplateName(Qualifier, &II);
3744
3745 // Somewhat redundant with ActOnDependentTemplateName.
3746 CXXScopeSpec SS;
3747 SS.setRange(SourceRange(getDerived().getBaseLocation()));
3748 SS.setScopeRep(Qualifier);
3749 Sema::TemplateTy Template;
3750 TemplateNameKind TNK = SemaRef.isTemplateName(II, 0, Template, &SS);
3751 if (TNK == TNK_Non_template) {
3752 SemaRef.Diag(getDerived().getBaseLocation(),
3753 diag::err_template_kw_refers_to_non_template)
3754 << &II;
3755 return TemplateName();
3756 } else if (TNK == TNK_Function_template) {
3757 SemaRef.Diag(getDerived().getBaseLocation(),
3758 diag::err_template_kw_refers_to_non_template)
3759 << &II;
3760 return TemplateName();
3761 }
3762
3763 return Template.getAsVal<TemplateName>();
3764}
Douglas Gregorb98b1992009-08-11 05:31:07 +00003765
3766template<typename Derived>
3767Sema::OwningExprResult
3768TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
3769 SourceLocation OpLoc,
3770 ExprArg Callee,
3771 ExprArg First,
3772 ExprArg Second) {
3773 Expr *FirstExpr = (Expr *)First.get();
3774 Expr *SecondExpr = (Expr *)Second.get();
3775 bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
3776
3777 // Determine whether this should be a builtin operation.
3778 if (SecondExpr == 0 || isPostIncDec) {
3779 if (!FirstExpr->getType()->isOverloadableType()) {
3780 // The argument is not of overloadable type, so try to create a
3781 // built-in unary operation.
3782 UnaryOperator::Opcode Opc
3783 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
3784
3785 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
3786 }
3787 } else {
3788 if (!FirstExpr->getType()->isOverloadableType() &&
3789 !SecondExpr->getType()->isOverloadableType()) {
3790 // Neither of the arguments is an overloadable type, so try to
3791 // create a built-in binary operation.
3792 BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
3793 OwningExprResult Result
3794 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
3795 if (Result.isInvalid())
3796 return SemaRef.ExprError();
3797
3798 First.release();
3799 Second.release();
3800 return move(Result);
3801 }
3802 }
3803
3804 // Compute the transformed set of functions (and function templates) to be
3805 // used during overload resolution.
3806 Sema::FunctionSet Functions;
3807
3808 DeclRefExpr *DRE = cast<DeclRefExpr>((Expr *)Callee.get());
3809 OverloadedFunctionDecl *Overloads
3810 = cast<OverloadedFunctionDecl>(DRE->getDecl());
3811
3812 // FIXME: Do we have to check
3813 // IsAcceptableNonMemberOperatorCandidate for each of these?
3814 for (OverloadedFunctionDecl::function_iterator
3815 F = Overloads->function_begin(),
3816 FEnd = Overloads->function_end();
3817 F != FEnd; ++F)
3818 Functions.insert(*F);
3819
3820 // Add any functions found via argument-dependent lookup.
3821 Expr *Args[2] = { FirstExpr, SecondExpr };
3822 unsigned NumArgs = 1 + (SecondExpr != 0);
3823 DeclarationName OpName
3824 = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
3825 SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions);
3826
3827 // Create the overloaded operator invocation for unary operators.
3828 if (NumArgs == 1 || isPostIncDec) {
3829 UnaryOperator::Opcode Opc
3830 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
3831 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
3832 }
3833
3834 // Create the overloaded operator invocation for binary operators.
3835 BinaryOperator::Opcode Opc =
3836 BinaryOperator::getOverloadedOpcode(Op);
3837 OwningExprResult Result
3838 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
3839 if (Result.isInvalid())
3840 return SemaRef.ExprError();
3841
3842 First.release();
3843 Second.release();
3844 return move(Result);
3845}
Douglas Gregord1067e52009-08-06 06:41:21 +00003846
Douglas Gregor577f75a2009-08-04 16:50:30 +00003847} // end namespace clang
3848
3849#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H