blob: 67d62a94ecefe0f087c0881f2fc0215afacd7d92 [file] [log] [blame]
Ted Kremenekfc7b6f72007-08-24 20:21:10 +00001//===--- ExprCXX.cpp - (C++) Expression AST Node Implementation -----------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Ted Kremenekfc7b6f72007-08-24 20:21:10 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the subclesses of Expr class declared in ExprCXX.h
11//
12//===----------------------------------------------------------------------===//
13
Douglas Gregor65fedaf2008-11-14 16:09:21 +000014#include "clang/Basic/IdentifierTable.h"
15#include "clang/AST/DeclCXX.h"
Douglas Gregor28857752009-06-30 22:34:41 +000016#include "clang/AST/DeclTemplate.h"
Ted Kremenekfc7b6f72007-08-24 20:21:10 +000017#include "clang/AST/ExprCXX.h"
18using namespace clang;
19
20//===----------------------------------------------------------------------===//
21// Child Iterators for iterating over subexpressions/substatements
22//===----------------------------------------------------------------------===//
23
Sebastian Redlb93b49c2008-11-11 11:37:55 +000024// CXXTypeidExpr - has child iterators if the operand is an expression
25Stmt::child_iterator CXXTypeidExpr::child_begin() {
Sebastian Redl9f81c3f2008-12-03 23:17:54 +000026 return isTypeOperand() ? child_iterator() : &Operand.Ex;
Sebastian Redlb93b49c2008-11-11 11:37:55 +000027}
28Stmt::child_iterator CXXTypeidExpr::child_end() {
Sebastian Redl9f81c3f2008-12-03 23:17:54 +000029 return isTypeOperand() ? child_iterator() : &Operand.Ex+1;
Sebastian Redlb93b49c2008-11-11 11:37:55 +000030}
Ted Kremenekfc7b6f72007-08-24 20:21:10 +000031
Ted Kremenekfc7b6f72007-08-24 20:21:10 +000032// CXXBoolLiteralExpr
Ted Kremeneka6478552007-10-18 23:28:49 +000033Stmt::child_iterator CXXBoolLiteralExpr::child_begin() {
34 return child_iterator();
35}
36Stmt::child_iterator CXXBoolLiteralExpr::child_end() {
37 return child_iterator();
38}
Chris Lattnera7447ba2008-02-26 00:51:44 +000039
Sebastian Redl5d0ead72009-05-10 18:38:11 +000040// CXXNullPtrLiteralExpr
41Stmt::child_iterator CXXNullPtrLiteralExpr::child_begin() {
42 return child_iterator();
43}
44Stmt::child_iterator CXXNullPtrLiteralExpr::child_end() {
45 return child_iterator();
46}
47
Douglas Gregora5b022a2008-11-04 14:32:21 +000048// CXXThisExpr
49Stmt::child_iterator CXXThisExpr::child_begin() { return child_iterator(); }
50Stmt::child_iterator CXXThisExpr::child_end() { return child_iterator(); }
51
Chris Lattnera7447ba2008-02-26 00:51:44 +000052// CXXThrowExpr
Ted Kremenek156714e2008-06-17 03:11:08 +000053Stmt::child_iterator CXXThrowExpr::child_begin() { return &Op; }
Chris Lattnera7447ba2008-02-26 00:51:44 +000054Stmt::child_iterator CXXThrowExpr::child_end() {
55 // If Op is 0, we are processing throw; which has no children.
Ted Kremenek156714e2008-06-17 03:11:08 +000056 return Op ? &Op+1 : &Op;
Chris Lattnera7447ba2008-02-26 00:51:44 +000057}
Chris Lattner3e254fb2008-04-08 04:40:51 +000058
59// CXXDefaultArgExpr
60Stmt::child_iterator CXXDefaultArgExpr::child_begin() {
Chris Lattner97316c02008-04-10 02:22:51 +000061 return child_iterator();
Chris Lattner3e254fb2008-04-08 04:40:51 +000062}
63Stmt::child_iterator CXXDefaultArgExpr::child_end() {
Chris Lattner97316c02008-04-10 02:22:51 +000064 return child_iterator();
Chris Lattner3e254fb2008-04-08 04:40:51 +000065}
Argiris Kirtzidis7a1e7412008-08-22 15:38:55 +000066
67// CXXZeroInitValueExpr
68Stmt::child_iterator CXXZeroInitValueExpr::child_begin() {
69 return child_iterator();
70}
71Stmt::child_iterator CXXZeroInitValueExpr::child_end() {
72 return child_iterator();
73}
Argiris Kirtzidisdbce6c12008-09-09 23:47:53 +000074
75// CXXConditionDeclExpr
76Stmt::child_iterator CXXConditionDeclExpr::child_begin() {
77 return getVarDecl();
78}
79Stmt::child_iterator CXXConditionDeclExpr::child_end() {
80 return child_iterator();
81}
Douglas Gregor21a04f32008-10-27 19:41:14 +000082
Sebastian Redl19fec9d2008-11-21 19:14:01 +000083// CXXNewExpr
84CXXNewExpr::CXXNewExpr(bool globalNew, FunctionDecl *operatorNew,
85 Expr **placementArgs, unsigned numPlaceArgs,
Sebastian Redl66df3ef2008-12-02 14:43:59 +000086 bool parenTypeId, Expr *arraySize,
Sebastian Redl19fec9d2008-11-21 19:14:01 +000087 CXXConstructorDecl *constructor, bool initializer,
88 Expr **constructorArgs, unsigned numConsArgs,
89 FunctionDecl *operatorDelete, QualType ty,
90 SourceLocation startLoc, SourceLocation endLoc)
Sebastian Redl6fdb28d2009-02-26 14:39:58 +000091 : Expr(CXXNewExprClass, ty, ty->isDependentType(), ty->isDependentType()),
92 GlobalNew(globalNew), ParenTypeId(parenTypeId),
Sebastian Redl66df3ef2008-12-02 14:43:59 +000093 Initializer(initializer), Array(arraySize), NumPlacementArgs(numPlaceArgs),
Sebastian Redl19fec9d2008-11-21 19:14:01 +000094 NumConstructorArgs(numConsArgs), OperatorNew(operatorNew),
Sebastian Redl66df3ef2008-12-02 14:43:59 +000095 OperatorDelete(operatorDelete), Constructor(constructor),
Sebastian Redl19fec9d2008-11-21 19:14:01 +000096 StartLoc(startLoc), EndLoc(endLoc)
97{
Sebastian Redl66df3ef2008-12-02 14:43:59 +000098 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
Sebastian Redl19fec9d2008-11-21 19:14:01 +000099 SubExprs = new Stmt*[TotalSize];
100 unsigned i = 0;
Sebastian Redl66df3ef2008-12-02 14:43:59 +0000101 if (Array)
102 SubExprs[i++] = arraySize;
103 for (unsigned j = 0; j < NumPlacementArgs; ++j)
Sebastian Redl19fec9d2008-11-21 19:14:01 +0000104 SubExprs[i++] = placementArgs[j];
Sebastian Redl66df3ef2008-12-02 14:43:59 +0000105 for (unsigned j = 0; j < NumConstructorArgs; ++j)
Sebastian Redl19fec9d2008-11-21 19:14:01 +0000106 SubExprs[i++] = constructorArgs[j];
107 assert(i == TotalSize);
108}
109
110Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
111Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redl66df3ef2008-12-02 14:43:59 +0000112 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redl19fec9d2008-11-21 19:14:01 +0000113}
114
115// CXXDeleteExpr
116Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
117Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
118
Douglas Gregor4646f9c2009-02-04 15:01:18 +0000119// UnresolvedFunctionNameExpr
120Stmt::child_iterator UnresolvedFunctionNameExpr::child_begin() {
Douglas Gregora133e262008-12-06 00:22:45 +0000121 return child_iterator();
122}
Douglas Gregor4646f9c2009-02-04 15:01:18 +0000123Stmt::child_iterator UnresolvedFunctionNameExpr::child_end() {
Douglas Gregora133e262008-12-06 00:22:45 +0000124 return child_iterator();
125}
126
Douglas Gregore1f8c0a2009-05-19 00:38:01 +0000127UnresolvedFunctionNameExpr*
128UnresolvedFunctionNameExpr::Clone(ASTContext &C) const {
129 return new (C) UnresolvedFunctionNameExpr(Name, getType(), Loc);
130}
131
Sebastian Redl39c0f6f2009-01-05 20:52:13 +0000132// UnaryTypeTraitExpr
133Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
134 return child_iterator();
135}
136Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
137 return child_iterator();
138}
139
Douglas Gregor47bde7c2009-03-19 17:26:29 +0000140// UnresolvedDeclRefExpr
141StmtIterator UnresolvedDeclRefExpr::child_begin() {
142 return child_iterator();
143}
144
145StmtIterator UnresolvedDeclRefExpr::child_end() {
146 return child_iterator();
147}
148
Douglas Gregor28857752009-06-30 22:34:41 +0000149TemplateIdRefExpr::TemplateIdRefExpr(QualType T,
150 NestedNameSpecifier *Qualifier,
151 SourceRange QualifierRange,
152 TemplateName Template,
153 SourceLocation TemplateNameLoc,
154 SourceLocation LAngleLoc,
155 const TemplateArgument *TemplateArgs,
156 unsigned NumTemplateArgs,
157 SourceLocation RAngleLoc)
158 : Expr(TemplateIdRefExprClass, T,
159 (Template.isDependent() ||
160 TemplateSpecializationType::anyDependentTemplateArguments(
161 TemplateArgs, NumTemplateArgs)),
162 (Template.isDependent() ||
163 TemplateSpecializationType::anyDependentTemplateArguments(
164 TemplateArgs, NumTemplateArgs))),
165 Qualifier(Qualifier), QualifierRange(QualifierRange), Template(Template),
166 TemplateNameLoc(TemplateNameLoc), LAngleLoc(LAngleLoc),
167 RAngleLoc(RAngleLoc), NumTemplateArgs(NumTemplateArgs)
168
169{
170 TemplateArgument *StoredTemplateArgs
171 = reinterpret_cast<TemplateArgument *> (this+1);
172 for (unsigned I = 0; I != NumTemplateArgs; ++I)
173 new (StoredTemplateArgs + I) TemplateArgument(TemplateArgs[I]);
174}
175
176TemplateIdRefExpr *
177TemplateIdRefExpr::Create(ASTContext &Context, QualType T,
178 NestedNameSpecifier *Qualifier,
179 SourceRange QualifierRange,
180 TemplateName Template, SourceLocation TemplateNameLoc,
181 SourceLocation LAngleLoc,
182 const TemplateArgument *TemplateArgs,
183 unsigned NumTemplateArgs, SourceLocation RAngleLoc) {
184 void *Mem = Context.Allocate(sizeof(TemplateIdRefExpr) +
185 sizeof(TemplateArgument) * NumTemplateArgs);
186 return new (Mem) TemplateIdRefExpr(T, Qualifier, QualifierRange, Template,
187 TemplateNameLoc, LAngleLoc, TemplateArgs,
188 NumTemplateArgs, RAngleLoc);
189}
190
Douglas Gregor53e8e4b2009-08-07 06:08:38 +0000191void TemplateIdRefExpr::DoDestroy(ASTContext &Context) {
Douglas Gregor28857752009-06-30 22:34:41 +0000192 const TemplateArgument *TemplateArgs = getTemplateArgs();
193 for (unsigned I = 0; I != NumTemplateArgs; ++I)
194 if (Expr *E = TemplateArgs[I].getAsExpr())
195 E->Destroy(Context);
Douglas Gregor53e8e4b2009-08-07 06:08:38 +0000196 this->~TemplateIdRefExpr();
197 Context.Deallocate(this);
Douglas Gregor28857752009-06-30 22:34:41 +0000198}
199
200Stmt::child_iterator TemplateIdRefExpr::child_begin() {
201 // FIXME: Walk the expressions in the template arguments (?)
202 return Stmt::child_iterator();
203}
204
205Stmt::child_iterator TemplateIdRefExpr::child_end() {
206 // FIXME: Walk the expressions in the template arguments (?)
207 return Stmt::child_iterator();
208}
209
Douglas Gregor4af05232009-07-23 23:49:00 +0000210bool UnaryTypeTraitExpr::EvaluateTrait(ASTContext& C) const {
Sebastian Redl39c0f6f2009-01-05 20:52:13 +0000211 switch(UTT) {
212 default: assert(false && "Unknown type trait or not implemented");
213 case UTT_IsPOD: return QueriedType->isPODType();
214 case UTT_IsClass: // Fallthrough
215 case UTT_IsUnion:
Ted Kremenekd00cd9e2009-07-29 21:53:49 +0000216 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redl39c0f6f2009-01-05 20:52:13 +0000217 bool Union = Record->getDecl()->isUnion();
218 return UTT == UTT_IsUnion ? Union : !Union;
219 }
220 return false;
221 case UTT_IsEnum: return QueriedType->isEnumeralType();
222 case UTT_IsPolymorphic:
Ted Kremenekd00cd9e2009-07-29 21:53:49 +0000223 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redl39c0f6f2009-01-05 20:52:13 +0000224 // Type traits are only parsed in C++, so we've got CXXRecords.
225 return cast<CXXRecordDecl>(Record->getDecl())->isPolymorphic();
226 }
227 return false;
Anders Carlsson1dae87f2009-03-22 01:52:17 +0000228 case UTT_IsAbstract:
Ted Kremenekd00cd9e2009-07-29 21:53:49 +0000229 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Anders Carlsson1dae87f2009-03-22 01:52:17 +0000230 return cast<CXXRecordDecl>(RT->getDecl())->isAbstract();
231 return false;
Anders Carlssonc6363712009-04-16 00:08:20 +0000232 case UTT_HasTrivialConstructor:
Douglas Gregor4af05232009-07-23 23:49:00 +0000233 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
234 // If __is_pod (type) is true then the trait is true, else if type is
235 // a cv class or union type (or array thereof) with a trivial default
236 // constructor ([class.ctor]) then the trait is true, else it is false.
237 if (QueriedType->isPODType())
238 return true;
239 if (const RecordType *RT =
Ted Kremenekd00cd9e2009-07-29 21:53:49 +0000240 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlssonc6363712009-04-16 00:08:20 +0000241 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialConstructor();
Anders Carlsson39a10db2009-04-17 02:34:54 +0000242 return false;
Douglas Gregor4af05232009-07-23 23:49:00 +0000243 case UTT_HasTrivialCopy:
244 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
245 // If __is_pod (type) is true or type is a reference type then
246 // the trait is true, else if type is a cv class or union type
247 // with a trivial copy constructor ([class.copy]) then the trait
248 // is true, else it is false.
249 if (QueriedType->isPODType() || QueriedType->isReferenceType())
250 return true;
Ted Kremenekd00cd9e2009-07-29 21:53:49 +0000251 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor4af05232009-07-23 23:49:00 +0000252 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyConstructor();
253 return false;
254 case UTT_HasTrivialAssign:
255 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
256 // If type is const qualified or is a reference type then the
257 // trait is false. Otherwise if __is_pod (type) is true then the
258 // trait is true, else if type is a cv class or union type with
259 // a trivial copy assignment ([class.copy]) then the trait is
260 // true, else it is false.
261 // Note: the const and reference restrictions are interesting,
262 // given that const and reference members don't prevent a class
263 // from having a trivial copy assignment operator (but do cause
264 // errors if the copy assignment operator is actually used, q.v.
265 // [class.copy]p12).
266
267 if (C.getBaseElementType(QueriedType).isConstQualified())
268 return false;
269 if (QueriedType->isPODType())
270 return true;
Ted Kremenekd00cd9e2009-07-29 21:53:49 +0000271 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor4af05232009-07-23 23:49:00 +0000272 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyAssignment();
273 return false;
274 case UTT_HasTrivialDestructor:
275 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
276 // If __is_pod (type) is true or type is a reference type
277 // then the trait is true, else if type is a cv class or union
278 // type (or array thereof) with a trivial destructor
279 // ([class.dtor]) then the trait is true, else it is
280 // false.
281 if (QueriedType->isPODType() || QueriedType->isReferenceType())
282 return true;
283 if (const RecordType *RT =
Ted Kremenekd00cd9e2009-07-29 21:53:49 +0000284 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlsson39a10db2009-04-17 02:34:54 +0000285 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor();
286 return false;
Sebastian Redl39c0f6f2009-01-05 20:52:13 +0000287 }
288}
289
Douglas Gregor65fedaf2008-11-14 16:09:21 +0000290SourceRange CXXOperatorCallExpr::getSourceRange() const {
291 OverloadedOperatorKind Kind = getOperator();
292 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
293 if (getNumArgs() == 1)
294 // Prefix operator
295 return SourceRange(getOperatorLoc(),
296 getArg(0)->getSourceRange().getEnd());
297 else
298 // Postfix operator
299 return SourceRange(getArg(0)->getSourceRange().getEnd(),
300 getOperatorLoc());
301 } else if (Kind == OO_Call) {
302 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
303 } else if (Kind == OO_Subscript) {
304 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
305 } else if (getNumArgs() == 1) {
306 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
307 } else if (getNumArgs() == 2) {
308 return SourceRange(getArg(0)->getSourceRange().getBegin(),
309 getArg(1)->getSourceRange().getEnd());
310 } else {
311 return SourceRange();
312 }
313}
314
Douglas Gregor3257fb52008-12-22 05:46:06 +0000315Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
316 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
317 return MemExpr->getBase();
318
319 // FIXME: Will eventually need to cope with member pointers.
320 return 0;
321}
322
Douglas Gregor21a04f32008-10-27 19:41:14 +0000323//===----------------------------------------------------------------------===//
324// Named casts
325//===----------------------------------------------------------------------===//
326
327/// getCastName - Get the name of the C++ cast being used, e.g.,
328/// "static_cast", "dynamic_cast", "reinterpret_cast", or
329/// "const_cast". The returned pointer must not be freed.
330const char *CXXNamedCastExpr::getCastName() const {
331 switch (getStmtClass()) {
332 case CXXStaticCastExprClass: return "static_cast";
333 case CXXDynamicCastExprClass: return "dynamic_cast";
334 case CXXReinterpretCastExprClass: return "reinterpret_cast";
335 case CXXConstCastExprClass: return "const_cast";
336 default: return "<invalid cast>";
337 }
338}
Douglas Gregor861e7902009-01-16 18:33:17 +0000339
Anders Carlsson29f365d2009-05-30 19:54:15 +0000340CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlsson432ba3c2009-05-30 20:34:37 +0000341 const CXXDestructorDecl *Destructor) {
Anders Carlssoncb8e0c02009-05-30 22:38:53 +0000342 return new (C) CXXTemporary(Destructor);
343}
344
Douglas Gregor53e8e4b2009-08-07 06:08:38 +0000345void CXXTemporary::Destroy(ASTContext &Ctx) {
Anders Carlssoncb8e0c02009-05-30 22:38:53 +0000346 this->~CXXTemporary();
Douglas Gregor53e8e4b2009-08-07 06:08:38 +0000347 Ctx.Deallocate(this);
Anders Carlsson29f365d2009-05-30 19:54:15 +0000348}
349
Anders Carlsson873176e2009-05-30 20:03:25 +0000350CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
351 CXXTemporary *Temp,
352 Expr* SubExpr) {
353 assert(SubExpr->getType()->isRecordType() &&
354 "Expression bound to a temporary must have record type!");
355
Anders Carlsson432ba3c2009-05-30 20:34:37 +0000356 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
Anders Carlsson873176e2009-05-30 20:03:25 +0000357}
358
Douglas Gregor53e8e4b2009-08-07 06:08:38 +0000359void CXXBindTemporaryExpr::DoDestroy(ASTContext &C) {
Anders Carlssoncb8e0c02009-05-30 22:38:53 +0000360 Temp->Destroy(C);
361 this->~CXXBindTemporaryExpr();
362 C.Deallocate(this);
363}
364
Anders Carlsson7b7b2552009-05-30 20:56:46 +0000365CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlssonebbd7cd2009-04-24 05:23:13 +0000366 CXXConstructorDecl *Cons,
Douglas Gregor861e7902009-01-16 18:33:17 +0000367 QualType writtenTy,
368 SourceLocation tyBeginLoc,
369 Expr **Args,
370 unsigned NumArgs,
371 SourceLocation rParenLoc)
Anders Carlsson7b7b2552009-05-30 20:56:46 +0000372 : CXXConstructExpr(C, CXXTemporaryObjectExprClass, writtenTy, Cons,
Anders Carlssone1c08f72009-04-24 17:34:38 +0000373 false, Args, NumArgs),
374 TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {
Douglas Gregor861e7902009-01-16 18:33:17 +0000375}
Anders Carlsson350edcf2009-04-21 02:22:11 +0000376
Anders Carlsson7b7b2552009-05-30 20:56:46 +0000377CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
378 CXXConstructorDecl *D, bool Elidable,
Anders Carlssondbbab8c2009-04-23 02:32:43 +0000379 Expr **Args, unsigned NumArgs) {
Anders Carlsson7b7b2552009-05-30 20:56:46 +0000380 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, D, Elidable,
Anders Carlsson94c73aa2009-04-24 05:04:04 +0000381 Args, NumArgs);
Anders Carlssondbbab8c2009-04-23 02:32:43 +0000382}
383
Anders Carlsson7b7b2552009-05-30 20:56:46 +0000384CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
385 CXXConstructorDecl *D, bool elidable,
Anders Carlssondbbab8c2009-04-23 02:32:43 +0000386 Expr **args, unsigned numargs)
Anders Carlsson94c73aa2009-04-24 05:04:04 +0000387: Expr(SC, T,
Anders Carlssondbbab8c2009-04-23 02:32:43 +0000388 T->isDependentType(),
389 (T->isDependentType() ||
390 CallExpr::hasAnyValueDependentArguments(args, numargs))),
Anders Carlsson7b7b2552009-05-30 20:56:46 +0000391 Constructor(D), Elidable(elidable), Args(0), NumArgs(numargs) {
Fariborz Jahanianbeb68c42009-08-05 00:26:10 +0000392 // leave room for default arguments;
393 FunctionDecl *FDecl = cast<FunctionDecl>(D);
394 unsigned NumArgsInProto = FDecl->param_size();
395 NumArgs += (NumArgsInProto - numargs);
Anders Carlssondbbab8c2009-04-23 02:32:43 +0000396 if (NumArgs > 0) {
397 Args = new (C) Stmt*[NumArgs];
Fariborz Jahanianbeb68c42009-08-05 00:26:10 +0000398 for (unsigned i = 0; i < numargs; ++i)
Anders Carlssondbbab8c2009-04-23 02:32:43 +0000399 Args[i] = args[i];
400 }
401}
402
Douglas Gregor53e8e4b2009-08-07 06:08:38 +0000403void CXXConstructExpr::DoDestroy(ASTContext &C) {
Anders Carlssondbbab8c2009-04-23 02:32:43 +0000404 DestroyChildren(C);
405 if (Args)
406 C.Deallocate(Args);
407 this->~CXXConstructExpr();
408 C.Deallocate(this);
409}
410
Anders Carlsson9f4aef72009-05-01 22:18:43 +0000411CXXExprWithTemporaries::CXXExprWithTemporaries(Expr *subexpr,
Anders Carlsson5552c802009-05-30 21:05:25 +0000412 CXXTemporary **temps,
Anders Carlsson8f75fbc2009-06-05 15:38:08 +0000413 unsigned numtemps,
Anders Carlsson37bb2bd2009-06-16 03:37:31 +0000414 bool shoulddestroytemps)
Anders Carlsson9f4aef72009-05-01 22:18:43 +0000415: Expr(CXXExprWithTemporariesClass, subexpr->getType(),
Anders Carlssonb5d9c472009-04-24 22:47:04 +0000416 subexpr->isTypeDependent(), subexpr->isValueDependent()),
Anders Carlsson37bb2bd2009-06-16 03:37:31 +0000417 SubExpr(subexpr), Temps(0), NumTemps(numtemps),
418 ShouldDestroyTemps(shoulddestroytemps) {
Anders Carlsson5552c802009-05-30 21:05:25 +0000419 if (NumTemps > 0) {
420 Temps = new CXXTemporary*[NumTemps];
421 for (unsigned i = 0; i < NumTemps; ++i)
422 Temps[i] = temps[i];
Anders Carlssonb5d9c472009-04-24 22:47:04 +0000423 }
424}
425
Anders Carlssoncb8e0c02009-05-30 22:38:53 +0000426CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C,
427 Expr *SubExpr,
428 CXXTemporary **Temps,
Anders Carlsson8f75fbc2009-06-05 15:38:08 +0000429 unsigned NumTemps,
Anders Carlsson37bb2bd2009-06-16 03:37:31 +0000430 bool ShouldDestroyTemps){
Anders Carlsson8f75fbc2009-06-05 15:38:08 +0000431 return new (C) CXXExprWithTemporaries(SubExpr, Temps, NumTemps,
Anders Carlsson37bb2bd2009-06-16 03:37:31 +0000432 ShouldDestroyTemps);
Anders Carlssoncb8e0c02009-05-30 22:38:53 +0000433}
434
Douglas Gregor53e8e4b2009-08-07 06:08:38 +0000435void CXXExprWithTemporaries::DoDestroy(ASTContext &C) {
Anders Carlssoncb8e0c02009-05-30 22:38:53 +0000436 DestroyChildren(C);
437 this->~CXXExprWithTemporaries();
438 C.Deallocate(this);
439}
440
Anders Carlsson9f4aef72009-05-01 22:18:43 +0000441CXXExprWithTemporaries::~CXXExprWithTemporaries() {
Anders Carlsson5552c802009-05-30 21:05:25 +0000442 delete[] Temps;
Anders Carlssonb5d9c472009-04-24 22:47:04 +0000443}
444
Anders Carlsson873176e2009-05-30 20:03:25 +0000445// CXXBindTemporaryExpr
446Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
447 return &SubExpr;
448}
449
450Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
451 return &SubExpr + 1;
452}
453
Anders Carlssondbbab8c2009-04-23 02:32:43 +0000454// CXXConstructExpr
455Stmt::child_iterator CXXConstructExpr::child_begin() {
456 return &Args[0];
457}
458Stmt::child_iterator CXXConstructExpr::child_end() {
459 return &Args[0]+NumArgs;
460}
461
Anders Carlssond79b7012009-05-01 22:21:22 +0000462// CXXExprWithTemporaries
463Stmt::child_iterator CXXExprWithTemporaries::child_begin() {
464 return &SubExpr;
Anders Carlsson350edcf2009-04-21 02:22:11 +0000465}
Anders Carlssonb5d9c472009-04-24 22:47:04 +0000466
Anders Carlssond79b7012009-05-01 22:21:22 +0000467Stmt::child_iterator CXXExprWithTemporaries::child_end() {
468 return &SubExpr + 1;
469}
Anders Carlssonb5d9c472009-04-24 22:47:04 +0000470
Douglas Gregorf27b7652009-05-20 18:46:25 +0000471CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(
472 SourceLocation TyBeginLoc,
473 QualType T,
474 SourceLocation LParenLoc,
475 Expr **Args,
476 unsigned NumArgs,
477 SourceLocation RParenLoc)
478 : Expr(CXXUnresolvedConstructExprClass, T.getNonReferenceType(),
479 T->isDependentType(), true),
480 TyBeginLoc(TyBeginLoc),
481 Type(T),
482 LParenLoc(LParenLoc),
483 RParenLoc(RParenLoc),
484 NumArgs(NumArgs) {
485 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
486 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs);
487}
488
489CXXUnresolvedConstructExpr *
490CXXUnresolvedConstructExpr::Create(ASTContext &C,
491 SourceLocation TyBegin,
492 QualType T,
493 SourceLocation LParenLoc,
494 Expr **Args,
495 unsigned NumArgs,
496 SourceLocation RParenLoc) {
497 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
498 sizeof(Expr *) * NumArgs);
499 return new (Mem) CXXUnresolvedConstructExpr(TyBegin, T, LParenLoc,
500 Args, NumArgs, RParenLoc);
501}
502
503Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
504 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
505}
506
507Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
508 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
509}
Sebastian Redlf80e2612009-05-16 18:50:46 +0000510
Douglas Gregor93b8b0f2009-05-22 21:13:27 +0000511Stmt::child_iterator CXXUnresolvedMemberExpr::child_begin() {
512 return child_iterator(&Base);
513}
514
515Stmt::child_iterator CXXUnresolvedMemberExpr::child_end() {
516 return child_iterator(&Base + 1);
517}
518
Sebastian Redlf80e2612009-05-16 18:50:46 +0000519//===----------------------------------------------------------------------===//
520// Cloners
521//===----------------------------------------------------------------------===//
522
523CXXBoolLiteralExpr* CXXBoolLiteralExpr::Clone(ASTContext &C) const {
524 return new (C) CXXBoolLiteralExpr(Value, getType(), Loc);
525}
526
527CXXNullPtrLiteralExpr* CXXNullPtrLiteralExpr::Clone(ASTContext &C) const {
528 return new (C) CXXNullPtrLiteralExpr(getType(), Loc);
529}
Douglas Gregor66c3cf02009-05-20 21:38:11 +0000530
531CXXZeroInitValueExpr* CXXZeroInitValueExpr::Clone(ASTContext &C) const {
532 return new (C) CXXZeroInitValueExpr(getType(), TyBeginLoc, RParenLoc);
533}