blob: c19fd834eae88db70da68a617b3034e9d93ad8dc [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"
Douglas Gregor26d4ac92010-02-24 23:40:28 +000018#include "clang/AST/TypeLoc.h"
Ted Kremeneka758d092007-08-24 20:21:10 +000019using namespace clang;
20
21//===----------------------------------------------------------------------===//
22// Child Iterators for iterating over subexpressions/substatements
23//===----------------------------------------------------------------------===//
24
Sebastian Redlc42e1182008-11-11 11:37:55 +000025// CXXTypeidExpr - has child iterators if the operand is an expression
26Stmt::child_iterator CXXTypeidExpr::child_begin() {
Sebastian Redld4575892008-12-03 23:17:54 +000027 return isTypeOperand() ? child_iterator() : &Operand.Ex;
Sebastian Redlc42e1182008-11-11 11:37:55 +000028}
29Stmt::child_iterator CXXTypeidExpr::child_end() {
Sebastian Redld4575892008-12-03 23:17:54 +000030 return isTypeOperand() ? child_iterator() : &Operand.Ex+1;
Sebastian Redlc42e1182008-11-11 11:37:55 +000031}
Ted Kremeneka758d092007-08-24 20:21:10 +000032
Ted Kremeneka758d092007-08-24 20:21:10 +000033// CXXBoolLiteralExpr
Mike Stump1eb44332009-09-09 15:08:12 +000034Stmt::child_iterator CXXBoolLiteralExpr::child_begin() {
Ted Kremenek9ac59282007-10-18 23:28:49 +000035 return child_iterator();
36}
37Stmt::child_iterator CXXBoolLiteralExpr::child_end() {
38 return child_iterator();
39}
Chris Lattner50dd2892008-02-26 00:51:44 +000040
Sebastian Redl6e8ed162009-05-10 18:38:11 +000041// CXXNullPtrLiteralExpr
Mike Stump1eb44332009-09-09 15:08:12 +000042Stmt::child_iterator CXXNullPtrLiteralExpr::child_begin() {
Sebastian Redl6e8ed162009-05-10 18:38:11 +000043 return child_iterator();
44}
45Stmt::child_iterator CXXNullPtrLiteralExpr::child_end() {
46 return child_iterator();
47}
48
Douglas Gregor796da182008-11-04 14:32:21 +000049// CXXThisExpr
50Stmt::child_iterator CXXThisExpr::child_begin() { return child_iterator(); }
51Stmt::child_iterator CXXThisExpr::child_end() { return child_iterator(); }
52
Chris Lattner50dd2892008-02-26 00:51:44 +000053// CXXThrowExpr
Ted Kremenek1060aff2008-06-17 03:11:08 +000054Stmt::child_iterator CXXThrowExpr::child_begin() { return &Op; }
Chris Lattner50dd2892008-02-26 00:51:44 +000055Stmt::child_iterator CXXThrowExpr::child_end() {
56 // If Op is 0, we are processing throw; which has no children.
Ted Kremenek1060aff2008-06-17 03:11:08 +000057 return Op ? &Op+1 : &Op;
Chris Lattner50dd2892008-02-26 00:51:44 +000058}
Chris Lattner04421082008-04-08 04:40:51 +000059
60// CXXDefaultArgExpr
61Stmt::child_iterator CXXDefaultArgExpr::child_begin() {
Chris Lattner8123a952008-04-10 02:22:51 +000062 return child_iterator();
Chris Lattner04421082008-04-08 04:40:51 +000063}
64Stmt::child_iterator CXXDefaultArgExpr::child_end() {
Chris Lattner8123a952008-04-10 02:22:51 +000065 return child_iterator();
Chris Lattner04421082008-04-08 04:40:51 +000066}
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +000067
68// CXXZeroInitValueExpr
Mike Stump1eb44332009-09-09 15:08:12 +000069Stmt::child_iterator CXXZeroInitValueExpr::child_begin() {
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +000070 return child_iterator();
71}
72Stmt::child_iterator CXXZeroInitValueExpr::child_end() {
73 return child_iterator();
74}
Argyrios Kyrtzidis9e922b12008-09-09 23:47:53 +000075
Sebastian Redl4c5d3202008-11-21 19:14:01 +000076// CXXNewExpr
Ted Kremenekad7fe862010-02-11 22:51:03 +000077CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
Sebastian Redl4c5d3202008-11-21 19:14:01 +000078 Expr **placementArgs, unsigned numPlaceArgs,
Sebastian Redlcee63fb2008-12-02 14:43:59 +000079 bool parenTypeId, Expr *arraySize,
Sebastian Redl4c5d3202008-11-21 19:14:01 +000080 CXXConstructorDecl *constructor, bool initializer,
81 Expr **constructorArgs, unsigned numConsArgs,
82 FunctionDecl *operatorDelete, QualType ty,
83 SourceLocation startLoc, SourceLocation endLoc)
Sebastian Redl28507842009-02-26 14:39:58 +000084 : Expr(CXXNewExprClass, ty, ty->isDependentType(), ty->isDependentType()),
85 GlobalNew(globalNew), ParenTypeId(parenTypeId),
Sebastian Redlcee63fb2008-12-02 14:43:59 +000086 Initializer(initializer), Array(arraySize), NumPlacementArgs(numPlaceArgs),
Sebastian Redl4c5d3202008-11-21 19:14:01 +000087 NumConstructorArgs(numConsArgs), OperatorNew(operatorNew),
Sebastian Redlcee63fb2008-12-02 14:43:59 +000088 OperatorDelete(operatorDelete), Constructor(constructor),
Mike Stump1eb44332009-09-09 15:08:12 +000089 StartLoc(startLoc), EndLoc(endLoc) {
Sebastian Redlcee63fb2008-12-02 14:43:59 +000090 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
Ted Kremenekad7fe862010-02-11 22:51:03 +000091 SubExprs = new (C) Stmt*[TotalSize];
Sebastian Redl4c5d3202008-11-21 19:14:01 +000092 unsigned i = 0;
Sebastian Redlcee63fb2008-12-02 14:43:59 +000093 if (Array)
94 SubExprs[i++] = arraySize;
95 for (unsigned j = 0; j < NumPlacementArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +000096 SubExprs[i++] = placementArgs[j];
Sebastian Redlcee63fb2008-12-02 14:43:59 +000097 for (unsigned j = 0; j < NumConstructorArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +000098 SubExprs[i++] = constructorArgs[j];
99 assert(i == TotalSize);
100}
101
Ted Kremenekad7fe862010-02-11 22:51:03 +0000102void CXXNewExpr::DoDestroy(ASTContext &C) {
103 DestroyChildren(C);
104 if (SubExprs)
105 C.Deallocate(SubExprs);
106 this->~CXXNewExpr();
107 C.Deallocate((void*)this);
108}
109
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000110Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
111Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000112 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redl4c5d3202008-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 Gregora71d8192009-09-04 17:36:40 +0000119// CXXPseudoDestructorExpr
120Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
121Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
122 return &Base + 1;
123}
124
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000125PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
126 : Type(Info)
127{
128 Location = Info->getTypeLoc().getSourceRange().getBegin();
129}
130
131QualType CXXPseudoDestructorExpr::getDestroyedType() const {
132 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
133 return TInfo->getType();
134
135 return QualType();
136}
137
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000138SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000139 SourceLocation End = DestroyedType.getLocation();
140 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
141 End = TInfo->getTypeLoc().getSourceRange().getEnd();
142 return SourceRange(Base->getLocStart(), End);
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000143}
144
145
John McCallba135432009-11-21 08:51:07 +0000146// UnresolvedLookupExpr
John McCallf7a1a742009-11-24 19:00:30 +0000147UnresolvedLookupExpr *
148UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent,
John McCallc373d482010-01-27 01:50:18 +0000149 CXXRecordDecl *NamingClass,
John McCallf7a1a742009-11-24 19:00:30 +0000150 NestedNameSpecifier *Qualifier,
151 SourceRange QualifierRange, DeclarationName Name,
152 SourceLocation NameLoc, bool ADL,
153 const TemplateArgumentListInfo &Args)
154{
155 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
156 ExplicitTemplateArgumentList::sizeFor(Args));
157 UnresolvedLookupExpr *ULE
158 = new (Mem) UnresolvedLookupExpr(Dependent ? C.DependentTy : C.OverloadTy,
John McCallc373d482010-01-27 01:50:18 +0000159 Dependent, NamingClass,
160 Qualifier, QualifierRange,
John McCallf7a1a742009-11-24 19:00:30 +0000161 Name, NameLoc, ADL,
162 /*Overload*/ true,
163 /*ExplicitTemplateArgs*/ true);
164
165 reinterpret_cast<ExplicitTemplateArgumentList*>(ULE+1)->initializeFrom(Args);
166
167 return ULE;
168}
169
John McCall7bb12da2010-02-02 06:20:04 +0000170bool OverloadExpr::ComputeDependence(UnresolvedSetIterator Begin,
171 UnresolvedSetIterator End,
172 const TemplateArgumentListInfo *Args) {
John McCalleec51cf2010-01-20 00:46:10 +0000173 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I)
John McCallf7a1a742009-11-24 19:00:30 +0000174 if ((*I)->getDeclContext()->isDependentContext())
175 return true;
176
177 if (Args && TemplateSpecializationType::anyDependentTemplateArguments(*Args))
178 return true;
179
180 return false;
181}
182
John McCalle9ee23e2010-04-22 18:44:12 +0000183CXXRecordDecl *OverloadExpr::getNamingClass() const {
184 if (isa<UnresolvedLookupExpr>(this))
185 return cast<UnresolvedLookupExpr>(this)->getNamingClass();
186 else
187 return cast<UnresolvedMemberExpr>(this)->getNamingClass();
188}
189
John McCallba135432009-11-21 08:51:07 +0000190Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump1eb44332009-09-09 15:08:12 +0000191 return child_iterator();
Douglas Gregor5c37de72008-12-06 00:22:45 +0000192}
John McCallba135432009-11-21 08:51:07 +0000193Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregor5c37de72008-12-06 00:22:45 +0000194 return child_iterator();
195}
Sebastian Redl64b45f72009-01-05 20:52:13 +0000196// UnaryTypeTraitExpr
197Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
198 return child_iterator();
199}
200Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
201 return child_iterator();
202}
203
John McCall865d4472009-11-19 22:55:06 +0000204// DependentScopeDeclRefExpr
John McCallf7a1a742009-11-24 19:00:30 +0000205DependentScopeDeclRefExpr *
206DependentScopeDeclRefExpr::Create(ASTContext &C,
207 NestedNameSpecifier *Qualifier,
208 SourceRange QualifierRange,
209 DeclarationName Name,
210 SourceLocation NameLoc,
211 const TemplateArgumentListInfo *Args) {
212 std::size_t size = sizeof(DependentScopeDeclRefExpr);
213 if (Args) size += ExplicitTemplateArgumentList::sizeFor(*Args);
214 void *Mem = C.Allocate(size);
215
216 DependentScopeDeclRefExpr *DRE
217 = new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
218 Qualifier, QualifierRange,
219 Name, NameLoc,
220 Args != 0);
221
222 if (Args)
223 reinterpret_cast<ExplicitTemplateArgumentList*>(DRE+1)
224 ->initializeFrom(*Args);
225
226 return DRE;
227}
228
John McCall865d4472009-11-19 22:55:06 +0000229StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000230 return child_iterator();
231}
232
John McCall865d4472009-11-19 22:55:06 +0000233StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000234 return child_iterator();
235}
236
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000237bool UnaryTypeTraitExpr::EvaluateTrait(ASTContext& C) const {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000238 switch(UTT) {
239 default: assert(false && "Unknown type trait or not implemented");
240 case UTT_IsPOD: return QueriedType->isPODType();
Sebastian Redlccf43502009-12-03 00:13:20 +0000241 case UTT_IsLiteral: return QueriedType->isLiteralType();
Sebastian Redl64b45f72009-01-05 20:52:13 +0000242 case UTT_IsClass: // Fallthrough
243 case UTT_IsUnion:
Ted Kremenek6217b802009-07-29 21:53:49 +0000244 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000245 bool Union = Record->getDecl()->isUnion();
246 return UTT == UTT_IsUnion ? Union : !Union;
247 }
248 return false;
249 case UTT_IsEnum: return QueriedType->isEnumeralType();
250 case UTT_IsPolymorphic:
Ted Kremenek6217b802009-07-29 21:53:49 +0000251 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000252 // Type traits are only parsed in C++, so we've got CXXRecords.
253 return cast<CXXRecordDecl>(Record->getDecl())->isPolymorphic();
254 }
255 return false;
Anders Carlsson67e4dd22009-03-22 01:52:17 +0000256 case UTT_IsAbstract:
Ted Kremenek6217b802009-07-29 21:53:49 +0000257 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Anders Carlsson67e4dd22009-03-22 01:52:17 +0000258 return cast<CXXRecordDecl>(RT->getDecl())->isAbstract();
259 return false;
Eli Friedman1d954f62009-08-15 21:55:26 +0000260 case UTT_IsEmpty:
261 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
262 return !Record->getDecl()->isUnion()
263 && cast<CXXRecordDecl>(Record->getDecl())->isEmpty();
264 }
265 return false;
Anders Carlsson347ba892009-04-16 00:08:20 +0000266 case UTT_HasTrivialConstructor:
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000267 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
268 // If __is_pod (type) is true then the trait is true, else if type is
269 // a cv class or union type (or array thereof) with a trivial default
270 // constructor ([class.ctor]) then the trait is true, else it is false.
271 if (QueriedType->isPODType())
272 return true;
273 if (const RecordType *RT =
Ted Kremenek6217b802009-07-29 21:53:49 +0000274 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlsson347ba892009-04-16 00:08:20 +0000275 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialConstructor();
Anders Carlsson072abef2009-04-17 02:34:54 +0000276 return false;
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000277 case UTT_HasTrivialCopy:
278 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
279 // If __is_pod (type) is true or type is a reference type then
280 // the trait is true, else if type is a cv class or union type
281 // with a trivial copy constructor ([class.copy]) then the trait
282 // is true, else it is false.
283 if (QueriedType->isPODType() || QueriedType->isReferenceType())
284 return true;
Ted Kremenek6217b802009-07-29 21:53:49 +0000285 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000286 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyConstructor();
287 return false;
288 case UTT_HasTrivialAssign:
289 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
290 // If type is const qualified or is a reference type then the
291 // trait is false. Otherwise if __is_pod (type) is true then the
292 // trait is true, else if type is a cv class or union type with
293 // a trivial copy assignment ([class.copy]) then the trait is
294 // true, else it is false.
295 // Note: the const and reference restrictions are interesting,
296 // given that const and reference members don't prevent a class
297 // from having a trivial copy assignment operator (but do cause
298 // errors if the copy assignment operator is actually used, q.v.
299 // [class.copy]p12).
300
301 if (C.getBaseElementType(QueriedType).isConstQualified())
302 return false;
303 if (QueriedType->isPODType())
304 return true;
Ted Kremenek6217b802009-07-29 21:53:49 +0000305 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000306 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyAssignment();
307 return false;
308 case UTT_HasTrivialDestructor:
309 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
310 // If __is_pod (type) is true or type is a reference type
311 // then the trait is true, else if type is a cv class or union
312 // type (or array thereof) with a trivial destructor
313 // ([class.dtor]) then the trait is true, else it is
314 // false.
315 if (QueriedType->isPODType() || QueriedType->isReferenceType())
316 return true;
317 if (const RecordType *RT =
Ted Kremenek6217b802009-07-29 21:53:49 +0000318 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlsson072abef2009-04-17 02:34:54 +0000319 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor();
320 return false;
Sebastian Redl64b45f72009-01-05 20:52:13 +0000321 }
322}
323
Ted Kremeneke3837682009-12-23 04:00:48 +0000324SourceRange CXXConstructExpr::getSourceRange() const {
325 // FIXME: Should we know where the parentheses are, if there are any?
326 for (std::reverse_iterator<Stmt**> I(&Args[NumArgs]), E(&Args[0]); I!=E;++I) {
327 // Ignore CXXDefaultExprs when computing the range, as they don't
328 // have a range.
329 if (!isa<CXXDefaultArgExpr>(*I))
330 return SourceRange(Loc, (*I)->getLocEnd());
331 }
332
333 return SourceRange(Loc);
334}
335
Douglas Gregorb4609802008-11-14 16:09:21 +0000336SourceRange CXXOperatorCallExpr::getSourceRange() const {
337 OverloadedOperatorKind Kind = getOperator();
338 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
339 if (getNumArgs() == 1)
340 // Prefix operator
Mike Stump1eb44332009-09-09 15:08:12 +0000341 return SourceRange(getOperatorLoc(),
Douglas Gregorb4609802008-11-14 16:09:21 +0000342 getArg(0)->getSourceRange().getEnd());
343 else
344 // Postfix operator
345 return SourceRange(getArg(0)->getSourceRange().getEnd(),
346 getOperatorLoc());
347 } else if (Kind == OO_Call) {
348 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
349 } else if (Kind == OO_Subscript) {
350 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
351 } else if (getNumArgs() == 1) {
352 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
353 } else if (getNumArgs() == 2) {
354 return SourceRange(getArg(0)->getSourceRange().getBegin(),
355 getArg(1)->getSourceRange().getEnd());
356 } else {
357 return SourceRange();
358 }
359}
360
Douglas Gregor88a35142008-12-22 05:46:06 +0000361Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
362 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
363 return MemExpr->getBase();
364
365 // FIXME: Will eventually need to cope with member pointers.
366 return 0;
367}
368
Douglas Gregor00b98c22009-11-12 15:31:47 +0000369SourceRange CXXMemberCallExpr::getSourceRange() const {
370 SourceLocation LocStart = getCallee()->getLocStart();
371 if (LocStart.isInvalid() && getNumArgs() > 0)
372 LocStart = getArg(0)->getLocStart();
373 return SourceRange(LocStart, getRParenLoc());
374}
375
376
Douglas Gregor49badde2008-10-27 19:41:14 +0000377//===----------------------------------------------------------------------===//
378// Named casts
379//===----------------------------------------------------------------------===//
380
381/// getCastName - Get the name of the C++ cast being used, e.g.,
382/// "static_cast", "dynamic_cast", "reinterpret_cast", or
383/// "const_cast". The returned pointer must not be freed.
384const char *CXXNamedCastExpr::getCastName() const {
385 switch (getStmtClass()) {
386 case CXXStaticCastExprClass: return "static_cast";
387 case CXXDynamicCastExprClass: return "dynamic_cast";
388 case CXXReinterpretCastExprClass: return "reinterpret_cast";
389 case CXXConstCastExprClass: return "const_cast";
390 default: return "<invalid cast>";
391 }
392}
Douglas Gregor506ae412009-01-16 18:33:17 +0000393
Douglas Gregor65222e82009-12-23 18:19:08 +0000394CXXDefaultArgExpr *
Douglas Gregor036aed12009-12-23 23:03:06 +0000395CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
396 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor65222e82009-12-23 18:19:08 +0000397 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor036aed12009-12-23 23:03:06 +0000398 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
399 SubExpr);
Douglas Gregor65222e82009-12-23 18:19:08 +0000400}
401
402void CXXDefaultArgExpr::DoDestroy(ASTContext &C) {
403 if (Param.getInt())
404 getExpr()->Destroy(C);
405 this->~CXXDefaultArgExpr();
406 C.Deallocate(this);
407}
408
Mike Stump1eb44332009-09-09 15:08:12 +0000409CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonb859f352009-05-30 20:34:37 +0000410 const CXXDestructorDecl *Destructor) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000411 return new (C) CXXTemporary(Destructor);
412}
413
Douglas Gregor42602bb2009-08-07 06:08:38 +0000414void CXXTemporary::Destroy(ASTContext &Ctx) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000415 this->~CXXTemporary();
Douglas Gregor42602bb2009-08-07 06:08:38 +0000416 Ctx.Deallocate(this);
Anders Carlssonc1ce4772009-05-30 19:54:15 +0000417}
418
Mike Stump1eb44332009-09-09 15:08:12 +0000419CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000420 CXXTemporary *Temp,
421 Expr* SubExpr) {
Mike Stump1eb44332009-09-09 15:08:12 +0000422 assert(SubExpr->getType()->isRecordType() &&
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000423 "Expression bound to a temporary must have record type!");
424
Anders Carlssonb859f352009-05-30 20:34:37 +0000425 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000426}
427
Douglas Gregor42602bb2009-08-07 06:08:38 +0000428void CXXBindTemporaryExpr::DoDestroy(ASTContext &C) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000429 Temp->Destroy(C);
430 this->~CXXBindTemporaryExpr();
431 C.Deallocate(this);
432}
433
Anders Carlssoneb60edf2010-01-29 02:39:32 +0000434CXXBindReferenceExpr *CXXBindReferenceExpr::Create(ASTContext &C, Expr *SubExpr,
435 bool ExtendsLifetime,
436 bool RequiresTemporaryCopy) {
437 return new (C) CXXBindReferenceExpr(SubExpr,
438 ExtendsLifetime,
439 RequiresTemporaryCopy);
440}
441
442void CXXBindReferenceExpr::DoDestroy(ASTContext &C) {
443 this->~CXXBindReferenceExpr();
444 C.Deallocate(this);
445}
446
Anders Carlsson8e587a12009-05-30 20:56:46 +0000447CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson26de5492009-04-24 05:23:13 +0000448 CXXConstructorDecl *Cons,
Douglas Gregor506ae412009-01-16 18:33:17 +0000449 QualType writtenTy,
Mike Stump1eb44332009-09-09 15:08:12 +0000450 SourceLocation tyBeginLoc,
Douglas Gregor506ae412009-01-16 18:33:17 +0000451 Expr **Args,
Mike Stump1eb44332009-09-09 15:08:12 +0000452 unsigned NumArgs,
Douglas Gregor506ae412009-01-16 18:33:17 +0000453 SourceLocation rParenLoc)
Douglas Gregor99a2e602009-12-16 01:38:02 +0000454 : CXXConstructExpr(C, CXXTemporaryObjectExprClass, writtenTy, tyBeginLoc,
455 Cons, false, Args, NumArgs),
Anders Carlsson524fa132009-04-24 17:34:38 +0000456 TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {
Douglas Gregor506ae412009-01-16 18:33:17 +0000457}
Anders Carlsson19d28a62009-04-21 02:22:11 +0000458
Mike Stump1eb44332009-09-09 15:08:12 +0000459CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000460 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000461 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000462 Expr **Args, unsigned NumArgs,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000463 bool ZeroInitialization,
464 bool BaseInitialization) {
Douglas Gregor99a2e602009-12-16 01:38:02 +0000465 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000466 Elidable, Args, NumArgs, ZeroInitialization,
467 BaseInitialization);
Anders Carlssone349bea2009-04-23 02:32:43 +0000468}
469
Mike Stump1eb44332009-09-09 15:08:12 +0000470CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000471 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000472 CXXConstructorDecl *D, bool elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000473 Expr **args, unsigned numargs,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000474 bool ZeroInitialization,
475 bool BaseInitialization)
Anders Carlssonbd6734e2009-04-24 05:04:04 +0000476: Expr(SC, T,
Anders Carlssone349bea2009-04-23 02:32:43 +0000477 T->isDependentType(),
478 (T->isDependentType() ||
479 CallExpr::hasAnyValueDependentArguments(args, numargs))),
Douglas Gregor16006c92009-12-16 18:50:27 +0000480 Constructor(D), Loc(Loc), Elidable(elidable),
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000481 ZeroInitialization(ZeroInitialization),
482 BaseInitialization(BaseInitialization), Args(0), NumArgs(numargs)
Douglas Gregor16006c92009-12-16 18:50:27 +0000483{
484 if (NumArgs) {
485 Args = new (C) Stmt*[NumArgs];
486
487 for (unsigned i = 0; i != NumArgs; ++i) {
488 assert(args[i] && "NULL argument in CXXConstructExpr");
489 Args[i] = args[i];
Anders Carlssone349bea2009-04-23 02:32:43 +0000490 }
Douglas Gregor16006c92009-12-16 18:50:27 +0000491 }
Anders Carlssone349bea2009-04-23 02:32:43 +0000492}
493
Douglas Gregor39da0b82009-09-09 23:08:42 +0000494CXXConstructExpr::CXXConstructExpr(EmptyShell Empty, ASTContext &C,
495 unsigned numargs)
496 : Expr(CXXConstructExprClass, Empty), Args(0), NumArgs(numargs)
497{
498 if (NumArgs)
499 Args = new (C) Stmt*[NumArgs];
500}
501
Douglas Gregor42602bb2009-08-07 06:08:38 +0000502void CXXConstructExpr::DoDestroy(ASTContext &C) {
Anders Carlssone349bea2009-04-23 02:32:43 +0000503 DestroyChildren(C);
504 if (Args)
505 C.Deallocate(Args);
506 this->~CXXConstructExpr();
507 C.Deallocate(this);
508}
509
Mike Stump1eb44332009-09-09 15:08:12 +0000510CXXExprWithTemporaries::CXXExprWithTemporaries(Expr *subexpr,
511 CXXTemporary **temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000512 unsigned numtemps)
Anders Carlsson2d44e8a2009-05-01 22:18:43 +0000513: Expr(CXXExprWithTemporariesClass, subexpr->getType(),
Mike Stump1eb44332009-09-09 15:08:12 +0000514 subexpr->isTypeDependent(), subexpr->isValueDependent()),
Anders Carlsson0ece4912009-12-15 20:51:39 +0000515 SubExpr(subexpr), Temps(0), NumTemps(numtemps) {
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000516 if (NumTemps > 0) {
517 Temps = new CXXTemporary*[NumTemps];
518 for (unsigned i = 0; i < NumTemps; ++i)
519 Temps[i] = temps[i];
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000520 }
521}
522
Mike Stump1eb44332009-09-09 15:08:12 +0000523CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C,
Anders Carlsson88eaf072009-05-30 22:38:53 +0000524 Expr *SubExpr,
Mike Stump1eb44332009-09-09 15:08:12 +0000525 CXXTemporary **Temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000526 unsigned NumTemps) {
527 return new (C) CXXExprWithTemporaries(SubExpr, Temps, NumTemps);
Anders Carlsson88eaf072009-05-30 22:38:53 +0000528}
529
Douglas Gregor42602bb2009-08-07 06:08:38 +0000530void CXXExprWithTemporaries::DoDestroy(ASTContext &C) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000531 DestroyChildren(C);
532 this->~CXXExprWithTemporaries();
533 C.Deallocate(this);
534}
535
Anders Carlsson2d44e8a2009-05-01 22:18:43 +0000536CXXExprWithTemporaries::~CXXExprWithTemporaries() {
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000537 delete[] Temps;
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000538}
539
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000540// CXXBindTemporaryExpr
541Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
542 return &SubExpr;
543}
544
Mike Stump1eb44332009-09-09 15:08:12 +0000545Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000546 return &SubExpr + 1;
547}
548
Anders Carlssoneb60edf2010-01-29 02:39:32 +0000549// CXXBindReferenceExpr
550Stmt::child_iterator CXXBindReferenceExpr::child_begin() {
551 return &SubExpr;
552}
553
554Stmt::child_iterator CXXBindReferenceExpr::child_end() {
555 return &SubExpr + 1;
556}
557
Anders Carlssone349bea2009-04-23 02:32:43 +0000558// CXXConstructExpr
559Stmt::child_iterator CXXConstructExpr::child_begin() {
560 return &Args[0];
561}
562Stmt::child_iterator CXXConstructExpr::child_end() {
563 return &Args[0]+NumArgs;
564}
565
Anders Carlsson55674ac2009-05-01 22:21:22 +0000566// CXXExprWithTemporaries
567Stmt::child_iterator CXXExprWithTemporaries::child_begin() {
568 return &SubExpr;
Anders Carlsson19d28a62009-04-21 02:22:11 +0000569}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000570
Mike Stump1eb44332009-09-09 15:08:12 +0000571Stmt::child_iterator CXXExprWithTemporaries::child_end() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000572 return &SubExpr + 1;
573}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000574
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000575CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(
576 SourceLocation TyBeginLoc,
577 QualType T,
578 SourceLocation LParenLoc,
579 Expr **Args,
580 unsigned NumArgs,
581 SourceLocation RParenLoc)
582 : Expr(CXXUnresolvedConstructExprClass, T.getNonReferenceType(),
583 T->isDependentType(), true),
584 TyBeginLoc(TyBeginLoc),
585 Type(T),
586 LParenLoc(LParenLoc),
587 RParenLoc(RParenLoc),
588 NumArgs(NumArgs) {
589 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
590 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs);
591}
592
593CXXUnresolvedConstructExpr *
Mike Stump1eb44332009-09-09 15:08:12 +0000594CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000595 SourceLocation TyBegin,
596 QualType T,
597 SourceLocation LParenLoc,
598 Expr **Args,
599 unsigned NumArgs,
600 SourceLocation RParenLoc) {
601 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
602 sizeof(Expr *) * NumArgs);
603 return new (Mem) CXXUnresolvedConstructExpr(TyBegin, T, LParenLoc,
604 Args, NumArgs, RParenLoc);
605}
606
607Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
608 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
609}
610
611Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
612 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
613}
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000614
John McCall865d4472009-11-19 22:55:06 +0000615CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000616 Expr *Base, QualType BaseType,
617 bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000618 SourceLocation OperatorLoc,
619 NestedNameSpecifier *Qualifier,
620 SourceRange QualifierRange,
621 NamedDecl *FirstQualifierFoundInScope,
622 DeclarationName Member,
623 SourceLocation MemberLoc,
John McCalld5532b62009-11-23 01:53:49 +0000624 const TemplateArgumentListInfo *TemplateArgs)
John McCall865d4472009-11-19 22:55:06 +0000625 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, true, true),
John McCallaa81e162009-12-01 22:10:20 +0000626 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
627 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000628 OperatorLoc(OperatorLoc),
629 Qualifier(Qualifier), QualifierRange(QualifierRange),
630 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Mike Stump1eb44332009-09-09 15:08:12 +0000631 Member(Member), MemberLoc(MemberLoc) {
John McCalld5532b62009-11-23 01:53:49 +0000632 if (TemplateArgs)
633 getExplicitTemplateArgumentList()->initializeFrom(*TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000634}
635
John McCall865d4472009-11-19 22:55:06 +0000636CXXDependentScopeMemberExpr *
637CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000638 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000639 SourceLocation OperatorLoc,
640 NestedNameSpecifier *Qualifier,
641 SourceRange QualifierRange,
642 NamedDecl *FirstQualifierFoundInScope,
643 DeclarationName Member,
644 SourceLocation MemberLoc,
John McCalld5532b62009-11-23 01:53:49 +0000645 const TemplateArgumentListInfo *TemplateArgs) {
646 if (!TemplateArgs)
John McCallaa81e162009-12-01 22:10:20 +0000647 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
648 IsArrow, OperatorLoc,
649 Qualifier, QualifierRange,
650 FirstQualifierFoundInScope,
651 Member, MemberLoc);
Mike Stump1eb44332009-09-09 15:08:12 +0000652
John McCalld5532b62009-11-23 01:53:49 +0000653 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
654 if (TemplateArgs)
655 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
656
657 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>());
John McCallaa81e162009-12-01 22:10:20 +0000658 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
659 IsArrow, OperatorLoc,
660 Qualifier, QualifierRange,
661 FirstQualifierFoundInScope,
662 Member, MemberLoc, TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000663}
664
John McCall865d4472009-11-19 22:55:06 +0000665Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000666 return child_iterator(&Base);
667}
668
John McCall865d4472009-11-19 22:55:06 +0000669Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000670 if (isImplicitAccess())
671 return child_iterator(&Base);
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000672 return child_iterator(&Base + 1);
673}
John McCall129e2df2009-11-30 22:42:35 +0000674
675UnresolvedMemberExpr::UnresolvedMemberExpr(QualType T, bool Dependent,
676 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000677 Expr *Base, QualType BaseType,
678 bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000679 SourceLocation OperatorLoc,
680 NestedNameSpecifier *Qualifier,
681 SourceRange QualifierRange,
682 DeclarationName MemberName,
683 SourceLocation MemberLoc,
684 const TemplateArgumentListInfo *TemplateArgs)
John McCall7bb12da2010-02-02 06:20:04 +0000685 : OverloadExpr(UnresolvedMemberExprClass, T, Dependent,
686 Qualifier, QualifierRange, MemberName, MemberLoc,
687 TemplateArgs != 0),
688 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
689 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
John McCall129e2df2009-11-30 22:42:35 +0000690 if (TemplateArgs)
John McCall7bb12da2010-02-02 06:20:04 +0000691 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
John McCall129e2df2009-11-30 22:42:35 +0000692}
693
694UnresolvedMemberExpr *
695UnresolvedMemberExpr::Create(ASTContext &C, bool Dependent,
696 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000697 Expr *Base, QualType BaseType, bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000698 SourceLocation OperatorLoc,
699 NestedNameSpecifier *Qualifier,
700 SourceRange QualifierRange,
701 DeclarationName Member,
702 SourceLocation MemberLoc,
703 const TemplateArgumentListInfo *TemplateArgs) {
704 std::size_t size = sizeof(UnresolvedMemberExpr);
705 if (TemplateArgs)
706 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
707
708 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>());
709 return new (Mem) UnresolvedMemberExpr(
710 Dependent ? C.DependentTy : C.OverloadTy,
John McCallaa81e162009-12-01 22:10:20 +0000711 Dependent, HasUnresolvedUsing, Base, BaseType,
712 IsArrow, OperatorLoc, Qualifier, QualifierRange,
John McCall129e2df2009-11-30 22:42:35 +0000713 Member, MemberLoc, TemplateArgs);
714}
715
John McCallc373d482010-01-27 01:50:18 +0000716CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
717 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
718
719 // If there was a nested name specifier, it names the naming class.
720 // It can't be dependent: after all, we were actually able to do the
721 // lookup.
722 const RecordType *RT;
John McCall7bb12da2010-02-02 06:20:04 +0000723 if (getQualifier()) {
724 Type *T = getQualifier()->getAsType();
John McCallc373d482010-01-27 01:50:18 +0000725 assert(T && "qualifier in member expression does not name type");
726 RT = T->getAs<RecordType>();
727 assert(RT && "qualifier in member expression does not name record");
728
729 // Otherwise the naming class must have been the base class.
730 } else {
731 QualType BaseType = getBaseType().getNonReferenceType();
732 if (isArrow()) {
733 const PointerType *PT = BaseType->getAs<PointerType>();
734 assert(PT && "base of arrow member access is not pointer");
735 BaseType = PT->getPointeeType();
736 }
737
738 RT = BaseType->getAs<RecordType>();
739 assert(RT && "base of member expression does not name record");
740 }
741
742 return cast<CXXRecordDecl>(RT->getDecl());
743}
744
John McCall129e2df2009-11-30 22:42:35 +0000745Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
746 return child_iterator(&Base);
747}
748
749Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000750 if (isImplicitAccess())
751 return child_iterator(&Base);
John McCall129e2df2009-11-30 22:42:35 +0000752 return child_iterator(&Base + 1);
753}