blob: 6e73b9cbc209a5f8908cc24226a05ee8fc926496 [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
Douglas Gregor57fdc8a2010-04-26 22:37:10 +000021
Ted Kremeneka758d092007-08-24 20:21:10 +000022//===----------------------------------------------------------------------===//
23// Child Iterators for iterating over subexpressions/substatements
24//===----------------------------------------------------------------------===//
25
Douglas Gregor57fdc8a2010-04-26 22:37:10 +000026QualType CXXTypeidExpr::getTypeOperand() const {
27 assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
28 return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType()
29 .getUnqualifiedType();
30}
31
Sebastian Redlc42e1182008-11-11 11:37:55 +000032// CXXTypeidExpr - has child iterators if the operand is an expression
33Stmt::child_iterator CXXTypeidExpr::child_begin() {
Douglas Gregor57fdc8a2010-04-26 22:37:10 +000034 return isTypeOperand() ? child_iterator()
35 : reinterpret_cast<Stmt **>(&Operand);
Sebastian Redlc42e1182008-11-11 11:37:55 +000036}
37Stmt::child_iterator CXXTypeidExpr::child_end() {
Douglas Gregor57fdc8a2010-04-26 22:37:10 +000038 return isTypeOperand() ? child_iterator()
39 : reinterpret_cast<Stmt **>(&Operand) + 1;
Sebastian Redlc42e1182008-11-11 11:37:55 +000040}
Ted Kremeneka758d092007-08-24 20:21:10 +000041
Francois Pichet01b7c302010-09-08 12:20:18 +000042QualType CXXUuidofExpr::getTypeOperand() const {
43 assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
44 return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType()
45 .getUnqualifiedType();
46}
47
48// CXXUuidofExpr - has child iterators if the operand is an expression
49Stmt::child_iterator CXXUuidofExpr::child_begin() {
50 return isTypeOperand() ? child_iterator()
51 : reinterpret_cast<Stmt **>(&Operand);
52}
53Stmt::child_iterator CXXUuidofExpr::child_end() {
54 return isTypeOperand() ? child_iterator()
55 : reinterpret_cast<Stmt **>(&Operand) + 1;
56}
57
Ted Kremeneka758d092007-08-24 20:21:10 +000058// CXXBoolLiteralExpr
Mike Stump1eb44332009-09-09 15:08:12 +000059Stmt::child_iterator CXXBoolLiteralExpr::child_begin() {
Ted Kremenek9ac59282007-10-18 23:28:49 +000060 return child_iterator();
61}
62Stmt::child_iterator CXXBoolLiteralExpr::child_end() {
63 return child_iterator();
64}
Chris Lattner50dd2892008-02-26 00:51:44 +000065
Sebastian Redl6e8ed162009-05-10 18:38:11 +000066// CXXNullPtrLiteralExpr
Mike Stump1eb44332009-09-09 15:08:12 +000067Stmt::child_iterator CXXNullPtrLiteralExpr::child_begin() {
Sebastian Redl6e8ed162009-05-10 18:38:11 +000068 return child_iterator();
69}
70Stmt::child_iterator CXXNullPtrLiteralExpr::child_end() {
71 return child_iterator();
72}
73
Douglas Gregor796da182008-11-04 14:32:21 +000074// CXXThisExpr
75Stmt::child_iterator CXXThisExpr::child_begin() { return child_iterator(); }
76Stmt::child_iterator CXXThisExpr::child_end() { return child_iterator(); }
77
Chris Lattner50dd2892008-02-26 00:51:44 +000078// CXXThrowExpr
Ted Kremenek1060aff2008-06-17 03:11:08 +000079Stmt::child_iterator CXXThrowExpr::child_begin() { return &Op; }
Chris Lattner50dd2892008-02-26 00:51:44 +000080Stmt::child_iterator CXXThrowExpr::child_end() {
81 // If Op is 0, we are processing throw; which has no children.
Ted Kremenek1060aff2008-06-17 03:11:08 +000082 return Op ? &Op+1 : &Op;
Chris Lattner50dd2892008-02-26 00:51:44 +000083}
Chris Lattner04421082008-04-08 04:40:51 +000084
85// CXXDefaultArgExpr
86Stmt::child_iterator CXXDefaultArgExpr::child_begin() {
Chris Lattner8123a952008-04-10 02:22:51 +000087 return child_iterator();
Chris Lattner04421082008-04-08 04:40:51 +000088}
89Stmt::child_iterator CXXDefaultArgExpr::child_end() {
Chris Lattner8123a952008-04-10 02:22:51 +000090 return child_iterator();
Chris Lattner04421082008-04-08 04:40:51 +000091}
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +000092
Douglas Gregored8abf12010-07-08 06:14:04 +000093// CXXScalarValueInitExpr
Douglas Gregorab6677e2010-09-08 00:15:04 +000094SourceRange CXXScalarValueInitExpr::getSourceRange() const {
95 SourceLocation Start = RParenLoc;
96 if (TypeInfo)
97 Start = TypeInfo->getTypeLoc().getBeginLoc();
98 return SourceRange(Start, RParenLoc);
99}
100
Douglas Gregored8abf12010-07-08 06:14:04 +0000101Stmt::child_iterator CXXScalarValueInitExpr::child_begin() {
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +0000102 return child_iterator();
103}
Douglas Gregored8abf12010-07-08 06:14:04 +0000104Stmt::child_iterator CXXScalarValueInitExpr::child_end() {
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +0000105 return child_iterator();
106}
Argyrios Kyrtzidis9e922b12008-09-09 23:47:53 +0000107
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000108// CXXNewExpr
Ted Kremenekad7fe862010-02-11 22:51:03 +0000109CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000110 Expr **placementArgs, unsigned numPlaceArgs,
Douglas Gregor4bd40312010-07-13 15:54:32 +0000111 SourceRange TypeIdParens, Expr *arraySize,
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000112 CXXConstructorDecl *constructor, bool initializer,
113 Expr **constructorArgs, unsigned numConsArgs,
114 FunctionDecl *operatorDelete, QualType ty,
Douglas Gregor1bb2a932010-09-07 21:49:58 +0000115 TypeSourceInfo *AllocatedTypeInfo,
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000116 SourceLocation startLoc, SourceLocation endLoc)
Sebastian Redl28507842009-02-26 14:39:58 +0000117 : Expr(CXXNewExprClass, ty, ty->isDependentType(), ty->isDependentType()),
Douglas Gregor4bd40312010-07-13 15:54:32 +0000118 GlobalNew(globalNew),
Chris Lattner59218632010-05-10 01:22:27 +0000119 Initializer(initializer), SubExprs(0), OperatorNew(operatorNew),
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000120 OperatorDelete(operatorDelete), Constructor(constructor),
Douglas Gregor1bb2a932010-09-07 21:49:58 +0000121 AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens),
122 StartLoc(startLoc), EndLoc(endLoc) {
Chris Lattner59218632010-05-10 01:22:27 +0000123
124 AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000125 unsigned i = 0;
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000126 if (Array)
127 SubExprs[i++] = arraySize;
128 for (unsigned j = 0; j < NumPlacementArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000129 SubExprs[i++] = placementArgs[j];
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000130 for (unsigned j = 0; j < NumConstructorArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000131 SubExprs[i++] = constructorArgs[j];
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000132}
133
Chris Lattner59218632010-05-10 01:22:27 +0000134void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray,
135 unsigned numPlaceArgs, unsigned numConsArgs){
136 assert(SubExprs == 0 && "SubExprs already allocated");
137 Array = isArray;
138 NumPlacementArgs = numPlaceArgs;
139 NumConstructorArgs = numConsArgs;
140
141 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
142 SubExprs = new (C) Stmt*[TotalSize];
143}
144
145
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000146Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
147Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000148 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000149}
150
151// CXXDeleteExpr
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000152QualType CXXDeleteExpr::getDestroyedType() const {
153 const Expr *Arg = getArgument();
154 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
155 if (ICE->getCastKind() != CK_UserDefinedConversion &&
156 ICE->getType()->isVoidPointerType())
157 Arg = ICE->getSubExpr();
158 else
159 break;
160 }
161
162 return Arg->getType()->getAs<PointerType>()->getPointeeType();
163}
164
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000165Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
166Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
167
Douglas Gregora71d8192009-09-04 17:36:40 +0000168// CXXPseudoDestructorExpr
169Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
170Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
171 return &Base + 1;
172}
173
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000174PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
175 : Type(Info)
176{
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000177 Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000178}
179
180QualType CXXPseudoDestructorExpr::getDestroyedType() const {
181 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
182 return TInfo->getType();
183
184 return QualType();
185}
186
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000187SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000188 SourceLocation End = DestroyedType.getLocation();
189 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000190 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000191 return SourceRange(Base->getLocStart(), End);
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000192}
193
194
John McCallba135432009-11-21 08:51:07 +0000195// UnresolvedLookupExpr
John McCallf7a1a742009-11-24 19:00:30 +0000196UnresolvedLookupExpr *
197UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent,
John McCallc373d482010-01-27 01:50:18 +0000198 CXXRecordDecl *NamingClass,
John McCallf7a1a742009-11-24 19:00:30 +0000199 NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000200 SourceRange QualifierRange,
201 const DeclarationNameInfo &NameInfo,
202 bool ADL,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000203 const TemplateArgumentListInfo &Args,
204 UnresolvedSetIterator Begin,
205 UnresolvedSetIterator End)
John McCallf7a1a742009-11-24 19:00:30 +0000206{
207 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
208 ExplicitTemplateArgumentList::sizeFor(Args));
209 UnresolvedLookupExpr *ULE
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000210 = new (Mem) UnresolvedLookupExpr(C,
211 Dependent ? C.DependentTy : C.OverloadTy,
John McCallc373d482010-01-27 01:50:18 +0000212 Dependent, NamingClass,
Abramo Bagnara25777432010-08-11 22:01:17 +0000213 Qualifier, QualifierRange, NameInfo,
214 ADL,
John McCallf7a1a742009-11-24 19:00:30 +0000215 /*Overload*/ true,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000216 /*ExplicitTemplateArgs*/ true,
217 Begin, End);
John McCallf7a1a742009-11-24 19:00:30 +0000218
219 reinterpret_cast<ExplicitTemplateArgumentList*>(ULE+1)->initializeFrom(Args);
220
221 return ULE;
222}
223
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000224UnresolvedLookupExpr *
225UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
226 std::size_t size = sizeof(UnresolvedLookupExpr);
227 if (NumTemplateArgs != 0)
228 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
229
230 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedLookupExpr>());
231 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
232 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
233 return E;
234}
235
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000236OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C, QualType T,
237 bool Dependent, NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000238 SourceRange QRange,
239 const DeclarationNameInfo &NameInfo,
240 bool HasTemplateArgs,
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000241 UnresolvedSetIterator Begin,
242 UnresolvedSetIterator End)
243 : Expr(K, T, Dependent, Dependent),
Abramo Bagnara25777432010-08-11 22:01:17 +0000244 Results(0), NumResults(0), NameInfo(NameInfo), Qualifier(Qualifier),
245 QualifierRange(QRange), HasExplicitTemplateArgs(HasTemplateArgs)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000246{
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000247 initializeResults(C, Begin, End);
248}
249
250void OverloadExpr::initializeResults(ASTContext &C,
251 UnresolvedSetIterator Begin,
252 UnresolvedSetIterator End) {
253 assert(Results == 0 && "Results already initialized!");
254 NumResults = End - Begin;
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000255 if (NumResults) {
256 Results = static_cast<DeclAccessPair *>(
257 C.Allocate(sizeof(DeclAccessPair) * NumResults,
258 llvm::alignof<DeclAccessPair>()));
259 memcpy(Results, &*Begin.getIterator(),
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000260 NumResults * sizeof(DeclAccessPair));
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000261 }
262}
263
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000264
John McCall7bb12da2010-02-02 06:20:04 +0000265bool OverloadExpr::ComputeDependence(UnresolvedSetIterator Begin,
266 UnresolvedSetIterator End,
267 const TemplateArgumentListInfo *Args) {
John McCalleec51cf2010-01-20 00:46:10 +0000268 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I)
John McCallf7a1a742009-11-24 19:00:30 +0000269 if ((*I)->getDeclContext()->isDependentContext())
270 return true;
271
272 if (Args && TemplateSpecializationType::anyDependentTemplateArguments(*Args))
273 return true;
274
275 return false;
276}
277
John McCalle9ee23e2010-04-22 18:44:12 +0000278CXXRecordDecl *OverloadExpr::getNamingClass() const {
279 if (isa<UnresolvedLookupExpr>(this))
280 return cast<UnresolvedLookupExpr>(this)->getNamingClass();
281 else
282 return cast<UnresolvedMemberExpr>(this)->getNamingClass();
283}
284
John McCallba135432009-11-21 08:51:07 +0000285Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump1eb44332009-09-09 15:08:12 +0000286 return child_iterator();
Douglas Gregor5c37de72008-12-06 00:22:45 +0000287}
John McCallba135432009-11-21 08:51:07 +0000288Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregor5c37de72008-12-06 00:22:45 +0000289 return child_iterator();
290}
Sebastian Redl64b45f72009-01-05 20:52:13 +0000291// UnaryTypeTraitExpr
292Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
293 return child_iterator();
294}
295Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
296 return child_iterator();
297}
298
John McCall865d4472009-11-19 22:55:06 +0000299// DependentScopeDeclRefExpr
John McCallf7a1a742009-11-24 19:00:30 +0000300DependentScopeDeclRefExpr *
301DependentScopeDeclRefExpr::Create(ASTContext &C,
302 NestedNameSpecifier *Qualifier,
303 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000304 const DeclarationNameInfo &NameInfo,
John McCallf7a1a742009-11-24 19:00:30 +0000305 const TemplateArgumentListInfo *Args) {
306 std::size_t size = sizeof(DependentScopeDeclRefExpr);
307 if (Args) size += ExplicitTemplateArgumentList::sizeFor(*Args);
308 void *Mem = C.Allocate(size);
309
310 DependentScopeDeclRefExpr *DRE
311 = new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
312 Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000313 NameInfo, Args != 0);
John McCallf7a1a742009-11-24 19:00:30 +0000314
315 if (Args)
316 reinterpret_cast<ExplicitTemplateArgumentList*>(DRE+1)
317 ->initializeFrom(*Args);
318
319 return DRE;
320}
321
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000322DependentScopeDeclRefExpr *
323DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
324 unsigned NumTemplateArgs) {
325 std::size_t size = sizeof(DependentScopeDeclRefExpr);
326 if (NumTemplateArgs)
327 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
328 void *Mem = C.Allocate(size);
329
330 return new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(),
Abramo Bagnara25777432010-08-11 22:01:17 +0000331 DeclarationNameInfo(),
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000332 NumTemplateArgs != 0);
333}
334
John McCall865d4472009-11-19 22:55:06 +0000335StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000336 return child_iterator();
337}
338
John McCall865d4472009-11-19 22:55:06 +0000339StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000340 return child_iterator();
341}
342
Ted Kremeneke3837682009-12-23 04:00:48 +0000343SourceRange CXXConstructExpr::getSourceRange() const {
344 // FIXME: Should we know where the parentheses are, if there are any?
345 for (std::reverse_iterator<Stmt**> I(&Args[NumArgs]), E(&Args[0]); I!=E;++I) {
346 // Ignore CXXDefaultExprs when computing the range, as they don't
347 // have a range.
348 if (!isa<CXXDefaultArgExpr>(*I))
349 return SourceRange(Loc, (*I)->getLocEnd());
350 }
351
352 return SourceRange(Loc);
353}
354
Douglas Gregorb4609802008-11-14 16:09:21 +0000355SourceRange CXXOperatorCallExpr::getSourceRange() const {
356 OverloadedOperatorKind Kind = getOperator();
357 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
358 if (getNumArgs() == 1)
359 // Prefix operator
Mike Stump1eb44332009-09-09 15:08:12 +0000360 return SourceRange(getOperatorLoc(),
Douglas Gregorb4609802008-11-14 16:09:21 +0000361 getArg(0)->getSourceRange().getEnd());
362 else
363 // Postfix operator
364 return SourceRange(getArg(0)->getSourceRange().getEnd(),
365 getOperatorLoc());
366 } else if (Kind == OO_Call) {
367 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
368 } else if (Kind == OO_Subscript) {
369 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
370 } else if (getNumArgs() == 1) {
371 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
372 } else if (getNumArgs() == 2) {
373 return SourceRange(getArg(0)->getSourceRange().getBegin(),
374 getArg(1)->getSourceRange().getEnd());
375 } else {
376 return SourceRange();
377 }
378}
379
Douglas Gregor88a35142008-12-22 05:46:06 +0000380Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
381 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
382 return MemExpr->getBase();
383
384 // FIXME: Will eventually need to cope with member pointers.
385 return 0;
386}
387
Douglas Gregor00b98c22009-11-12 15:31:47 +0000388SourceRange CXXMemberCallExpr::getSourceRange() const {
389 SourceLocation LocStart = getCallee()->getLocStart();
390 if (LocStart.isInvalid() && getNumArgs() > 0)
391 LocStart = getArg(0)->getLocStart();
392 return SourceRange(LocStart, getRParenLoc());
393}
394
395
Douglas Gregor49badde2008-10-27 19:41:14 +0000396//===----------------------------------------------------------------------===//
397// Named casts
398//===----------------------------------------------------------------------===//
399
400/// getCastName - Get the name of the C++ cast being used, e.g.,
401/// "static_cast", "dynamic_cast", "reinterpret_cast", or
402/// "const_cast". The returned pointer must not be freed.
403const char *CXXNamedCastExpr::getCastName() const {
404 switch (getStmtClass()) {
405 case CXXStaticCastExprClass: return "static_cast";
406 case CXXDynamicCastExprClass: return "dynamic_cast";
407 case CXXReinterpretCastExprClass: return "reinterpret_cast";
408 case CXXConstCastExprClass: return "const_cast";
409 default: return "<invalid cast>";
410 }
411}
Douglas Gregor506ae412009-01-16 18:33:17 +0000412
John McCallf871d0c2010-08-07 06:22:56 +0000413CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
414 CastKind K, Expr *Op,
415 const CXXCastPath *BasePath,
416 TypeSourceInfo *WrittenTy,
417 SourceLocation L) {
418 unsigned PathSize = (BasePath ? BasePath->size() : 0);
419 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
420 + PathSize * sizeof(CXXBaseSpecifier*));
421 CXXStaticCastExpr *E =
422 new (Buffer) CXXStaticCastExpr(T, K, Op, PathSize, WrittenTy, L);
423 if (PathSize) E->setCastPath(*BasePath);
424 return E;
425}
426
427CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
428 unsigned PathSize) {
429 void *Buffer =
430 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
431 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
432}
433
434CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
435 CastKind K, Expr *Op,
436 const CXXCastPath *BasePath,
437 TypeSourceInfo *WrittenTy,
438 SourceLocation L) {
439 unsigned PathSize = (BasePath ? BasePath->size() : 0);
440 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
441 + PathSize * sizeof(CXXBaseSpecifier*));
442 CXXDynamicCastExpr *E =
443 new (Buffer) CXXDynamicCastExpr(T, K, Op, PathSize, WrittenTy, L);
444 if (PathSize) E->setCastPath(*BasePath);
445 return E;
446}
447
448CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
449 unsigned PathSize) {
450 void *Buffer =
451 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
452 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
453}
454
455CXXReinterpretCastExpr *
456CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, CastKind K, Expr *Op,
457 const CXXCastPath *BasePath,
458 TypeSourceInfo *WrittenTy, SourceLocation L) {
459 unsigned PathSize = (BasePath ? BasePath->size() : 0);
460 void *Buffer =
461 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
462 CXXReinterpretCastExpr *E =
463 new (Buffer) CXXReinterpretCastExpr(T, K, Op, PathSize, WrittenTy, L);
464 if (PathSize) E->setCastPath(*BasePath);
465 return E;
466}
467
468CXXReinterpretCastExpr *
469CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
470 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
471 + PathSize * sizeof(CXXBaseSpecifier*));
472 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
473}
474
475CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T, Expr *Op,
476 TypeSourceInfo *WrittenTy,
477 SourceLocation L) {
478 return new (C) CXXConstCastExpr(T, Op, WrittenTy, L);
479}
480
481CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
482 return new (C) CXXConstCastExpr(EmptyShell());
483}
484
485CXXFunctionalCastExpr *
486CXXFunctionalCastExpr::Create(ASTContext &C, QualType T,
487 TypeSourceInfo *Written, SourceLocation L,
488 CastKind K, Expr *Op, const CXXCastPath *BasePath,
489 SourceLocation R) {
490 unsigned PathSize = (BasePath ? BasePath->size() : 0);
491 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
492 + PathSize * sizeof(CXXBaseSpecifier*));
493 CXXFunctionalCastExpr *E =
494 new (Buffer) CXXFunctionalCastExpr(T, Written, L, K, Op, PathSize, R);
495 if (PathSize) E->setCastPath(*BasePath);
496 return E;
497}
498
499CXXFunctionalCastExpr *
500CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
501 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
502 + PathSize * sizeof(CXXBaseSpecifier*));
503 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
504}
505
506
Douglas Gregor65222e82009-12-23 18:19:08 +0000507CXXDefaultArgExpr *
Douglas Gregor036aed12009-12-23 23:03:06 +0000508CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
509 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor65222e82009-12-23 18:19:08 +0000510 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor036aed12009-12-23 23:03:06 +0000511 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
512 SubExpr);
Douglas Gregor65222e82009-12-23 18:19:08 +0000513}
514
Mike Stump1eb44332009-09-09 15:08:12 +0000515CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonb859f352009-05-30 20:34:37 +0000516 const CXXDestructorDecl *Destructor) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000517 return new (C) CXXTemporary(Destructor);
518}
519
Mike Stump1eb44332009-09-09 15:08:12 +0000520CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000521 CXXTemporary *Temp,
522 Expr* SubExpr) {
Mike Stump1eb44332009-09-09 15:08:12 +0000523 assert(SubExpr->getType()->isRecordType() &&
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000524 "Expression bound to a temporary must have record type!");
525
Anders Carlssonb859f352009-05-30 20:34:37 +0000526 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000527}
528
Anders Carlsson8e587a12009-05-30 20:56:46 +0000529CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson26de5492009-04-24 05:23:13 +0000530 CXXConstructorDecl *Cons,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000531 TypeSourceInfo *Type,
Douglas Gregor506ae412009-01-16 18:33:17 +0000532 Expr **Args,
Mike Stump1eb44332009-09-09 15:08:12 +0000533 unsigned NumArgs,
Douglas Gregor1c63b9c2010-04-27 20:36:09 +0000534 SourceLocation rParenLoc,
535 bool ZeroInitialization)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000536 : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
537 Type->getType().getNonReferenceType(),
538 Type->getTypeLoc().getBeginLoc(),
Douglas Gregor1c63b9c2010-04-27 20:36:09 +0000539 Cons, false, Args, NumArgs, ZeroInitialization),
Douglas Gregorab6677e2010-09-08 00:15:04 +0000540 RParenLoc(rParenLoc), Type(Type) {
541}
542
543SourceRange CXXTemporaryObjectExpr::getSourceRange() const {
544 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
Douglas Gregor506ae412009-01-16 18:33:17 +0000545}
Anders Carlsson19d28a62009-04-21 02:22:11 +0000546
Mike Stump1eb44332009-09-09 15:08:12 +0000547CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000548 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000549 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000550 Expr **Args, unsigned NumArgs,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000551 bool ZeroInitialization,
Anders Carlssonfcaeef22010-05-02 23:53:04 +0000552 ConstructionKind ConstructKind) {
Douglas Gregor99a2e602009-12-16 01:38:02 +0000553 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000554 Elidable, Args, NumArgs, ZeroInitialization,
Anders Carlssonfcaeef22010-05-02 23:53:04 +0000555 ConstructKind);
Anders Carlssone349bea2009-04-23 02:32:43 +0000556}
557
Mike Stump1eb44332009-09-09 15:08:12 +0000558CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000559 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000560 CXXConstructorDecl *D, bool elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000561 Expr **args, unsigned numargs,
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000562 bool ZeroInitialization,
563 ConstructionKind ConstructKind)
Anders Carlssonbd6734e2009-04-24 05:04:04 +0000564: Expr(SC, T,
Anders Carlssone349bea2009-04-23 02:32:43 +0000565 T->isDependentType(),
566 (T->isDependentType() ||
567 CallExpr::hasAnyValueDependentArguments(args, numargs))),
Douglas Gregor16006c92009-12-16 18:50:27 +0000568 Constructor(D), Loc(Loc), Elidable(elidable),
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000569 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
570 Args(0), NumArgs(numargs)
Douglas Gregor16006c92009-12-16 18:50:27 +0000571{
572 if (NumArgs) {
573 Args = new (C) Stmt*[NumArgs];
574
575 for (unsigned i = 0; i != NumArgs; ++i) {
576 assert(args[i] && "NULL argument in CXXConstructExpr");
577 Args[i] = args[i];
Anders Carlssone349bea2009-04-23 02:32:43 +0000578 }
Douglas Gregor16006c92009-12-16 18:50:27 +0000579 }
Anders Carlssone349bea2009-04-23 02:32:43 +0000580}
581
Ted Kremenekd04ed412010-05-10 20:06:30 +0000582CXXExprWithTemporaries::CXXExprWithTemporaries(ASTContext &C,
583 Expr *subexpr,
Mike Stump1eb44332009-09-09 15:08:12 +0000584 CXXTemporary **temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000585 unsigned numtemps)
Chris Lattnerd2598362010-05-10 00:25:06 +0000586 : Expr(CXXExprWithTemporariesClass, subexpr->getType(),
Mike Stump1eb44332009-09-09 15:08:12 +0000587 subexpr->isTypeDependent(), subexpr->isValueDependent()),
Chris Lattnerd2598362010-05-10 00:25:06 +0000588 SubExpr(subexpr), Temps(0), NumTemps(0) {
Chris Lattneraff32cb2010-05-10 00:45:12 +0000589 if (numtemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000590 setNumTemporaries(C, numtemps);
Chris Lattnerd2598362010-05-10 00:25:06 +0000591 for (unsigned i = 0; i != numtemps; ++i)
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000592 Temps[i] = temps[i];
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000593 }
594}
595
Ted Kremenekd04ed412010-05-10 20:06:30 +0000596void CXXExprWithTemporaries::setNumTemporaries(ASTContext &C, unsigned N) {
Chris Lattnerd2598362010-05-10 00:25:06 +0000597 assert(Temps == 0 && "Cannot resize with this");
Daniel Dunbar90556d42010-05-10 15:59:37 +0000598 NumTemps = N;
Ted Kremenekd04ed412010-05-10 20:06:30 +0000599 Temps = new (C) CXXTemporary*[NumTemps];
Chris Lattnerd2598362010-05-10 00:25:06 +0000600}
601
602
Mike Stump1eb44332009-09-09 15:08:12 +0000603CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C,
Anders Carlsson88eaf072009-05-30 22:38:53 +0000604 Expr *SubExpr,
Mike Stump1eb44332009-09-09 15:08:12 +0000605 CXXTemporary **Temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000606 unsigned NumTemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000607 return new (C) CXXExprWithTemporaries(C, SubExpr, Temps, NumTemps);
Anders Carlsson88eaf072009-05-30 22:38:53 +0000608}
609
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000610// CXXBindTemporaryExpr
611Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
612 return &SubExpr;
613}
614
Mike Stump1eb44332009-09-09 15:08:12 +0000615Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000616 return &SubExpr + 1;
617}
618
Anders Carlssone349bea2009-04-23 02:32:43 +0000619// CXXConstructExpr
620Stmt::child_iterator CXXConstructExpr::child_begin() {
621 return &Args[0];
622}
623Stmt::child_iterator CXXConstructExpr::child_end() {
624 return &Args[0]+NumArgs;
625}
626
Anders Carlsson55674ac2009-05-01 22:21:22 +0000627// CXXExprWithTemporaries
628Stmt::child_iterator CXXExprWithTemporaries::child_begin() {
629 return &SubExpr;
Anders Carlsson19d28a62009-04-21 02:22:11 +0000630}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000631
Mike Stump1eb44332009-09-09 15:08:12 +0000632Stmt::child_iterator CXXExprWithTemporaries::child_end() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000633 return &SubExpr + 1;
634}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000635
Douglas Gregorab6677e2010-09-08 00:15:04 +0000636CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000637 SourceLocation LParenLoc,
638 Expr **Args,
639 unsigned NumArgs,
640 SourceLocation RParenLoc)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000641 : Expr(CXXUnresolvedConstructExprClass,
642 Type->getType().getNonReferenceType(),
643 Type->getType()->isDependentType(), true),
644 Type(Type),
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000645 LParenLoc(LParenLoc),
646 RParenLoc(RParenLoc),
647 NumArgs(NumArgs) {
648 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
649 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs);
650}
651
652CXXUnresolvedConstructExpr *
Mike Stump1eb44332009-09-09 15:08:12 +0000653CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000654 TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000655 SourceLocation LParenLoc,
656 Expr **Args,
657 unsigned NumArgs,
658 SourceLocation RParenLoc) {
659 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
660 sizeof(Expr *) * NumArgs);
Douglas Gregorab6677e2010-09-08 00:15:04 +0000661 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000662 Args, NumArgs, RParenLoc);
663}
664
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000665CXXUnresolvedConstructExpr *
666CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
667 Stmt::EmptyShell Empty;
668 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
669 sizeof(Expr *) * NumArgs);
670 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
671}
672
Douglas Gregorab6677e2010-09-08 00:15:04 +0000673SourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
674 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
675}
676
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000677Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
678 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
679}
680
681Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
682 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
683}
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000684
John McCall865d4472009-11-19 22:55:06 +0000685CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000686 Expr *Base, QualType BaseType,
687 bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000688 SourceLocation OperatorLoc,
689 NestedNameSpecifier *Qualifier,
690 SourceRange QualifierRange,
691 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000692 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000693 const TemplateArgumentListInfo *TemplateArgs)
John McCall865d4472009-11-19 22:55:06 +0000694 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, true, true),
John McCallaa81e162009-12-01 22:10:20 +0000695 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
696 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000697 OperatorLoc(OperatorLoc),
698 Qualifier(Qualifier), QualifierRange(QualifierRange),
699 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Abramo Bagnara25777432010-08-11 22:01:17 +0000700 MemberNameInfo(MemberNameInfo) {
John McCalld5532b62009-11-23 01:53:49 +0000701 if (TemplateArgs)
John McCall096832c2010-08-19 23:49:38 +0000702 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000703}
704
John McCall865d4472009-11-19 22:55:06 +0000705CXXDependentScopeMemberExpr *
706CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000707 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000708 SourceLocation OperatorLoc,
709 NestedNameSpecifier *Qualifier,
710 SourceRange QualifierRange,
711 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000712 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000713 const TemplateArgumentListInfo *TemplateArgs) {
714 if (!TemplateArgs)
John McCallaa81e162009-12-01 22:10:20 +0000715 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
716 IsArrow, OperatorLoc,
717 Qualifier, QualifierRange,
718 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000719 MemberNameInfo);
Mike Stump1eb44332009-09-09 15:08:12 +0000720
John McCalld5532b62009-11-23 01:53:49 +0000721 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
722 if (TemplateArgs)
723 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
724
725 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>());
John McCallaa81e162009-12-01 22:10:20 +0000726 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
727 IsArrow, OperatorLoc,
728 Qualifier, QualifierRange,
729 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000730 MemberNameInfo, TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000731}
732
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000733CXXDependentScopeMemberExpr *
734CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
735 unsigned NumTemplateArgs) {
736 if (NumTemplateArgs == 0)
737 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
738 0, SourceLocation(), 0,
739 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000740 DeclarationNameInfo());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000741
742 std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
743 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
744 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>());
745 CXXDependentScopeMemberExpr *E
746 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
747 0, SourceLocation(), 0,
748 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000749 DeclarationNameInfo(), 0);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000750 E->HasExplicitTemplateArgs = true;
751 return E;
752}
753
John McCall865d4472009-11-19 22:55:06 +0000754Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000755 return child_iterator(&Base);
756}
757
John McCall865d4472009-11-19 22:55:06 +0000758Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000759 if (isImplicitAccess())
760 return child_iterator(&Base);
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000761 return child_iterator(&Base + 1);
762}
John McCall129e2df2009-11-30 22:42:35 +0000763
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000764UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, QualType T,
765 bool Dependent,
John McCall129e2df2009-11-30 22:42:35 +0000766 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000767 Expr *Base, QualType BaseType,
768 bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000769 SourceLocation OperatorLoc,
770 NestedNameSpecifier *Qualifier,
771 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000772 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000773 const TemplateArgumentListInfo *TemplateArgs,
774 UnresolvedSetIterator Begin,
775 UnresolvedSetIterator End)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000776 : OverloadExpr(UnresolvedMemberExprClass, C, T, Dependent,
Abramo Bagnara25777432010-08-11 22:01:17 +0000777 Qualifier, QualifierRange, MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000778 TemplateArgs != 0, Begin, End),
John McCall7bb12da2010-02-02 06:20:04 +0000779 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
780 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
John McCall129e2df2009-11-30 22:42:35 +0000781 if (TemplateArgs)
John McCall7bb12da2010-02-02 06:20:04 +0000782 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
John McCall129e2df2009-11-30 22:42:35 +0000783}
784
785UnresolvedMemberExpr *
786UnresolvedMemberExpr::Create(ASTContext &C, bool Dependent,
787 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000788 Expr *Base, QualType BaseType, bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000789 SourceLocation OperatorLoc,
790 NestedNameSpecifier *Qualifier,
791 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000792 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000793 const TemplateArgumentListInfo *TemplateArgs,
794 UnresolvedSetIterator Begin,
795 UnresolvedSetIterator End) {
John McCall129e2df2009-11-30 22:42:35 +0000796 std::size_t size = sizeof(UnresolvedMemberExpr);
797 if (TemplateArgs)
798 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
799
800 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>());
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000801 return new (Mem) UnresolvedMemberExpr(C,
John McCall129e2df2009-11-30 22:42:35 +0000802 Dependent ? C.DependentTy : C.OverloadTy,
John McCallaa81e162009-12-01 22:10:20 +0000803 Dependent, HasUnresolvedUsing, Base, BaseType,
804 IsArrow, OperatorLoc, Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000805 MemberNameInfo, TemplateArgs, Begin, End);
John McCall129e2df2009-11-30 22:42:35 +0000806}
807
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000808UnresolvedMemberExpr *
809UnresolvedMemberExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
810 std::size_t size = sizeof(UnresolvedMemberExpr);
811 if (NumTemplateArgs != 0)
812 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
813
814 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>());
815 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
816 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
817 return E;
818}
819
John McCallc373d482010-01-27 01:50:18 +0000820CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
821 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
822
823 // If there was a nested name specifier, it names the naming class.
824 // It can't be dependent: after all, we were actually able to do the
825 // lookup.
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000826 CXXRecordDecl *Record = 0;
John McCall7bb12da2010-02-02 06:20:04 +0000827 if (getQualifier()) {
828 Type *T = getQualifier()->getAsType();
John McCallc373d482010-01-27 01:50:18 +0000829 assert(T && "qualifier in member expression does not name type");
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000830 Record = T->getAsCXXRecordDecl();
831 assert(Record && "qualifier in member expression does not name record");
832 }
John McCallc373d482010-01-27 01:50:18 +0000833 // Otherwise the naming class must have been the base class.
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000834 else {
John McCallc373d482010-01-27 01:50:18 +0000835 QualType BaseType = getBaseType().getNonReferenceType();
836 if (isArrow()) {
837 const PointerType *PT = BaseType->getAs<PointerType>();
838 assert(PT && "base of arrow member access is not pointer");
839 BaseType = PT->getPointeeType();
840 }
841
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000842 Record = BaseType->getAsCXXRecordDecl();
843 assert(Record && "base of member expression does not name record");
John McCallc373d482010-01-27 01:50:18 +0000844 }
845
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000846 return Record;
John McCallc373d482010-01-27 01:50:18 +0000847}
848
John McCall129e2df2009-11-30 22:42:35 +0000849Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
850 return child_iterator(&Base);
851}
852
853Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000854 if (isImplicitAccess())
855 return child_iterator(&Base);
John McCall129e2df2009-11-30 22:42:35 +0000856 return child_iterator(&Base + 1);
857}
Sebastian Redl2e156222010-09-10 20:55:43 +0000858
859Stmt::child_iterator CXXNoexceptExpr::child_begin() {
860 return child_iterator(&Operand);
861}
862Stmt::child_iterator CXXNoexceptExpr::child_end() {
863 return child_iterator(&Operand + 1);
864}