blob: a07d7840f0c24d137ee58297dabccc77366d258a [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,
Chandler Carruth01718152010-10-25 08:47:36 +0000116 SourceLocation startLoc, SourceLocation endLoc,
117 SourceLocation constructorLParen,
118 SourceLocation constructorRParen)
Sebastian Redl8d2ccae2009-02-26 14:39:58 +0000119 : Expr(CXXNewExprClass, ty, ty->isDependentType(), ty->isDependentType()),
Douglas Gregorf2753b32010-07-13 15:54:32 +0000120 GlobalNew(globalNew),
Chris Lattnerabfb58d2010-05-10 01:22:27 +0000121 Initializer(initializer), SubExprs(0), OperatorNew(operatorNew),
Sebastian Redl351bb782008-12-02 14:43:59 +0000122 OperatorDelete(operatorDelete), Constructor(constructor),
Douglas Gregor0744ef62010-09-07 21:49:58 +0000123 AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens),
Chandler Carruth01718152010-10-25 08:47:36 +0000124 StartLoc(startLoc), EndLoc(endLoc), ConstructorLParen(constructorLParen),
125 ConstructorRParen(constructorRParen) {
Chris Lattnerabfb58d2010-05-10 01:22:27 +0000126 AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
Sebastian Redlbd150f42008-11-21 19:14:01 +0000127 unsigned i = 0;
Sebastian Redl351bb782008-12-02 14:43:59 +0000128 if (Array)
129 SubExprs[i++] = arraySize;
130 for (unsigned j = 0; j < NumPlacementArgs; ++j)
Sebastian Redlbd150f42008-11-21 19:14:01 +0000131 SubExprs[i++] = placementArgs[j];
Sebastian Redl351bb782008-12-02 14:43:59 +0000132 for (unsigned j = 0; j < NumConstructorArgs; ++j)
Sebastian Redlbd150f42008-11-21 19:14:01 +0000133 SubExprs[i++] = constructorArgs[j];
Sebastian Redlbd150f42008-11-21 19:14:01 +0000134}
135
Chris Lattnerabfb58d2010-05-10 01:22:27 +0000136void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray,
137 unsigned numPlaceArgs, unsigned numConsArgs){
138 assert(SubExprs == 0 && "SubExprs already allocated");
139 Array = isArray;
140 NumPlacementArgs = numPlaceArgs;
141 NumConstructorArgs = numConsArgs;
142
143 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
144 SubExprs = new (C) Stmt*[TotalSize];
145}
146
147
Sebastian Redlbd150f42008-11-21 19:14:01 +0000148Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
149Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redl351bb782008-12-02 14:43:59 +0000150 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redlbd150f42008-11-21 19:14:01 +0000151}
152
153// CXXDeleteExpr
Douglas Gregor6ed2fee2010-09-14 22:55:20 +0000154QualType CXXDeleteExpr::getDestroyedType() const {
155 const Expr *Arg = getArgument();
156 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
157 if (ICE->getCastKind() != CK_UserDefinedConversion &&
158 ICE->getType()->isVoidPointerType())
159 Arg = ICE->getSubExpr();
160 else
161 break;
162 }
Craig Silverstein20f7ab72010-10-20 00:38:15 +0000163 // The type-to-delete may not be a pointer if it's a dependent type.
Craig Silverstein3b9936f2010-10-20 00:56:01 +0000164 const QualType ArgType = Arg->getType();
Craig Silverstein20f7ab72010-10-20 00:38:15 +0000165 if (ArgType->isDependentType())
166 return ArgType;
Douglas Gregor6ed2fee2010-09-14 22:55:20 +0000167
Craig Silverstein20f7ab72010-10-20 00:38:15 +0000168 return ArgType->getAs<PointerType>()->getPointeeType();
Douglas Gregor6ed2fee2010-09-14 22:55:20 +0000169}
170
Sebastian Redlbd150f42008-11-21 19:14:01 +0000171Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
172Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
173
Douglas Gregorad8a3362009-09-04 17:36:40 +0000174// CXXPseudoDestructorExpr
175Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
176Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
177 return &Base + 1;
178}
179
Douglas Gregor678f90d2010-02-25 01:56:36 +0000180PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
181 : Type(Info)
182{
Abramo Bagnara1108e7b2010-05-20 10:00:11 +0000183 Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
Douglas Gregor678f90d2010-02-25 01:56:36 +0000184}
185
186QualType CXXPseudoDestructorExpr::getDestroyedType() const {
187 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
188 return TInfo->getType();
189
190 return QualType();
191}
192
Douglas Gregor651fe5e2010-02-24 23:40:28 +0000193SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
Douglas Gregor678f90d2010-02-25 01:56:36 +0000194 SourceLocation End = DestroyedType.getLocation();
195 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
Abramo Bagnara1108e7b2010-05-20 10:00:11 +0000196 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
Douglas Gregor678f90d2010-02-25 01:56:36 +0000197 return SourceRange(Base->getLocStart(), End);
Douglas Gregor651fe5e2010-02-24 23:40:28 +0000198}
199
200
John McCalld14a8642009-11-21 08:51:07 +0000201// UnresolvedLookupExpr
John McCalle66edc12009-11-24 19:00:30 +0000202UnresolvedLookupExpr *
203UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent,
John McCall58cc69d2010-01-27 01:50:18 +0000204 CXXRecordDecl *NamingClass,
John McCalle66edc12009-11-24 19:00:30 +0000205 NestedNameSpecifier *Qualifier,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000206 SourceRange QualifierRange,
207 const DeclarationNameInfo &NameInfo,
208 bool ADL,
Douglas Gregor30a4f4c2010-05-23 18:57:34 +0000209 const TemplateArgumentListInfo &Args,
210 UnresolvedSetIterator Begin,
211 UnresolvedSetIterator End)
John McCalle66edc12009-11-24 19:00:30 +0000212{
213 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
214 ExplicitTemplateArgumentList::sizeFor(Args));
215 UnresolvedLookupExpr *ULE
Douglas Gregorc69978f2010-05-23 19:36:40 +0000216 = new (Mem) UnresolvedLookupExpr(C,
217 Dependent ? C.DependentTy : C.OverloadTy,
John McCall58cc69d2010-01-27 01:50:18 +0000218 Dependent, NamingClass,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000219 Qualifier, QualifierRange, NameInfo,
220 ADL,
John McCalle66edc12009-11-24 19:00:30 +0000221 /*Overload*/ true,
Douglas Gregor30a4f4c2010-05-23 18:57:34 +0000222 /*ExplicitTemplateArgs*/ true,
223 Begin, End);
John McCalle66edc12009-11-24 19:00:30 +0000224
225 reinterpret_cast<ExplicitTemplateArgumentList*>(ULE+1)->initializeFrom(Args);
226
227 return ULE;
228}
229
Argyrios Kyrtzidis58e01ad2010-06-25 09:03:34 +0000230UnresolvedLookupExpr *
231UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
232 std::size_t size = sizeof(UnresolvedLookupExpr);
233 if (NumTemplateArgs != 0)
234 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
235
Chris Lattner5c0b4052010-10-30 05:14:06 +0000236 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedLookupExpr>());
Argyrios Kyrtzidis58e01ad2010-06-25 09:03:34 +0000237 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
238 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
239 return E;
240}
241
Douglas Gregorc69978f2010-05-23 19:36:40 +0000242OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C, QualType T,
243 bool Dependent, NestedNameSpecifier *Qualifier,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000244 SourceRange QRange,
245 const DeclarationNameInfo &NameInfo,
246 bool HasTemplateArgs,
Douglas Gregorc69978f2010-05-23 19:36:40 +0000247 UnresolvedSetIterator Begin,
248 UnresolvedSetIterator End)
249 : Expr(K, T, Dependent, Dependent),
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000250 Results(0), NumResults(0), NameInfo(NameInfo), Qualifier(Qualifier),
251 QualifierRange(QRange), HasExplicitTemplateArgs(HasTemplateArgs)
Douglas Gregorc69978f2010-05-23 19:36:40 +0000252{
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +0000253 initializeResults(C, Begin, End);
254}
255
256void OverloadExpr::initializeResults(ASTContext &C,
257 UnresolvedSetIterator Begin,
258 UnresolvedSetIterator End) {
259 assert(Results == 0 && "Results already initialized!");
260 NumResults = End - Begin;
Douglas Gregorc69978f2010-05-23 19:36:40 +0000261 if (NumResults) {
262 Results = static_cast<DeclAccessPair *>(
263 C.Allocate(sizeof(DeclAccessPair) * NumResults,
Chris Lattner5c0b4052010-10-30 05:14:06 +0000264 llvm::alignOf<DeclAccessPair>()));
Douglas Gregorc69978f2010-05-23 19:36:40 +0000265 memcpy(Results, &*Begin.getIterator(),
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +0000266 NumResults * sizeof(DeclAccessPair));
Douglas Gregorc69978f2010-05-23 19:36:40 +0000267 }
268}
269
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +0000270
John McCall1acbbb52010-02-02 06:20:04 +0000271bool OverloadExpr::ComputeDependence(UnresolvedSetIterator Begin,
272 UnresolvedSetIterator End,
273 const TemplateArgumentListInfo *Args) {
John McCallad371252010-01-20 00:46:10 +0000274 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I)
John McCalle66edc12009-11-24 19:00:30 +0000275 if ((*I)->getDeclContext()->isDependentContext())
276 return true;
277
278 if (Args && TemplateSpecializationType::anyDependentTemplateArguments(*Args))
279 return true;
280
281 return false;
282}
283
John McCall8c12dc42010-04-22 18:44:12 +0000284CXXRecordDecl *OverloadExpr::getNamingClass() const {
285 if (isa<UnresolvedLookupExpr>(this))
286 return cast<UnresolvedLookupExpr>(this)->getNamingClass();
287 else
288 return cast<UnresolvedMemberExpr>(this)->getNamingClass();
289}
290
John McCalld14a8642009-11-21 08:51:07 +0000291Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump11289f42009-09-09 15:08:12 +0000292 return child_iterator();
Douglas Gregorb0846b02008-12-06 00:22:45 +0000293}
John McCalld14a8642009-11-21 08:51:07 +0000294Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregorb0846b02008-12-06 00:22:45 +0000295 return child_iterator();
296}
Sebastian Redlbaad4e72009-01-05 20:52:13 +0000297// UnaryTypeTraitExpr
298Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
299 return child_iterator();
300}
301Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
302 return child_iterator();
303}
304
John McCall8cd78132009-11-19 22:55:06 +0000305// DependentScopeDeclRefExpr
John McCalle66edc12009-11-24 19:00:30 +0000306DependentScopeDeclRefExpr *
307DependentScopeDeclRefExpr::Create(ASTContext &C,
308 NestedNameSpecifier *Qualifier,
309 SourceRange QualifierRange,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000310 const DeclarationNameInfo &NameInfo,
John McCalle66edc12009-11-24 19:00:30 +0000311 const TemplateArgumentListInfo *Args) {
312 std::size_t size = sizeof(DependentScopeDeclRefExpr);
313 if (Args) size += ExplicitTemplateArgumentList::sizeFor(*Args);
314 void *Mem = C.Allocate(size);
315
316 DependentScopeDeclRefExpr *DRE
317 = new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
318 Qualifier, QualifierRange,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000319 NameInfo, Args != 0);
John McCalle66edc12009-11-24 19:00:30 +0000320
321 if (Args)
322 reinterpret_cast<ExplicitTemplateArgumentList*>(DRE+1)
323 ->initializeFrom(*Args);
324
325 return DRE;
326}
327
Argyrios Kyrtzidiscd444d1a2010-06-28 09:31:56 +0000328DependentScopeDeclRefExpr *
329DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
330 unsigned NumTemplateArgs) {
331 std::size_t size = sizeof(DependentScopeDeclRefExpr);
332 if (NumTemplateArgs)
333 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
334 void *Mem = C.Allocate(size);
335
336 return new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(),
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000337 DeclarationNameInfo(),
Argyrios Kyrtzidiscd444d1a2010-06-28 09:31:56 +0000338 NumTemplateArgs != 0);
339}
340
John McCall8cd78132009-11-19 22:55:06 +0000341StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor90a1a652009-03-19 17:26:29 +0000342 return child_iterator();
343}
344
John McCall8cd78132009-11-19 22:55:06 +0000345StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor90a1a652009-03-19 17:26:29 +0000346 return child_iterator();
347}
348
Chandler Carruth01718152010-10-25 08:47:36 +0000349SourceRange CXXConstructExpr::getSourceRange() const {
350 return ParenRange.isValid() ?
351 SourceRange(Loc, ParenRange.getEnd()) :
352 SourceRange(Loc);
Ted Kremenek49ace5c2009-12-23 04:00:48 +0000353}
354
Douglas Gregor993603d2008-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 Stump11289f42009-09-09 15:08:12 +0000360 return SourceRange(getOperatorLoc(),
Douglas Gregor993603d2008-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 Gregor97fd6e22008-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
Chandler Carruth00426b42010-10-27 06:55:41 +0000388CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() {
389 Expr* ThisArg = getImplicitObjectArgument();
390 if (!ThisArg)
391 return 0;
392
393 if (ThisArg->getType()->isAnyPointerType())
394 return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
395
396 return ThisArg->getType()->getAsCXXRecordDecl();
397}
398
Douglas Gregoref986e82009-11-12 15:31:47 +0000399SourceRange CXXMemberCallExpr::getSourceRange() const {
400 SourceLocation LocStart = getCallee()->getLocStart();
401 if (LocStart.isInvalid() && getNumArgs() > 0)
402 LocStart = getArg(0)->getLocStart();
403 return SourceRange(LocStart, getRParenLoc());
404}
405
406
Douglas Gregore200adc2008-10-27 19:41:14 +0000407//===----------------------------------------------------------------------===//
408// Named casts
409//===----------------------------------------------------------------------===//
410
411/// getCastName - Get the name of the C++ cast being used, e.g.,
412/// "static_cast", "dynamic_cast", "reinterpret_cast", or
413/// "const_cast". The returned pointer must not be freed.
414const char *CXXNamedCastExpr::getCastName() const {
415 switch (getStmtClass()) {
416 case CXXStaticCastExprClass: return "static_cast";
417 case CXXDynamicCastExprClass: return "dynamic_cast";
418 case CXXReinterpretCastExprClass: return "reinterpret_cast";
419 case CXXConstCastExprClass: return "const_cast";
420 default: return "<invalid cast>";
421 }
422}
Douglas Gregordd04d332009-01-16 18:33:17 +0000423
John McCallcf142162010-08-07 06:22:56 +0000424CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
425 CastKind K, Expr *Op,
426 const CXXCastPath *BasePath,
427 TypeSourceInfo *WrittenTy,
428 SourceLocation L) {
429 unsigned PathSize = (BasePath ? BasePath->size() : 0);
430 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
431 + PathSize * sizeof(CXXBaseSpecifier*));
432 CXXStaticCastExpr *E =
433 new (Buffer) CXXStaticCastExpr(T, K, Op, PathSize, WrittenTy, L);
434 if (PathSize) E->setCastPath(*BasePath);
435 return E;
436}
437
438CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
439 unsigned PathSize) {
440 void *Buffer =
441 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
442 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
443}
444
445CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
446 CastKind K, Expr *Op,
447 const CXXCastPath *BasePath,
448 TypeSourceInfo *WrittenTy,
449 SourceLocation L) {
450 unsigned PathSize = (BasePath ? BasePath->size() : 0);
451 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
452 + PathSize * sizeof(CXXBaseSpecifier*));
453 CXXDynamicCastExpr *E =
454 new (Buffer) CXXDynamicCastExpr(T, K, Op, PathSize, WrittenTy, L);
455 if (PathSize) E->setCastPath(*BasePath);
456 return E;
457}
458
459CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
460 unsigned PathSize) {
461 void *Buffer =
462 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
463 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
464}
465
466CXXReinterpretCastExpr *
467CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, CastKind K, Expr *Op,
468 const CXXCastPath *BasePath,
469 TypeSourceInfo *WrittenTy, SourceLocation L) {
470 unsigned PathSize = (BasePath ? BasePath->size() : 0);
471 void *Buffer =
472 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
473 CXXReinterpretCastExpr *E =
474 new (Buffer) CXXReinterpretCastExpr(T, K, Op, PathSize, WrittenTy, L);
475 if (PathSize) E->setCastPath(*BasePath);
476 return E;
477}
478
479CXXReinterpretCastExpr *
480CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
481 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
482 + PathSize * sizeof(CXXBaseSpecifier*));
483 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
484}
485
486CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T, Expr *Op,
487 TypeSourceInfo *WrittenTy,
488 SourceLocation L) {
489 return new (C) CXXConstCastExpr(T, Op, WrittenTy, L);
490}
491
492CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
493 return new (C) CXXConstCastExpr(EmptyShell());
494}
495
496CXXFunctionalCastExpr *
497CXXFunctionalCastExpr::Create(ASTContext &C, QualType T,
498 TypeSourceInfo *Written, SourceLocation L,
499 CastKind K, Expr *Op, const CXXCastPath *BasePath,
500 SourceLocation R) {
501 unsigned PathSize = (BasePath ? BasePath->size() : 0);
502 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
503 + PathSize * sizeof(CXXBaseSpecifier*));
504 CXXFunctionalCastExpr *E =
505 new (Buffer) CXXFunctionalCastExpr(T, Written, L, K, Op, PathSize, R);
506 if (PathSize) E->setCastPath(*BasePath);
507 return E;
508}
509
510CXXFunctionalCastExpr *
511CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
512 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
513 + PathSize * sizeof(CXXBaseSpecifier*));
514 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
515}
516
517
Douglas Gregor25ab25f2009-12-23 18:19:08 +0000518CXXDefaultArgExpr *
Douglas Gregor033f6752009-12-23 23:03:06 +0000519CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
520 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor25ab25f2009-12-23 18:19:08 +0000521 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor033f6752009-12-23 23:03:06 +0000522 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
523 SubExpr);
Douglas Gregor25ab25f2009-12-23 18:19:08 +0000524}
525
Mike Stump11289f42009-09-09 15:08:12 +0000526CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonffda6062009-05-30 20:34:37 +0000527 const CXXDestructorDecl *Destructor) {
Anders Carlsson73b836b2009-05-30 22:38:53 +0000528 return new (C) CXXTemporary(Destructor);
529}
530
Mike Stump11289f42009-09-09 15:08:12 +0000531CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlsson993a4b32009-05-30 20:03:25 +0000532 CXXTemporary *Temp,
533 Expr* SubExpr) {
Mike Stump11289f42009-09-09 15:08:12 +0000534 assert(SubExpr->getType()->isRecordType() &&
Anders Carlsson993a4b32009-05-30 20:03:25 +0000535 "Expression bound to a temporary must have record type!");
536
Fariborz Jahaniandba351d2010-11-02 21:05:53 +0000537 return new (C) CXXBindTemporaryExpr(Temp, SubExpr,
538 SubExpr->isTypeDependent(),
539 SubExpr->isValueDependent());
Anders Carlsson993a4b32009-05-30 20:03:25 +0000540}
541
Anders Carlsson4b2434d2009-05-30 20:56:46 +0000542CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson56c5bd82009-04-24 05:23:13 +0000543 CXXConstructorDecl *Cons,
Douglas Gregor2b88c112010-09-08 00:15:04 +0000544 TypeSourceInfo *Type,
Douglas Gregordd04d332009-01-16 18:33:17 +0000545 Expr **Args,
Mike Stump11289f42009-09-09 15:08:12 +0000546 unsigned NumArgs,
Chandler Carruth01718152010-10-25 08:47:36 +0000547 SourceRange parenRange,
Douglas Gregor199db362010-04-27 20:36:09 +0000548 bool ZeroInitialization)
Douglas Gregor2b88c112010-09-08 00:15:04 +0000549 : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
550 Type->getType().getNonReferenceType(),
551 Type->getTypeLoc().getBeginLoc(),
Chandler Carruth01718152010-10-25 08:47:36 +0000552 Cons, false, Args, NumArgs, ZeroInitialization,
553 CXXConstructExpr::CK_Complete, parenRange),
554 Type(Type) {
Douglas Gregor2b88c112010-09-08 00:15:04 +0000555}
556
557SourceRange CXXTemporaryObjectExpr::getSourceRange() const {
Chandler Carruth01718152010-10-25 08:47:36 +0000558 return SourceRange(Type->getTypeLoc().getBeginLoc(),
559 getParenRange().getEnd());
Douglas Gregordd04d332009-01-16 18:33:17 +0000560}
Anders Carlsson6f287832009-04-21 02:22:11 +0000561
Mike Stump11289f42009-09-09 15:08:12 +0000562CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor85dabae2009-12-16 01:38:02 +0000563 SourceLocation Loc,
Anders Carlsson4b2434d2009-05-30 20:56:46 +0000564 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000565 Expr **Args, unsigned NumArgs,
Douglas Gregor7ae2d772010-01-31 09:12:51 +0000566 bool ZeroInitialization,
Chandler Carruth01718152010-10-25 08:47:36 +0000567 ConstructionKind ConstructKind,
568 SourceRange ParenRange) {
Douglas Gregor85dabae2009-12-16 01:38:02 +0000569 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor7ae2d772010-01-31 09:12:51 +0000570 Elidable, Args, NumArgs, ZeroInitialization,
Chandler Carruth01718152010-10-25 08:47:36 +0000571 ConstructKind, ParenRange);
Anders Carlsson0781ce72009-04-23 02:32:43 +0000572}
573
Mike Stump11289f42009-09-09 15:08:12 +0000574CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor85dabae2009-12-16 01:38:02 +0000575 SourceLocation Loc,
Anders Carlsson4b2434d2009-05-30 20:56:46 +0000576 CXXConstructorDecl *D, bool elidable,
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000577 Expr **args, unsigned numargs,
Anders Carlssonbcc066b2010-05-02 22:54:08 +0000578 bool ZeroInitialization,
Chandler Carruth01718152010-10-25 08:47:36 +0000579 ConstructionKind ConstructKind,
580 SourceRange ParenRange)
Anders Carlsson32ebd292009-04-24 05:04:04 +0000581: Expr(SC, T,
Anders Carlsson0781ce72009-04-23 02:32:43 +0000582 T->isDependentType(),
583 (T->isDependentType() ||
584 CallExpr::hasAnyValueDependentArguments(args, numargs))),
Chandler Carruth01718152010-10-25 08:47:36 +0000585 Constructor(D), Loc(Loc), ParenRange(ParenRange), Elidable(elidable),
Anders Carlssonbcc066b2010-05-02 22:54:08 +0000586 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
587 Args(0), NumArgs(numargs)
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000588{
589 if (NumArgs) {
590 Args = new (C) Stmt*[NumArgs];
591
592 for (unsigned i = 0; i != NumArgs; ++i) {
593 assert(args[i] && "NULL argument in CXXConstructExpr");
594 Args[i] = args[i];
Anders Carlsson0781ce72009-04-23 02:32:43 +0000595 }
Douglas Gregor4f4b1862009-12-16 18:50:27 +0000596 }
Anders Carlsson0781ce72009-04-23 02:32:43 +0000597}
598
Ted Kremeneka9084c12010-05-10 20:06:30 +0000599CXXExprWithTemporaries::CXXExprWithTemporaries(ASTContext &C,
600 Expr *subexpr,
Mike Stump11289f42009-09-09 15:08:12 +0000601 CXXTemporary **temps,
Anders Carlsson6e997b22009-12-15 20:51:39 +0000602 unsigned numtemps)
Chris Lattnercba86142010-05-10 00:25:06 +0000603 : Expr(CXXExprWithTemporariesClass, subexpr->getType(),
Mike Stump11289f42009-09-09 15:08:12 +0000604 subexpr->isTypeDependent(), subexpr->isValueDependent()),
Chris Lattnercba86142010-05-10 00:25:06 +0000605 SubExpr(subexpr), Temps(0), NumTemps(0) {
Chris Lattnerbc7d55d2010-05-10 00:45:12 +0000606 if (numtemps) {
Ted Kremeneka9084c12010-05-10 20:06:30 +0000607 setNumTemporaries(C, numtemps);
Chris Lattnercba86142010-05-10 00:25:06 +0000608 for (unsigned i = 0; i != numtemps; ++i)
Anders Carlssona29ded92009-05-30 21:05:25 +0000609 Temps[i] = temps[i];
Anders Carlssondefc6442009-04-24 22:47:04 +0000610 }
611}
612
Ted Kremeneka9084c12010-05-10 20:06:30 +0000613void CXXExprWithTemporaries::setNumTemporaries(ASTContext &C, unsigned N) {
Chris Lattnercba86142010-05-10 00:25:06 +0000614 assert(Temps == 0 && "Cannot resize with this");
Daniel Dunbarc8a7bdb2010-05-10 15:59:37 +0000615 NumTemps = N;
Ted Kremeneka9084c12010-05-10 20:06:30 +0000616 Temps = new (C) CXXTemporary*[NumTemps];
Chris Lattnercba86142010-05-10 00:25:06 +0000617}
618
619
Mike Stump11289f42009-09-09 15:08:12 +0000620CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C,
Anders Carlsson73b836b2009-05-30 22:38:53 +0000621 Expr *SubExpr,
Mike Stump11289f42009-09-09 15:08:12 +0000622 CXXTemporary **Temps,
Anders Carlsson6e997b22009-12-15 20:51:39 +0000623 unsigned NumTemps) {
Ted Kremeneka9084c12010-05-10 20:06:30 +0000624 return new (C) CXXExprWithTemporaries(C, SubExpr, Temps, NumTemps);
Anders Carlsson73b836b2009-05-30 22:38:53 +0000625}
626
Anders Carlsson993a4b32009-05-30 20:03:25 +0000627// CXXBindTemporaryExpr
628Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
629 return &SubExpr;
630}
631
Mike Stump11289f42009-09-09 15:08:12 +0000632Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlsson993a4b32009-05-30 20:03:25 +0000633 return &SubExpr + 1;
634}
635
Anders Carlsson0781ce72009-04-23 02:32:43 +0000636// CXXConstructExpr
637Stmt::child_iterator CXXConstructExpr::child_begin() {
638 return &Args[0];
639}
640Stmt::child_iterator CXXConstructExpr::child_end() {
641 return &Args[0]+NumArgs;
642}
643
Anders Carlssonaa10d652009-05-01 22:21:22 +0000644// CXXExprWithTemporaries
645Stmt::child_iterator CXXExprWithTemporaries::child_begin() {
646 return &SubExpr;
Anders Carlsson6f287832009-04-21 02:22:11 +0000647}
Anders Carlssondefc6442009-04-24 22:47:04 +0000648
Mike Stump11289f42009-09-09 15:08:12 +0000649Stmt::child_iterator CXXExprWithTemporaries::child_end() {
Anders Carlssonaa10d652009-05-01 22:21:22 +0000650 return &SubExpr + 1;
651}
Anders Carlssondefc6442009-04-24 22:47:04 +0000652
Douglas Gregor2b88c112010-09-08 00:15:04 +0000653CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
Douglas Gregorce934142009-05-20 18:46:25 +0000654 SourceLocation LParenLoc,
655 Expr **Args,
656 unsigned NumArgs,
657 SourceLocation RParenLoc)
Douglas Gregor2b88c112010-09-08 00:15:04 +0000658 : Expr(CXXUnresolvedConstructExprClass,
659 Type->getType().getNonReferenceType(),
660 Type->getType()->isDependentType(), true),
661 Type(Type),
Douglas Gregorce934142009-05-20 18:46:25 +0000662 LParenLoc(LParenLoc),
663 RParenLoc(RParenLoc),
664 NumArgs(NumArgs) {
665 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
666 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs);
667}
668
669CXXUnresolvedConstructExpr *
Mike Stump11289f42009-09-09 15:08:12 +0000670CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregor2b88c112010-09-08 00:15:04 +0000671 TypeSourceInfo *Type,
Douglas Gregorce934142009-05-20 18:46:25 +0000672 SourceLocation LParenLoc,
673 Expr **Args,
674 unsigned NumArgs,
675 SourceLocation RParenLoc) {
676 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
677 sizeof(Expr *) * NumArgs);
Douglas Gregor2b88c112010-09-08 00:15:04 +0000678 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc,
Douglas Gregorce934142009-05-20 18:46:25 +0000679 Args, NumArgs, RParenLoc);
680}
681
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000682CXXUnresolvedConstructExpr *
683CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
684 Stmt::EmptyShell Empty;
685 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
686 sizeof(Expr *) * NumArgs);
687 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
688}
689
Douglas Gregor2b88c112010-09-08 00:15:04 +0000690SourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
691 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
692}
693
Douglas Gregorce934142009-05-20 18:46:25 +0000694Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
695 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
696}
697
698Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
699 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
700}
Sebastian Redle769ecf2009-05-16 18:50:46 +0000701
John McCall8cd78132009-11-19 22:55:06 +0000702CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCall2d74de92009-12-01 22:10:20 +0000703 Expr *Base, QualType BaseType,
704 bool IsArrow,
Douglas Gregor308047d2009-09-09 00:23:06 +0000705 SourceLocation OperatorLoc,
706 NestedNameSpecifier *Qualifier,
707 SourceRange QualifierRange,
708 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000709 DeclarationNameInfo MemberNameInfo,
John McCall6b51f282009-11-23 01:53:49 +0000710 const TemplateArgumentListInfo *TemplateArgs)
John McCall8cd78132009-11-19 22:55:06 +0000711 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, true, true),
John McCall2d74de92009-12-01 22:10:20 +0000712 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
713 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor308047d2009-09-09 00:23:06 +0000714 OperatorLoc(OperatorLoc),
715 Qualifier(Qualifier), QualifierRange(QualifierRange),
716 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000717 MemberNameInfo(MemberNameInfo) {
John McCall6b51f282009-11-23 01:53:49 +0000718 if (TemplateArgs)
John McCallb3774b52010-08-19 23:49:38 +0000719 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
Douglas Gregor308047d2009-09-09 00:23:06 +0000720}
721
John McCall8cd78132009-11-19 22:55:06 +0000722CXXDependentScopeMemberExpr *
723CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCall2d74de92009-12-01 22:10:20 +0000724 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor308047d2009-09-09 00:23:06 +0000725 SourceLocation OperatorLoc,
726 NestedNameSpecifier *Qualifier,
727 SourceRange QualifierRange,
728 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000729 DeclarationNameInfo MemberNameInfo,
John McCall6b51f282009-11-23 01:53:49 +0000730 const TemplateArgumentListInfo *TemplateArgs) {
731 if (!TemplateArgs)
John McCall2d74de92009-12-01 22:10:20 +0000732 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
733 IsArrow, OperatorLoc,
734 Qualifier, QualifierRange,
735 FirstQualifierFoundInScope,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000736 MemberNameInfo);
Mike Stump11289f42009-09-09 15:08:12 +0000737
John McCall6b51f282009-11-23 01:53:49 +0000738 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
739 if (TemplateArgs)
740 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
741
Chris Lattner5c0b4052010-10-30 05:14:06 +0000742 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
John McCall2d74de92009-12-01 22:10:20 +0000743 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
744 IsArrow, OperatorLoc,
745 Qualifier, QualifierRange,
746 FirstQualifierFoundInScope,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000747 MemberNameInfo, TemplateArgs);
Douglas Gregor308047d2009-09-09 00:23:06 +0000748}
749
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000750CXXDependentScopeMemberExpr *
751CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
752 unsigned NumTemplateArgs) {
753 if (NumTemplateArgs == 0)
754 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
755 0, SourceLocation(), 0,
756 SourceRange(), 0,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000757 DeclarationNameInfo());
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000758
759 std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
760 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
Chris Lattner5c0b4052010-10-30 05:14:06 +0000761 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000762 CXXDependentScopeMemberExpr *E
763 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
764 0, SourceLocation(), 0,
765 SourceRange(), 0,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000766 DeclarationNameInfo(), 0);
Argyrios Kyrtzidisbfcacee2010-06-24 08:57:31 +0000767 E->HasExplicitTemplateArgs = true;
768 return E;
769}
770
John McCall8cd78132009-11-19 22:55:06 +0000771Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregora8db9542009-05-22 21:13:27 +0000772 return child_iterator(&Base);
773}
774
John McCall8cd78132009-11-19 22:55:06 +0000775Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCall2d74de92009-12-01 22:10:20 +0000776 if (isImplicitAccess())
777 return child_iterator(&Base);
Douglas Gregora8db9542009-05-22 21:13:27 +0000778 return child_iterator(&Base + 1);
779}
John McCall10eae182009-11-30 22:42:35 +0000780
Douglas Gregorc69978f2010-05-23 19:36:40 +0000781UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, QualType T,
782 bool Dependent,
John McCall10eae182009-11-30 22:42:35 +0000783 bool HasUnresolvedUsing,
John McCall2d74de92009-12-01 22:10:20 +0000784 Expr *Base, QualType BaseType,
785 bool IsArrow,
John McCall10eae182009-11-30 22:42:35 +0000786 SourceLocation OperatorLoc,
787 NestedNameSpecifier *Qualifier,
788 SourceRange QualifierRange,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000789 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor30a4f4c2010-05-23 18:57:34 +0000790 const TemplateArgumentListInfo *TemplateArgs,
791 UnresolvedSetIterator Begin,
792 UnresolvedSetIterator End)
Douglas Gregorc69978f2010-05-23 19:36:40 +0000793 : OverloadExpr(UnresolvedMemberExprClass, C, T, Dependent,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000794 Qualifier, QualifierRange, MemberNameInfo,
Douglas Gregor30a4f4c2010-05-23 18:57:34 +0000795 TemplateArgs != 0, Begin, End),
John McCall1acbbb52010-02-02 06:20:04 +0000796 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
797 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
John McCall10eae182009-11-30 22:42:35 +0000798 if (TemplateArgs)
John McCall1acbbb52010-02-02 06:20:04 +0000799 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
John McCall10eae182009-11-30 22:42:35 +0000800}
801
802UnresolvedMemberExpr *
803UnresolvedMemberExpr::Create(ASTContext &C, bool Dependent,
804 bool HasUnresolvedUsing,
John McCall2d74de92009-12-01 22:10:20 +0000805 Expr *Base, QualType BaseType, bool IsArrow,
John McCall10eae182009-11-30 22:42:35 +0000806 SourceLocation OperatorLoc,
807 NestedNameSpecifier *Qualifier,
808 SourceRange QualifierRange,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000809 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor30a4f4c2010-05-23 18:57:34 +0000810 const TemplateArgumentListInfo *TemplateArgs,
811 UnresolvedSetIterator Begin,
812 UnresolvedSetIterator End) {
John McCall10eae182009-11-30 22:42:35 +0000813 std::size_t size = sizeof(UnresolvedMemberExpr);
814 if (TemplateArgs)
815 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
816
Chris Lattner5c0b4052010-10-30 05:14:06 +0000817 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Douglas Gregorc69978f2010-05-23 19:36:40 +0000818 return new (Mem) UnresolvedMemberExpr(C,
John McCall10eae182009-11-30 22:42:35 +0000819 Dependent ? C.DependentTy : C.OverloadTy,
John McCall2d74de92009-12-01 22:10:20 +0000820 Dependent, HasUnresolvedUsing, Base, BaseType,
821 IsArrow, OperatorLoc, Qualifier, QualifierRange,
Abramo Bagnarad6d2f182010-08-11 22:01:17 +0000822 MemberNameInfo, TemplateArgs, Begin, End);
John McCall10eae182009-11-30 22:42:35 +0000823}
824
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +0000825UnresolvedMemberExpr *
826UnresolvedMemberExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
827 std::size_t size = sizeof(UnresolvedMemberExpr);
828 if (NumTemplateArgs != 0)
829 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
830
Chris Lattner5c0b4052010-10-30 05:14:06 +0000831 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Argyrios Kyrtzidisb8d3c632010-06-25 09:03:26 +0000832 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
833 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
834 return E;
835}
836
John McCall58cc69d2010-01-27 01:50:18 +0000837CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
838 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
839
840 // If there was a nested name specifier, it names the naming class.
841 // It can't be dependent: after all, we were actually able to do the
842 // lookup.
Douglas Gregor9262f472010-04-27 18:19:34 +0000843 CXXRecordDecl *Record = 0;
John McCall1acbbb52010-02-02 06:20:04 +0000844 if (getQualifier()) {
845 Type *T = getQualifier()->getAsType();
John McCall58cc69d2010-01-27 01:50:18 +0000846 assert(T && "qualifier in member expression does not name type");
Douglas Gregor9262f472010-04-27 18:19:34 +0000847 Record = T->getAsCXXRecordDecl();
848 assert(Record && "qualifier in member expression does not name record");
849 }
John McCall58cc69d2010-01-27 01:50:18 +0000850 // Otherwise the naming class must have been the base class.
Douglas Gregor9262f472010-04-27 18:19:34 +0000851 else {
John McCall58cc69d2010-01-27 01:50:18 +0000852 QualType BaseType = getBaseType().getNonReferenceType();
853 if (isArrow()) {
854 const PointerType *PT = BaseType->getAs<PointerType>();
855 assert(PT && "base of arrow member access is not pointer");
856 BaseType = PT->getPointeeType();
857 }
858
Douglas Gregor9262f472010-04-27 18:19:34 +0000859 Record = BaseType->getAsCXXRecordDecl();
860 assert(Record && "base of member expression does not name record");
John McCall58cc69d2010-01-27 01:50:18 +0000861 }
862
Douglas Gregor9262f472010-04-27 18:19:34 +0000863 return Record;
John McCall58cc69d2010-01-27 01:50:18 +0000864}
865
John McCall10eae182009-11-30 22:42:35 +0000866Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
867 return child_iterator(&Base);
868}
869
870Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCall2d74de92009-12-01 22:10:20 +0000871 if (isImplicitAccess())
872 return child_iterator(&Base);
John McCall10eae182009-11-30 22:42:35 +0000873 return child_iterator(&Base + 1);
874}
Sebastian Redl4202c0f2010-09-10 20:55:43 +0000875
876Stmt::child_iterator CXXNoexceptExpr::child_begin() {
877 return child_iterator(&Operand);
878}
879Stmt::child_iterator CXXNoexceptExpr::child_end() {
880 return child_iterator(&Operand + 1);
881}