blob: 81584b700270bd06015314c4c3ea2a300afd78d5 [file] [log] [blame]
Ted Kremeneka758d092007-08-24 20:21:10 +00001//===--- ExprCXX.cpp - (C++) Expression AST Node Implementation -----------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-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 Kremeneka758d092007-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 Gregorb4609802008-11-14 16:09:21 +000014#include "clang/Basic/IdentifierTable.h"
15#include "clang/AST/DeclCXX.h"
Douglas Gregoredce4dd2009-06-30 22:34:41 +000016#include "clang/AST/DeclTemplate.h"
Ted Kremeneka758d092007-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 Redlc42e1182008-11-11 11:37:55 +000024// CXXTypeidExpr - has child iterators if the operand is an expression
25Stmt::child_iterator CXXTypeidExpr::child_begin() {
Sebastian Redld4575892008-12-03 23:17:54 +000026 return isTypeOperand() ? child_iterator() : &Operand.Ex;
Sebastian Redlc42e1182008-11-11 11:37:55 +000027}
28Stmt::child_iterator CXXTypeidExpr::child_end() {
Sebastian Redld4575892008-12-03 23:17:54 +000029 return isTypeOperand() ? child_iterator() : &Operand.Ex+1;
Sebastian Redlc42e1182008-11-11 11:37:55 +000030}
Ted Kremeneka758d092007-08-24 20:21:10 +000031
Ted Kremeneka758d092007-08-24 20:21:10 +000032// CXXBoolLiteralExpr
Mike Stump1eb44332009-09-09 15:08:12 +000033Stmt::child_iterator CXXBoolLiteralExpr::child_begin() {
Ted Kremenek9ac59282007-10-18 23:28:49 +000034 return child_iterator();
35}
36Stmt::child_iterator CXXBoolLiteralExpr::child_end() {
37 return child_iterator();
38}
Chris Lattner50dd2892008-02-26 00:51:44 +000039
Sebastian Redl6e8ed162009-05-10 18:38:11 +000040// CXXNullPtrLiteralExpr
Mike Stump1eb44332009-09-09 15:08:12 +000041Stmt::child_iterator CXXNullPtrLiteralExpr::child_begin() {
Sebastian Redl6e8ed162009-05-10 18:38:11 +000042 return child_iterator();
43}
44Stmt::child_iterator CXXNullPtrLiteralExpr::child_end() {
45 return child_iterator();
46}
47
Douglas Gregor796da182008-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 Lattner50dd2892008-02-26 00:51:44 +000052// CXXThrowExpr
Ted Kremenek1060aff2008-06-17 03:11:08 +000053Stmt::child_iterator CXXThrowExpr::child_begin() { return &Op; }
Chris Lattner50dd2892008-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 Kremenek1060aff2008-06-17 03:11:08 +000056 return Op ? &Op+1 : &Op;
Chris Lattner50dd2892008-02-26 00:51:44 +000057}
Chris Lattner04421082008-04-08 04:40:51 +000058
59// CXXDefaultArgExpr
60Stmt::child_iterator CXXDefaultArgExpr::child_begin() {
Chris Lattner8123a952008-04-10 02:22:51 +000061 return child_iterator();
Chris Lattner04421082008-04-08 04:40:51 +000062}
63Stmt::child_iterator CXXDefaultArgExpr::child_end() {
Chris Lattner8123a952008-04-10 02:22:51 +000064 return child_iterator();
Chris Lattner04421082008-04-08 04:40:51 +000065}
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +000066
67// CXXZeroInitValueExpr
Mike Stump1eb44332009-09-09 15:08:12 +000068Stmt::child_iterator CXXZeroInitValueExpr::child_begin() {
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +000069 return child_iterator();
70}
71Stmt::child_iterator CXXZeroInitValueExpr::child_end() {
72 return child_iterator();
73}
Argyrios Kyrtzidis9e922b12008-09-09 23:47:53 +000074
Sebastian Redl4c5d3202008-11-21 19:14:01 +000075// CXXNewExpr
76CXXNewExpr::CXXNewExpr(bool globalNew, FunctionDecl *operatorNew,
77 Expr **placementArgs, unsigned numPlaceArgs,
Sebastian Redlcee63fb2008-12-02 14:43:59 +000078 bool parenTypeId, Expr *arraySize,
Sebastian Redl4c5d3202008-11-21 19:14:01 +000079 CXXConstructorDecl *constructor, bool initializer,
80 Expr **constructorArgs, unsigned numConsArgs,
81 FunctionDecl *operatorDelete, QualType ty,
82 SourceLocation startLoc, SourceLocation endLoc)
Sebastian Redl28507842009-02-26 14:39:58 +000083 : Expr(CXXNewExprClass, ty, ty->isDependentType(), ty->isDependentType()),
84 GlobalNew(globalNew), ParenTypeId(parenTypeId),
Sebastian Redlcee63fb2008-12-02 14:43:59 +000085 Initializer(initializer), Array(arraySize), NumPlacementArgs(numPlaceArgs),
Sebastian Redl4c5d3202008-11-21 19:14:01 +000086 NumConstructorArgs(numConsArgs), OperatorNew(operatorNew),
Sebastian Redlcee63fb2008-12-02 14:43:59 +000087 OperatorDelete(operatorDelete), Constructor(constructor),
Mike Stump1eb44332009-09-09 15:08:12 +000088 StartLoc(startLoc), EndLoc(endLoc) {
Sebastian Redlcee63fb2008-12-02 14:43:59 +000089 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
Sebastian Redl4c5d3202008-11-21 19:14:01 +000090 SubExprs = new Stmt*[TotalSize];
91 unsigned i = 0;
Sebastian Redlcee63fb2008-12-02 14:43:59 +000092 if (Array)
93 SubExprs[i++] = arraySize;
94 for (unsigned j = 0; j < NumPlacementArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +000095 SubExprs[i++] = placementArgs[j];
Sebastian Redlcee63fb2008-12-02 14:43:59 +000096 for (unsigned j = 0; j < NumConstructorArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +000097 SubExprs[i++] = constructorArgs[j];
98 assert(i == TotalSize);
99}
100
101Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
102Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000103 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000104}
105
106// CXXDeleteExpr
107Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
108Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
109
Douglas Gregora71d8192009-09-04 17:36:40 +0000110// CXXPseudoDestructorExpr
111Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
112Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
113 return &Base + 1;
114}
115
John McCallba135432009-11-21 08:51:07 +0000116// UnresolvedLookupExpr
John McCallf7a1a742009-11-24 19:00:30 +0000117UnresolvedLookupExpr *
118UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent,
119 NestedNameSpecifier *Qualifier,
120 SourceRange QualifierRange, DeclarationName Name,
121 SourceLocation NameLoc, bool ADL,
122 const TemplateArgumentListInfo &Args)
123{
124 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
125 ExplicitTemplateArgumentList::sizeFor(Args));
126 UnresolvedLookupExpr *ULE
127 = new (Mem) UnresolvedLookupExpr(Dependent ? C.DependentTy : C.OverloadTy,
128 Dependent, Qualifier, QualifierRange,
129 Name, NameLoc, ADL,
130 /*Overload*/ true,
131 /*ExplicitTemplateArgs*/ true);
132
133 reinterpret_cast<ExplicitTemplateArgumentList*>(ULE+1)->initializeFrom(Args);
134
135 return ULE;
136}
137
138bool UnresolvedLookupExpr::ComputeDependence(NamedDecl * const *Begin,
139 NamedDecl * const *End,
140 const TemplateArgumentListInfo *Args) {
141 for (NamedDecl * const *I = Begin; I != End; ++I)
142 if ((*I)->getDeclContext()->isDependentContext())
143 return true;
144
145 if (Args && TemplateSpecializationType::anyDependentTemplateArguments(*Args))
146 return true;
147
148 return false;
149}
150
John McCallba135432009-11-21 08:51:07 +0000151Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump1eb44332009-09-09 15:08:12 +0000152 return child_iterator();
Douglas Gregor5c37de72008-12-06 00:22:45 +0000153}
John McCallba135432009-11-21 08:51:07 +0000154Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregor5c37de72008-12-06 00:22:45 +0000155 return child_iterator();
156}
Sebastian Redl64b45f72009-01-05 20:52:13 +0000157// UnaryTypeTraitExpr
158Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
159 return child_iterator();
160}
161Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
162 return child_iterator();
163}
164
John McCall865d4472009-11-19 22:55:06 +0000165// DependentScopeDeclRefExpr
John McCallf7a1a742009-11-24 19:00:30 +0000166DependentScopeDeclRefExpr *
167DependentScopeDeclRefExpr::Create(ASTContext &C,
168 NestedNameSpecifier *Qualifier,
169 SourceRange QualifierRange,
170 DeclarationName Name,
171 SourceLocation NameLoc,
172 const TemplateArgumentListInfo *Args) {
173 std::size_t size = sizeof(DependentScopeDeclRefExpr);
174 if (Args) size += ExplicitTemplateArgumentList::sizeFor(*Args);
175 void *Mem = C.Allocate(size);
176
177 DependentScopeDeclRefExpr *DRE
178 = new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
179 Qualifier, QualifierRange,
180 Name, NameLoc,
181 Args != 0);
182
183 if (Args)
184 reinterpret_cast<ExplicitTemplateArgumentList*>(DRE+1)
185 ->initializeFrom(*Args);
186
187 return DRE;
188}
189
John McCall865d4472009-11-19 22:55:06 +0000190StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000191 return child_iterator();
192}
193
John McCall865d4472009-11-19 22:55:06 +0000194StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000195 return child_iterator();
196}
197
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000198bool UnaryTypeTraitExpr::EvaluateTrait(ASTContext& C) const {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000199 switch(UTT) {
200 default: assert(false && "Unknown type trait or not implemented");
201 case UTT_IsPOD: return QueriedType->isPODType();
Sebastian Redlccf43502009-12-03 00:13:20 +0000202 case UTT_IsLiteral: return QueriedType->isLiteralType();
Sebastian Redl64b45f72009-01-05 20:52:13 +0000203 case UTT_IsClass: // Fallthrough
204 case UTT_IsUnion:
Ted Kremenek6217b802009-07-29 21:53:49 +0000205 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000206 bool Union = Record->getDecl()->isUnion();
207 return UTT == UTT_IsUnion ? Union : !Union;
208 }
209 return false;
210 case UTT_IsEnum: return QueriedType->isEnumeralType();
211 case UTT_IsPolymorphic:
Ted Kremenek6217b802009-07-29 21:53:49 +0000212 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000213 // Type traits are only parsed in C++, so we've got CXXRecords.
214 return cast<CXXRecordDecl>(Record->getDecl())->isPolymorphic();
215 }
216 return false;
Anders Carlsson67e4dd22009-03-22 01:52:17 +0000217 case UTT_IsAbstract:
Ted Kremenek6217b802009-07-29 21:53:49 +0000218 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Anders Carlsson67e4dd22009-03-22 01:52:17 +0000219 return cast<CXXRecordDecl>(RT->getDecl())->isAbstract();
220 return false;
Eli Friedman1d954f62009-08-15 21:55:26 +0000221 case UTT_IsEmpty:
222 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
223 return !Record->getDecl()->isUnion()
224 && cast<CXXRecordDecl>(Record->getDecl())->isEmpty();
225 }
226 return false;
Anders Carlsson347ba892009-04-16 00:08:20 +0000227 case UTT_HasTrivialConstructor:
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000228 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
229 // If __is_pod (type) is true then the trait is true, else if type is
230 // a cv class or union type (or array thereof) with a trivial default
231 // constructor ([class.ctor]) then the trait is true, else it is false.
232 if (QueriedType->isPODType())
233 return true;
234 if (const RecordType *RT =
Ted Kremenek6217b802009-07-29 21:53:49 +0000235 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlsson347ba892009-04-16 00:08:20 +0000236 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialConstructor();
Anders Carlsson072abef2009-04-17 02:34:54 +0000237 return false;
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000238 case UTT_HasTrivialCopy:
239 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
240 // If __is_pod (type) is true or type is a reference type then
241 // the trait is true, else if type is a cv class or union type
242 // with a trivial copy constructor ([class.copy]) then the trait
243 // is true, else it is false.
244 if (QueriedType->isPODType() || QueriedType->isReferenceType())
245 return true;
Ted Kremenek6217b802009-07-29 21:53:49 +0000246 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000247 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyConstructor();
248 return false;
249 case UTT_HasTrivialAssign:
250 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
251 // If type is const qualified or is a reference type then the
252 // trait is false. Otherwise if __is_pod (type) is true then the
253 // trait is true, else if type is a cv class or union type with
254 // a trivial copy assignment ([class.copy]) then the trait is
255 // true, else it is false.
256 // Note: the const and reference restrictions are interesting,
257 // given that const and reference members don't prevent a class
258 // from having a trivial copy assignment operator (but do cause
259 // errors if the copy assignment operator is actually used, q.v.
260 // [class.copy]p12).
261
262 if (C.getBaseElementType(QueriedType).isConstQualified())
263 return false;
264 if (QueriedType->isPODType())
265 return true;
Ted Kremenek6217b802009-07-29 21:53:49 +0000266 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000267 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyAssignment();
268 return false;
269 case UTT_HasTrivialDestructor:
270 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
271 // If __is_pod (type) is true or type is a reference type
272 // then the trait is true, else if type is a cv class or union
273 // type (or array thereof) with a trivial destructor
274 // ([class.dtor]) then the trait is true, else it is
275 // false.
276 if (QueriedType->isPODType() || QueriedType->isReferenceType())
277 return true;
278 if (const RecordType *RT =
Ted Kremenek6217b802009-07-29 21:53:49 +0000279 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlsson072abef2009-04-17 02:34:54 +0000280 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor();
281 return false;
Sebastian Redl64b45f72009-01-05 20:52:13 +0000282 }
283}
284
Ted Kremeneke3837682009-12-23 04:00:48 +0000285SourceRange CXXConstructExpr::getSourceRange() const {
286 // FIXME: Should we know where the parentheses are, if there are any?
287 for (std::reverse_iterator<Stmt**> I(&Args[NumArgs]), E(&Args[0]); I!=E;++I) {
288 // Ignore CXXDefaultExprs when computing the range, as they don't
289 // have a range.
290 if (!isa<CXXDefaultArgExpr>(*I))
291 return SourceRange(Loc, (*I)->getLocEnd());
292 }
293
294 return SourceRange(Loc);
295}
296
Douglas Gregorb4609802008-11-14 16:09:21 +0000297SourceRange CXXOperatorCallExpr::getSourceRange() const {
298 OverloadedOperatorKind Kind = getOperator();
299 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
300 if (getNumArgs() == 1)
301 // Prefix operator
Mike Stump1eb44332009-09-09 15:08:12 +0000302 return SourceRange(getOperatorLoc(),
Douglas Gregorb4609802008-11-14 16:09:21 +0000303 getArg(0)->getSourceRange().getEnd());
304 else
305 // Postfix operator
306 return SourceRange(getArg(0)->getSourceRange().getEnd(),
307 getOperatorLoc());
308 } else if (Kind == OO_Call) {
309 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
310 } else if (Kind == OO_Subscript) {
311 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
312 } else if (getNumArgs() == 1) {
313 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
314 } else if (getNumArgs() == 2) {
315 return SourceRange(getArg(0)->getSourceRange().getBegin(),
316 getArg(1)->getSourceRange().getEnd());
317 } else {
318 return SourceRange();
319 }
320}
321
Douglas Gregor88a35142008-12-22 05:46:06 +0000322Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
323 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
324 return MemExpr->getBase();
325
326 // FIXME: Will eventually need to cope with member pointers.
327 return 0;
328}
329
Douglas Gregor00b98c22009-11-12 15:31:47 +0000330SourceRange CXXMemberCallExpr::getSourceRange() const {
331 SourceLocation LocStart = getCallee()->getLocStart();
332 if (LocStart.isInvalid() && getNumArgs() > 0)
333 LocStart = getArg(0)->getLocStart();
334 return SourceRange(LocStart, getRParenLoc());
335}
336
337
Douglas Gregor49badde2008-10-27 19:41:14 +0000338//===----------------------------------------------------------------------===//
339// Named casts
340//===----------------------------------------------------------------------===//
341
342/// getCastName - Get the name of the C++ cast being used, e.g.,
343/// "static_cast", "dynamic_cast", "reinterpret_cast", or
344/// "const_cast". The returned pointer must not be freed.
345const char *CXXNamedCastExpr::getCastName() const {
346 switch (getStmtClass()) {
347 case CXXStaticCastExprClass: return "static_cast";
348 case CXXDynamicCastExprClass: return "dynamic_cast";
349 case CXXReinterpretCastExprClass: return "reinterpret_cast";
350 case CXXConstCastExprClass: return "const_cast";
351 default: return "<invalid cast>";
352 }
353}
Douglas Gregor506ae412009-01-16 18:33:17 +0000354
Douglas Gregor65222e82009-12-23 18:19:08 +0000355CXXDefaultArgExpr *
Douglas Gregor036aed12009-12-23 23:03:06 +0000356CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
357 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor65222e82009-12-23 18:19:08 +0000358 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor036aed12009-12-23 23:03:06 +0000359 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
360 SubExpr);
Douglas Gregor65222e82009-12-23 18:19:08 +0000361}
362
363void CXXDefaultArgExpr::DoDestroy(ASTContext &C) {
364 if (Param.getInt())
365 getExpr()->Destroy(C);
366 this->~CXXDefaultArgExpr();
367 C.Deallocate(this);
368}
369
Mike Stump1eb44332009-09-09 15:08:12 +0000370CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonb859f352009-05-30 20:34:37 +0000371 const CXXDestructorDecl *Destructor) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000372 return new (C) CXXTemporary(Destructor);
373}
374
Douglas Gregor42602bb2009-08-07 06:08:38 +0000375void CXXTemporary::Destroy(ASTContext &Ctx) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000376 this->~CXXTemporary();
Douglas Gregor42602bb2009-08-07 06:08:38 +0000377 Ctx.Deallocate(this);
Anders Carlssonc1ce4772009-05-30 19:54:15 +0000378}
379
Mike Stump1eb44332009-09-09 15:08:12 +0000380CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000381 CXXTemporary *Temp,
382 Expr* SubExpr) {
Mike Stump1eb44332009-09-09 15:08:12 +0000383 assert(SubExpr->getType()->isRecordType() &&
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000384 "Expression bound to a temporary must have record type!");
385
Anders Carlssonb859f352009-05-30 20:34:37 +0000386 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000387}
388
Douglas Gregor42602bb2009-08-07 06:08:38 +0000389void CXXBindTemporaryExpr::DoDestroy(ASTContext &C) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000390 Temp->Destroy(C);
391 this->~CXXBindTemporaryExpr();
392 C.Deallocate(this);
393}
394
Anders Carlsson8e587a12009-05-30 20:56:46 +0000395CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson26de5492009-04-24 05:23:13 +0000396 CXXConstructorDecl *Cons,
Douglas Gregor506ae412009-01-16 18:33:17 +0000397 QualType writtenTy,
Mike Stump1eb44332009-09-09 15:08:12 +0000398 SourceLocation tyBeginLoc,
Douglas Gregor506ae412009-01-16 18:33:17 +0000399 Expr **Args,
Mike Stump1eb44332009-09-09 15:08:12 +0000400 unsigned NumArgs,
Douglas Gregor506ae412009-01-16 18:33:17 +0000401 SourceLocation rParenLoc)
Douglas Gregor99a2e602009-12-16 01:38:02 +0000402 : CXXConstructExpr(C, CXXTemporaryObjectExprClass, writtenTy, tyBeginLoc,
403 Cons, false, Args, NumArgs),
Anders Carlsson524fa132009-04-24 17:34:38 +0000404 TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {
Douglas Gregor506ae412009-01-16 18:33:17 +0000405}
Anders Carlsson19d28a62009-04-21 02:22:11 +0000406
Mike Stump1eb44332009-09-09 15:08:12 +0000407CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000408 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000409 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000410 Expr **Args, unsigned NumArgs,
411 bool ZeroInitialization) {
Douglas Gregor99a2e602009-12-16 01:38:02 +0000412 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor16006c92009-12-16 18:50:27 +0000413 Elidable, Args, NumArgs, ZeroInitialization);
Anders Carlssone349bea2009-04-23 02:32:43 +0000414}
415
Mike Stump1eb44332009-09-09 15:08:12 +0000416CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000417 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000418 CXXConstructorDecl *D, bool elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000419 Expr **args, unsigned numargs,
420 bool ZeroInitialization)
Anders Carlssonbd6734e2009-04-24 05:04:04 +0000421: Expr(SC, T,
Anders Carlssone349bea2009-04-23 02:32:43 +0000422 T->isDependentType(),
423 (T->isDependentType() ||
424 CallExpr::hasAnyValueDependentArguments(args, numargs))),
Douglas Gregor16006c92009-12-16 18:50:27 +0000425 Constructor(D), Loc(Loc), Elidable(elidable),
426 ZeroInitialization(ZeroInitialization), Args(0), NumArgs(numargs)
427{
428 if (NumArgs) {
429 Args = new (C) Stmt*[NumArgs];
430
431 for (unsigned i = 0; i != NumArgs; ++i) {
432 assert(args[i] && "NULL argument in CXXConstructExpr");
433 Args[i] = args[i];
Anders Carlssone349bea2009-04-23 02:32:43 +0000434 }
Douglas Gregor16006c92009-12-16 18:50:27 +0000435 }
Anders Carlssone349bea2009-04-23 02:32:43 +0000436}
437
Douglas Gregor39da0b82009-09-09 23:08:42 +0000438CXXConstructExpr::CXXConstructExpr(EmptyShell Empty, ASTContext &C,
439 unsigned numargs)
440 : Expr(CXXConstructExprClass, Empty), Args(0), NumArgs(numargs)
441{
442 if (NumArgs)
443 Args = new (C) Stmt*[NumArgs];
444}
445
Douglas Gregor42602bb2009-08-07 06:08:38 +0000446void CXXConstructExpr::DoDestroy(ASTContext &C) {
Anders Carlssone349bea2009-04-23 02:32:43 +0000447 DestroyChildren(C);
448 if (Args)
449 C.Deallocate(Args);
450 this->~CXXConstructExpr();
451 C.Deallocate(this);
452}
453
Mike Stump1eb44332009-09-09 15:08:12 +0000454CXXExprWithTemporaries::CXXExprWithTemporaries(Expr *subexpr,
455 CXXTemporary **temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000456 unsigned numtemps)
Anders Carlsson2d44e8a2009-05-01 22:18:43 +0000457: Expr(CXXExprWithTemporariesClass, subexpr->getType(),
Mike Stump1eb44332009-09-09 15:08:12 +0000458 subexpr->isTypeDependent(), subexpr->isValueDependent()),
Anders Carlsson0ece4912009-12-15 20:51:39 +0000459 SubExpr(subexpr), Temps(0), NumTemps(numtemps) {
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000460 if (NumTemps > 0) {
461 Temps = new CXXTemporary*[NumTemps];
462 for (unsigned i = 0; i < NumTemps; ++i)
463 Temps[i] = temps[i];
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000464 }
465}
466
Mike Stump1eb44332009-09-09 15:08:12 +0000467CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C,
Anders Carlsson88eaf072009-05-30 22:38:53 +0000468 Expr *SubExpr,
Mike Stump1eb44332009-09-09 15:08:12 +0000469 CXXTemporary **Temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000470 unsigned NumTemps) {
471 return new (C) CXXExprWithTemporaries(SubExpr, Temps, NumTemps);
Anders Carlsson88eaf072009-05-30 22:38:53 +0000472}
473
Douglas Gregor42602bb2009-08-07 06:08:38 +0000474void CXXExprWithTemporaries::DoDestroy(ASTContext &C) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000475 DestroyChildren(C);
476 this->~CXXExprWithTemporaries();
477 C.Deallocate(this);
478}
479
Anders Carlsson2d44e8a2009-05-01 22:18:43 +0000480CXXExprWithTemporaries::~CXXExprWithTemporaries() {
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000481 delete[] Temps;
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000482}
483
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000484// CXXBindTemporaryExpr
485Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
486 return &SubExpr;
487}
488
Mike Stump1eb44332009-09-09 15:08:12 +0000489Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000490 return &SubExpr + 1;
491}
492
Anders Carlssone349bea2009-04-23 02:32:43 +0000493// CXXConstructExpr
494Stmt::child_iterator CXXConstructExpr::child_begin() {
495 return &Args[0];
496}
497Stmt::child_iterator CXXConstructExpr::child_end() {
498 return &Args[0]+NumArgs;
499}
500
Anders Carlsson55674ac2009-05-01 22:21:22 +0000501// CXXExprWithTemporaries
502Stmt::child_iterator CXXExprWithTemporaries::child_begin() {
503 return &SubExpr;
Anders Carlsson19d28a62009-04-21 02:22:11 +0000504}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000505
Mike Stump1eb44332009-09-09 15:08:12 +0000506Stmt::child_iterator CXXExprWithTemporaries::child_end() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000507 return &SubExpr + 1;
508}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000509
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000510CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(
511 SourceLocation TyBeginLoc,
512 QualType T,
513 SourceLocation LParenLoc,
514 Expr **Args,
515 unsigned NumArgs,
516 SourceLocation RParenLoc)
517 : Expr(CXXUnresolvedConstructExprClass, T.getNonReferenceType(),
518 T->isDependentType(), true),
519 TyBeginLoc(TyBeginLoc),
520 Type(T),
521 LParenLoc(LParenLoc),
522 RParenLoc(RParenLoc),
523 NumArgs(NumArgs) {
524 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
525 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs);
526}
527
528CXXUnresolvedConstructExpr *
Mike Stump1eb44332009-09-09 15:08:12 +0000529CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000530 SourceLocation TyBegin,
531 QualType T,
532 SourceLocation LParenLoc,
533 Expr **Args,
534 unsigned NumArgs,
535 SourceLocation RParenLoc) {
536 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
537 sizeof(Expr *) * NumArgs);
538 return new (Mem) CXXUnresolvedConstructExpr(TyBegin, T, LParenLoc,
539 Args, NumArgs, RParenLoc);
540}
541
542Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
543 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
544}
545
546Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
547 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
548}
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000549
John McCall865d4472009-11-19 22:55:06 +0000550CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000551 Expr *Base, QualType BaseType,
552 bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000553 SourceLocation OperatorLoc,
554 NestedNameSpecifier *Qualifier,
555 SourceRange QualifierRange,
556 NamedDecl *FirstQualifierFoundInScope,
557 DeclarationName Member,
558 SourceLocation MemberLoc,
John McCalld5532b62009-11-23 01:53:49 +0000559 const TemplateArgumentListInfo *TemplateArgs)
John McCall865d4472009-11-19 22:55:06 +0000560 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, true, true),
John McCallaa81e162009-12-01 22:10:20 +0000561 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
562 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000563 OperatorLoc(OperatorLoc),
564 Qualifier(Qualifier), QualifierRange(QualifierRange),
565 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Mike Stump1eb44332009-09-09 15:08:12 +0000566 Member(Member), MemberLoc(MemberLoc) {
John McCalld5532b62009-11-23 01:53:49 +0000567 if (TemplateArgs)
568 getExplicitTemplateArgumentList()->initializeFrom(*TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000569}
570
John McCall865d4472009-11-19 22:55:06 +0000571CXXDependentScopeMemberExpr *
572CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000573 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000574 SourceLocation OperatorLoc,
575 NestedNameSpecifier *Qualifier,
576 SourceRange QualifierRange,
577 NamedDecl *FirstQualifierFoundInScope,
578 DeclarationName Member,
579 SourceLocation MemberLoc,
John McCalld5532b62009-11-23 01:53:49 +0000580 const TemplateArgumentListInfo *TemplateArgs) {
581 if (!TemplateArgs)
John McCallaa81e162009-12-01 22:10:20 +0000582 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
583 IsArrow, OperatorLoc,
584 Qualifier, QualifierRange,
585 FirstQualifierFoundInScope,
586 Member, MemberLoc);
Mike Stump1eb44332009-09-09 15:08:12 +0000587
John McCalld5532b62009-11-23 01:53:49 +0000588 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
589 if (TemplateArgs)
590 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
591
592 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>());
John McCallaa81e162009-12-01 22:10:20 +0000593 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
594 IsArrow, OperatorLoc,
595 Qualifier, QualifierRange,
596 FirstQualifierFoundInScope,
597 Member, MemberLoc, TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000598}
599
John McCall865d4472009-11-19 22:55:06 +0000600Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000601 return child_iterator(&Base);
602}
603
John McCall865d4472009-11-19 22:55:06 +0000604Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000605 if (isImplicitAccess())
606 return child_iterator(&Base);
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000607 return child_iterator(&Base + 1);
608}
John McCall129e2df2009-11-30 22:42:35 +0000609
610UnresolvedMemberExpr::UnresolvedMemberExpr(QualType T, bool Dependent,
611 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000612 Expr *Base, QualType BaseType,
613 bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000614 SourceLocation OperatorLoc,
615 NestedNameSpecifier *Qualifier,
616 SourceRange QualifierRange,
617 DeclarationName MemberName,
618 SourceLocation MemberLoc,
619 const TemplateArgumentListInfo *TemplateArgs)
620 : Expr(UnresolvedMemberExprClass, T, Dependent, Dependent),
John McCallaa81e162009-12-01 22:10:20 +0000621 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
622 HasUnresolvedUsing(HasUnresolvedUsing),
John McCall129e2df2009-11-30 22:42:35 +0000623 HasExplicitTemplateArgs(TemplateArgs != 0),
624 OperatorLoc(OperatorLoc),
625 Qualifier(Qualifier), QualifierRange(QualifierRange),
626 MemberName(MemberName), MemberLoc(MemberLoc) {
627 if (TemplateArgs)
628 getExplicitTemplateArgs()->initializeFrom(*TemplateArgs);
629}
630
631UnresolvedMemberExpr *
632UnresolvedMemberExpr::Create(ASTContext &C, bool Dependent,
633 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000634 Expr *Base, QualType BaseType, bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000635 SourceLocation OperatorLoc,
636 NestedNameSpecifier *Qualifier,
637 SourceRange QualifierRange,
638 DeclarationName Member,
639 SourceLocation MemberLoc,
640 const TemplateArgumentListInfo *TemplateArgs) {
641 std::size_t size = sizeof(UnresolvedMemberExpr);
642 if (TemplateArgs)
643 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
644
645 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>());
646 return new (Mem) UnresolvedMemberExpr(
647 Dependent ? C.DependentTy : C.OverloadTy,
John McCallaa81e162009-12-01 22:10:20 +0000648 Dependent, HasUnresolvedUsing, Base, BaseType,
649 IsArrow, OperatorLoc, Qualifier, QualifierRange,
John McCall129e2df2009-11-30 22:42:35 +0000650 Member, MemberLoc, TemplateArgs);
651}
652
653Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
654 return child_iterator(&Base);
655}
656
657Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000658 if (isImplicitAccess())
659 return child_iterator(&Base);
John McCall129e2df2009-11-30 22:42:35 +0000660 return child_iterator(&Base + 1);
661}