blob: cbd33f2dc4f9612bd26a44af68cbbbcc90822443 [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)
John McCallf89e55a2010-11-18 06:31:45 +0000119 : Expr(CXXNewExprClass, ty, VK_RValue, OK_Ordinary,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000120 ty->isDependentType(), ty->isDependentType(),
121 ty->containsUnexpandedParameterPack()),
Douglas Gregor4bd40312010-07-13 15:54:32 +0000122 GlobalNew(globalNew),
Chris Lattner59218632010-05-10 01:22:27 +0000123 Initializer(initializer), SubExprs(0), OperatorNew(operatorNew),
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000124 OperatorDelete(operatorDelete), Constructor(constructor),
Douglas Gregor1bb2a932010-09-07 21:49:58 +0000125 AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens),
Chandler Carruth428edaf2010-10-25 08:47:36 +0000126 StartLoc(startLoc), EndLoc(endLoc), ConstructorLParen(constructorLParen),
127 ConstructorRParen(constructorRParen) {
Chris Lattner59218632010-05-10 01:22:27 +0000128 AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000129 unsigned i = 0;
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000130 if (Array) {
131 if (arraySize->containsUnexpandedParameterPack())
132 ExprBits.ContainsUnexpandedParameterPack = true;
133
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000134 SubExprs[i++] = arraySize;
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000135 }
136
137 for (unsigned j = 0; j < NumPlacementArgs; ++j) {
138 if (placementArgs[j]->containsUnexpandedParameterPack())
139 ExprBits.ContainsUnexpandedParameterPack = true;
140
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000141 SubExprs[i++] = placementArgs[j];
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000142 }
143
144 for (unsigned j = 0; j < NumConstructorArgs; ++j) {
145 if (constructorArgs[j]->containsUnexpandedParameterPack())
146 ExprBits.ContainsUnexpandedParameterPack = true;
147
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000148 SubExprs[i++] = constructorArgs[j];
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000149 }
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000150}
151
Chris Lattner59218632010-05-10 01:22:27 +0000152void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray,
153 unsigned numPlaceArgs, unsigned numConsArgs){
154 assert(SubExprs == 0 && "SubExprs already allocated");
155 Array = isArray;
156 NumPlacementArgs = numPlaceArgs;
157 NumConstructorArgs = numConsArgs;
158
159 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
160 SubExprs = new (C) Stmt*[TotalSize];
161}
162
163
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000164Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
165Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000166 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000167}
168
169// CXXDeleteExpr
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000170QualType CXXDeleteExpr::getDestroyedType() const {
171 const Expr *Arg = getArgument();
172 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
173 if (ICE->getCastKind() != CK_UserDefinedConversion &&
174 ICE->getType()->isVoidPointerType())
175 Arg = ICE->getSubExpr();
176 else
177 break;
178 }
Craig Silverstein0fa0b782010-10-20 00:38:15 +0000179 // The type-to-delete may not be a pointer if it's a dependent type.
Craig Silversteinc87fa062010-10-20 00:56:01 +0000180 const QualType ArgType = Arg->getType();
Craig Silversteina437ad32010-11-16 07:16:25 +0000181
182 if (ArgType->isDependentType() && !ArgType->isPointerType())
183 return QualType();
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000184
Craig Silverstein0fa0b782010-10-20 00:38:15 +0000185 return ArgType->getAs<PointerType>()->getPointeeType();
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000186}
187
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000188Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
189Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
190
Douglas Gregora71d8192009-09-04 17:36:40 +0000191// CXXPseudoDestructorExpr
192Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
193Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
194 return &Base + 1;
195}
196
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000197PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
198 : Type(Info)
199{
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000200 Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000201}
202
John McCalle23cf432010-12-14 08:05:40 +0000203CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(ASTContext &Context,
204 Expr *Base, bool isArrow, SourceLocation OperatorLoc,
205 NestedNameSpecifier *Qualifier, SourceRange QualifierRange,
206 TypeSourceInfo *ScopeType, SourceLocation ColonColonLoc,
207 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType)
208 : Expr(CXXPseudoDestructorExprClass,
209 Context.getPointerType(Context.getFunctionType(Context.VoidTy, 0, 0,
210 FunctionProtoType::ExtProtoInfo())),
211 VK_RValue, OK_Ordinary,
212 /*isTypeDependent=*/(Base->isTypeDependent() ||
213 (DestroyedType.getTypeSourceInfo() &&
214 DestroyedType.getTypeSourceInfo()->getType()->isDependentType())),
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000215 /*isValueDependent=*/Base->isValueDependent(),
216 // ContainsUnexpandedParameterPack
217 (Base->containsUnexpandedParameterPack() ||
218 (Qualifier && Qualifier->containsUnexpandedParameterPack()) ||
219 (ScopeType &&
220 ScopeType->getType()->containsUnexpandedParameterPack()) ||
221 (DestroyedType.getTypeSourceInfo() &&
222 DestroyedType.getTypeSourceInfo()->getType()
223 ->containsUnexpandedParameterPack()))),
John McCalle23cf432010-12-14 08:05:40 +0000224 Base(static_cast<Stmt *>(Base)), IsArrow(isArrow),
225 OperatorLoc(OperatorLoc), Qualifier(Qualifier),
226 QualifierRange(QualifierRange),
227 ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc),
228 DestroyedType(DestroyedType) { }
229
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000230QualType CXXPseudoDestructorExpr::getDestroyedType() const {
231 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
232 return TInfo->getType();
233
234 return QualType();
235}
236
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000237SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000238 SourceLocation End = DestroyedType.getLocation();
239 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000240 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000241 return SourceRange(Base->getLocStart(), End);
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000242}
243
244
John McCallba135432009-11-21 08:51:07 +0000245// UnresolvedLookupExpr
John McCallf7a1a742009-11-24 19:00:30 +0000246UnresolvedLookupExpr *
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000247UnresolvedLookupExpr::Create(ASTContext &C,
John McCallc373d482010-01-27 01:50:18 +0000248 CXXRecordDecl *NamingClass,
John McCallf7a1a742009-11-24 19:00:30 +0000249 NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000250 SourceRange QualifierRange,
251 const DeclarationNameInfo &NameInfo,
252 bool ADL,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000253 const TemplateArgumentListInfo &Args,
254 UnresolvedSetIterator Begin,
255 UnresolvedSetIterator End)
John McCallf7a1a742009-11-24 19:00:30 +0000256{
257 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
258 ExplicitTemplateArgumentList::sizeFor(Args));
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000259 return new (Mem) UnresolvedLookupExpr(C, NamingClass,
260 Qualifier, QualifierRange, NameInfo,
261 ADL, /*Overload*/ true, &Args,
262 Begin, End);
John McCallf7a1a742009-11-24 19:00:30 +0000263}
264
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000265UnresolvedLookupExpr *
266UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
267 std::size_t size = sizeof(UnresolvedLookupExpr);
268 if (NumTemplateArgs != 0)
269 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
270
Chris Lattner32488542010-10-30 05:14:06 +0000271 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedLookupExpr>());
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000272 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
273 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
274 return E;
275}
276
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000277OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C,
278 NestedNameSpecifier *Qualifier, SourceRange QRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000279 const DeclarationNameInfo &NameInfo,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000280 const TemplateArgumentListInfo *TemplateArgs,
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000281 UnresolvedSetIterator Begin,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000282 UnresolvedSetIterator End,
283 bool KnownDependent,
284 bool KnownContainsUnexpandedParameterPack)
285 : Expr(K, C.OverloadTy, VK_LValue, OK_Ordinary, KnownDependent,
286 KnownDependent,
287 (KnownContainsUnexpandedParameterPack ||
288 NameInfo.containsUnexpandedParameterPack() ||
289 (Qualifier && Qualifier->containsUnexpandedParameterPack()))),
290 Results(0), NumResults(End - Begin), NameInfo(NameInfo),
291 Qualifier(Qualifier), QualifierRange(QRange),
292 HasExplicitTemplateArgs(TemplateArgs != 0)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000293{
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000294 NumResults = End - Begin;
295 if (NumResults) {
296 // Determine whether this expression is type-dependent.
297 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I) {
298 if ((*I)->getDeclContext()->isDependentContext() ||
299 isa<UnresolvedUsingValueDecl>(*I)) {
300 ExprBits.TypeDependent = true;
301 ExprBits.ValueDependent = true;
302 }
303 }
304
305 Results = static_cast<DeclAccessPair *>(
306 C.Allocate(sizeof(DeclAccessPair) * NumResults,
307 llvm::alignOf<DeclAccessPair>()));
308 memcpy(Results, &*Begin.getIterator(),
309 NumResults * sizeof(DeclAccessPair));
310 }
311
312 // If we have explicit template arguments, check for dependent
313 // template arguments and whether they contain any unexpanded pack
314 // expansions.
315 if (TemplateArgs) {
316 bool Dependent = false;
317 bool ContainsUnexpandedParameterPack = false;
318 getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent,
319 ContainsUnexpandedParameterPack);
320
321 if (Dependent) {
322 ExprBits.TypeDependent = true;
323 ExprBits.ValueDependent = true;
324 }
325 if (ContainsUnexpandedParameterPack)
326 ExprBits.ContainsUnexpandedParameterPack = true;
327 }
328
329 if (isTypeDependent())
330 setType(C.DependentTy);
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000331}
332
333void OverloadExpr::initializeResults(ASTContext &C,
334 UnresolvedSetIterator Begin,
335 UnresolvedSetIterator End) {
336 assert(Results == 0 && "Results already initialized!");
337 NumResults = End - Begin;
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000338 if (NumResults) {
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000339 Results = static_cast<DeclAccessPair *>(
340 C.Allocate(sizeof(DeclAccessPair) * NumResults,
341
342 llvm::alignOf<DeclAccessPair>()));
343 memcpy(Results, &*Begin.getIterator(),
344 NumResults * sizeof(DeclAccessPair));
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000345 }
346}
347
John McCalle9ee23e2010-04-22 18:44:12 +0000348CXXRecordDecl *OverloadExpr::getNamingClass() const {
349 if (isa<UnresolvedLookupExpr>(this))
350 return cast<UnresolvedLookupExpr>(this)->getNamingClass();
351 else
352 return cast<UnresolvedMemberExpr>(this)->getNamingClass();
353}
354
John McCallba135432009-11-21 08:51:07 +0000355Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump1eb44332009-09-09 15:08:12 +0000356 return child_iterator();
Douglas Gregor5c37de72008-12-06 00:22:45 +0000357}
John McCallba135432009-11-21 08:51:07 +0000358Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregor5c37de72008-12-06 00:22:45 +0000359 return child_iterator();
360}
Sebastian Redl64b45f72009-01-05 20:52:13 +0000361// UnaryTypeTraitExpr
362Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
363 return child_iterator();
364}
365Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
366 return child_iterator();
367}
368
Francois Pichet6ad6f282010-12-07 00:08:36 +0000369//BinaryTypeTraitExpr
370Stmt::child_iterator BinaryTypeTraitExpr::child_begin() {
371 return child_iterator();
372}
373Stmt::child_iterator BinaryTypeTraitExpr::child_end() {
374 return child_iterator();
375}
376
John McCall865d4472009-11-19 22:55:06 +0000377// DependentScopeDeclRefExpr
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000378DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
379 NestedNameSpecifier *Qualifier,
380 SourceRange QualifierRange,
381 const DeclarationNameInfo &NameInfo,
382 const TemplateArgumentListInfo *Args)
383 : Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary,
384 true, true,
385 (NameInfo.containsUnexpandedParameterPack() ||
386 (Qualifier && Qualifier->containsUnexpandedParameterPack()))),
387 NameInfo(NameInfo), QualifierRange(QualifierRange), Qualifier(Qualifier),
388 HasExplicitTemplateArgs(Args != 0)
389{
390 if (Args) {
391 bool Dependent = true;
392 bool ContainsUnexpandedParameterPack
393 = ExprBits.ContainsUnexpandedParameterPack;
394
395 reinterpret_cast<ExplicitTemplateArgumentList*>(this+1)
396 ->initializeFrom(*Args, Dependent, ContainsUnexpandedParameterPack);
397 ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
398 }
399}
400
John McCallf7a1a742009-11-24 19:00:30 +0000401DependentScopeDeclRefExpr *
402DependentScopeDeclRefExpr::Create(ASTContext &C,
403 NestedNameSpecifier *Qualifier,
404 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000405 const DeclarationNameInfo &NameInfo,
John McCallf7a1a742009-11-24 19:00:30 +0000406 const TemplateArgumentListInfo *Args) {
407 std::size_t size = sizeof(DependentScopeDeclRefExpr);
John McCallf7a1a742009-11-24 19:00:30 +0000408 if (Args)
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000409 size += ExplicitTemplateArgumentList::sizeFor(*Args);
410 void *Mem = C.Allocate(size);
411 return new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
412 Qualifier, QualifierRange,
413 NameInfo, Args);
John McCallf7a1a742009-11-24 19:00:30 +0000414}
415
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000416DependentScopeDeclRefExpr *
417DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
418 unsigned NumTemplateArgs) {
419 std::size_t size = sizeof(DependentScopeDeclRefExpr);
420 if (NumTemplateArgs)
421 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
422 void *Mem = C.Allocate(size);
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000423 return new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(),
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000424 DeclarationNameInfo(), 0);
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000425}
426
John McCall865d4472009-11-19 22:55:06 +0000427StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000428 return child_iterator();
429}
430
John McCall865d4472009-11-19 22:55:06 +0000431StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000432 return child_iterator();
433}
434
Chandler Carruth428edaf2010-10-25 08:47:36 +0000435SourceRange CXXConstructExpr::getSourceRange() const {
Douglas Gregor40749ee2010-11-03 00:35:38 +0000436 if (ParenRange.isValid())
437 return SourceRange(Loc, ParenRange.getEnd());
438
439 SourceLocation End = Loc;
440 for (unsigned I = getNumArgs(); I > 0; --I) {
441 const Expr *Arg = getArg(I-1);
442 if (!Arg->isDefaultArgument()) {
443 SourceLocation NewEnd = Arg->getLocEnd();
444 if (NewEnd.isValid()) {
445 End = NewEnd;
446 break;
447 }
448 }
449 }
450
451 return SourceRange(Loc, End);
Ted Kremeneke3837682009-12-23 04:00:48 +0000452}
453
Douglas Gregorb4609802008-11-14 16:09:21 +0000454SourceRange CXXOperatorCallExpr::getSourceRange() const {
455 OverloadedOperatorKind Kind = getOperator();
456 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
457 if (getNumArgs() == 1)
458 // Prefix operator
Mike Stump1eb44332009-09-09 15:08:12 +0000459 return SourceRange(getOperatorLoc(),
Douglas Gregorb4609802008-11-14 16:09:21 +0000460 getArg(0)->getSourceRange().getEnd());
461 else
462 // Postfix operator
463 return SourceRange(getArg(0)->getSourceRange().getEnd(),
464 getOperatorLoc());
465 } else if (Kind == OO_Call) {
466 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
467 } else if (Kind == OO_Subscript) {
468 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
469 } else if (getNumArgs() == 1) {
470 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
471 } else if (getNumArgs() == 2) {
472 return SourceRange(getArg(0)->getSourceRange().getBegin(),
473 getArg(1)->getSourceRange().getEnd());
474 } else {
475 return SourceRange();
476 }
477}
478
Douglas Gregor88a35142008-12-22 05:46:06 +0000479Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
480 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
481 return MemExpr->getBase();
482
483 // FIXME: Will eventually need to cope with member pointers.
484 return 0;
485}
486
Chandler Carruth007a9b12010-10-27 06:55:41 +0000487CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() {
488 Expr* ThisArg = getImplicitObjectArgument();
489 if (!ThisArg)
490 return 0;
491
492 if (ThisArg->getType()->isAnyPointerType())
493 return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
494
495 return ThisArg->getType()->getAsCXXRecordDecl();
496}
497
Douglas Gregor00b98c22009-11-12 15:31:47 +0000498SourceRange CXXMemberCallExpr::getSourceRange() const {
499 SourceLocation LocStart = getCallee()->getLocStart();
500 if (LocStart.isInvalid() && getNumArgs() > 0)
501 LocStart = getArg(0)->getLocStart();
502 return SourceRange(LocStart, getRParenLoc());
503}
504
505
Douglas Gregor49badde2008-10-27 19:41:14 +0000506//===----------------------------------------------------------------------===//
507// Named casts
508//===----------------------------------------------------------------------===//
509
510/// getCastName - Get the name of the C++ cast being used, e.g.,
511/// "static_cast", "dynamic_cast", "reinterpret_cast", or
512/// "const_cast". The returned pointer must not be freed.
513const char *CXXNamedCastExpr::getCastName() const {
514 switch (getStmtClass()) {
515 case CXXStaticCastExprClass: return "static_cast";
516 case CXXDynamicCastExprClass: return "dynamic_cast";
517 case CXXReinterpretCastExprClass: return "reinterpret_cast";
518 case CXXConstCastExprClass: return "const_cast";
519 default: return "<invalid cast>";
520 }
521}
Douglas Gregor506ae412009-01-16 18:33:17 +0000522
John McCallf871d0c2010-08-07 06:22:56 +0000523CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
John McCallf89e55a2010-11-18 06:31:45 +0000524 ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000525 CastKind K, Expr *Op,
526 const CXXCastPath *BasePath,
527 TypeSourceInfo *WrittenTy,
528 SourceLocation L) {
529 unsigned PathSize = (BasePath ? BasePath->size() : 0);
530 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
531 + PathSize * sizeof(CXXBaseSpecifier*));
532 CXXStaticCastExpr *E =
John McCallf89e55a2010-11-18 06:31:45 +0000533 new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L);
John McCallf871d0c2010-08-07 06:22:56 +0000534 if (PathSize) E->setCastPath(*BasePath);
535 return E;
536}
537
538CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
539 unsigned PathSize) {
540 void *Buffer =
541 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
542 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
543}
544
545CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
John McCallf89e55a2010-11-18 06:31:45 +0000546 ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000547 CastKind K, Expr *Op,
548 const CXXCastPath *BasePath,
549 TypeSourceInfo *WrittenTy,
550 SourceLocation L) {
551 unsigned PathSize = (BasePath ? BasePath->size() : 0);
552 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
553 + PathSize * sizeof(CXXBaseSpecifier*));
554 CXXDynamicCastExpr *E =
John McCallf89e55a2010-11-18 06:31:45 +0000555 new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L);
John McCallf871d0c2010-08-07 06:22:56 +0000556 if (PathSize) E->setCastPath(*BasePath);
557 return E;
558}
559
560CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
561 unsigned PathSize) {
562 void *Buffer =
563 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
564 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
565}
566
567CXXReinterpretCastExpr *
John McCallf89e55a2010-11-18 06:31:45 +0000568CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
569 CastKind K, Expr *Op,
John McCallf871d0c2010-08-07 06:22:56 +0000570 const CXXCastPath *BasePath,
571 TypeSourceInfo *WrittenTy, SourceLocation L) {
572 unsigned PathSize = (BasePath ? BasePath->size() : 0);
573 void *Buffer =
574 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
575 CXXReinterpretCastExpr *E =
John McCallf89e55a2010-11-18 06:31:45 +0000576 new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L);
John McCallf871d0c2010-08-07 06:22:56 +0000577 if (PathSize) E->setCastPath(*BasePath);
578 return E;
579}
580
581CXXReinterpretCastExpr *
582CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
583 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
584 + PathSize * sizeof(CXXBaseSpecifier*));
585 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
586}
587
John McCallf89e55a2010-11-18 06:31:45 +0000588CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T,
589 ExprValueKind VK, Expr *Op,
John McCallf871d0c2010-08-07 06:22:56 +0000590 TypeSourceInfo *WrittenTy,
591 SourceLocation L) {
John McCallf89e55a2010-11-18 06:31:45 +0000592 return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L);
John McCallf871d0c2010-08-07 06:22:56 +0000593}
594
595CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
596 return new (C) CXXConstCastExpr(EmptyShell());
597}
598
599CXXFunctionalCastExpr *
John McCallf89e55a2010-11-18 06:31:45 +0000600CXXFunctionalCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000601 TypeSourceInfo *Written, SourceLocation L,
602 CastKind K, Expr *Op, const CXXCastPath *BasePath,
603 SourceLocation R) {
604 unsigned PathSize = (BasePath ? BasePath->size() : 0);
605 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
606 + PathSize * sizeof(CXXBaseSpecifier*));
607 CXXFunctionalCastExpr *E =
John McCallf89e55a2010-11-18 06:31:45 +0000608 new (Buffer) CXXFunctionalCastExpr(T, VK, Written, L, K, Op, PathSize, R);
John McCallf871d0c2010-08-07 06:22:56 +0000609 if (PathSize) E->setCastPath(*BasePath);
610 return E;
611}
612
613CXXFunctionalCastExpr *
614CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
615 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
616 + PathSize * sizeof(CXXBaseSpecifier*));
617 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
618}
619
620
Douglas Gregor65222e82009-12-23 18:19:08 +0000621CXXDefaultArgExpr *
Douglas Gregor036aed12009-12-23 23:03:06 +0000622CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
623 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor65222e82009-12-23 18:19:08 +0000624 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor036aed12009-12-23 23:03:06 +0000625 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
626 SubExpr);
Douglas Gregor65222e82009-12-23 18:19:08 +0000627}
628
Mike Stump1eb44332009-09-09 15:08:12 +0000629CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonb859f352009-05-30 20:34:37 +0000630 const CXXDestructorDecl *Destructor) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000631 return new (C) CXXTemporary(Destructor);
632}
633
Mike Stump1eb44332009-09-09 15:08:12 +0000634CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000635 CXXTemporary *Temp,
636 Expr* SubExpr) {
Mike Stump1eb44332009-09-09 15:08:12 +0000637 assert(SubExpr->getType()->isRecordType() &&
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000638 "Expression bound to a temporary must have record type!");
639
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000640 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000641}
642
Anders Carlsson8e587a12009-05-30 20:56:46 +0000643CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson26de5492009-04-24 05:23:13 +0000644 CXXConstructorDecl *Cons,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000645 TypeSourceInfo *Type,
Douglas Gregor506ae412009-01-16 18:33:17 +0000646 Expr **Args,
Mike Stump1eb44332009-09-09 15:08:12 +0000647 unsigned NumArgs,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000648 SourceRange parenRange,
Douglas Gregor1c63b9c2010-04-27 20:36:09 +0000649 bool ZeroInitialization)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000650 : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
651 Type->getType().getNonReferenceType(),
652 Type->getTypeLoc().getBeginLoc(),
Chandler Carruth428edaf2010-10-25 08:47:36 +0000653 Cons, false, Args, NumArgs, ZeroInitialization,
654 CXXConstructExpr::CK_Complete, parenRange),
655 Type(Type) {
Douglas Gregorab6677e2010-09-08 00:15:04 +0000656}
657
658SourceRange CXXTemporaryObjectExpr::getSourceRange() const {
Chandler Carruth428edaf2010-10-25 08:47:36 +0000659 return SourceRange(Type->getTypeLoc().getBeginLoc(),
660 getParenRange().getEnd());
Douglas Gregor506ae412009-01-16 18:33:17 +0000661}
Anders Carlsson19d28a62009-04-21 02:22:11 +0000662
Mike Stump1eb44332009-09-09 15:08:12 +0000663CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000664 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000665 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000666 Expr **Args, unsigned NumArgs,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000667 bool ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000668 ConstructionKind ConstructKind,
669 SourceRange ParenRange) {
Douglas Gregor99a2e602009-12-16 01:38:02 +0000670 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000671 Elidable, Args, NumArgs, ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000672 ConstructKind, ParenRange);
Anders Carlssone349bea2009-04-23 02:32:43 +0000673}
674
Mike Stump1eb44332009-09-09 15:08:12 +0000675CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000676 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000677 CXXConstructorDecl *D, bool elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000678 Expr **args, unsigned numargs,
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000679 bool ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000680 ConstructionKind ConstructKind,
681 SourceRange ParenRange)
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000682 : Expr(SC, T, VK_RValue, OK_Ordinary,
683 T->isDependentType(), T->isDependentType(),
684 T->containsUnexpandedParameterPack()),
685 Constructor(D), Loc(Loc), ParenRange(ParenRange), Elidable(elidable),
686 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
687 Args(0), NumArgs(numargs)
Douglas Gregor16006c92009-12-16 18:50:27 +0000688{
689 if (NumArgs) {
690 Args = new (C) Stmt*[NumArgs];
691
692 for (unsigned i = 0; i != NumArgs; ++i) {
693 assert(args[i] && "NULL argument in CXXConstructExpr");
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000694
695 if (args[i]->isValueDependent())
696 ExprBits.ValueDependent = true;
697 if (args[i]->containsUnexpandedParameterPack())
698 ExprBits.ContainsUnexpandedParameterPack = true;
699
Douglas Gregor16006c92009-12-16 18:50:27 +0000700 Args[i] = args[i];
Anders Carlssone349bea2009-04-23 02:32:43 +0000701 }
Douglas Gregor16006c92009-12-16 18:50:27 +0000702 }
Anders Carlssone349bea2009-04-23 02:32:43 +0000703}
704
John McCall4765fa02010-12-06 08:20:24 +0000705ExprWithCleanups::ExprWithCleanups(ASTContext &C,
706 Expr *subexpr,
707 CXXTemporary **temps,
708 unsigned numtemps)
709 : Expr(ExprWithCleanupsClass, subexpr->getType(),
John McCallf89e55a2010-11-18 06:31:45 +0000710 subexpr->getValueKind(), subexpr->getObjectKind(),
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000711 subexpr->isTypeDependent(), subexpr->isValueDependent(),
712 subexpr->containsUnexpandedParameterPack()),
Chris Lattnerd2598362010-05-10 00:25:06 +0000713 SubExpr(subexpr), Temps(0), NumTemps(0) {
Chris Lattneraff32cb2010-05-10 00:45:12 +0000714 if (numtemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000715 setNumTemporaries(C, numtemps);
Chris Lattnerd2598362010-05-10 00:25:06 +0000716 for (unsigned i = 0; i != numtemps; ++i)
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000717 Temps[i] = temps[i];
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000718 }
719}
720
John McCall4765fa02010-12-06 08:20:24 +0000721void ExprWithCleanups::setNumTemporaries(ASTContext &C, unsigned N) {
Chris Lattnerd2598362010-05-10 00:25:06 +0000722 assert(Temps == 0 && "Cannot resize with this");
Daniel Dunbar90556d42010-05-10 15:59:37 +0000723 NumTemps = N;
Ted Kremenekd04ed412010-05-10 20:06:30 +0000724 Temps = new (C) CXXTemporary*[NumTemps];
Chris Lattnerd2598362010-05-10 00:25:06 +0000725}
726
727
John McCall4765fa02010-12-06 08:20:24 +0000728ExprWithCleanups *ExprWithCleanups::Create(ASTContext &C,
729 Expr *SubExpr,
730 CXXTemporary **Temps,
731 unsigned NumTemps) {
732 return new (C) ExprWithCleanups(C, SubExpr, Temps, NumTemps);
Anders Carlsson88eaf072009-05-30 22:38:53 +0000733}
734
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000735// CXXBindTemporaryExpr
736Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
737 return &SubExpr;
738}
739
Mike Stump1eb44332009-09-09 15:08:12 +0000740Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000741 return &SubExpr + 1;
742}
743
Anders Carlssone349bea2009-04-23 02:32:43 +0000744// CXXConstructExpr
745Stmt::child_iterator CXXConstructExpr::child_begin() {
746 return &Args[0];
747}
748Stmt::child_iterator CXXConstructExpr::child_end() {
749 return &Args[0]+NumArgs;
750}
751
John McCall4765fa02010-12-06 08:20:24 +0000752// ExprWithCleanups
753Stmt::child_iterator ExprWithCleanups::child_begin() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000754 return &SubExpr;
Anders Carlsson19d28a62009-04-21 02:22:11 +0000755}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000756
John McCall4765fa02010-12-06 08:20:24 +0000757Stmt::child_iterator ExprWithCleanups::child_end() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000758 return &SubExpr + 1;
759}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000760
Douglas Gregorab6677e2010-09-08 00:15:04 +0000761CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000762 SourceLocation LParenLoc,
763 Expr **Args,
764 unsigned NumArgs,
765 SourceLocation RParenLoc)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000766 : Expr(CXXUnresolvedConstructExprClass,
767 Type->getType().getNonReferenceType(),
John McCall09431682010-11-18 19:01:18 +0000768 VK_LValue, OK_Ordinary,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000769 Type->getType()->isDependentType(), true,
770 Type->getType()->containsUnexpandedParameterPack()),
Douglas Gregorab6677e2010-09-08 00:15:04 +0000771 Type(Type),
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000772 LParenLoc(LParenLoc),
773 RParenLoc(RParenLoc),
774 NumArgs(NumArgs) {
775 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000776 for (unsigned I = 0; I != NumArgs; ++I) {
777 if (Args[I]->containsUnexpandedParameterPack())
778 ExprBits.ContainsUnexpandedParameterPack = true;
779
780 StoredArgs[I] = Args[I];
781 }
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000782}
783
784CXXUnresolvedConstructExpr *
Mike Stump1eb44332009-09-09 15:08:12 +0000785CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000786 TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000787 SourceLocation LParenLoc,
788 Expr **Args,
789 unsigned NumArgs,
790 SourceLocation RParenLoc) {
791 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
792 sizeof(Expr *) * NumArgs);
Douglas Gregorab6677e2010-09-08 00:15:04 +0000793 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000794 Args, NumArgs, RParenLoc);
795}
796
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000797CXXUnresolvedConstructExpr *
798CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
799 Stmt::EmptyShell Empty;
800 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
801 sizeof(Expr *) * NumArgs);
802 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
803}
804
Douglas Gregorab6677e2010-09-08 00:15:04 +0000805SourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
806 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
807}
808
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000809Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
810 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
811}
812
813Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
814 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
815}
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000816
John McCall865d4472009-11-19 22:55:06 +0000817CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000818 Expr *Base, QualType BaseType,
819 bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000820 SourceLocation OperatorLoc,
821 NestedNameSpecifier *Qualifier,
822 SourceRange QualifierRange,
823 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000824 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000825 const TemplateArgumentListInfo *TemplateArgs)
John McCallf89e55a2010-11-18 06:31:45 +0000826 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000827 VK_LValue, OK_Ordinary, true, true,
828 ((Base && Base->containsUnexpandedParameterPack()) ||
829 (Qualifier && Qualifier->containsUnexpandedParameterPack()) ||
830 MemberNameInfo.containsUnexpandedParameterPack())),
John McCallaa81e162009-12-01 22:10:20 +0000831 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
832 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000833 OperatorLoc(OperatorLoc),
834 Qualifier(Qualifier), QualifierRange(QualifierRange),
835 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Abramo Bagnara25777432010-08-11 22:01:17 +0000836 MemberNameInfo(MemberNameInfo) {
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000837 if (TemplateArgs) {
838 bool Dependent = true;
839 bool ContainsUnexpandedParameterPack = false;
840 getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent,
841 ContainsUnexpandedParameterPack);
842 if (ContainsUnexpandedParameterPack)
843 ExprBits.ContainsUnexpandedParameterPack = true;
844 }
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000845}
846
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000847CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
848 Expr *Base, QualType BaseType,
849 bool IsArrow,
850 SourceLocation OperatorLoc,
851 NestedNameSpecifier *Qualifier,
852 SourceRange QualifierRange,
853 NamedDecl *FirstQualifierFoundInScope,
854 DeclarationNameInfo MemberNameInfo)
855 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
856 VK_LValue, OK_Ordinary, true, true,
857 ((Base && Base->containsUnexpandedParameterPack()) ||
858 (Qualifier && Qualifier->containsUnexpandedParameterPack()) ||
859 MemberNameInfo.containsUnexpandedParameterPack())),
860 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
861 HasExplicitTemplateArgs(false), OperatorLoc(OperatorLoc),
862 Qualifier(Qualifier), QualifierRange(QualifierRange),
863 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
864 MemberNameInfo(MemberNameInfo) { }
865
John McCall865d4472009-11-19 22:55:06 +0000866CXXDependentScopeMemberExpr *
867CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000868 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000869 SourceLocation OperatorLoc,
870 NestedNameSpecifier *Qualifier,
871 SourceRange QualifierRange,
872 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000873 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000874 const TemplateArgumentListInfo *TemplateArgs) {
875 if (!TemplateArgs)
John McCallaa81e162009-12-01 22:10:20 +0000876 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
877 IsArrow, OperatorLoc,
878 Qualifier, QualifierRange,
879 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000880 MemberNameInfo);
Mike Stump1eb44332009-09-09 15:08:12 +0000881
John McCalld5532b62009-11-23 01:53:49 +0000882 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
883 if (TemplateArgs)
884 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
885
Chris Lattner32488542010-10-30 05:14:06 +0000886 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
John McCallaa81e162009-12-01 22:10:20 +0000887 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
888 IsArrow, OperatorLoc,
889 Qualifier, QualifierRange,
890 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000891 MemberNameInfo, TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000892}
893
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000894CXXDependentScopeMemberExpr *
895CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
896 unsigned NumTemplateArgs) {
897 if (NumTemplateArgs == 0)
898 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
899 0, SourceLocation(), 0,
900 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000901 DeclarationNameInfo());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000902
903 std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
904 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
Chris Lattner32488542010-10-30 05:14:06 +0000905 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000906 CXXDependentScopeMemberExpr *E
907 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
908 0, SourceLocation(), 0,
909 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000910 DeclarationNameInfo(), 0);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000911 E->HasExplicitTemplateArgs = true;
912 return E;
913}
914
John McCall865d4472009-11-19 22:55:06 +0000915Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000916 return child_iterator(&Base);
917}
918
John McCall865d4472009-11-19 22:55:06 +0000919Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000920 if (isImplicitAccess())
921 return child_iterator(&Base);
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000922 return child_iterator(&Base + 1);
923}
John McCall129e2df2009-11-30 22:42:35 +0000924
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000925UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C,
John McCall129e2df2009-11-30 22:42:35 +0000926 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000927 Expr *Base, QualType BaseType,
928 bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000929 SourceLocation OperatorLoc,
930 NestedNameSpecifier *Qualifier,
931 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000932 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000933 const TemplateArgumentListInfo *TemplateArgs,
934 UnresolvedSetIterator Begin,
935 UnresolvedSetIterator End)
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000936 : OverloadExpr(UnresolvedMemberExprClass, C,
Abramo Bagnara25777432010-08-11 22:01:17 +0000937 Qualifier, QualifierRange, MemberNameInfo,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000938 TemplateArgs, Begin, End,
939 // Dependent
940 ((Base && Base->isTypeDependent()) ||
941 BaseType->isDependentType()),
942 // Contains unexpanded parameter pack
943 ((Base && Base->containsUnexpandedParameterPack()) ||
944 BaseType->containsUnexpandedParameterPack())),
John McCall7bb12da2010-02-02 06:20:04 +0000945 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
946 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
John McCall129e2df2009-11-30 22:42:35 +0000947}
948
949UnresolvedMemberExpr *
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000950UnresolvedMemberExpr::Create(ASTContext &C,
John McCall129e2df2009-11-30 22:42:35 +0000951 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000952 Expr *Base, QualType BaseType, bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000953 SourceLocation OperatorLoc,
954 NestedNameSpecifier *Qualifier,
955 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000956 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000957 const TemplateArgumentListInfo *TemplateArgs,
958 UnresolvedSetIterator Begin,
959 UnresolvedSetIterator End) {
John McCall129e2df2009-11-30 22:42:35 +0000960 std::size_t size = sizeof(UnresolvedMemberExpr);
961 if (TemplateArgs)
962 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
963
Chris Lattner32488542010-10-30 05:14:06 +0000964 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000965 return new (Mem) UnresolvedMemberExpr(C,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000966 HasUnresolvedUsing, Base, BaseType,
John McCallaa81e162009-12-01 22:10:20 +0000967 IsArrow, OperatorLoc, Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000968 MemberNameInfo, TemplateArgs, Begin, End);
John McCall129e2df2009-11-30 22:42:35 +0000969}
970
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000971UnresolvedMemberExpr *
972UnresolvedMemberExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
973 std::size_t size = sizeof(UnresolvedMemberExpr);
974 if (NumTemplateArgs != 0)
975 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
976
Chris Lattner32488542010-10-30 05:14:06 +0000977 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000978 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
979 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
980 return E;
981}
982
John McCallc373d482010-01-27 01:50:18 +0000983CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
984 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
985
986 // If there was a nested name specifier, it names the naming class.
987 // It can't be dependent: after all, we were actually able to do the
988 // lookup.
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000989 CXXRecordDecl *Record = 0;
John McCall7bb12da2010-02-02 06:20:04 +0000990 if (getQualifier()) {
991 Type *T = getQualifier()->getAsType();
John McCallc373d482010-01-27 01:50:18 +0000992 assert(T && "qualifier in member expression does not name type");
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000993 Record = T->getAsCXXRecordDecl();
994 assert(Record && "qualifier in member expression does not name record");
995 }
John McCallc373d482010-01-27 01:50:18 +0000996 // Otherwise the naming class must have been the base class.
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000997 else {
John McCallc373d482010-01-27 01:50:18 +0000998 QualType BaseType = getBaseType().getNonReferenceType();
999 if (isArrow()) {
1000 const PointerType *PT = BaseType->getAs<PointerType>();
1001 assert(PT && "base of arrow member access is not pointer");
1002 BaseType = PT->getPointeeType();
1003 }
1004
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001005 Record = BaseType->getAsCXXRecordDecl();
1006 assert(Record && "base of member expression does not name record");
John McCallc373d482010-01-27 01:50:18 +00001007 }
1008
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001009 return Record;
John McCallc373d482010-01-27 01:50:18 +00001010}
1011
John McCall129e2df2009-11-30 22:42:35 +00001012Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
1013 return child_iterator(&Base);
1014}
1015
1016Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +00001017 if (isImplicitAccess())
1018 return child_iterator(&Base);
John McCall129e2df2009-11-30 22:42:35 +00001019 return child_iterator(&Base + 1);
1020}
Sebastian Redl2e156222010-09-10 20:55:43 +00001021
1022Stmt::child_iterator CXXNoexceptExpr::child_begin() {
1023 return child_iterator(&Operand);
1024}
1025Stmt::child_iterator CXXNoexceptExpr::child_end() {
1026 return child_iterator(&Operand + 1);
1027}