blob: 1820ff77074ab9a564b7b09676def7d301a9d10d [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,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000116 SourceLocation startLoc, SourceLocation endLoc,
117 SourceLocation constructorLParen,
118 SourceLocation constructorRParen)
Sebastian Redl28507842009-02-26 14:39:58 +0000119 : Expr(CXXNewExprClass, ty, ty->isDependentType(), ty->isDependentType()),
Douglas Gregor4bd40312010-07-13 15:54:32 +0000120 GlobalNew(globalNew),
Chris Lattner59218632010-05-10 01:22:27 +0000121 Initializer(initializer), SubExprs(0), OperatorNew(operatorNew),
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000122 OperatorDelete(operatorDelete), Constructor(constructor),
Douglas Gregor1bb2a932010-09-07 21:49:58 +0000123 AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens),
Chandler Carruth428edaf2010-10-25 08:47:36 +0000124 StartLoc(startLoc), EndLoc(endLoc), ConstructorLParen(constructorLParen),
125 ConstructorRParen(constructorRParen) {
Chris Lattner59218632010-05-10 01:22:27 +0000126 AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000127 unsigned i = 0;
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000128 if (Array)
129 SubExprs[i++] = arraySize;
130 for (unsigned j = 0; j < NumPlacementArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000131 SubExprs[i++] = placementArgs[j];
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000132 for (unsigned j = 0; j < NumConstructorArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000133 SubExprs[i++] = constructorArgs[j];
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000134}
135
Chris Lattner59218632010-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 Redl4c5d3202008-11-21 19:14:01 +0000148Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
149Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000150 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000151}
152
153// CXXDeleteExpr
Douglas Gregor5833b0b2010-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 Silverstein0fa0b782010-10-20 00:38:15 +0000163 // The type-to-delete may not be a pointer if it's a dependent type.
Craig Silversteinc87fa062010-10-20 00:56:01 +0000164 const QualType ArgType = Arg->getType();
Craig Silversteina437ad32010-11-16 07:16:25 +0000165
166 if (ArgType->isDependentType() && !ArgType->isPointerType())
167 return QualType();
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000168
Craig Silverstein0fa0b782010-10-20 00:38:15 +0000169 return ArgType->getAs<PointerType>()->getPointeeType();
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000170}
171
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000172Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
173Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
174
Douglas Gregora71d8192009-09-04 17:36:40 +0000175// CXXPseudoDestructorExpr
176Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
177Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
178 return &Base + 1;
179}
180
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000181PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
182 : Type(Info)
183{
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000184 Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000185}
186
187QualType CXXPseudoDestructorExpr::getDestroyedType() const {
188 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
189 return TInfo->getType();
190
191 return QualType();
192}
193
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000194SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000195 SourceLocation End = DestroyedType.getLocation();
196 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000197 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000198 return SourceRange(Base->getLocStart(), End);
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000199}
200
201
John McCallba135432009-11-21 08:51:07 +0000202// UnresolvedLookupExpr
John McCallf7a1a742009-11-24 19:00:30 +0000203UnresolvedLookupExpr *
204UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent,
John McCallc373d482010-01-27 01:50:18 +0000205 CXXRecordDecl *NamingClass,
John McCallf7a1a742009-11-24 19:00:30 +0000206 NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000207 SourceRange QualifierRange,
208 const DeclarationNameInfo &NameInfo,
209 bool ADL,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000210 const TemplateArgumentListInfo &Args,
211 UnresolvedSetIterator Begin,
212 UnresolvedSetIterator End)
John McCallf7a1a742009-11-24 19:00:30 +0000213{
214 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
215 ExplicitTemplateArgumentList::sizeFor(Args));
216 UnresolvedLookupExpr *ULE
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000217 = new (Mem) UnresolvedLookupExpr(C,
218 Dependent ? C.DependentTy : C.OverloadTy,
John McCallc373d482010-01-27 01:50:18 +0000219 Dependent, NamingClass,
Abramo Bagnara25777432010-08-11 22:01:17 +0000220 Qualifier, QualifierRange, NameInfo,
221 ADL,
John McCallf7a1a742009-11-24 19:00:30 +0000222 /*Overload*/ true,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000223 /*ExplicitTemplateArgs*/ true,
224 Begin, End);
John McCallf7a1a742009-11-24 19:00:30 +0000225
226 reinterpret_cast<ExplicitTemplateArgumentList*>(ULE+1)->initializeFrom(Args);
227
228 return ULE;
229}
230
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000231UnresolvedLookupExpr *
232UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
233 std::size_t size = sizeof(UnresolvedLookupExpr);
234 if (NumTemplateArgs != 0)
235 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
236
Chris Lattner32488542010-10-30 05:14:06 +0000237 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedLookupExpr>());
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000238 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
239 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
240 return E;
241}
242
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000243OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C, QualType T,
244 bool Dependent, NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000245 SourceRange QRange,
246 const DeclarationNameInfo &NameInfo,
247 bool HasTemplateArgs,
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000248 UnresolvedSetIterator Begin,
249 UnresolvedSetIterator End)
250 : Expr(K, T, Dependent, Dependent),
Abramo Bagnara25777432010-08-11 22:01:17 +0000251 Results(0), NumResults(0), NameInfo(NameInfo), Qualifier(Qualifier),
252 QualifierRange(QRange), HasExplicitTemplateArgs(HasTemplateArgs)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000253{
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000254 initializeResults(C, Begin, End);
255}
256
257void OverloadExpr::initializeResults(ASTContext &C,
258 UnresolvedSetIterator Begin,
259 UnresolvedSetIterator End) {
260 assert(Results == 0 && "Results already initialized!");
261 NumResults = End - Begin;
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000262 if (NumResults) {
263 Results = static_cast<DeclAccessPair *>(
264 C.Allocate(sizeof(DeclAccessPair) * NumResults,
Chris Lattner32488542010-10-30 05:14:06 +0000265 llvm::alignOf<DeclAccessPair>()));
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000266 memcpy(Results, &*Begin.getIterator(),
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000267 NumResults * sizeof(DeclAccessPair));
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000268 }
269}
270
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000271
John McCall7bb12da2010-02-02 06:20:04 +0000272bool OverloadExpr::ComputeDependence(UnresolvedSetIterator Begin,
273 UnresolvedSetIterator End,
274 const TemplateArgumentListInfo *Args) {
John McCalleec51cf2010-01-20 00:46:10 +0000275 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I)
John McCallf7a1a742009-11-24 19:00:30 +0000276 if ((*I)->getDeclContext()->isDependentContext())
277 return true;
278
279 if (Args && TemplateSpecializationType::anyDependentTemplateArguments(*Args))
280 return true;
281
282 return false;
283}
284
John McCalle9ee23e2010-04-22 18:44:12 +0000285CXXRecordDecl *OverloadExpr::getNamingClass() const {
286 if (isa<UnresolvedLookupExpr>(this))
287 return cast<UnresolvedLookupExpr>(this)->getNamingClass();
288 else
289 return cast<UnresolvedMemberExpr>(this)->getNamingClass();
290}
291
John McCallba135432009-11-21 08:51:07 +0000292Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump1eb44332009-09-09 15:08:12 +0000293 return child_iterator();
Douglas Gregor5c37de72008-12-06 00:22:45 +0000294}
John McCallba135432009-11-21 08:51:07 +0000295Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregor5c37de72008-12-06 00:22:45 +0000296 return child_iterator();
297}
Sebastian Redl64b45f72009-01-05 20:52:13 +0000298// UnaryTypeTraitExpr
299Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
300 return child_iterator();
301}
302Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
303 return child_iterator();
304}
305
John McCall865d4472009-11-19 22:55:06 +0000306// DependentScopeDeclRefExpr
John McCallf7a1a742009-11-24 19:00:30 +0000307DependentScopeDeclRefExpr *
308DependentScopeDeclRefExpr::Create(ASTContext &C,
309 NestedNameSpecifier *Qualifier,
310 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000311 const DeclarationNameInfo &NameInfo,
John McCallf7a1a742009-11-24 19:00:30 +0000312 const TemplateArgumentListInfo *Args) {
313 std::size_t size = sizeof(DependentScopeDeclRefExpr);
314 if (Args) size += ExplicitTemplateArgumentList::sizeFor(*Args);
315 void *Mem = C.Allocate(size);
316
317 DependentScopeDeclRefExpr *DRE
318 = new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
319 Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000320 NameInfo, Args != 0);
John McCallf7a1a742009-11-24 19:00:30 +0000321
322 if (Args)
323 reinterpret_cast<ExplicitTemplateArgumentList*>(DRE+1)
324 ->initializeFrom(*Args);
325
326 return DRE;
327}
328
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000329DependentScopeDeclRefExpr *
330DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
331 unsigned NumTemplateArgs) {
332 std::size_t size = sizeof(DependentScopeDeclRefExpr);
333 if (NumTemplateArgs)
334 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
335 void *Mem = C.Allocate(size);
336
337 return new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(),
Abramo Bagnara25777432010-08-11 22:01:17 +0000338 DeclarationNameInfo(),
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000339 NumTemplateArgs != 0);
340}
341
John McCall865d4472009-11-19 22:55:06 +0000342StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000343 return child_iterator();
344}
345
John McCall865d4472009-11-19 22:55:06 +0000346StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000347 return child_iterator();
348}
349
Chandler Carruth428edaf2010-10-25 08:47:36 +0000350SourceRange CXXConstructExpr::getSourceRange() const {
Douglas Gregor40749ee2010-11-03 00:35:38 +0000351 if (ParenRange.isValid())
352 return SourceRange(Loc, ParenRange.getEnd());
353
354 SourceLocation End = Loc;
355 for (unsigned I = getNumArgs(); I > 0; --I) {
356 const Expr *Arg = getArg(I-1);
357 if (!Arg->isDefaultArgument()) {
358 SourceLocation NewEnd = Arg->getLocEnd();
359 if (NewEnd.isValid()) {
360 End = NewEnd;
361 break;
362 }
363 }
364 }
365
366 return SourceRange(Loc, End);
Ted Kremeneke3837682009-12-23 04:00:48 +0000367}
368
Douglas Gregorb4609802008-11-14 16:09:21 +0000369SourceRange CXXOperatorCallExpr::getSourceRange() const {
370 OverloadedOperatorKind Kind = getOperator();
371 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
372 if (getNumArgs() == 1)
373 // Prefix operator
Mike Stump1eb44332009-09-09 15:08:12 +0000374 return SourceRange(getOperatorLoc(),
Douglas Gregorb4609802008-11-14 16:09:21 +0000375 getArg(0)->getSourceRange().getEnd());
376 else
377 // Postfix operator
378 return SourceRange(getArg(0)->getSourceRange().getEnd(),
379 getOperatorLoc());
380 } else if (Kind == OO_Call) {
381 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
382 } else if (Kind == OO_Subscript) {
383 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
384 } else if (getNumArgs() == 1) {
385 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
386 } else if (getNumArgs() == 2) {
387 return SourceRange(getArg(0)->getSourceRange().getBegin(),
388 getArg(1)->getSourceRange().getEnd());
389 } else {
390 return SourceRange();
391 }
392}
393
Douglas Gregor88a35142008-12-22 05:46:06 +0000394Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
395 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
396 return MemExpr->getBase();
397
398 // FIXME: Will eventually need to cope with member pointers.
399 return 0;
400}
401
Chandler Carruth007a9b12010-10-27 06:55:41 +0000402CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() {
403 Expr* ThisArg = getImplicitObjectArgument();
404 if (!ThisArg)
405 return 0;
406
407 if (ThisArg->getType()->isAnyPointerType())
408 return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
409
410 return ThisArg->getType()->getAsCXXRecordDecl();
411}
412
Douglas Gregor00b98c22009-11-12 15:31:47 +0000413SourceRange CXXMemberCallExpr::getSourceRange() const {
414 SourceLocation LocStart = getCallee()->getLocStart();
415 if (LocStart.isInvalid() && getNumArgs() > 0)
416 LocStart = getArg(0)->getLocStart();
417 return SourceRange(LocStart, getRParenLoc());
418}
419
420
Douglas Gregor49badde2008-10-27 19:41:14 +0000421//===----------------------------------------------------------------------===//
422// Named casts
423//===----------------------------------------------------------------------===//
424
425/// getCastName - Get the name of the C++ cast being used, e.g.,
426/// "static_cast", "dynamic_cast", "reinterpret_cast", or
427/// "const_cast". The returned pointer must not be freed.
428const char *CXXNamedCastExpr::getCastName() const {
429 switch (getStmtClass()) {
430 case CXXStaticCastExprClass: return "static_cast";
431 case CXXDynamicCastExprClass: return "dynamic_cast";
432 case CXXReinterpretCastExprClass: return "reinterpret_cast";
433 case CXXConstCastExprClass: return "const_cast";
434 default: return "<invalid cast>";
435 }
436}
Douglas Gregor506ae412009-01-16 18:33:17 +0000437
John McCallf871d0c2010-08-07 06:22:56 +0000438CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
439 CastKind K, Expr *Op,
440 const CXXCastPath *BasePath,
441 TypeSourceInfo *WrittenTy,
442 SourceLocation L) {
443 unsigned PathSize = (BasePath ? BasePath->size() : 0);
444 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
445 + PathSize * sizeof(CXXBaseSpecifier*));
446 CXXStaticCastExpr *E =
447 new (Buffer) CXXStaticCastExpr(T, K, Op, PathSize, WrittenTy, L);
448 if (PathSize) E->setCastPath(*BasePath);
449 return E;
450}
451
452CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
453 unsigned PathSize) {
454 void *Buffer =
455 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
456 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
457}
458
459CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
460 CastKind K, Expr *Op,
461 const CXXCastPath *BasePath,
462 TypeSourceInfo *WrittenTy,
463 SourceLocation L) {
464 unsigned PathSize = (BasePath ? BasePath->size() : 0);
465 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
466 + PathSize * sizeof(CXXBaseSpecifier*));
467 CXXDynamicCastExpr *E =
468 new (Buffer) CXXDynamicCastExpr(T, K, Op, PathSize, WrittenTy, L);
469 if (PathSize) E->setCastPath(*BasePath);
470 return E;
471}
472
473CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
474 unsigned PathSize) {
475 void *Buffer =
476 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
477 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
478}
479
480CXXReinterpretCastExpr *
481CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, CastKind K, Expr *Op,
482 const CXXCastPath *BasePath,
483 TypeSourceInfo *WrittenTy, SourceLocation L) {
484 unsigned PathSize = (BasePath ? BasePath->size() : 0);
485 void *Buffer =
486 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
487 CXXReinterpretCastExpr *E =
488 new (Buffer) CXXReinterpretCastExpr(T, K, Op, PathSize, WrittenTy, L);
489 if (PathSize) E->setCastPath(*BasePath);
490 return E;
491}
492
493CXXReinterpretCastExpr *
494CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
495 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
496 + PathSize * sizeof(CXXBaseSpecifier*));
497 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
498}
499
500CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T, Expr *Op,
501 TypeSourceInfo *WrittenTy,
502 SourceLocation L) {
503 return new (C) CXXConstCastExpr(T, Op, WrittenTy, L);
504}
505
506CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
507 return new (C) CXXConstCastExpr(EmptyShell());
508}
509
510CXXFunctionalCastExpr *
511CXXFunctionalCastExpr::Create(ASTContext &C, QualType T,
512 TypeSourceInfo *Written, SourceLocation L,
513 CastKind K, Expr *Op, const CXXCastPath *BasePath,
514 SourceLocation R) {
515 unsigned PathSize = (BasePath ? BasePath->size() : 0);
516 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
517 + PathSize * sizeof(CXXBaseSpecifier*));
518 CXXFunctionalCastExpr *E =
519 new (Buffer) CXXFunctionalCastExpr(T, Written, L, K, Op, PathSize, R);
520 if (PathSize) E->setCastPath(*BasePath);
521 return E;
522}
523
524CXXFunctionalCastExpr *
525CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
526 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
527 + PathSize * sizeof(CXXBaseSpecifier*));
528 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
529}
530
531
Douglas Gregor65222e82009-12-23 18:19:08 +0000532CXXDefaultArgExpr *
Douglas Gregor036aed12009-12-23 23:03:06 +0000533CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
534 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor65222e82009-12-23 18:19:08 +0000535 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor036aed12009-12-23 23:03:06 +0000536 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
537 SubExpr);
Douglas Gregor65222e82009-12-23 18:19:08 +0000538}
539
Mike Stump1eb44332009-09-09 15:08:12 +0000540CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonb859f352009-05-30 20:34:37 +0000541 const CXXDestructorDecl *Destructor) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000542 return new (C) CXXTemporary(Destructor);
543}
544
Mike Stump1eb44332009-09-09 15:08:12 +0000545CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000546 CXXTemporary *Temp,
547 Expr* SubExpr) {
Mike Stump1eb44332009-09-09 15:08:12 +0000548 assert(SubExpr->getType()->isRecordType() &&
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000549 "Expression bound to a temporary must have record type!");
550
Fariborz Jahanianb8e39232010-11-02 21:05:53 +0000551 return new (C) CXXBindTemporaryExpr(Temp, SubExpr,
552 SubExpr->isTypeDependent(),
553 SubExpr->isValueDependent());
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000554}
555
Anders Carlsson8e587a12009-05-30 20:56:46 +0000556CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson26de5492009-04-24 05:23:13 +0000557 CXXConstructorDecl *Cons,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000558 TypeSourceInfo *Type,
Douglas Gregor506ae412009-01-16 18:33:17 +0000559 Expr **Args,
Mike Stump1eb44332009-09-09 15:08:12 +0000560 unsigned NumArgs,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000561 SourceRange parenRange,
Douglas Gregor1c63b9c2010-04-27 20:36:09 +0000562 bool ZeroInitialization)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000563 : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
564 Type->getType().getNonReferenceType(),
565 Type->getTypeLoc().getBeginLoc(),
Chandler Carruth428edaf2010-10-25 08:47:36 +0000566 Cons, false, Args, NumArgs, ZeroInitialization,
567 CXXConstructExpr::CK_Complete, parenRange),
568 Type(Type) {
Douglas Gregorab6677e2010-09-08 00:15:04 +0000569}
570
571SourceRange CXXTemporaryObjectExpr::getSourceRange() const {
Chandler Carruth428edaf2010-10-25 08:47:36 +0000572 return SourceRange(Type->getTypeLoc().getBeginLoc(),
573 getParenRange().getEnd());
Douglas Gregor506ae412009-01-16 18:33:17 +0000574}
Anders Carlsson19d28a62009-04-21 02:22:11 +0000575
Mike Stump1eb44332009-09-09 15:08:12 +0000576CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000577 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000578 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000579 Expr **Args, unsigned NumArgs,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000580 bool ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000581 ConstructionKind ConstructKind,
582 SourceRange ParenRange) {
Douglas Gregor99a2e602009-12-16 01:38:02 +0000583 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000584 Elidable, Args, NumArgs, ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000585 ConstructKind, ParenRange);
Anders Carlssone349bea2009-04-23 02:32:43 +0000586}
587
Mike Stump1eb44332009-09-09 15:08:12 +0000588CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000589 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000590 CXXConstructorDecl *D, bool elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000591 Expr **args, unsigned numargs,
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000592 bool ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000593 ConstructionKind ConstructKind,
594 SourceRange ParenRange)
Anders Carlssonbd6734e2009-04-24 05:04:04 +0000595: Expr(SC, T,
Anders Carlssone349bea2009-04-23 02:32:43 +0000596 T->isDependentType(),
597 (T->isDependentType() ||
598 CallExpr::hasAnyValueDependentArguments(args, numargs))),
Chandler Carruth428edaf2010-10-25 08:47:36 +0000599 Constructor(D), Loc(Loc), ParenRange(ParenRange), Elidable(elidable),
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000600 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
601 Args(0), NumArgs(numargs)
Douglas Gregor16006c92009-12-16 18:50:27 +0000602{
603 if (NumArgs) {
604 Args = new (C) Stmt*[NumArgs];
605
606 for (unsigned i = 0; i != NumArgs; ++i) {
607 assert(args[i] && "NULL argument in CXXConstructExpr");
608 Args[i] = args[i];
Anders Carlssone349bea2009-04-23 02:32:43 +0000609 }
Douglas Gregor16006c92009-12-16 18:50:27 +0000610 }
Anders Carlssone349bea2009-04-23 02:32:43 +0000611}
612
Ted Kremenekd04ed412010-05-10 20:06:30 +0000613CXXExprWithTemporaries::CXXExprWithTemporaries(ASTContext &C,
614 Expr *subexpr,
Mike Stump1eb44332009-09-09 15:08:12 +0000615 CXXTemporary **temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000616 unsigned numtemps)
Chris Lattnerd2598362010-05-10 00:25:06 +0000617 : Expr(CXXExprWithTemporariesClass, subexpr->getType(),
Mike Stump1eb44332009-09-09 15:08:12 +0000618 subexpr->isTypeDependent(), subexpr->isValueDependent()),
Chris Lattnerd2598362010-05-10 00:25:06 +0000619 SubExpr(subexpr), Temps(0), NumTemps(0) {
Chris Lattneraff32cb2010-05-10 00:45:12 +0000620 if (numtemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000621 setNumTemporaries(C, numtemps);
Chris Lattnerd2598362010-05-10 00:25:06 +0000622 for (unsigned i = 0; i != numtemps; ++i)
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000623 Temps[i] = temps[i];
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000624 }
625}
626
Ted Kremenekd04ed412010-05-10 20:06:30 +0000627void CXXExprWithTemporaries::setNumTemporaries(ASTContext &C, unsigned N) {
Chris Lattnerd2598362010-05-10 00:25:06 +0000628 assert(Temps == 0 && "Cannot resize with this");
Daniel Dunbar90556d42010-05-10 15:59:37 +0000629 NumTemps = N;
Ted Kremenekd04ed412010-05-10 20:06:30 +0000630 Temps = new (C) CXXTemporary*[NumTemps];
Chris Lattnerd2598362010-05-10 00:25:06 +0000631}
632
633
Mike Stump1eb44332009-09-09 15:08:12 +0000634CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C,
Anders Carlsson88eaf072009-05-30 22:38:53 +0000635 Expr *SubExpr,
Mike Stump1eb44332009-09-09 15:08:12 +0000636 CXXTemporary **Temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000637 unsigned NumTemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000638 return new (C) CXXExprWithTemporaries(C, SubExpr, Temps, NumTemps);
Anders Carlsson88eaf072009-05-30 22:38:53 +0000639}
640
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000641// CXXBindTemporaryExpr
642Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
643 return &SubExpr;
644}
645
Mike Stump1eb44332009-09-09 15:08:12 +0000646Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000647 return &SubExpr + 1;
648}
649
Anders Carlssone349bea2009-04-23 02:32:43 +0000650// CXXConstructExpr
651Stmt::child_iterator CXXConstructExpr::child_begin() {
652 return &Args[0];
653}
654Stmt::child_iterator CXXConstructExpr::child_end() {
655 return &Args[0]+NumArgs;
656}
657
Anders Carlsson55674ac2009-05-01 22:21:22 +0000658// CXXExprWithTemporaries
659Stmt::child_iterator CXXExprWithTemporaries::child_begin() {
660 return &SubExpr;
Anders Carlsson19d28a62009-04-21 02:22:11 +0000661}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000662
Mike Stump1eb44332009-09-09 15:08:12 +0000663Stmt::child_iterator CXXExprWithTemporaries::child_end() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000664 return &SubExpr + 1;
665}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000666
Douglas Gregorab6677e2010-09-08 00:15:04 +0000667CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000668 SourceLocation LParenLoc,
669 Expr **Args,
670 unsigned NumArgs,
671 SourceLocation RParenLoc)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000672 : Expr(CXXUnresolvedConstructExprClass,
673 Type->getType().getNonReferenceType(),
674 Type->getType()->isDependentType(), true),
675 Type(Type),
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000676 LParenLoc(LParenLoc),
677 RParenLoc(RParenLoc),
678 NumArgs(NumArgs) {
679 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
680 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs);
681}
682
683CXXUnresolvedConstructExpr *
Mike Stump1eb44332009-09-09 15:08:12 +0000684CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000685 TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000686 SourceLocation LParenLoc,
687 Expr **Args,
688 unsigned NumArgs,
689 SourceLocation RParenLoc) {
690 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
691 sizeof(Expr *) * NumArgs);
Douglas Gregorab6677e2010-09-08 00:15:04 +0000692 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000693 Args, NumArgs, RParenLoc);
694}
695
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000696CXXUnresolvedConstructExpr *
697CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
698 Stmt::EmptyShell Empty;
699 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
700 sizeof(Expr *) * NumArgs);
701 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
702}
703
Douglas Gregorab6677e2010-09-08 00:15:04 +0000704SourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
705 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
706}
707
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000708Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
709 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
710}
711
712Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
713 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
714}
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000715
John McCall865d4472009-11-19 22:55:06 +0000716CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000717 Expr *Base, QualType BaseType,
718 bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000719 SourceLocation OperatorLoc,
720 NestedNameSpecifier *Qualifier,
721 SourceRange QualifierRange,
722 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000723 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000724 const TemplateArgumentListInfo *TemplateArgs)
John McCall865d4472009-11-19 22:55:06 +0000725 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, true, true),
John McCallaa81e162009-12-01 22:10:20 +0000726 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
727 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000728 OperatorLoc(OperatorLoc),
729 Qualifier(Qualifier), QualifierRange(QualifierRange),
730 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Abramo Bagnara25777432010-08-11 22:01:17 +0000731 MemberNameInfo(MemberNameInfo) {
John McCalld5532b62009-11-23 01:53:49 +0000732 if (TemplateArgs)
John McCall096832c2010-08-19 23:49:38 +0000733 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000734}
735
John McCall865d4472009-11-19 22:55:06 +0000736CXXDependentScopeMemberExpr *
737CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000738 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000739 SourceLocation OperatorLoc,
740 NestedNameSpecifier *Qualifier,
741 SourceRange QualifierRange,
742 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000743 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000744 const TemplateArgumentListInfo *TemplateArgs) {
745 if (!TemplateArgs)
John McCallaa81e162009-12-01 22:10:20 +0000746 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
747 IsArrow, OperatorLoc,
748 Qualifier, QualifierRange,
749 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000750 MemberNameInfo);
Mike Stump1eb44332009-09-09 15:08:12 +0000751
John McCalld5532b62009-11-23 01:53:49 +0000752 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
753 if (TemplateArgs)
754 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
755
Chris Lattner32488542010-10-30 05:14:06 +0000756 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
John McCallaa81e162009-12-01 22:10:20 +0000757 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
758 IsArrow, OperatorLoc,
759 Qualifier, QualifierRange,
760 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000761 MemberNameInfo, TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000762}
763
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000764CXXDependentScopeMemberExpr *
765CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
766 unsigned NumTemplateArgs) {
767 if (NumTemplateArgs == 0)
768 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
769 0, SourceLocation(), 0,
770 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000771 DeclarationNameInfo());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000772
773 std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
774 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
Chris Lattner32488542010-10-30 05:14:06 +0000775 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000776 CXXDependentScopeMemberExpr *E
777 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
778 0, SourceLocation(), 0,
779 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000780 DeclarationNameInfo(), 0);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000781 E->HasExplicitTemplateArgs = true;
782 return E;
783}
784
John McCall865d4472009-11-19 22:55:06 +0000785Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000786 return child_iterator(&Base);
787}
788
John McCall865d4472009-11-19 22:55:06 +0000789Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000790 if (isImplicitAccess())
791 return child_iterator(&Base);
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000792 return child_iterator(&Base + 1);
793}
John McCall129e2df2009-11-30 22:42:35 +0000794
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000795UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, QualType T,
796 bool Dependent,
John McCall129e2df2009-11-30 22:42:35 +0000797 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000798 Expr *Base, QualType BaseType,
799 bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000800 SourceLocation OperatorLoc,
801 NestedNameSpecifier *Qualifier,
802 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000803 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000804 const TemplateArgumentListInfo *TemplateArgs,
805 UnresolvedSetIterator Begin,
806 UnresolvedSetIterator End)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000807 : OverloadExpr(UnresolvedMemberExprClass, C, T, Dependent,
Abramo Bagnara25777432010-08-11 22:01:17 +0000808 Qualifier, QualifierRange, MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000809 TemplateArgs != 0, Begin, End),
John McCall7bb12da2010-02-02 06:20:04 +0000810 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
811 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
John McCall129e2df2009-11-30 22:42:35 +0000812 if (TemplateArgs)
John McCall7bb12da2010-02-02 06:20:04 +0000813 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
John McCall129e2df2009-11-30 22:42:35 +0000814}
815
816UnresolvedMemberExpr *
817UnresolvedMemberExpr::Create(ASTContext &C, bool Dependent,
818 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000819 Expr *Base, QualType BaseType, bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000820 SourceLocation OperatorLoc,
821 NestedNameSpecifier *Qualifier,
822 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000823 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000824 const TemplateArgumentListInfo *TemplateArgs,
825 UnresolvedSetIterator Begin,
826 UnresolvedSetIterator End) {
John McCall129e2df2009-11-30 22:42:35 +0000827 std::size_t size = sizeof(UnresolvedMemberExpr);
828 if (TemplateArgs)
829 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
830
Chris Lattner32488542010-10-30 05:14:06 +0000831 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000832 return new (Mem) UnresolvedMemberExpr(C,
John McCall129e2df2009-11-30 22:42:35 +0000833 Dependent ? C.DependentTy : C.OverloadTy,
John McCallaa81e162009-12-01 22:10:20 +0000834 Dependent, HasUnresolvedUsing, Base, BaseType,
835 IsArrow, OperatorLoc, Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000836 MemberNameInfo, TemplateArgs, Begin, End);
John McCall129e2df2009-11-30 22:42:35 +0000837}
838
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000839UnresolvedMemberExpr *
840UnresolvedMemberExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
841 std::size_t size = sizeof(UnresolvedMemberExpr);
842 if (NumTemplateArgs != 0)
843 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
844
Chris Lattner32488542010-10-30 05:14:06 +0000845 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000846 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
847 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
848 return E;
849}
850
John McCallc373d482010-01-27 01:50:18 +0000851CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
852 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
853
854 // If there was a nested name specifier, it names the naming class.
855 // It can't be dependent: after all, we were actually able to do the
856 // lookup.
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000857 CXXRecordDecl *Record = 0;
John McCall7bb12da2010-02-02 06:20:04 +0000858 if (getQualifier()) {
859 Type *T = getQualifier()->getAsType();
John McCallc373d482010-01-27 01:50:18 +0000860 assert(T && "qualifier in member expression does not name type");
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000861 Record = T->getAsCXXRecordDecl();
862 assert(Record && "qualifier in member expression does not name record");
863 }
John McCallc373d482010-01-27 01:50:18 +0000864 // Otherwise the naming class must have been the base class.
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000865 else {
John McCallc373d482010-01-27 01:50:18 +0000866 QualType BaseType = getBaseType().getNonReferenceType();
867 if (isArrow()) {
868 const PointerType *PT = BaseType->getAs<PointerType>();
869 assert(PT && "base of arrow member access is not pointer");
870 BaseType = PT->getPointeeType();
871 }
872
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000873 Record = BaseType->getAsCXXRecordDecl();
874 assert(Record && "base of member expression does not name record");
John McCallc373d482010-01-27 01:50:18 +0000875 }
876
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000877 return Record;
John McCallc373d482010-01-27 01:50:18 +0000878}
879
John McCall129e2df2009-11-30 22:42:35 +0000880Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
881 return child_iterator(&Base);
882}
883
884Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000885 if (isImplicitAccess())
886 return child_iterator(&Base);
John McCall129e2df2009-11-30 22:42:35 +0000887 return child_iterator(&Base + 1);
888}
Sebastian Redl2e156222010-09-10 20:55:43 +0000889
890Stmt::child_iterator CXXNoexceptExpr::child_begin() {
891 return child_iterator(&Operand);
892}
893Stmt::child_iterator CXXNoexceptExpr::child_end() {
894 return child_iterator(&Operand + 1);
895}