blob: a6aeef1ba824d9480aea6e4bdfb03f9ae557b32d [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"
Douglas Gregor651fe5e2010-02-24 23:40:28 +000018#include "clang/AST/TypeLoc.h"
Ted Kremeneke3a0c142007-08-24 20:21:10 +000019using namespace clang;
20
Douglas Gregor9da64192010-04-26 22:37:10 +000021
Ted Kremeneke3a0c142007-08-24 20:21:10 +000022//===----------------------------------------------------------------------===//
23// Child Iterators for iterating over subexpressions/substatements
24//===----------------------------------------------------------------------===//
25
Douglas Gregor9da64192010-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 Redlc4704762008-11-11 11:37:55 +000032// CXXTypeidExpr - has child iterators if the operand is an expression
33Stmt::child_iterator CXXTypeidExpr::child_begin() {
Douglas Gregor9da64192010-04-26 22:37:10 +000034 return isTypeOperand() ? child_iterator()
35 : reinterpret_cast<Stmt **>(&Operand);
Sebastian Redlc4704762008-11-11 11:37:55 +000036}
37Stmt::child_iterator CXXTypeidExpr::child_end() {
Douglas Gregor9da64192010-04-26 22:37:10 +000038 return isTypeOperand() ? child_iterator()
39 : reinterpret_cast<Stmt **>(&Operand) + 1;
Sebastian Redlc4704762008-11-11 11:37:55 +000040}
Ted Kremeneke3a0c142007-08-24 20:21:10 +000041
Francois Pichet9f4f2072010-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 Kremeneke3a0c142007-08-24 20:21:10 +000058// CXXBoolLiteralExpr
Mike Stump11289f42009-09-09 15:08:12 +000059Stmt::child_iterator CXXBoolLiteralExpr::child_begin() {
Ted Kremenek04746ce2007-10-18 23:28:49 +000060 return child_iterator();
61}
62Stmt::child_iterator CXXBoolLiteralExpr::child_end() {
63 return child_iterator();
64}
Chris Lattnerb7e656b2008-02-26 00:51:44 +000065
Sebastian Redl576fd422009-05-10 18:38:11 +000066// CXXNullPtrLiteralExpr
Mike Stump11289f42009-09-09 15:08:12 +000067Stmt::child_iterator CXXNullPtrLiteralExpr::child_begin() {
Sebastian Redl576fd422009-05-10 18:38:11 +000068 return child_iterator();
69}
70Stmt::child_iterator CXXNullPtrLiteralExpr::child_end() {
71 return child_iterator();
72}
73
Douglas Gregor97a9c812008-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 Lattnerb7e656b2008-02-26 00:51:44 +000078// CXXThrowExpr
Ted Kremenekc6501db2008-06-17 03:11:08 +000079Stmt::child_iterator CXXThrowExpr::child_begin() { return &Op; }
Chris Lattnerb7e656b2008-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 Kremenekc6501db2008-06-17 03:11:08 +000082 return Op ? &Op+1 : &Op;
Chris Lattnerb7e656b2008-02-26 00:51:44 +000083}
Chris Lattneraa9c7ae2008-04-08 04:40:51 +000084
85// CXXDefaultArgExpr
86Stmt::child_iterator CXXDefaultArgExpr::child_begin() {
Chris Lattner58258242008-04-10 02:22:51 +000087 return child_iterator();
Chris Lattneraa9c7ae2008-04-08 04:40:51 +000088}
89Stmt::child_iterator CXXDefaultArgExpr::child_end() {
Chris Lattner58258242008-04-10 02:22:51 +000090 return child_iterator();
Chris Lattneraa9c7ae2008-04-08 04:40:51 +000091}
Argyrios Kyrtzidis857fcc22008-08-22 15:38:55 +000092
Douglas Gregor747eb782010-07-08 06:14:04 +000093// CXXScalarValueInitExpr
Douglas Gregor2b88c112010-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 Gregor747eb782010-07-08 06:14:04 +0000101Stmt::child_iterator CXXScalarValueInitExpr::child_begin() {
Argyrios Kyrtzidis857fcc22008-08-22 15:38:55 +0000102 return child_iterator();
103}
Douglas Gregor747eb782010-07-08 06:14:04 +0000104Stmt::child_iterator CXXScalarValueInitExpr::child_end() {
Argyrios Kyrtzidis857fcc22008-08-22 15:38:55 +0000105 return child_iterator();
106}
Argyrios Kyrtzidisaa479132008-09-09 23:47:53 +0000107
Sebastian Redlbd150f42008-11-21 19:14:01 +0000108// CXXNewExpr
Ted Kremenek9d6eb402010-02-11 22:51:03 +0000109CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
Sebastian Redlbd150f42008-11-21 19:14:01 +0000110 Expr **placementArgs, unsigned numPlaceArgs,
Douglas Gregorf2753b32010-07-13 15:54:32 +0000111 SourceRange TypeIdParens, Expr *arraySize,
Sebastian Redlbd150f42008-11-21 19:14:01 +0000112 CXXConstructorDecl *constructor, bool initializer,
113 Expr **constructorArgs, unsigned numConsArgs,
114 FunctionDecl *operatorDelete, QualType ty,
Douglas Gregor0744ef62010-09-07 21:49:58 +0000115 TypeSourceInfo *AllocatedTypeInfo,
Sebastian Redlbd150f42008-11-21 19:14:01 +0000116 SourceLocation startLoc, SourceLocation endLoc)
Sebastian Redl8d2ccae2009-02-26 14:39:58 +0000117 : Expr(CXXNewExprClass, ty, ty->isDependentType(), ty->isDependentType()),
Douglas Gregorf2753b32010-07-13 15:54:32 +0000118 GlobalNew(globalNew),
Chris Lattnerabfb58d2010-05-10 01:22:27 +0000119 Initializer(initializer), SubExprs(0), OperatorNew(operatorNew),
Sebastian Redl351bb782008-12-02 14:43:59 +0000120 OperatorDelete(operatorDelete), Constructor(constructor),
Douglas Gregor0744ef62010-09-07 21:49:58 +0000121 AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens),
122 StartLoc(startLoc), EndLoc(endLoc) {
Chris Lattnerabfb58d2010-05-10 01:22:27 +0000123
124 AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
Sebastian Redlbd150f42008-11-21 19:14:01 +0000125 unsigned i = 0;
Sebastian Redl351bb782008-12-02 14:43:59 +0000126 if (Array)
127 SubExprs[i++] = arraySize;
128 for (unsigned j = 0; j < NumPlacementArgs; ++j)
Sebastian Redlbd150f42008-11-21 19:14:01 +0000129 SubExprs[i++] = placementArgs[j];
Sebastian Redl351bb782008-12-02 14:43:59 +0000130 for (unsigned j = 0; j < NumConstructorArgs; ++j)
Sebastian Redlbd150f42008-11-21 19:14:01 +0000131 SubExprs[i++] = constructorArgs[j];
Sebastian Redlbd150f42008-11-21 19:14:01 +0000132}
133
Chris Lattnerabfb58d2010-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 Redlbd150f42008-11-21 19:14:01 +0000146Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
147Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redl351bb782008-12-02 14:43:59 +0000148 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redlbd150f42008-11-21 19:14:01 +0000149}
150
151// CXXDeleteExpr
152Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
153Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
154
Douglas Gregorad8a3362009-09-04 17:36:40 +0000155// CXXPseudoDestructorExpr
156Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
157Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
158 return &Base + 1;
159}
160
Douglas Gregor678f90d2010-02-25 01:56:36 +0000161PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
162 : Type(Info)
163{
Abramo Bagnara1108e7b2010-05-20 10:00:11 +0000164 Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
Douglas Gregor678f90d2010-02-25 01:56:36 +0000165}
166
167QualType CXXPseudoDestructorExpr::getDestroyedType() const {
168 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
169 return TInfo->getType();
170
171 return QualType();
172}
173
Douglas Gregor651fe5e2010-02-24 23:40:28 +0000174SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
Douglas Gregor678f90d2010-02-25 01:56:36 +0000175 SourceLocation End = DestroyedType.getLocation();
176 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
Abramo Bagnara1108e7b2010-05-20 10:00:11 +0000177 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
Douglas Gregor678f90d2010-02-25 01:56:36 +0000178 return SourceRange(Base->getLocStart(), End);
Douglas Gregor651fe5e2010-02-24 23:40:28 +0000179}
180
181
John McCalld14a8642009-11-21 08:51:07 +0000182// UnresolvedLookupExpr
John McCalle66edc12009-11-24 19:00:30 +0000183UnresolvedLookupExpr *
184UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent,
John McCall58cc69d2010-01-27 01:50:18 +0000185 CXXRecordDecl *NamingClass,
John McCalle66edc12009-11-24 19:00:30 +0000186 NestedNameSpecifier *Qualifier,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000187 SourceRange QualifierRange,
188 const DeclarationNameInfo &NameInfo,
189 bool ADL,
Douglas Gregor30a4f4c2010-05-23 18:57:34 +0000190 const TemplateArgumentListInfo &Args,
191 UnresolvedSetIterator Begin,
192 UnresolvedSetIterator End)
John McCalle66edc12009-11-24 19:00:30 +0000193{
194 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
195 ExplicitTemplateArgumentList::sizeFor(Args));
196 UnresolvedLookupExpr *ULE
Douglas Gregorc69978f2010-05-23 19:36:40 +0000197 = new (Mem) UnresolvedLookupExpr(C,
198 Dependent ? C.DependentTy : C.OverloadTy,
John McCall58cc69d2010-01-27 01:50:18 +0000199 Dependent, NamingClass,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000200 Qualifier, QualifierRange, NameInfo,
201 ADL,
John McCalle66edc12009-11-24 19:00:30 +0000202 /*Overload*/ true,
Douglas Gregor30a4f4c2010-05-23 18:57:34 +0000203 /*ExplicitTemplateArgs*/ true,
204 Begin, End);
John McCalle66edc12009-11-24 19:00:30 +0000205
206 reinterpret_cast<ExplicitTemplateArgumentList*>(ULE+1)->initializeFrom(Args);
207
208 return ULE;
209}
210
Argyrios Kyrtzidis58e01ad2010-06-25 09:03:34 +0000211UnresolvedLookupExpr *
212UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
213 std::size_t size = sizeof(UnresolvedLookupExpr);
214 if (NumTemplateArgs != 0)
215 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
216
217 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedLookupExpr>());
218 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
219 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
220 return E;
221}
222
Douglas Gregorc69978f2010-05-23 19:36:40 +0000223OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C, QualType T,
224 bool Dependent, NestedNameSpecifier *Qualifier,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000225 SourceRange QRange,
226 const DeclarationNameInfo &NameInfo,
227 bool HasTemplateArgs,
Douglas Gregorc69978f2010-05-23 19:36:40 +0000228 UnresolvedSetIterator Begin,
229 UnresolvedSetIterator End)
230 : Expr(K, T, Dependent, Dependent),
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000231 Results(0), NumResults(0), NameInfo(NameInfo), Qualifier(Qualifier),
232 QualifierRange(QRange), HasExplicitTemplateArgs(HasTemplateArgs)
Douglas Gregorc69978f2010-05-23 19:36:40 +0000233{
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +0000234 initializeResults(C, Begin, End);
235}
236
237void OverloadExpr::initializeResults(ASTContext &C,
238 UnresolvedSetIterator Begin,
239 UnresolvedSetIterator End) {
240 assert(Results == 0 && "Results already initialized!");
241 NumResults = End - Begin;
Douglas Gregorc69978f2010-05-23 19:36:40 +0000242 if (NumResults) {
243 Results = static_cast<DeclAccessPair *>(
244 C.Allocate(sizeof(DeclAccessPair) * NumResults,
245 llvm::alignof<DeclAccessPair>()));
246 memcpy(Results, &*Begin.getIterator(),
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +0000247 NumResults * sizeof(DeclAccessPair));
Douglas Gregorc69978f2010-05-23 19:36:40 +0000248 }
249}
250
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +0000251
John McCall1acbbb52010-02-02 06:20:04 +0000252bool OverloadExpr::ComputeDependence(UnresolvedSetIterator Begin,
253 UnresolvedSetIterator End,
254 const TemplateArgumentListInfo *Args) {
John McCallad371252010-01-20 00:46:10 +0000255 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I)
John McCalle66edc12009-11-24 19:00:30 +0000256 if ((*I)->getDeclContext()->isDependentContext())
257 return true;
258
259 if (Args && TemplateSpecializationType::anyDependentTemplateArguments(*Args))
260 return true;
261
262 return false;
263}
264
John McCall8c12dc42010-04-22 18:44:12 +0000265CXXRecordDecl *OverloadExpr::getNamingClass() const {
266 if (isa<UnresolvedLookupExpr>(this))
267 return cast<UnresolvedLookupExpr>(this)->getNamingClass();
268 else
269 return cast<UnresolvedMemberExpr>(this)->getNamingClass();
270}
271
John McCalld14a8642009-11-21 08:51:07 +0000272Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump11289f42009-09-09 15:08:12 +0000273 return child_iterator();
Douglas Gregorb0846b02008-12-06 00:22:45 +0000274}
John McCalld14a8642009-11-21 08:51:07 +0000275Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregorb0846b02008-12-06 00:22:45 +0000276 return child_iterator();
277}
Sebastian Redlbaad4e72009-01-05 20:52:13 +0000278// UnaryTypeTraitExpr
279Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
280 return child_iterator();
281}
282Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
283 return child_iterator();
284}
285
John McCall8cd78132009-11-19 22:55:06 +0000286// DependentScopeDeclRefExpr
John McCalle66edc12009-11-24 19:00:30 +0000287DependentScopeDeclRefExpr *
288DependentScopeDeclRefExpr::Create(ASTContext &C,
289 NestedNameSpecifier *Qualifier,
290 SourceRange QualifierRange,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000291 const DeclarationNameInfo &NameInfo,
John McCalle66edc12009-11-24 19:00:30 +0000292 const TemplateArgumentListInfo *Args) {
293 std::size_t size = sizeof(DependentScopeDeclRefExpr);
294 if (Args) size += ExplicitTemplateArgumentList::sizeFor(*Args);
295 void *Mem = C.Allocate(size);
296
297 DependentScopeDeclRefExpr *DRE
298 = new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
299 Qualifier, QualifierRange,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000300 NameInfo, Args != 0);
John McCalle66edc12009-11-24 19:00:30 +0000301
302 if (Args)
303 reinterpret_cast<ExplicitTemplateArgumentList*>(DRE+1)
304 ->initializeFrom(*Args);
305
306 return DRE;
307}
308
Argyrios Kyrtzidiscd444d1a2010-06-28 09:31:56 +0000309DependentScopeDeclRefExpr *
310DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
311 unsigned NumTemplateArgs) {
312 std::size_t size = sizeof(DependentScopeDeclRefExpr);
313 if (NumTemplateArgs)
314 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
315 void *Mem = C.Allocate(size);
316
317 return new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(),
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000318 DeclarationNameInfo(),
Argyrios Kyrtzidiscd444d1a2010-06-28 09:31:56 +0000319 NumTemplateArgs != 0);
320}
321
John McCall8cd78132009-11-19 22:55:06 +0000322StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor90a1a652009-03-19 17:26:29 +0000323 return child_iterator();
324}
325
John McCall8cd78132009-11-19 22:55:06 +0000326StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor90a1a652009-03-19 17:26:29 +0000327 return child_iterator();
328}
329
Ted Kremenek49ace5c2009-12-23 04:00:48 +0000330SourceRange CXXConstructExpr::getSourceRange() const {
331 // FIXME: Should we know where the parentheses are, if there are any?
332 for (std::reverse_iterator<Stmt**> I(&Args[NumArgs]), E(&Args[0]); I!=E;++I) {
333 // Ignore CXXDefaultExprs when computing the range, as they don't
334 // have a range.
335 if (!isa<CXXDefaultArgExpr>(*I))
336 return SourceRange(Loc, (*I)->getLocEnd());
337 }
338
339 return SourceRange(Loc);
340}
341
Douglas Gregor993603d2008-11-14 16:09:21 +0000342SourceRange CXXOperatorCallExpr::getSourceRange() const {
343 OverloadedOperatorKind Kind = getOperator();
344 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
345 if (getNumArgs() == 1)
346 // Prefix operator
Mike Stump11289f42009-09-09 15:08:12 +0000347 return SourceRange(getOperatorLoc(),
Douglas Gregor993603d2008-11-14 16:09:21 +0000348 getArg(0)->getSourceRange().getEnd());
349 else
350 // Postfix operator
351 return SourceRange(getArg(0)->getSourceRange().getEnd(),
352 getOperatorLoc());
353 } else if (Kind == OO_Call) {
354 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
355 } else if (Kind == OO_Subscript) {
356 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
357 } else if (getNumArgs() == 1) {
358 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
359 } else if (getNumArgs() == 2) {
360 return SourceRange(getArg(0)->getSourceRange().getBegin(),
361 getArg(1)->getSourceRange().getEnd());
362 } else {
363 return SourceRange();
364 }
365}
366
Douglas Gregor97fd6e22008-12-22 05:46:06 +0000367Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
368 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
369 return MemExpr->getBase();
370
371 // FIXME: Will eventually need to cope with member pointers.
372 return 0;
373}
374
Douglas Gregoref986e82009-11-12 15:31:47 +0000375SourceRange CXXMemberCallExpr::getSourceRange() const {
376 SourceLocation LocStart = getCallee()->getLocStart();
377 if (LocStart.isInvalid() && getNumArgs() > 0)
378 LocStart = getArg(0)->getLocStart();
379 return SourceRange(LocStart, getRParenLoc());
380}
381
382
Douglas Gregore200adc2008-10-27 19:41:14 +0000383//===----------------------------------------------------------------------===//
384// Named casts
385//===----------------------------------------------------------------------===//
386
387/// getCastName - Get the name of the C++ cast being used, e.g.,
388/// "static_cast", "dynamic_cast", "reinterpret_cast", or
389/// "const_cast". The returned pointer must not be freed.
390const char *CXXNamedCastExpr::getCastName() const {
391 switch (getStmtClass()) {
392 case CXXStaticCastExprClass: return "static_cast";
393 case CXXDynamicCastExprClass: return "dynamic_cast";
394 case CXXReinterpretCastExprClass: return "reinterpret_cast";
395 case CXXConstCastExprClass: return "const_cast";
396 default: return "<invalid cast>";
397 }
398}
Douglas Gregordd04d332009-01-16 18:33:17 +0000399
John McCallcf142162010-08-07 06:22:56 +0000400CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
401 CastKind K, Expr *Op,
402 const CXXCastPath *BasePath,
403 TypeSourceInfo *WrittenTy,
404 SourceLocation L) {
405 unsigned PathSize = (BasePath ? BasePath->size() : 0);
406 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
407 + PathSize * sizeof(CXXBaseSpecifier*));
408 CXXStaticCastExpr *E =
409 new (Buffer) CXXStaticCastExpr(T, K, Op, PathSize, WrittenTy, L);
410 if (PathSize) E->setCastPath(*BasePath);
411 return E;
412}
413
414CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
415 unsigned PathSize) {
416 void *Buffer =
417 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
418 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
419}
420
421CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
422 CastKind K, Expr *Op,
423 const CXXCastPath *BasePath,
424 TypeSourceInfo *WrittenTy,
425 SourceLocation L) {
426 unsigned PathSize = (BasePath ? BasePath->size() : 0);
427 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
428 + PathSize * sizeof(CXXBaseSpecifier*));
429 CXXDynamicCastExpr *E =
430 new (Buffer) CXXDynamicCastExpr(T, K, Op, PathSize, WrittenTy, L);
431 if (PathSize) E->setCastPath(*BasePath);
432 return E;
433}
434
435CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
436 unsigned PathSize) {
437 void *Buffer =
438 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
439 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
440}
441
442CXXReinterpretCastExpr *
443CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, CastKind K, Expr *Op,
444 const CXXCastPath *BasePath,
445 TypeSourceInfo *WrittenTy, SourceLocation L) {
446 unsigned PathSize = (BasePath ? BasePath->size() : 0);
447 void *Buffer =
448 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
449 CXXReinterpretCastExpr *E =
450 new (Buffer) CXXReinterpretCastExpr(T, K, Op, PathSize, WrittenTy, L);
451 if (PathSize) E->setCastPath(*BasePath);
452 return E;
453}
454
455CXXReinterpretCastExpr *
456CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
457 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
458 + PathSize * sizeof(CXXBaseSpecifier*));
459 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
460}
461
462CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T, Expr *Op,
463 TypeSourceInfo *WrittenTy,
464 SourceLocation L) {
465 return new (C) CXXConstCastExpr(T, Op, WrittenTy, L);
466}
467
468CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
469 return new (C) CXXConstCastExpr(EmptyShell());
470}
471
472CXXFunctionalCastExpr *
473CXXFunctionalCastExpr::Create(ASTContext &C, QualType T,
474 TypeSourceInfo *Written, SourceLocation L,
475 CastKind K, Expr *Op, const CXXCastPath *BasePath,
476 SourceLocation R) {
477 unsigned PathSize = (BasePath ? BasePath->size() : 0);
478 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
479 + PathSize * sizeof(CXXBaseSpecifier*));
480 CXXFunctionalCastExpr *E =
481 new (Buffer) CXXFunctionalCastExpr(T, Written, L, K, Op, PathSize, R);
482 if (PathSize) E->setCastPath(*BasePath);
483 return E;
484}
485
486CXXFunctionalCastExpr *
487CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
488 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
489 + PathSize * sizeof(CXXBaseSpecifier*));
490 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
491}
492
493
Douglas Gregor25ab25f2009-12-23 18:19:08 +0000494CXXDefaultArgExpr *
Douglas Gregor033f6752009-12-23 23:03:06 +0000495CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
496 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor25ab25f2009-12-23 18:19:08 +0000497 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor033f6752009-12-23 23:03:06 +0000498 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
499 SubExpr);
Douglas Gregor25ab25f2009-12-23 18:19:08 +0000500}
501
Mike Stump11289f42009-09-09 15:08:12 +0000502CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonffda6062009-05-30 20:34:37 +0000503 const CXXDestructorDecl *Destructor) {
Anders Carlsson73b836b2009-05-30 22:38:53 +0000504 return new (C) CXXTemporary(Destructor);
505}
506
Mike Stump11289f42009-09-09 15:08:12 +0000507CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlsson993a4b32009-05-30 20:03:25 +0000508 CXXTemporary *Temp,
509 Expr* SubExpr) {
Mike Stump11289f42009-09-09 15:08:12 +0000510 assert(SubExpr->getType()->isRecordType() &&
Anders Carlsson993a4b32009-05-30 20:03:25 +0000511 "Expression bound to a temporary must have record type!");
512
Anders Carlssonffda6062009-05-30 20:34:37 +0000513 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
Anders Carlsson993a4b32009-05-30 20:03:25 +0000514}
515
Anders Carlsson4b2434d2009-05-30 20:56:46 +0000516CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson56c5bd82009-04-24 05:23:13 +0000517 CXXConstructorDecl *Cons,
Douglas Gregor2b88c112010-09-08 00:15:04 +0000518 TypeSourceInfo *Type,
Douglas Gregordd04d332009-01-16 18:33:17 +0000519 Expr **Args,
Mike Stump11289f42009-09-09 15:08:12 +0000520 unsigned NumArgs,
Douglas Gregor199db362010-04-27 20:36:09 +0000521 SourceLocation rParenLoc,
522 bool ZeroInitialization)
Douglas Gregor2b88c112010-09-08 00:15:04 +0000523 : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
524 Type->getType().getNonReferenceType(),
525 Type->getTypeLoc().getBeginLoc(),
Douglas Gregor199db362010-04-27 20:36:09 +0000526 Cons, false, Args, NumArgs, ZeroInitialization),
Douglas Gregor2b88c112010-09-08 00:15:04 +0000527 RParenLoc(rParenLoc), Type(Type) {
528}
529
530SourceRange CXXTemporaryObjectExpr::getSourceRange() const {
531 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
Douglas Gregordd04d332009-01-16 18:33:17 +0000532}
Anders Carlsson6f287832009-04-21 02:22:11 +0000533
Mike Stump11289f42009-09-09 15:08:12 +0000534CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor85dabae2009-12-16 01:38:02 +0000535 SourceLocation Loc,
Anders Carlsson4b2434d2009-05-30 20:56:46 +0000536 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000537 Expr **Args, unsigned NumArgs,
Douglas Gregor7ae2d772010-01-31 09:12:51 +0000538 bool ZeroInitialization,
Anders Carlssonedea1de2010-05-02 23:53:04 +0000539 ConstructionKind ConstructKind) {
Douglas Gregor85dabae2009-12-16 01:38:02 +0000540 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor7ae2d772010-01-31 09:12:51 +0000541 Elidable, Args, NumArgs, ZeroInitialization,
Anders Carlssonedea1de2010-05-02 23:53:04 +0000542 ConstructKind);
Anders Carlsson0781ce72009-04-23 02:32:43 +0000543}
544
Mike Stump11289f42009-09-09 15:08:12 +0000545CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor85dabae2009-12-16 01:38:02 +0000546 SourceLocation Loc,
Anders Carlsson4b2434d2009-05-30 20:56:46 +0000547 CXXConstructorDecl *D, bool elidable,
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000548 Expr **args, unsigned numargs,
Anders Carlssonbcc066b2010-05-02 22:54:08 +0000549 bool ZeroInitialization,
550 ConstructionKind ConstructKind)
Anders Carlsson32ebd292009-04-24 05:04:04 +0000551: Expr(SC, T,
Anders Carlsson0781ce72009-04-23 02:32:43 +0000552 T->isDependentType(),
553 (T->isDependentType() ||
554 CallExpr::hasAnyValueDependentArguments(args, numargs))),
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000555 Constructor(D), Loc(Loc), Elidable(elidable),
Anders Carlssonbcc066b2010-05-02 22:54:08 +0000556 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
557 Args(0), NumArgs(numargs)
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000558{
559 if (NumArgs) {
560 Args = new (C) Stmt*[NumArgs];
561
562 for (unsigned i = 0; i != NumArgs; ++i) {
563 assert(args[i] && "NULL argument in CXXConstructExpr");
564 Args[i] = args[i];
Anders Carlsson0781ce72009-04-23 02:32:43 +0000565 }
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000566 }
Anders Carlsson0781ce72009-04-23 02:32:43 +0000567}
568
Ted Kremeneka9084c12010-05-10 20:06:30 +0000569CXXExprWithTemporaries::CXXExprWithTemporaries(ASTContext &C,
570 Expr *subexpr,
Mike Stump11289f42009-09-09 15:08:12 +0000571 CXXTemporary **temps,
Anders Carlsson6e997b22009-12-15 20:51:39 +0000572 unsigned numtemps)
Chris Lattnercba86142010-05-10 00:25:06 +0000573 : Expr(CXXExprWithTemporariesClass, subexpr->getType(),
Mike Stump11289f42009-09-09 15:08:12 +0000574 subexpr->isTypeDependent(), subexpr->isValueDependent()),
Chris Lattnercba86142010-05-10 00:25:06 +0000575 SubExpr(subexpr), Temps(0), NumTemps(0) {
Chris Lattnerbc7d55d2010-05-10 00:45:12 +0000576 if (numtemps) {
Ted Kremeneka9084c12010-05-10 20:06:30 +0000577 setNumTemporaries(C, numtemps);
Chris Lattnercba86142010-05-10 00:25:06 +0000578 for (unsigned i = 0; i != numtemps; ++i)
Anders Carlssona29ded92009-05-30 21:05:25 +0000579 Temps[i] = temps[i];
Anders Carlssondefc6442009-04-24 22:47:04 +0000580 }
581}
582
Ted Kremeneka9084c12010-05-10 20:06:30 +0000583void CXXExprWithTemporaries::setNumTemporaries(ASTContext &C, unsigned N) {
Chris Lattnercba86142010-05-10 00:25:06 +0000584 assert(Temps == 0 && "Cannot resize with this");
Daniel Dunbarc8a7bdb2010-05-10 15:59:37 +0000585 NumTemps = N;
Ted Kremeneka9084c12010-05-10 20:06:30 +0000586 Temps = new (C) CXXTemporary*[NumTemps];
Chris Lattnercba86142010-05-10 00:25:06 +0000587}
588
589
Mike Stump11289f42009-09-09 15:08:12 +0000590CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C,
Anders Carlsson73b836b2009-05-30 22:38:53 +0000591 Expr *SubExpr,
Mike Stump11289f42009-09-09 15:08:12 +0000592 CXXTemporary **Temps,
Anders Carlsson6e997b22009-12-15 20:51:39 +0000593 unsigned NumTemps) {
Ted Kremeneka9084c12010-05-10 20:06:30 +0000594 return new (C) CXXExprWithTemporaries(C, SubExpr, Temps, NumTemps);
Anders Carlsson73b836b2009-05-30 22:38:53 +0000595}
596
Anders Carlsson993a4b32009-05-30 20:03:25 +0000597// CXXBindTemporaryExpr
598Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
599 return &SubExpr;
600}
601
Mike Stump11289f42009-09-09 15:08:12 +0000602Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlsson993a4b32009-05-30 20:03:25 +0000603 return &SubExpr + 1;
604}
605
Anders Carlsson0781ce72009-04-23 02:32:43 +0000606// CXXConstructExpr
607Stmt::child_iterator CXXConstructExpr::child_begin() {
608 return &Args[0];
609}
610Stmt::child_iterator CXXConstructExpr::child_end() {
611 return &Args[0]+NumArgs;
612}
613
Anders Carlssonaa10d652009-05-01 22:21:22 +0000614// CXXExprWithTemporaries
615Stmt::child_iterator CXXExprWithTemporaries::child_begin() {
616 return &SubExpr;
Anders Carlsson6f287832009-04-21 02:22:11 +0000617}
Anders Carlssondefc6442009-04-24 22:47:04 +0000618
Mike Stump11289f42009-09-09 15:08:12 +0000619Stmt::child_iterator CXXExprWithTemporaries::child_end() {
Anders Carlssonaa10d652009-05-01 22:21:22 +0000620 return &SubExpr + 1;
621}
Anders Carlssondefc6442009-04-24 22:47:04 +0000622
Douglas Gregor2b88c112010-09-08 00:15:04 +0000623CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
Douglas Gregorce934142009-05-20 18:46:25 +0000624 SourceLocation LParenLoc,
625 Expr **Args,
626 unsigned NumArgs,
627 SourceLocation RParenLoc)
Douglas Gregor2b88c112010-09-08 00:15:04 +0000628 : Expr(CXXUnresolvedConstructExprClass,
629 Type->getType().getNonReferenceType(),
630 Type->getType()->isDependentType(), true),
631 Type(Type),
Douglas Gregorce934142009-05-20 18:46:25 +0000632 LParenLoc(LParenLoc),
633 RParenLoc(RParenLoc),
634 NumArgs(NumArgs) {
635 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
636 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs);
637}
638
639CXXUnresolvedConstructExpr *
Mike Stump11289f42009-09-09 15:08:12 +0000640CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregor2b88c112010-09-08 00:15:04 +0000641 TypeSourceInfo *Type,
Douglas Gregorce934142009-05-20 18:46:25 +0000642 SourceLocation LParenLoc,
643 Expr **Args,
644 unsigned NumArgs,
645 SourceLocation RParenLoc) {
646 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
647 sizeof(Expr *) * NumArgs);
Douglas Gregor2b88c112010-09-08 00:15:04 +0000648 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc,
Douglas Gregorce934142009-05-20 18:46:25 +0000649 Args, NumArgs, RParenLoc);
650}
651
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000652CXXUnresolvedConstructExpr *
653CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
654 Stmt::EmptyShell Empty;
655 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
656 sizeof(Expr *) * NumArgs);
657 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
658}
659
Douglas Gregor2b88c112010-09-08 00:15:04 +0000660SourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
661 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
662}
663
Douglas Gregorce934142009-05-20 18:46:25 +0000664Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
665 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
666}
667
668Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
669 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
670}
Sebastian Redle769ecf2009-05-16 18:50:46 +0000671
John McCall8cd78132009-11-19 22:55:06 +0000672CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCall2d74de92009-12-01 22:10:20 +0000673 Expr *Base, QualType BaseType,
674 bool IsArrow,
Douglas Gregor308047d2009-09-09 00:23:06 +0000675 SourceLocation OperatorLoc,
676 NestedNameSpecifier *Qualifier,
677 SourceRange QualifierRange,
678 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000679 DeclarationNameInfo MemberNameInfo,
John McCall6b51f282009-11-23 01:53:49 +0000680 const TemplateArgumentListInfo *TemplateArgs)
John McCall8cd78132009-11-19 22:55:06 +0000681 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, true, true),
John McCall2d74de92009-12-01 22:10:20 +0000682 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
683 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor308047d2009-09-09 00:23:06 +0000684 OperatorLoc(OperatorLoc),
685 Qualifier(Qualifier), QualifierRange(QualifierRange),
686 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000687 MemberNameInfo(MemberNameInfo) {
John McCall6b51f282009-11-23 01:53:49 +0000688 if (TemplateArgs)
John McCallb3774b52010-08-19 23:49:38 +0000689 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
Douglas Gregor308047d2009-09-09 00:23:06 +0000690}
691
John McCall8cd78132009-11-19 22:55:06 +0000692CXXDependentScopeMemberExpr *
693CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCall2d74de92009-12-01 22:10:20 +0000694 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor308047d2009-09-09 00:23:06 +0000695 SourceLocation OperatorLoc,
696 NestedNameSpecifier *Qualifier,
697 SourceRange QualifierRange,
698 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000699 DeclarationNameInfo MemberNameInfo,
John McCall6b51f282009-11-23 01:53:49 +0000700 const TemplateArgumentListInfo *TemplateArgs) {
701 if (!TemplateArgs)
John McCall2d74de92009-12-01 22:10:20 +0000702 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
703 IsArrow, OperatorLoc,
704 Qualifier, QualifierRange,
705 FirstQualifierFoundInScope,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000706 MemberNameInfo);
Mike Stump11289f42009-09-09 15:08:12 +0000707
John McCall6b51f282009-11-23 01:53:49 +0000708 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
709 if (TemplateArgs)
710 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
711
712 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>());
John McCall2d74de92009-12-01 22:10:20 +0000713 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
714 IsArrow, OperatorLoc,
715 Qualifier, QualifierRange,
716 FirstQualifierFoundInScope,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000717 MemberNameInfo, TemplateArgs);
Douglas Gregor308047d2009-09-09 00:23:06 +0000718}
719
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000720CXXDependentScopeMemberExpr *
721CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
722 unsigned NumTemplateArgs) {
723 if (NumTemplateArgs == 0)
724 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
725 0, SourceLocation(), 0,
726 SourceRange(), 0,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000727 DeclarationNameInfo());
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000728
729 std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
730 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
731 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>());
732 CXXDependentScopeMemberExpr *E
733 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
734 0, SourceLocation(), 0,
735 SourceRange(), 0,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000736 DeclarationNameInfo(), 0);
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000737 E->HasExplicitTemplateArgs = true;
738 return E;
739}
740
John McCall8cd78132009-11-19 22:55:06 +0000741Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregora8db9542009-05-22 21:13:27 +0000742 return child_iterator(&Base);
743}
744
John McCall8cd78132009-11-19 22:55:06 +0000745Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCall2d74de92009-12-01 22:10:20 +0000746 if (isImplicitAccess())
747 return child_iterator(&Base);
Douglas Gregora8db9542009-05-22 21:13:27 +0000748 return child_iterator(&Base + 1);
749}
John McCall10eae182009-11-30 22:42:35 +0000750
Douglas Gregorc69978f2010-05-23 19:36:40 +0000751UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, QualType T,
752 bool Dependent,
John McCall10eae182009-11-30 22:42:35 +0000753 bool HasUnresolvedUsing,
John McCall2d74de92009-12-01 22:10:20 +0000754 Expr *Base, QualType BaseType,
755 bool IsArrow,
John McCall10eae182009-11-30 22:42:35 +0000756 SourceLocation OperatorLoc,
757 NestedNameSpecifier *Qualifier,
758 SourceRange QualifierRange,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000759 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor30a4f4c2010-05-23 18:57:34 +0000760 const TemplateArgumentListInfo *TemplateArgs,
761 UnresolvedSetIterator Begin,
762 UnresolvedSetIterator End)
Douglas Gregorc69978f2010-05-23 19:36:40 +0000763 : OverloadExpr(UnresolvedMemberExprClass, C, T, Dependent,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000764 Qualifier, QualifierRange, MemberNameInfo,
Douglas Gregor30a4f4c2010-05-23 18:57:34 +0000765 TemplateArgs != 0, Begin, End),
John McCall1acbbb52010-02-02 06:20:04 +0000766 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
767 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
John McCall10eae182009-11-30 22:42:35 +0000768 if (TemplateArgs)
John McCall1acbbb52010-02-02 06:20:04 +0000769 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
John McCall10eae182009-11-30 22:42:35 +0000770}
771
772UnresolvedMemberExpr *
773UnresolvedMemberExpr::Create(ASTContext &C, bool Dependent,
774 bool HasUnresolvedUsing,
John McCall2d74de92009-12-01 22:10:20 +0000775 Expr *Base, QualType BaseType, bool IsArrow,
John McCall10eae182009-11-30 22:42:35 +0000776 SourceLocation OperatorLoc,
777 NestedNameSpecifier *Qualifier,
778 SourceRange QualifierRange,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000779 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor30a4f4c2010-05-23 18:57:34 +0000780 const TemplateArgumentListInfo *TemplateArgs,
781 UnresolvedSetIterator Begin,
782 UnresolvedSetIterator End) {
John McCall10eae182009-11-30 22:42:35 +0000783 std::size_t size = sizeof(UnresolvedMemberExpr);
784 if (TemplateArgs)
785 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
786
787 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>());
Douglas Gregorc69978f2010-05-23 19:36:40 +0000788 return new (Mem) UnresolvedMemberExpr(C,
John McCall10eae182009-11-30 22:42:35 +0000789 Dependent ? C.DependentTy : C.OverloadTy,
John McCall2d74de92009-12-01 22:10:20 +0000790 Dependent, HasUnresolvedUsing, Base, BaseType,
791 IsArrow, OperatorLoc, Qualifier, QualifierRange,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000792 MemberNameInfo, TemplateArgs, Begin, End);
John McCall10eae182009-11-30 22:42:35 +0000793}
794
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +0000795UnresolvedMemberExpr *
796UnresolvedMemberExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
797 std::size_t size = sizeof(UnresolvedMemberExpr);
798 if (NumTemplateArgs != 0)
799 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
800
801 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>());
802 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
803 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
804 return E;
805}
806
John McCall58cc69d2010-01-27 01:50:18 +0000807CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
808 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
809
810 // If there was a nested name specifier, it names the naming class.
811 // It can't be dependent: after all, we were actually able to do the
812 // lookup.
Douglas Gregor9262f472010-04-27 18:19:34 +0000813 CXXRecordDecl *Record = 0;
John McCall1acbbb52010-02-02 06:20:04 +0000814 if (getQualifier()) {
815 Type *T = getQualifier()->getAsType();
John McCall58cc69d2010-01-27 01:50:18 +0000816 assert(T && "qualifier in member expression does not name type");
Douglas Gregor9262f472010-04-27 18:19:34 +0000817 Record = T->getAsCXXRecordDecl();
818 assert(Record && "qualifier in member expression does not name record");
819 }
John McCall58cc69d2010-01-27 01:50:18 +0000820 // Otherwise the naming class must have been the base class.
Douglas Gregor9262f472010-04-27 18:19:34 +0000821 else {
John McCall58cc69d2010-01-27 01:50:18 +0000822 QualType BaseType = getBaseType().getNonReferenceType();
823 if (isArrow()) {
824 const PointerType *PT = BaseType->getAs<PointerType>();
825 assert(PT && "base of arrow member access is not pointer");
826 BaseType = PT->getPointeeType();
827 }
828
Douglas Gregor9262f472010-04-27 18:19:34 +0000829 Record = BaseType->getAsCXXRecordDecl();
830 assert(Record && "base of member expression does not name record");
John McCall58cc69d2010-01-27 01:50:18 +0000831 }
832
Douglas Gregor9262f472010-04-27 18:19:34 +0000833 return Record;
John McCall58cc69d2010-01-27 01:50:18 +0000834}
835
John McCall10eae182009-11-30 22:42:35 +0000836Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
837 return child_iterator(&Base);
838}
839
840Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCall2d74de92009-12-01 22:10:20 +0000841 if (isImplicitAccess())
842 return child_iterator(&Base);
John McCall10eae182009-11-30 22:42:35 +0000843 return child_iterator(&Base + 1);
844}
Sebastian Redl4202c0f2010-09-10 20:55:43 +0000845
846Stmt::child_iterator CXXNoexceptExpr::child_begin() {
847 return child_iterator(&Operand);
848}
849Stmt::child_iterator CXXNoexceptExpr::child_end() {
850 return child_iterator(&Operand + 1);
851}