blob: 3931bbd6dae56103a7d525feaaf84c02dcfed79f [file] [log] [blame]
Ted Kremeneke3a0c142007-08-24 20:21:10 +00001//===--- ExprCXX.cpp - (C++) Expression AST Node Implementation -----------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-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 Kremeneke3a0c142007-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 Gregor993603d2008-11-14 16:09:21 +000014#include "clang/Basic/IdentifierTable.h"
15#include "clang/AST/DeclCXX.h"
Douglas Gregora727cb92009-06-30 22:34:41 +000016#include "clang/AST/DeclTemplate.h"
Ted Kremeneke3a0c142007-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 Redlc4704762008-11-11 11:37:55 +000024// CXXTypeidExpr - has child iterators if the operand is an expression
25Stmt::child_iterator CXXTypeidExpr::child_begin() {
Sebastian Redlba3fdfc2008-12-03 23:17:54 +000026 return isTypeOperand() ? child_iterator() : &Operand.Ex;
Sebastian Redlc4704762008-11-11 11:37:55 +000027}
28Stmt::child_iterator CXXTypeidExpr::child_end() {
Sebastian Redlba3fdfc2008-12-03 23:17:54 +000029 return isTypeOperand() ? child_iterator() : &Operand.Ex+1;
Sebastian Redlc4704762008-11-11 11:37:55 +000030}
Ted Kremeneke3a0c142007-08-24 20:21:10 +000031
Ted Kremeneke3a0c142007-08-24 20:21:10 +000032// CXXBoolLiteralExpr
Mike Stump11289f42009-09-09 15:08:12 +000033Stmt::child_iterator CXXBoolLiteralExpr::child_begin() {
Ted Kremenek04746ce2007-10-18 23:28:49 +000034 return child_iterator();
35}
36Stmt::child_iterator CXXBoolLiteralExpr::child_end() {
37 return child_iterator();
38}
Chris Lattnerb7e656b2008-02-26 00:51:44 +000039
Sebastian Redl576fd422009-05-10 18:38:11 +000040// CXXNullPtrLiteralExpr
Mike Stump11289f42009-09-09 15:08:12 +000041Stmt::child_iterator CXXNullPtrLiteralExpr::child_begin() {
Sebastian Redl576fd422009-05-10 18:38:11 +000042 return child_iterator();
43}
44Stmt::child_iterator CXXNullPtrLiteralExpr::child_end() {
45 return child_iterator();
46}
47
Douglas Gregor97a9c812008-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 Lattnerb7e656b2008-02-26 00:51:44 +000052// CXXThrowExpr
Ted Kremenekc6501db2008-06-17 03:11:08 +000053Stmt::child_iterator CXXThrowExpr::child_begin() { return &Op; }
Chris Lattnerb7e656b2008-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 Kremenekc6501db2008-06-17 03:11:08 +000056 return Op ? &Op+1 : &Op;
Chris Lattnerb7e656b2008-02-26 00:51:44 +000057}
Chris Lattneraa9c7ae2008-04-08 04:40:51 +000058
59// CXXDefaultArgExpr
60Stmt::child_iterator CXXDefaultArgExpr::child_begin() {
Chris Lattner58258242008-04-10 02:22:51 +000061 return child_iterator();
Chris Lattneraa9c7ae2008-04-08 04:40:51 +000062}
63Stmt::child_iterator CXXDefaultArgExpr::child_end() {
Chris Lattner58258242008-04-10 02:22:51 +000064 return child_iterator();
Chris Lattneraa9c7ae2008-04-08 04:40:51 +000065}
Argyrios Kyrtzidis857fcc22008-08-22 15:38:55 +000066
67// CXXZeroInitValueExpr
Mike Stump11289f42009-09-09 15:08:12 +000068Stmt::child_iterator CXXZeroInitValueExpr::child_begin() {
Argyrios Kyrtzidis857fcc22008-08-22 15:38:55 +000069 return child_iterator();
70}
71Stmt::child_iterator CXXZeroInitValueExpr::child_end() {
72 return child_iterator();
73}
Argyrios Kyrtzidisaa479132008-09-09 23:47:53 +000074
Sebastian Redlbd150f42008-11-21 19:14:01 +000075// CXXNewExpr
76CXXNewExpr::CXXNewExpr(bool globalNew, FunctionDecl *operatorNew,
77 Expr **placementArgs, unsigned numPlaceArgs,
Sebastian Redl351bb782008-12-02 14:43:59 +000078 bool parenTypeId, Expr *arraySize,
Sebastian Redlbd150f42008-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 Redl8d2ccae2009-02-26 14:39:58 +000083 : Expr(CXXNewExprClass, ty, ty->isDependentType(), ty->isDependentType()),
84 GlobalNew(globalNew), ParenTypeId(parenTypeId),
Sebastian Redl351bb782008-12-02 14:43:59 +000085 Initializer(initializer), Array(arraySize), NumPlacementArgs(numPlaceArgs),
Sebastian Redlbd150f42008-11-21 19:14:01 +000086 NumConstructorArgs(numConsArgs), OperatorNew(operatorNew),
Sebastian Redl351bb782008-12-02 14:43:59 +000087 OperatorDelete(operatorDelete), Constructor(constructor),
Mike Stump11289f42009-09-09 15:08:12 +000088 StartLoc(startLoc), EndLoc(endLoc) {
Sebastian Redl351bb782008-12-02 14:43:59 +000089 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
Sebastian Redlbd150f42008-11-21 19:14:01 +000090 SubExprs = new Stmt*[TotalSize];
91 unsigned i = 0;
Sebastian Redl351bb782008-12-02 14:43:59 +000092 if (Array)
93 SubExprs[i++] = arraySize;
94 for (unsigned j = 0; j < NumPlacementArgs; ++j)
Sebastian Redlbd150f42008-11-21 19:14:01 +000095 SubExprs[i++] = placementArgs[j];
Sebastian Redl351bb782008-12-02 14:43:59 +000096 for (unsigned j = 0; j < NumConstructorArgs; ++j)
Sebastian Redlbd150f42008-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 Redl351bb782008-12-02 14:43:59 +0000103 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redlbd150f42008-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 Gregorad8a3362009-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 McCalld14a8642009-11-21 08:51:07 +0000116// UnresolvedLookupExpr
John McCalle66edc12009-11-24 19:00:30 +0000117UnresolvedLookupExpr *
118UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent,
John McCall58cc69d2010-01-27 01:50:18 +0000119 CXXRecordDecl *NamingClass,
John McCalle66edc12009-11-24 19:00:30 +0000120 NestedNameSpecifier *Qualifier,
121 SourceRange QualifierRange, DeclarationName Name,
122 SourceLocation NameLoc, bool ADL,
123 const TemplateArgumentListInfo &Args)
124{
125 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
126 ExplicitTemplateArgumentList::sizeFor(Args));
127 UnresolvedLookupExpr *ULE
128 = new (Mem) UnresolvedLookupExpr(Dependent ? C.DependentTy : C.OverloadTy,
John McCall58cc69d2010-01-27 01:50:18 +0000129 Dependent, NamingClass,
130 Qualifier, QualifierRange,
John McCalle66edc12009-11-24 19:00:30 +0000131 Name, NameLoc, ADL,
132 /*Overload*/ true,
133 /*ExplicitTemplateArgs*/ true);
134
135 reinterpret_cast<ExplicitTemplateArgumentList*>(ULE+1)->initializeFrom(Args);
136
137 return ULE;
138}
139
John McCallad371252010-01-20 00:46:10 +0000140bool UnresolvedLookupExpr::
141 ComputeDependence(UnresolvedSetImpl::const_iterator Begin,
142 UnresolvedSetImpl::const_iterator End,
143 const TemplateArgumentListInfo *Args) {
144 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I)
John McCalle66edc12009-11-24 19:00:30 +0000145 if ((*I)->getDeclContext()->isDependentContext())
146 return true;
147
148 if (Args && TemplateSpecializationType::anyDependentTemplateArguments(*Args))
149 return true;
150
151 return false;
152}
153
John McCalld14a8642009-11-21 08:51:07 +0000154Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump11289f42009-09-09 15:08:12 +0000155 return child_iterator();
Douglas Gregorb0846b02008-12-06 00:22:45 +0000156}
John McCalld14a8642009-11-21 08:51:07 +0000157Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregorb0846b02008-12-06 00:22:45 +0000158 return child_iterator();
159}
Sebastian Redlbaad4e72009-01-05 20:52:13 +0000160// UnaryTypeTraitExpr
161Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
162 return child_iterator();
163}
164Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
165 return child_iterator();
166}
167
John McCall8cd78132009-11-19 22:55:06 +0000168// DependentScopeDeclRefExpr
John McCalle66edc12009-11-24 19:00:30 +0000169DependentScopeDeclRefExpr *
170DependentScopeDeclRefExpr::Create(ASTContext &C,
171 NestedNameSpecifier *Qualifier,
172 SourceRange QualifierRange,
173 DeclarationName Name,
174 SourceLocation NameLoc,
175 const TemplateArgumentListInfo *Args) {
176 std::size_t size = sizeof(DependentScopeDeclRefExpr);
177 if (Args) size += ExplicitTemplateArgumentList::sizeFor(*Args);
178 void *Mem = C.Allocate(size);
179
180 DependentScopeDeclRefExpr *DRE
181 = new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
182 Qualifier, QualifierRange,
183 Name, NameLoc,
184 Args != 0);
185
186 if (Args)
187 reinterpret_cast<ExplicitTemplateArgumentList*>(DRE+1)
188 ->initializeFrom(*Args);
189
190 return DRE;
191}
192
John McCall8cd78132009-11-19 22:55:06 +0000193StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor90a1a652009-03-19 17:26:29 +0000194 return child_iterator();
195}
196
John McCall8cd78132009-11-19 22:55:06 +0000197StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor90a1a652009-03-19 17:26:29 +0000198 return child_iterator();
199}
200
Douglas Gregor79f83ed2009-07-23 23:49:00 +0000201bool UnaryTypeTraitExpr::EvaluateTrait(ASTContext& C) const {
Sebastian Redlbaad4e72009-01-05 20:52:13 +0000202 switch(UTT) {
203 default: assert(false && "Unknown type trait or not implemented");
204 case UTT_IsPOD: return QueriedType->isPODType();
Sebastian Redl79eba1c2009-12-03 00:13:20 +0000205 case UTT_IsLiteral: return QueriedType->isLiteralType();
Sebastian Redlbaad4e72009-01-05 20:52:13 +0000206 case UTT_IsClass: // Fallthrough
207 case UTT_IsUnion:
Ted Kremenekc23c7e62009-07-29 21:53:49 +0000208 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redlbaad4e72009-01-05 20:52:13 +0000209 bool Union = Record->getDecl()->isUnion();
210 return UTT == UTT_IsUnion ? Union : !Union;
211 }
212 return false;
213 case UTT_IsEnum: return QueriedType->isEnumeralType();
214 case UTT_IsPolymorphic:
Ted Kremenekc23c7e62009-07-29 21:53:49 +0000215 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redlbaad4e72009-01-05 20:52:13 +0000216 // Type traits are only parsed in C++, so we've got CXXRecords.
217 return cast<CXXRecordDecl>(Record->getDecl())->isPolymorphic();
218 }
219 return false;
Anders Carlsson7cbd8fb2009-03-22 01:52:17 +0000220 case UTT_IsAbstract:
Ted Kremenekc23c7e62009-07-29 21:53:49 +0000221 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Anders Carlsson7cbd8fb2009-03-22 01:52:17 +0000222 return cast<CXXRecordDecl>(RT->getDecl())->isAbstract();
223 return false;
Eli Friedmanc96d4962009-08-15 21:55:26 +0000224 case UTT_IsEmpty:
225 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
226 return !Record->getDecl()->isUnion()
227 && cast<CXXRecordDecl>(Record->getDecl())->isEmpty();
228 }
229 return false;
Anders Carlssonfe63dc52009-04-16 00:08:20 +0000230 case UTT_HasTrivialConstructor:
Douglas Gregor79f83ed2009-07-23 23:49:00 +0000231 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
232 // If __is_pod (type) is true then the trait is true, else if type is
233 // a cv class or union type (or array thereof) with a trivial default
234 // constructor ([class.ctor]) then the trait is true, else it is false.
235 if (QueriedType->isPODType())
236 return true;
237 if (const RecordType *RT =
Ted Kremenekc23c7e62009-07-29 21:53:49 +0000238 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlssonfe63dc52009-04-16 00:08:20 +0000239 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialConstructor();
Anders Carlsson6dc35752009-04-17 02:34:54 +0000240 return false;
Douglas Gregor79f83ed2009-07-23 23:49:00 +0000241 case UTT_HasTrivialCopy:
242 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
243 // If __is_pod (type) is true or type is a reference type then
244 // the trait is true, else if type is a cv class or union type
245 // with a trivial copy constructor ([class.copy]) then the trait
246 // is true, else it is false.
247 if (QueriedType->isPODType() || QueriedType->isReferenceType())
248 return true;
Ted Kremenekc23c7e62009-07-29 21:53:49 +0000249 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor79f83ed2009-07-23 23:49:00 +0000250 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyConstructor();
251 return false;
252 case UTT_HasTrivialAssign:
253 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
254 // If type is const qualified or is a reference type then the
255 // trait is false. Otherwise if __is_pod (type) is true then the
256 // trait is true, else if type is a cv class or union type with
257 // a trivial copy assignment ([class.copy]) then the trait is
258 // true, else it is false.
259 // Note: the const and reference restrictions are interesting,
260 // given that const and reference members don't prevent a class
261 // from having a trivial copy assignment operator (but do cause
262 // errors if the copy assignment operator is actually used, q.v.
263 // [class.copy]p12).
264
265 if (C.getBaseElementType(QueriedType).isConstQualified())
266 return false;
267 if (QueriedType->isPODType())
268 return true;
Ted Kremenekc23c7e62009-07-29 21:53:49 +0000269 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor79f83ed2009-07-23 23:49:00 +0000270 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyAssignment();
271 return false;
272 case UTT_HasTrivialDestructor:
273 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
274 // If __is_pod (type) is true or type is a reference type
275 // then the trait is true, else if type is a cv class or union
276 // type (or array thereof) with a trivial destructor
277 // ([class.dtor]) then the trait is true, else it is
278 // false.
279 if (QueriedType->isPODType() || QueriedType->isReferenceType())
280 return true;
281 if (const RecordType *RT =
Ted Kremenekc23c7e62009-07-29 21:53:49 +0000282 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlsson6dc35752009-04-17 02:34:54 +0000283 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor();
284 return false;
Sebastian Redlbaad4e72009-01-05 20:52:13 +0000285 }
286}
287
Ted Kremenek49ace5c2009-12-23 04:00:48 +0000288SourceRange CXXConstructExpr::getSourceRange() const {
289 // FIXME: Should we know where the parentheses are, if there are any?
290 for (std::reverse_iterator<Stmt**> I(&Args[NumArgs]), E(&Args[0]); I!=E;++I) {
291 // Ignore CXXDefaultExprs when computing the range, as they don't
292 // have a range.
293 if (!isa<CXXDefaultArgExpr>(*I))
294 return SourceRange(Loc, (*I)->getLocEnd());
295 }
296
297 return SourceRange(Loc);
298}
299
Douglas Gregor993603d2008-11-14 16:09:21 +0000300SourceRange CXXOperatorCallExpr::getSourceRange() const {
301 OverloadedOperatorKind Kind = getOperator();
302 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
303 if (getNumArgs() == 1)
304 // Prefix operator
Mike Stump11289f42009-09-09 15:08:12 +0000305 return SourceRange(getOperatorLoc(),
Douglas Gregor993603d2008-11-14 16:09:21 +0000306 getArg(0)->getSourceRange().getEnd());
307 else
308 // Postfix operator
309 return SourceRange(getArg(0)->getSourceRange().getEnd(),
310 getOperatorLoc());
311 } else if (Kind == OO_Call) {
312 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
313 } else if (Kind == OO_Subscript) {
314 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
315 } else if (getNumArgs() == 1) {
316 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
317 } else if (getNumArgs() == 2) {
318 return SourceRange(getArg(0)->getSourceRange().getBegin(),
319 getArg(1)->getSourceRange().getEnd());
320 } else {
321 return SourceRange();
322 }
323}
324
Douglas Gregor97fd6e22008-12-22 05:46:06 +0000325Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
326 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
327 return MemExpr->getBase();
328
329 // FIXME: Will eventually need to cope with member pointers.
330 return 0;
331}
332
Douglas Gregoref986e82009-11-12 15:31:47 +0000333SourceRange CXXMemberCallExpr::getSourceRange() const {
334 SourceLocation LocStart = getCallee()->getLocStart();
335 if (LocStart.isInvalid() && getNumArgs() > 0)
336 LocStart = getArg(0)->getLocStart();
337 return SourceRange(LocStart, getRParenLoc());
338}
339
340
Douglas Gregore200adc2008-10-27 19:41:14 +0000341//===----------------------------------------------------------------------===//
342// Named casts
343//===----------------------------------------------------------------------===//
344
345/// getCastName - Get the name of the C++ cast being used, e.g.,
346/// "static_cast", "dynamic_cast", "reinterpret_cast", or
347/// "const_cast". The returned pointer must not be freed.
348const char *CXXNamedCastExpr::getCastName() const {
349 switch (getStmtClass()) {
350 case CXXStaticCastExprClass: return "static_cast";
351 case CXXDynamicCastExprClass: return "dynamic_cast";
352 case CXXReinterpretCastExprClass: return "reinterpret_cast";
353 case CXXConstCastExprClass: return "const_cast";
354 default: return "<invalid cast>";
355 }
356}
Douglas Gregordd04d332009-01-16 18:33:17 +0000357
Douglas Gregor25ab25f2009-12-23 18:19:08 +0000358CXXDefaultArgExpr *
Douglas Gregor033f6752009-12-23 23:03:06 +0000359CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
360 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor25ab25f2009-12-23 18:19:08 +0000361 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor033f6752009-12-23 23:03:06 +0000362 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
363 SubExpr);
Douglas Gregor25ab25f2009-12-23 18:19:08 +0000364}
365
366void CXXDefaultArgExpr::DoDestroy(ASTContext &C) {
367 if (Param.getInt())
368 getExpr()->Destroy(C);
369 this->~CXXDefaultArgExpr();
370 C.Deallocate(this);
371}
372
Mike Stump11289f42009-09-09 15:08:12 +0000373CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonffda6062009-05-30 20:34:37 +0000374 const CXXDestructorDecl *Destructor) {
Anders Carlsson73b836b2009-05-30 22:38:53 +0000375 return new (C) CXXTemporary(Destructor);
376}
377
Douglas Gregore26a2852009-08-07 06:08:38 +0000378void CXXTemporary::Destroy(ASTContext &Ctx) {
Anders Carlsson73b836b2009-05-30 22:38:53 +0000379 this->~CXXTemporary();
Douglas Gregore26a2852009-08-07 06:08:38 +0000380 Ctx.Deallocate(this);
Anders Carlssonf337d8c2009-05-30 19:54:15 +0000381}
382
Mike Stump11289f42009-09-09 15:08:12 +0000383CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlsson993a4b32009-05-30 20:03:25 +0000384 CXXTemporary *Temp,
385 Expr* SubExpr) {
Mike Stump11289f42009-09-09 15:08:12 +0000386 assert(SubExpr->getType()->isRecordType() &&
Anders Carlsson993a4b32009-05-30 20:03:25 +0000387 "Expression bound to a temporary must have record type!");
388
Anders Carlssonffda6062009-05-30 20:34:37 +0000389 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
Anders Carlsson993a4b32009-05-30 20:03:25 +0000390}
391
Douglas Gregore26a2852009-08-07 06:08:38 +0000392void CXXBindTemporaryExpr::DoDestroy(ASTContext &C) {
Anders Carlsson73b836b2009-05-30 22:38:53 +0000393 Temp->Destroy(C);
394 this->~CXXBindTemporaryExpr();
395 C.Deallocate(this);
396}
397
Anders Carlssonba6c4372010-01-29 02:39:32 +0000398CXXBindReferenceExpr *CXXBindReferenceExpr::Create(ASTContext &C, Expr *SubExpr,
399 bool ExtendsLifetime,
400 bool RequiresTemporaryCopy) {
401 return new (C) CXXBindReferenceExpr(SubExpr,
402 ExtendsLifetime,
403 RequiresTemporaryCopy);
404}
405
406void CXXBindReferenceExpr::DoDestroy(ASTContext &C) {
407 this->~CXXBindReferenceExpr();
408 C.Deallocate(this);
409}
410
Anders Carlsson4b2434d2009-05-30 20:56:46 +0000411CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson56c5bd82009-04-24 05:23:13 +0000412 CXXConstructorDecl *Cons,
Douglas Gregordd04d332009-01-16 18:33:17 +0000413 QualType writtenTy,
Mike Stump11289f42009-09-09 15:08:12 +0000414 SourceLocation tyBeginLoc,
Douglas Gregordd04d332009-01-16 18:33:17 +0000415 Expr **Args,
Mike Stump11289f42009-09-09 15:08:12 +0000416 unsigned NumArgs,
Douglas Gregordd04d332009-01-16 18:33:17 +0000417 SourceLocation rParenLoc)
Douglas Gregor85dabae2009-12-16 01:38:02 +0000418 : CXXConstructExpr(C, CXXTemporaryObjectExprClass, writtenTy, tyBeginLoc,
419 Cons, false, Args, NumArgs),
Anders Carlsson95c56eb2009-04-24 17:34:38 +0000420 TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {
Douglas Gregordd04d332009-01-16 18:33:17 +0000421}
Anders Carlsson6f287832009-04-21 02:22:11 +0000422
Mike Stump11289f42009-09-09 15:08:12 +0000423CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor85dabae2009-12-16 01:38:02 +0000424 SourceLocation Loc,
Anders Carlsson4b2434d2009-05-30 20:56:46 +0000425 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000426 Expr **Args, unsigned NumArgs,
427 bool ZeroInitialization) {
Douglas Gregor85dabae2009-12-16 01:38:02 +0000428 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000429 Elidable, Args, NumArgs, ZeroInitialization);
Anders Carlsson0781ce72009-04-23 02:32:43 +0000430}
431
Mike Stump11289f42009-09-09 15:08:12 +0000432CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor85dabae2009-12-16 01:38:02 +0000433 SourceLocation Loc,
Anders Carlsson4b2434d2009-05-30 20:56:46 +0000434 CXXConstructorDecl *D, bool elidable,
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000435 Expr **args, unsigned numargs,
436 bool ZeroInitialization)
Anders Carlsson32ebd292009-04-24 05:04:04 +0000437: Expr(SC, T,
Anders Carlsson0781ce72009-04-23 02:32:43 +0000438 T->isDependentType(),
439 (T->isDependentType() ||
440 CallExpr::hasAnyValueDependentArguments(args, numargs))),
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000441 Constructor(D), Loc(Loc), Elidable(elidable),
442 ZeroInitialization(ZeroInitialization), Args(0), NumArgs(numargs)
443{
444 if (NumArgs) {
445 Args = new (C) Stmt*[NumArgs];
446
447 for (unsigned i = 0; i != NumArgs; ++i) {
448 assert(args[i] && "NULL argument in CXXConstructExpr");
449 Args[i] = args[i];
Anders Carlsson0781ce72009-04-23 02:32:43 +0000450 }
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000451 }
Anders Carlsson0781ce72009-04-23 02:32:43 +0000452}
453
Douglas Gregor5d3507d2009-09-09 23:08:42 +0000454CXXConstructExpr::CXXConstructExpr(EmptyShell Empty, ASTContext &C,
455 unsigned numargs)
456 : Expr(CXXConstructExprClass, Empty), Args(0), NumArgs(numargs)
457{
458 if (NumArgs)
459 Args = new (C) Stmt*[NumArgs];
460}
461
Douglas Gregore26a2852009-08-07 06:08:38 +0000462void CXXConstructExpr::DoDestroy(ASTContext &C) {
Anders Carlsson0781ce72009-04-23 02:32:43 +0000463 DestroyChildren(C);
464 if (Args)
465 C.Deallocate(Args);
466 this->~CXXConstructExpr();
467 C.Deallocate(this);
468}
469
Mike Stump11289f42009-09-09 15:08:12 +0000470CXXExprWithTemporaries::CXXExprWithTemporaries(Expr *subexpr,
471 CXXTemporary **temps,
Anders Carlsson6e997b22009-12-15 20:51:39 +0000472 unsigned numtemps)
Anders Carlssonf58c2432009-05-01 22:18:43 +0000473: Expr(CXXExprWithTemporariesClass, subexpr->getType(),
Mike Stump11289f42009-09-09 15:08:12 +0000474 subexpr->isTypeDependent(), subexpr->isValueDependent()),
Anders Carlsson6e997b22009-12-15 20:51:39 +0000475 SubExpr(subexpr), Temps(0), NumTemps(numtemps) {
Anders Carlssona29ded92009-05-30 21:05:25 +0000476 if (NumTemps > 0) {
477 Temps = new CXXTemporary*[NumTemps];
478 for (unsigned i = 0; i < NumTemps; ++i)
479 Temps[i] = temps[i];
Anders Carlssondefc6442009-04-24 22:47:04 +0000480 }
481}
482
Mike Stump11289f42009-09-09 15:08:12 +0000483CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C,
Anders Carlsson73b836b2009-05-30 22:38:53 +0000484 Expr *SubExpr,
Mike Stump11289f42009-09-09 15:08:12 +0000485 CXXTemporary **Temps,
Anders Carlsson6e997b22009-12-15 20:51:39 +0000486 unsigned NumTemps) {
487 return new (C) CXXExprWithTemporaries(SubExpr, Temps, NumTemps);
Anders Carlsson73b836b2009-05-30 22:38:53 +0000488}
489
Douglas Gregore26a2852009-08-07 06:08:38 +0000490void CXXExprWithTemporaries::DoDestroy(ASTContext &C) {
Anders Carlsson73b836b2009-05-30 22:38:53 +0000491 DestroyChildren(C);
492 this->~CXXExprWithTemporaries();
493 C.Deallocate(this);
494}
495
Anders Carlssonf58c2432009-05-01 22:18:43 +0000496CXXExprWithTemporaries::~CXXExprWithTemporaries() {
Anders Carlssona29ded92009-05-30 21:05:25 +0000497 delete[] Temps;
Anders Carlssondefc6442009-04-24 22:47:04 +0000498}
499
Anders Carlsson993a4b32009-05-30 20:03:25 +0000500// CXXBindTemporaryExpr
501Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
502 return &SubExpr;
503}
504
Mike Stump11289f42009-09-09 15:08:12 +0000505Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlsson993a4b32009-05-30 20:03:25 +0000506 return &SubExpr + 1;
507}
508
Anders Carlssonba6c4372010-01-29 02:39:32 +0000509// CXXBindReferenceExpr
510Stmt::child_iterator CXXBindReferenceExpr::child_begin() {
511 return &SubExpr;
512}
513
514Stmt::child_iterator CXXBindReferenceExpr::child_end() {
515 return &SubExpr + 1;
516}
517
Anders Carlsson0781ce72009-04-23 02:32:43 +0000518// CXXConstructExpr
519Stmt::child_iterator CXXConstructExpr::child_begin() {
520 return &Args[0];
521}
522Stmt::child_iterator CXXConstructExpr::child_end() {
523 return &Args[0]+NumArgs;
524}
525
Anders Carlssonaa10d652009-05-01 22:21:22 +0000526// CXXExprWithTemporaries
527Stmt::child_iterator CXXExprWithTemporaries::child_begin() {
528 return &SubExpr;
Anders Carlsson6f287832009-04-21 02:22:11 +0000529}
Anders Carlssondefc6442009-04-24 22:47:04 +0000530
Mike Stump11289f42009-09-09 15:08:12 +0000531Stmt::child_iterator CXXExprWithTemporaries::child_end() {
Anders Carlssonaa10d652009-05-01 22:21:22 +0000532 return &SubExpr + 1;
533}
Anders Carlssondefc6442009-04-24 22:47:04 +0000534
Douglas Gregorce934142009-05-20 18:46:25 +0000535CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(
536 SourceLocation TyBeginLoc,
537 QualType T,
538 SourceLocation LParenLoc,
539 Expr **Args,
540 unsigned NumArgs,
541 SourceLocation RParenLoc)
542 : Expr(CXXUnresolvedConstructExprClass, T.getNonReferenceType(),
543 T->isDependentType(), true),
544 TyBeginLoc(TyBeginLoc),
545 Type(T),
546 LParenLoc(LParenLoc),
547 RParenLoc(RParenLoc),
548 NumArgs(NumArgs) {
549 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
550 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs);
551}
552
553CXXUnresolvedConstructExpr *
Mike Stump11289f42009-09-09 15:08:12 +0000554CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregorce934142009-05-20 18:46:25 +0000555 SourceLocation TyBegin,
556 QualType T,
557 SourceLocation LParenLoc,
558 Expr **Args,
559 unsigned NumArgs,
560 SourceLocation RParenLoc) {
561 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
562 sizeof(Expr *) * NumArgs);
563 return new (Mem) CXXUnresolvedConstructExpr(TyBegin, T, LParenLoc,
564 Args, NumArgs, RParenLoc);
565}
566
567Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
568 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
569}
570
571Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
572 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
573}
Sebastian Redle769ecf2009-05-16 18:50:46 +0000574
John McCall8cd78132009-11-19 22:55:06 +0000575CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCall2d74de92009-12-01 22:10:20 +0000576 Expr *Base, QualType BaseType,
577 bool IsArrow,
Douglas Gregor308047d2009-09-09 00:23:06 +0000578 SourceLocation OperatorLoc,
579 NestedNameSpecifier *Qualifier,
580 SourceRange QualifierRange,
581 NamedDecl *FirstQualifierFoundInScope,
582 DeclarationName Member,
583 SourceLocation MemberLoc,
John McCall6b51f282009-11-23 01:53:49 +0000584 const TemplateArgumentListInfo *TemplateArgs)
John McCall8cd78132009-11-19 22:55:06 +0000585 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, true, true),
John McCall2d74de92009-12-01 22:10:20 +0000586 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
587 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor308047d2009-09-09 00:23:06 +0000588 OperatorLoc(OperatorLoc),
589 Qualifier(Qualifier), QualifierRange(QualifierRange),
590 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Mike Stump11289f42009-09-09 15:08:12 +0000591 Member(Member), MemberLoc(MemberLoc) {
John McCall6b51f282009-11-23 01:53:49 +0000592 if (TemplateArgs)
593 getExplicitTemplateArgumentList()->initializeFrom(*TemplateArgs);
Douglas Gregor308047d2009-09-09 00:23:06 +0000594}
595
John McCall8cd78132009-11-19 22:55:06 +0000596CXXDependentScopeMemberExpr *
597CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCall2d74de92009-12-01 22:10:20 +0000598 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor308047d2009-09-09 00:23:06 +0000599 SourceLocation OperatorLoc,
600 NestedNameSpecifier *Qualifier,
601 SourceRange QualifierRange,
602 NamedDecl *FirstQualifierFoundInScope,
603 DeclarationName Member,
604 SourceLocation MemberLoc,
John McCall6b51f282009-11-23 01:53:49 +0000605 const TemplateArgumentListInfo *TemplateArgs) {
606 if (!TemplateArgs)
John McCall2d74de92009-12-01 22:10:20 +0000607 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
608 IsArrow, OperatorLoc,
609 Qualifier, QualifierRange,
610 FirstQualifierFoundInScope,
611 Member, MemberLoc);
Mike Stump11289f42009-09-09 15:08:12 +0000612
John McCall6b51f282009-11-23 01:53:49 +0000613 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
614 if (TemplateArgs)
615 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
616
617 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>());
John McCall2d74de92009-12-01 22:10:20 +0000618 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
619 IsArrow, OperatorLoc,
620 Qualifier, QualifierRange,
621 FirstQualifierFoundInScope,
622 Member, MemberLoc, TemplateArgs);
Douglas Gregor308047d2009-09-09 00:23:06 +0000623}
624
John McCall8cd78132009-11-19 22:55:06 +0000625Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregora8db9542009-05-22 21:13:27 +0000626 return child_iterator(&Base);
627}
628
John McCall8cd78132009-11-19 22:55:06 +0000629Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCall2d74de92009-12-01 22:10:20 +0000630 if (isImplicitAccess())
631 return child_iterator(&Base);
Douglas Gregora8db9542009-05-22 21:13:27 +0000632 return child_iterator(&Base + 1);
633}
John McCall10eae182009-11-30 22:42:35 +0000634
635UnresolvedMemberExpr::UnresolvedMemberExpr(QualType T, bool Dependent,
636 bool HasUnresolvedUsing,
John McCall2d74de92009-12-01 22:10:20 +0000637 Expr *Base, QualType BaseType,
638 bool IsArrow,
John McCall10eae182009-11-30 22:42:35 +0000639 SourceLocation OperatorLoc,
640 NestedNameSpecifier *Qualifier,
641 SourceRange QualifierRange,
642 DeclarationName MemberName,
643 SourceLocation MemberLoc,
644 const TemplateArgumentListInfo *TemplateArgs)
645 : Expr(UnresolvedMemberExprClass, T, Dependent, Dependent),
John McCall2d74de92009-12-01 22:10:20 +0000646 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
647 HasUnresolvedUsing(HasUnresolvedUsing),
John McCall10eae182009-11-30 22:42:35 +0000648 HasExplicitTemplateArgs(TemplateArgs != 0),
649 OperatorLoc(OperatorLoc),
650 Qualifier(Qualifier), QualifierRange(QualifierRange),
651 MemberName(MemberName), MemberLoc(MemberLoc) {
652 if (TemplateArgs)
653 getExplicitTemplateArgs()->initializeFrom(*TemplateArgs);
654}
655
656UnresolvedMemberExpr *
657UnresolvedMemberExpr::Create(ASTContext &C, bool Dependent,
658 bool HasUnresolvedUsing,
John McCall2d74de92009-12-01 22:10:20 +0000659 Expr *Base, QualType BaseType, bool IsArrow,
John McCall10eae182009-11-30 22:42:35 +0000660 SourceLocation OperatorLoc,
661 NestedNameSpecifier *Qualifier,
662 SourceRange QualifierRange,
663 DeclarationName Member,
664 SourceLocation MemberLoc,
665 const TemplateArgumentListInfo *TemplateArgs) {
666 std::size_t size = sizeof(UnresolvedMemberExpr);
667 if (TemplateArgs)
668 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
669
670 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>());
671 return new (Mem) UnresolvedMemberExpr(
672 Dependent ? C.DependentTy : C.OverloadTy,
John McCall2d74de92009-12-01 22:10:20 +0000673 Dependent, HasUnresolvedUsing, Base, BaseType,
674 IsArrow, OperatorLoc, Qualifier, QualifierRange,
John McCall10eae182009-11-30 22:42:35 +0000675 Member, MemberLoc, TemplateArgs);
676}
677
John McCall58cc69d2010-01-27 01:50:18 +0000678CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
679 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
680
681 // If there was a nested name specifier, it names the naming class.
682 // It can't be dependent: after all, we were actually able to do the
683 // lookup.
684 const RecordType *RT;
685 if (Qualifier) {
686 Type *T = Qualifier->getAsType();
687 assert(T && "qualifier in member expression does not name type");
688 RT = T->getAs<RecordType>();
689 assert(RT && "qualifier in member expression does not name record");
690
691 // Otherwise the naming class must have been the base class.
692 } else {
693 QualType BaseType = getBaseType().getNonReferenceType();
694 if (isArrow()) {
695 const PointerType *PT = BaseType->getAs<PointerType>();
696 assert(PT && "base of arrow member access is not pointer");
697 BaseType = PT->getPointeeType();
698 }
699
700 RT = BaseType->getAs<RecordType>();
701 assert(RT && "base of member expression does not name record");
702 }
703
704 return cast<CXXRecordDecl>(RT->getDecl());
705}
706
John McCall10eae182009-11-30 22:42:35 +0000707Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
708 return child_iterator(&Base);
709}
710
711Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCall2d74de92009-12-01 22:10:20 +0000712 if (isImplicitAccess())
713 return child_iterator(&Base);
John McCall10eae182009-11-30 22:42:35 +0000714 return child_iterator(&Base + 1);
715}