blob: 7cd714ba3fa754779dbfe417e533c7c8c599a705 [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,
John McCall6ec278d2011-01-27 09:37:56 +0000114 FunctionDecl *operatorDelete,
115 bool usualArrayDeleteWantsSize, QualType ty,
Douglas Gregor1bb2a932010-09-07 21:49:58 +0000116 TypeSourceInfo *AllocatedTypeInfo,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000117 SourceLocation startLoc, SourceLocation endLoc,
118 SourceLocation constructorLParen,
119 SourceLocation constructorRParen)
John McCallf89e55a2010-11-18 06:31:45 +0000120 : Expr(CXXNewExprClass, ty, VK_RValue, OK_Ordinary,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000121 ty->isDependentType(), ty->isDependentType(),
122 ty->containsUnexpandedParameterPack()),
John McCall6ec278d2011-01-27 09:37:56 +0000123 GlobalNew(globalNew), Initializer(initializer),
124 UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize),
125 SubExprs(0), OperatorNew(operatorNew),
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000126 OperatorDelete(operatorDelete), Constructor(constructor),
Douglas Gregor1bb2a932010-09-07 21:49:58 +0000127 AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens),
Chandler Carruth428edaf2010-10-25 08:47:36 +0000128 StartLoc(startLoc), EndLoc(endLoc), ConstructorLParen(constructorLParen),
129 ConstructorRParen(constructorRParen) {
Chris Lattner59218632010-05-10 01:22:27 +0000130 AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000131 unsigned i = 0;
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000132 if (Array) {
133 if (arraySize->containsUnexpandedParameterPack())
134 ExprBits.ContainsUnexpandedParameterPack = true;
135
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000136 SubExprs[i++] = arraySize;
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000137 }
138
139 for (unsigned j = 0; j < NumPlacementArgs; ++j) {
140 if (placementArgs[j]->containsUnexpandedParameterPack())
141 ExprBits.ContainsUnexpandedParameterPack = true;
142
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000143 SubExprs[i++] = placementArgs[j];
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000144 }
145
146 for (unsigned j = 0; j < NumConstructorArgs; ++j) {
147 if (constructorArgs[j]->containsUnexpandedParameterPack())
148 ExprBits.ContainsUnexpandedParameterPack = true;
149
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000150 SubExprs[i++] = constructorArgs[j];
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000151 }
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000152}
153
Chris Lattner59218632010-05-10 01:22:27 +0000154void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray,
155 unsigned numPlaceArgs, unsigned numConsArgs){
156 assert(SubExprs == 0 && "SubExprs already allocated");
157 Array = isArray;
158 NumPlacementArgs = numPlaceArgs;
159 NumConstructorArgs = numConsArgs;
160
161 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
162 SubExprs = new (C) Stmt*[TotalSize];
163}
164
165
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000166Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
167Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000168 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000169}
170
171// CXXDeleteExpr
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000172QualType CXXDeleteExpr::getDestroyedType() const {
173 const Expr *Arg = getArgument();
174 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
175 if (ICE->getCastKind() != CK_UserDefinedConversion &&
176 ICE->getType()->isVoidPointerType())
177 Arg = ICE->getSubExpr();
178 else
179 break;
180 }
Craig Silverstein0fa0b782010-10-20 00:38:15 +0000181 // The type-to-delete may not be a pointer if it's a dependent type.
Craig Silversteinc87fa062010-10-20 00:56:01 +0000182 const QualType ArgType = Arg->getType();
Craig Silversteina437ad32010-11-16 07:16:25 +0000183
184 if (ArgType->isDependentType() && !ArgType->isPointerType())
185 return QualType();
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000186
Craig Silverstein0fa0b782010-10-20 00:38:15 +0000187 return ArgType->getAs<PointerType>()->getPointeeType();
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000188}
189
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000190Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
191Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
192
Douglas Gregora71d8192009-09-04 17:36:40 +0000193// CXXPseudoDestructorExpr
194Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
195Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
196 return &Base + 1;
197}
198
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000199PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
200 : Type(Info)
201{
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000202 Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000203}
204
John McCalle23cf432010-12-14 08:05:40 +0000205CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(ASTContext &Context,
206 Expr *Base, bool isArrow, SourceLocation OperatorLoc,
207 NestedNameSpecifier *Qualifier, SourceRange QualifierRange,
208 TypeSourceInfo *ScopeType, SourceLocation ColonColonLoc,
209 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType)
210 : Expr(CXXPseudoDestructorExprClass,
211 Context.getPointerType(Context.getFunctionType(Context.VoidTy, 0, 0,
212 FunctionProtoType::ExtProtoInfo())),
213 VK_RValue, OK_Ordinary,
214 /*isTypeDependent=*/(Base->isTypeDependent() ||
215 (DestroyedType.getTypeSourceInfo() &&
216 DestroyedType.getTypeSourceInfo()->getType()->isDependentType())),
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000217 /*isValueDependent=*/Base->isValueDependent(),
218 // ContainsUnexpandedParameterPack
219 (Base->containsUnexpandedParameterPack() ||
220 (Qualifier && Qualifier->containsUnexpandedParameterPack()) ||
221 (ScopeType &&
222 ScopeType->getType()->containsUnexpandedParameterPack()) ||
223 (DestroyedType.getTypeSourceInfo() &&
224 DestroyedType.getTypeSourceInfo()->getType()
225 ->containsUnexpandedParameterPack()))),
John McCalle23cf432010-12-14 08:05:40 +0000226 Base(static_cast<Stmt *>(Base)), IsArrow(isArrow),
227 OperatorLoc(OperatorLoc), Qualifier(Qualifier),
228 QualifierRange(QualifierRange),
229 ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc),
230 DestroyedType(DestroyedType) { }
231
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000232QualType CXXPseudoDestructorExpr::getDestroyedType() const {
233 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
234 return TInfo->getType();
235
236 return QualType();
237}
238
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000239SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000240 SourceLocation End = DestroyedType.getLocation();
241 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000242 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000243 return SourceRange(Base->getLocStart(), End);
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000244}
245
246
John McCallba135432009-11-21 08:51:07 +0000247// UnresolvedLookupExpr
John McCallf7a1a742009-11-24 19:00:30 +0000248UnresolvedLookupExpr *
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000249UnresolvedLookupExpr::Create(ASTContext &C,
John McCallc373d482010-01-27 01:50:18 +0000250 CXXRecordDecl *NamingClass,
John McCallf7a1a742009-11-24 19:00:30 +0000251 NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000252 SourceRange QualifierRange,
253 const DeclarationNameInfo &NameInfo,
254 bool ADL,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000255 const TemplateArgumentListInfo &Args,
256 UnresolvedSetIterator Begin,
257 UnresolvedSetIterator End)
John McCallf7a1a742009-11-24 19:00:30 +0000258{
259 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
260 ExplicitTemplateArgumentList::sizeFor(Args));
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000261 return new (Mem) UnresolvedLookupExpr(C, NamingClass,
262 Qualifier, QualifierRange, NameInfo,
263 ADL, /*Overload*/ true, &Args,
264 Begin, End);
John McCallf7a1a742009-11-24 19:00:30 +0000265}
266
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000267UnresolvedLookupExpr *
268UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
269 std::size_t size = sizeof(UnresolvedLookupExpr);
270 if (NumTemplateArgs != 0)
271 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
272
Chris Lattner32488542010-10-30 05:14:06 +0000273 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedLookupExpr>());
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000274 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
275 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
276 return E;
277}
278
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000279OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C,
280 NestedNameSpecifier *Qualifier, SourceRange QRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000281 const DeclarationNameInfo &NameInfo,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000282 const TemplateArgumentListInfo *TemplateArgs,
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000283 UnresolvedSetIterator Begin,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000284 UnresolvedSetIterator End,
285 bool KnownDependent,
286 bool KnownContainsUnexpandedParameterPack)
287 : Expr(K, C.OverloadTy, VK_LValue, OK_Ordinary, KnownDependent,
288 KnownDependent,
289 (KnownContainsUnexpandedParameterPack ||
290 NameInfo.containsUnexpandedParameterPack() ||
291 (Qualifier && Qualifier->containsUnexpandedParameterPack()))),
292 Results(0), NumResults(End - Begin), NameInfo(NameInfo),
293 Qualifier(Qualifier), QualifierRange(QRange),
294 HasExplicitTemplateArgs(TemplateArgs != 0)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000295{
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000296 NumResults = End - Begin;
297 if (NumResults) {
298 // Determine whether this expression is type-dependent.
299 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I) {
300 if ((*I)->getDeclContext()->isDependentContext() ||
301 isa<UnresolvedUsingValueDecl>(*I)) {
302 ExprBits.TypeDependent = true;
303 ExprBits.ValueDependent = true;
304 }
305 }
306
307 Results = static_cast<DeclAccessPair *>(
308 C.Allocate(sizeof(DeclAccessPair) * NumResults,
309 llvm::alignOf<DeclAccessPair>()));
310 memcpy(Results, &*Begin.getIterator(),
311 NumResults * sizeof(DeclAccessPair));
312 }
313
314 // If we have explicit template arguments, check for dependent
315 // template arguments and whether they contain any unexpanded pack
316 // expansions.
317 if (TemplateArgs) {
318 bool Dependent = false;
319 bool ContainsUnexpandedParameterPack = false;
320 getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent,
321 ContainsUnexpandedParameterPack);
322
323 if (Dependent) {
324 ExprBits.TypeDependent = true;
325 ExprBits.ValueDependent = true;
326 }
327 if (ContainsUnexpandedParameterPack)
328 ExprBits.ContainsUnexpandedParameterPack = true;
329 }
330
331 if (isTypeDependent())
332 setType(C.DependentTy);
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000333}
334
335void OverloadExpr::initializeResults(ASTContext &C,
336 UnresolvedSetIterator Begin,
337 UnresolvedSetIterator End) {
338 assert(Results == 0 && "Results already initialized!");
339 NumResults = End - Begin;
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000340 if (NumResults) {
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000341 Results = static_cast<DeclAccessPair *>(
342 C.Allocate(sizeof(DeclAccessPair) * NumResults,
343
344 llvm::alignOf<DeclAccessPair>()));
345 memcpy(Results, &*Begin.getIterator(),
346 NumResults * sizeof(DeclAccessPair));
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000347 }
348}
349
John McCalle9ee23e2010-04-22 18:44:12 +0000350CXXRecordDecl *OverloadExpr::getNamingClass() const {
351 if (isa<UnresolvedLookupExpr>(this))
352 return cast<UnresolvedLookupExpr>(this)->getNamingClass();
353 else
354 return cast<UnresolvedMemberExpr>(this)->getNamingClass();
355}
356
John McCallba135432009-11-21 08:51:07 +0000357Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump1eb44332009-09-09 15:08:12 +0000358 return child_iterator();
Douglas Gregor5c37de72008-12-06 00:22:45 +0000359}
John McCallba135432009-11-21 08:51:07 +0000360Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregor5c37de72008-12-06 00:22:45 +0000361 return child_iterator();
362}
Sebastian Redl64b45f72009-01-05 20:52:13 +0000363// UnaryTypeTraitExpr
364Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
365 return child_iterator();
366}
367Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
368 return child_iterator();
369}
370
Francois Pichet6ad6f282010-12-07 00:08:36 +0000371//BinaryTypeTraitExpr
372Stmt::child_iterator BinaryTypeTraitExpr::child_begin() {
373 return child_iterator();
374}
375Stmt::child_iterator BinaryTypeTraitExpr::child_end() {
376 return child_iterator();
377}
378
John McCall865d4472009-11-19 22:55:06 +0000379// DependentScopeDeclRefExpr
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000380DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
381 NestedNameSpecifier *Qualifier,
382 SourceRange QualifierRange,
383 const DeclarationNameInfo &NameInfo,
384 const TemplateArgumentListInfo *Args)
385 : Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary,
386 true, true,
387 (NameInfo.containsUnexpandedParameterPack() ||
388 (Qualifier && Qualifier->containsUnexpandedParameterPack()))),
389 NameInfo(NameInfo), QualifierRange(QualifierRange), Qualifier(Qualifier),
390 HasExplicitTemplateArgs(Args != 0)
391{
392 if (Args) {
393 bool Dependent = true;
394 bool ContainsUnexpandedParameterPack
395 = ExprBits.ContainsUnexpandedParameterPack;
396
397 reinterpret_cast<ExplicitTemplateArgumentList*>(this+1)
398 ->initializeFrom(*Args, Dependent, ContainsUnexpandedParameterPack);
399 ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
400 }
401}
402
John McCallf7a1a742009-11-24 19:00:30 +0000403DependentScopeDeclRefExpr *
404DependentScopeDeclRefExpr::Create(ASTContext &C,
405 NestedNameSpecifier *Qualifier,
406 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000407 const DeclarationNameInfo &NameInfo,
John McCallf7a1a742009-11-24 19:00:30 +0000408 const TemplateArgumentListInfo *Args) {
409 std::size_t size = sizeof(DependentScopeDeclRefExpr);
John McCallf7a1a742009-11-24 19:00:30 +0000410 if (Args)
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000411 size += ExplicitTemplateArgumentList::sizeFor(*Args);
412 void *Mem = C.Allocate(size);
413 return new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
414 Qualifier, QualifierRange,
415 NameInfo, Args);
John McCallf7a1a742009-11-24 19:00:30 +0000416}
417
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000418DependentScopeDeclRefExpr *
419DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
420 unsigned NumTemplateArgs) {
421 std::size_t size = sizeof(DependentScopeDeclRefExpr);
422 if (NumTemplateArgs)
423 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
424 void *Mem = C.Allocate(size);
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000425 return new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(),
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000426 DeclarationNameInfo(), 0);
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000427}
428
John McCall865d4472009-11-19 22:55:06 +0000429StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000430 return child_iterator();
431}
432
John McCall865d4472009-11-19 22:55:06 +0000433StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000434 return child_iterator();
435}
436
Chandler Carruth428edaf2010-10-25 08:47:36 +0000437SourceRange CXXConstructExpr::getSourceRange() const {
Douglas Gregor40749ee2010-11-03 00:35:38 +0000438 if (ParenRange.isValid())
439 return SourceRange(Loc, ParenRange.getEnd());
440
441 SourceLocation End = Loc;
442 for (unsigned I = getNumArgs(); I > 0; --I) {
443 const Expr *Arg = getArg(I-1);
444 if (!Arg->isDefaultArgument()) {
445 SourceLocation NewEnd = Arg->getLocEnd();
446 if (NewEnd.isValid()) {
447 End = NewEnd;
448 break;
449 }
450 }
451 }
452
453 return SourceRange(Loc, End);
Ted Kremeneke3837682009-12-23 04:00:48 +0000454}
455
Douglas Gregorb4609802008-11-14 16:09:21 +0000456SourceRange CXXOperatorCallExpr::getSourceRange() const {
457 OverloadedOperatorKind Kind = getOperator();
458 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
459 if (getNumArgs() == 1)
460 // Prefix operator
Mike Stump1eb44332009-09-09 15:08:12 +0000461 return SourceRange(getOperatorLoc(),
Douglas Gregorb4609802008-11-14 16:09:21 +0000462 getArg(0)->getSourceRange().getEnd());
463 else
464 // Postfix operator
465 return SourceRange(getArg(0)->getSourceRange().getEnd(),
466 getOperatorLoc());
467 } else if (Kind == OO_Call) {
468 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
469 } else if (Kind == OO_Subscript) {
470 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
471 } else if (getNumArgs() == 1) {
472 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
473 } else if (getNumArgs() == 2) {
474 return SourceRange(getArg(0)->getSourceRange().getBegin(),
475 getArg(1)->getSourceRange().getEnd());
476 } else {
477 return SourceRange();
478 }
479}
480
Douglas Gregor88a35142008-12-22 05:46:06 +0000481Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
482 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
483 return MemExpr->getBase();
484
485 // FIXME: Will eventually need to cope with member pointers.
486 return 0;
487}
488
Chandler Carruth007a9b12010-10-27 06:55:41 +0000489CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() {
490 Expr* ThisArg = getImplicitObjectArgument();
491 if (!ThisArg)
492 return 0;
493
494 if (ThisArg->getType()->isAnyPointerType())
495 return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
496
497 return ThisArg->getType()->getAsCXXRecordDecl();
498}
499
Douglas Gregor00b98c22009-11-12 15:31:47 +0000500SourceRange CXXMemberCallExpr::getSourceRange() const {
501 SourceLocation LocStart = getCallee()->getLocStart();
502 if (LocStart.isInvalid() && getNumArgs() > 0)
503 LocStart = getArg(0)->getLocStart();
504 return SourceRange(LocStart, getRParenLoc());
505}
506
507
Douglas Gregor49badde2008-10-27 19:41:14 +0000508//===----------------------------------------------------------------------===//
509// Named casts
510//===----------------------------------------------------------------------===//
511
512/// getCastName - Get the name of the C++ cast being used, e.g.,
513/// "static_cast", "dynamic_cast", "reinterpret_cast", or
514/// "const_cast". The returned pointer must not be freed.
515const char *CXXNamedCastExpr::getCastName() const {
516 switch (getStmtClass()) {
517 case CXXStaticCastExprClass: return "static_cast";
518 case CXXDynamicCastExprClass: return "dynamic_cast";
519 case CXXReinterpretCastExprClass: return "reinterpret_cast";
520 case CXXConstCastExprClass: return "const_cast";
521 default: return "<invalid cast>";
522 }
523}
Douglas Gregor506ae412009-01-16 18:33:17 +0000524
John McCallf871d0c2010-08-07 06:22:56 +0000525CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
John McCallf89e55a2010-11-18 06:31:45 +0000526 ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000527 CastKind K, Expr *Op,
528 const CXXCastPath *BasePath,
529 TypeSourceInfo *WrittenTy,
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000530 SourceLocation L,
531 SourceLocation RParenLoc) {
John McCallf871d0c2010-08-07 06:22:56 +0000532 unsigned PathSize = (BasePath ? BasePath->size() : 0);
533 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
534 + PathSize * sizeof(CXXBaseSpecifier*));
535 CXXStaticCastExpr *E =
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000536 new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
537 RParenLoc);
John McCallf871d0c2010-08-07 06:22:56 +0000538 if (PathSize) E->setCastPath(*BasePath);
539 return E;
540}
541
542CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
543 unsigned PathSize) {
544 void *Buffer =
545 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
546 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
547}
548
549CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
John McCallf89e55a2010-11-18 06:31:45 +0000550 ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000551 CastKind K, Expr *Op,
552 const CXXCastPath *BasePath,
553 TypeSourceInfo *WrittenTy,
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000554 SourceLocation L,
555 SourceLocation RParenLoc) {
John McCallf871d0c2010-08-07 06:22:56 +0000556 unsigned PathSize = (BasePath ? BasePath->size() : 0);
557 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
558 + PathSize * sizeof(CXXBaseSpecifier*));
559 CXXDynamicCastExpr *E =
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000560 new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
561 RParenLoc);
John McCallf871d0c2010-08-07 06:22:56 +0000562 if (PathSize) E->setCastPath(*BasePath);
563 return E;
564}
565
566CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
567 unsigned PathSize) {
568 void *Buffer =
569 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
570 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
571}
572
573CXXReinterpretCastExpr *
John McCallf89e55a2010-11-18 06:31:45 +0000574CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
575 CastKind K, Expr *Op,
John McCallf871d0c2010-08-07 06:22:56 +0000576 const CXXCastPath *BasePath,
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000577 TypeSourceInfo *WrittenTy, SourceLocation L,
578 SourceLocation RParenLoc) {
John McCallf871d0c2010-08-07 06:22:56 +0000579 unsigned PathSize = (BasePath ? BasePath->size() : 0);
580 void *Buffer =
581 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
582 CXXReinterpretCastExpr *E =
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000583 new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
584 RParenLoc);
John McCallf871d0c2010-08-07 06:22:56 +0000585 if (PathSize) E->setCastPath(*BasePath);
586 return E;
587}
588
589CXXReinterpretCastExpr *
590CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
591 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
592 + PathSize * sizeof(CXXBaseSpecifier*));
593 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
594}
595
John McCallf89e55a2010-11-18 06:31:45 +0000596CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T,
597 ExprValueKind VK, Expr *Op,
John McCallf871d0c2010-08-07 06:22:56 +0000598 TypeSourceInfo *WrittenTy,
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000599 SourceLocation L,
600 SourceLocation RParenLoc) {
601 return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L, RParenLoc);
John McCallf871d0c2010-08-07 06:22:56 +0000602}
603
604CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
605 return new (C) CXXConstCastExpr(EmptyShell());
606}
607
608CXXFunctionalCastExpr *
John McCallf89e55a2010-11-18 06:31:45 +0000609CXXFunctionalCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000610 TypeSourceInfo *Written, SourceLocation L,
611 CastKind K, Expr *Op, const CXXCastPath *BasePath,
612 SourceLocation R) {
613 unsigned PathSize = (BasePath ? BasePath->size() : 0);
614 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
615 + PathSize * sizeof(CXXBaseSpecifier*));
616 CXXFunctionalCastExpr *E =
John McCallf89e55a2010-11-18 06:31:45 +0000617 new (Buffer) CXXFunctionalCastExpr(T, VK, Written, L, K, Op, PathSize, R);
John McCallf871d0c2010-08-07 06:22:56 +0000618 if (PathSize) E->setCastPath(*BasePath);
619 return E;
620}
621
622CXXFunctionalCastExpr *
623CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
624 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
625 + PathSize * sizeof(CXXBaseSpecifier*));
626 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
627}
628
629
Douglas Gregor65222e82009-12-23 18:19:08 +0000630CXXDefaultArgExpr *
Douglas Gregor036aed12009-12-23 23:03:06 +0000631CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
632 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor65222e82009-12-23 18:19:08 +0000633 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor036aed12009-12-23 23:03:06 +0000634 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
635 SubExpr);
Douglas Gregor65222e82009-12-23 18:19:08 +0000636}
637
Mike Stump1eb44332009-09-09 15:08:12 +0000638CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonb859f352009-05-30 20:34:37 +0000639 const CXXDestructorDecl *Destructor) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000640 return new (C) CXXTemporary(Destructor);
641}
642
Mike Stump1eb44332009-09-09 15:08:12 +0000643CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000644 CXXTemporary *Temp,
645 Expr* SubExpr) {
Mike Stump1eb44332009-09-09 15:08:12 +0000646 assert(SubExpr->getType()->isRecordType() &&
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000647 "Expression bound to a temporary must have record type!");
648
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000649 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000650}
651
Anders Carlsson8e587a12009-05-30 20:56:46 +0000652CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson26de5492009-04-24 05:23:13 +0000653 CXXConstructorDecl *Cons,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000654 TypeSourceInfo *Type,
Douglas Gregor506ae412009-01-16 18:33:17 +0000655 Expr **Args,
Mike Stump1eb44332009-09-09 15:08:12 +0000656 unsigned NumArgs,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000657 SourceRange parenRange,
Douglas Gregor1c63b9c2010-04-27 20:36:09 +0000658 bool ZeroInitialization)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000659 : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
660 Type->getType().getNonReferenceType(),
661 Type->getTypeLoc().getBeginLoc(),
Chandler Carruth428edaf2010-10-25 08:47:36 +0000662 Cons, false, Args, NumArgs, ZeroInitialization,
663 CXXConstructExpr::CK_Complete, parenRange),
664 Type(Type) {
Douglas Gregorab6677e2010-09-08 00:15:04 +0000665}
666
667SourceRange CXXTemporaryObjectExpr::getSourceRange() const {
Chandler Carruth428edaf2010-10-25 08:47:36 +0000668 return SourceRange(Type->getTypeLoc().getBeginLoc(),
669 getParenRange().getEnd());
Douglas Gregor506ae412009-01-16 18:33:17 +0000670}
Anders Carlsson19d28a62009-04-21 02:22:11 +0000671
Mike Stump1eb44332009-09-09 15:08:12 +0000672CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000673 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000674 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000675 Expr **Args, unsigned NumArgs,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000676 bool ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000677 ConstructionKind ConstructKind,
678 SourceRange ParenRange) {
Douglas Gregor99a2e602009-12-16 01:38:02 +0000679 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000680 Elidable, Args, NumArgs, ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000681 ConstructKind, ParenRange);
Anders Carlssone349bea2009-04-23 02:32:43 +0000682}
683
Mike Stump1eb44332009-09-09 15:08:12 +0000684CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000685 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000686 CXXConstructorDecl *D, bool elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000687 Expr **args, unsigned numargs,
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000688 bool ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000689 ConstructionKind ConstructKind,
690 SourceRange ParenRange)
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000691 : Expr(SC, T, VK_RValue, OK_Ordinary,
692 T->isDependentType(), T->isDependentType(),
693 T->containsUnexpandedParameterPack()),
694 Constructor(D), Loc(Loc), ParenRange(ParenRange), Elidable(elidable),
695 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
696 Args(0), NumArgs(numargs)
Douglas Gregor16006c92009-12-16 18:50:27 +0000697{
698 if (NumArgs) {
699 Args = new (C) Stmt*[NumArgs];
700
701 for (unsigned i = 0; i != NumArgs; ++i) {
702 assert(args[i] && "NULL argument in CXXConstructExpr");
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000703
704 if (args[i]->isValueDependent())
705 ExprBits.ValueDependent = true;
706 if (args[i]->containsUnexpandedParameterPack())
707 ExprBits.ContainsUnexpandedParameterPack = true;
708
Douglas Gregor16006c92009-12-16 18:50:27 +0000709 Args[i] = args[i];
Anders Carlssone349bea2009-04-23 02:32:43 +0000710 }
Douglas Gregor16006c92009-12-16 18:50:27 +0000711 }
Anders Carlssone349bea2009-04-23 02:32:43 +0000712}
713
John McCall4765fa02010-12-06 08:20:24 +0000714ExprWithCleanups::ExprWithCleanups(ASTContext &C,
715 Expr *subexpr,
716 CXXTemporary **temps,
717 unsigned numtemps)
718 : Expr(ExprWithCleanupsClass, subexpr->getType(),
John McCallf89e55a2010-11-18 06:31:45 +0000719 subexpr->getValueKind(), subexpr->getObjectKind(),
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000720 subexpr->isTypeDependent(), subexpr->isValueDependent(),
721 subexpr->containsUnexpandedParameterPack()),
Chris Lattnerd2598362010-05-10 00:25:06 +0000722 SubExpr(subexpr), Temps(0), NumTemps(0) {
Chris Lattneraff32cb2010-05-10 00:45:12 +0000723 if (numtemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000724 setNumTemporaries(C, numtemps);
Chris Lattnerd2598362010-05-10 00:25:06 +0000725 for (unsigned i = 0; i != numtemps; ++i)
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000726 Temps[i] = temps[i];
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000727 }
728}
729
John McCall4765fa02010-12-06 08:20:24 +0000730void ExprWithCleanups::setNumTemporaries(ASTContext &C, unsigned N) {
Chris Lattnerd2598362010-05-10 00:25:06 +0000731 assert(Temps == 0 && "Cannot resize with this");
Daniel Dunbar90556d42010-05-10 15:59:37 +0000732 NumTemps = N;
Ted Kremenekd04ed412010-05-10 20:06:30 +0000733 Temps = new (C) CXXTemporary*[NumTemps];
Chris Lattnerd2598362010-05-10 00:25:06 +0000734}
735
736
John McCall4765fa02010-12-06 08:20:24 +0000737ExprWithCleanups *ExprWithCleanups::Create(ASTContext &C,
738 Expr *SubExpr,
739 CXXTemporary **Temps,
740 unsigned NumTemps) {
741 return new (C) ExprWithCleanups(C, SubExpr, Temps, NumTemps);
Anders Carlsson88eaf072009-05-30 22:38:53 +0000742}
743
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000744// CXXBindTemporaryExpr
745Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
746 return &SubExpr;
747}
748
Mike Stump1eb44332009-09-09 15:08:12 +0000749Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000750 return &SubExpr + 1;
751}
752
Anders Carlssone349bea2009-04-23 02:32:43 +0000753// CXXConstructExpr
754Stmt::child_iterator CXXConstructExpr::child_begin() {
755 return &Args[0];
756}
757Stmt::child_iterator CXXConstructExpr::child_end() {
758 return &Args[0]+NumArgs;
759}
760
John McCall4765fa02010-12-06 08:20:24 +0000761// ExprWithCleanups
762Stmt::child_iterator ExprWithCleanups::child_begin() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000763 return &SubExpr;
Anders Carlsson19d28a62009-04-21 02:22:11 +0000764}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000765
John McCall4765fa02010-12-06 08:20:24 +0000766Stmt::child_iterator ExprWithCleanups::child_end() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000767 return &SubExpr + 1;
768}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000769
Douglas Gregorab6677e2010-09-08 00:15:04 +0000770CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000771 SourceLocation LParenLoc,
772 Expr **Args,
773 unsigned NumArgs,
774 SourceLocation RParenLoc)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000775 : Expr(CXXUnresolvedConstructExprClass,
776 Type->getType().getNonReferenceType(),
John McCall09431682010-11-18 19:01:18 +0000777 VK_LValue, OK_Ordinary,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000778 Type->getType()->isDependentType(), true,
779 Type->getType()->containsUnexpandedParameterPack()),
Douglas Gregorab6677e2010-09-08 00:15:04 +0000780 Type(Type),
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000781 LParenLoc(LParenLoc),
782 RParenLoc(RParenLoc),
783 NumArgs(NumArgs) {
784 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000785 for (unsigned I = 0; I != NumArgs; ++I) {
786 if (Args[I]->containsUnexpandedParameterPack())
787 ExprBits.ContainsUnexpandedParameterPack = true;
788
789 StoredArgs[I] = Args[I];
790 }
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000791}
792
793CXXUnresolvedConstructExpr *
Mike Stump1eb44332009-09-09 15:08:12 +0000794CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000795 TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000796 SourceLocation LParenLoc,
797 Expr **Args,
798 unsigned NumArgs,
799 SourceLocation RParenLoc) {
800 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
801 sizeof(Expr *) * NumArgs);
Douglas Gregorab6677e2010-09-08 00:15:04 +0000802 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000803 Args, NumArgs, RParenLoc);
804}
805
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000806CXXUnresolvedConstructExpr *
807CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
808 Stmt::EmptyShell Empty;
809 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
810 sizeof(Expr *) * NumArgs);
811 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
812}
813
Douglas Gregorab6677e2010-09-08 00:15:04 +0000814SourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
815 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
816}
817
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000818Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
819 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
820}
821
822Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
823 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
824}
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000825
John McCall865d4472009-11-19 22:55:06 +0000826CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000827 Expr *Base, QualType BaseType,
828 bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000829 SourceLocation OperatorLoc,
830 NestedNameSpecifier *Qualifier,
831 SourceRange QualifierRange,
832 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000833 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000834 const TemplateArgumentListInfo *TemplateArgs)
John McCallf89e55a2010-11-18 06:31:45 +0000835 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000836 VK_LValue, OK_Ordinary, true, true,
837 ((Base && Base->containsUnexpandedParameterPack()) ||
838 (Qualifier && Qualifier->containsUnexpandedParameterPack()) ||
839 MemberNameInfo.containsUnexpandedParameterPack())),
John McCallaa81e162009-12-01 22:10:20 +0000840 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
841 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000842 OperatorLoc(OperatorLoc),
843 Qualifier(Qualifier), QualifierRange(QualifierRange),
844 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Abramo Bagnara25777432010-08-11 22:01:17 +0000845 MemberNameInfo(MemberNameInfo) {
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000846 if (TemplateArgs) {
847 bool Dependent = true;
848 bool ContainsUnexpandedParameterPack = false;
849 getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent,
850 ContainsUnexpandedParameterPack);
851 if (ContainsUnexpandedParameterPack)
852 ExprBits.ContainsUnexpandedParameterPack = true;
853 }
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000854}
855
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000856CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
857 Expr *Base, QualType BaseType,
858 bool IsArrow,
859 SourceLocation OperatorLoc,
860 NestedNameSpecifier *Qualifier,
861 SourceRange QualifierRange,
862 NamedDecl *FirstQualifierFoundInScope,
863 DeclarationNameInfo MemberNameInfo)
864 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
865 VK_LValue, OK_Ordinary, true, true,
866 ((Base && Base->containsUnexpandedParameterPack()) ||
867 (Qualifier && Qualifier->containsUnexpandedParameterPack()) ||
868 MemberNameInfo.containsUnexpandedParameterPack())),
869 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
870 HasExplicitTemplateArgs(false), OperatorLoc(OperatorLoc),
871 Qualifier(Qualifier), QualifierRange(QualifierRange),
872 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
873 MemberNameInfo(MemberNameInfo) { }
874
John McCall865d4472009-11-19 22:55:06 +0000875CXXDependentScopeMemberExpr *
876CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000877 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000878 SourceLocation OperatorLoc,
879 NestedNameSpecifier *Qualifier,
880 SourceRange QualifierRange,
881 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000882 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000883 const TemplateArgumentListInfo *TemplateArgs) {
884 if (!TemplateArgs)
John McCallaa81e162009-12-01 22:10:20 +0000885 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
886 IsArrow, OperatorLoc,
887 Qualifier, QualifierRange,
888 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000889 MemberNameInfo);
Mike Stump1eb44332009-09-09 15:08:12 +0000890
John McCalld5532b62009-11-23 01:53:49 +0000891 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
892 if (TemplateArgs)
893 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
894
Chris Lattner32488542010-10-30 05:14:06 +0000895 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
John McCallaa81e162009-12-01 22:10:20 +0000896 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
897 IsArrow, OperatorLoc,
898 Qualifier, QualifierRange,
899 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000900 MemberNameInfo, TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000901}
902
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000903CXXDependentScopeMemberExpr *
904CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
905 unsigned NumTemplateArgs) {
906 if (NumTemplateArgs == 0)
907 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
908 0, SourceLocation(), 0,
909 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000910 DeclarationNameInfo());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000911
912 std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
913 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
Chris Lattner32488542010-10-30 05:14:06 +0000914 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000915 CXXDependentScopeMemberExpr *E
916 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
917 0, SourceLocation(), 0,
918 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000919 DeclarationNameInfo(), 0);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000920 E->HasExplicitTemplateArgs = true;
921 return E;
922}
923
John McCall865d4472009-11-19 22:55:06 +0000924Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000925 return child_iterator(&Base);
926}
927
John McCall865d4472009-11-19 22:55:06 +0000928Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000929 if (isImplicitAccess())
930 return child_iterator(&Base);
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000931 return child_iterator(&Base + 1);
932}
John McCall129e2df2009-11-30 22:42:35 +0000933
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000934UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C,
John McCall129e2df2009-11-30 22:42:35 +0000935 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000936 Expr *Base, QualType BaseType,
937 bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000938 SourceLocation OperatorLoc,
939 NestedNameSpecifier *Qualifier,
940 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000941 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000942 const TemplateArgumentListInfo *TemplateArgs,
943 UnresolvedSetIterator Begin,
944 UnresolvedSetIterator End)
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000945 : OverloadExpr(UnresolvedMemberExprClass, C,
Abramo Bagnara25777432010-08-11 22:01:17 +0000946 Qualifier, QualifierRange, MemberNameInfo,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000947 TemplateArgs, Begin, End,
948 // Dependent
949 ((Base && Base->isTypeDependent()) ||
950 BaseType->isDependentType()),
951 // Contains unexpanded parameter pack
952 ((Base && Base->containsUnexpandedParameterPack()) ||
953 BaseType->containsUnexpandedParameterPack())),
John McCall7bb12da2010-02-02 06:20:04 +0000954 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
955 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
John McCall129e2df2009-11-30 22:42:35 +0000956}
957
958UnresolvedMemberExpr *
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000959UnresolvedMemberExpr::Create(ASTContext &C,
John McCall129e2df2009-11-30 22:42:35 +0000960 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000961 Expr *Base, QualType BaseType, bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000962 SourceLocation OperatorLoc,
963 NestedNameSpecifier *Qualifier,
964 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000965 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000966 const TemplateArgumentListInfo *TemplateArgs,
967 UnresolvedSetIterator Begin,
968 UnresolvedSetIterator End) {
John McCall129e2df2009-11-30 22:42:35 +0000969 std::size_t size = sizeof(UnresolvedMemberExpr);
970 if (TemplateArgs)
971 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
972
Chris Lattner32488542010-10-30 05:14:06 +0000973 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000974 return new (Mem) UnresolvedMemberExpr(C,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000975 HasUnresolvedUsing, Base, BaseType,
John McCallaa81e162009-12-01 22:10:20 +0000976 IsArrow, OperatorLoc, Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000977 MemberNameInfo, TemplateArgs, Begin, End);
John McCall129e2df2009-11-30 22:42:35 +0000978}
979
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000980UnresolvedMemberExpr *
981UnresolvedMemberExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
982 std::size_t size = sizeof(UnresolvedMemberExpr);
983 if (NumTemplateArgs != 0)
984 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
985
Chris Lattner32488542010-10-30 05:14:06 +0000986 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000987 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
988 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
989 return E;
990}
991
John McCallc373d482010-01-27 01:50:18 +0000992CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
993 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
994
995 // If there was a nested name specifier, it names the naming class.
996 // It can't be dependent: after all, we were actually able to do the
997 // lookup.
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000998 CXXRecordDecl *Record = 0;
John McCall7bb12da2010-02-02 06:20:04 +0000999 if (getQualifier()) {
John McCallf4c73712011-01-19 06:33:43 +00001000 const Type *T = getQualifier()->getAsType();
John McCallc373d482010-01-27 01:50:18 +00001001 assert(T && "qualifier in member expression does not name type");
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001002 Record = T->getAsCXXRecordDecl();
1003 assert(Record && "qualifier in member expression does not name record");
1004 }
John McCallc373d482010-01-27 01:50:18 +00001005 // Otherwise the naming class must have been the base class.
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001006 else {
John McCallc373d482010-01-27 01:50:18 +00001007 QualType BaseType = getBaseType().getNonReferenceType();
1008 if (isArrow()) {
1009 const PointerType *PT = BaseType->getAs<PointerType>();
1010 assert(PT && "base of arrow member access is not pointer");
1011 BaseType = PT->getPointeeType();
1012 }
1013
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001014 Record = BaseType->getAsCXXRecordDecl();
1015 assert(Record && "base of member expression does not name record");
John McCallc373d482010-01-27 01:50:18 +00001016 }
1017
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001018 return Record;
John McCallc373d482010-01-27 01:50:18 +00001019}
1020
John McCall129e2df2009-11-30 22:42:35 +00001021Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
1022 return child_iterator(&Base);
1023}
1024
1025Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +00001026 if (isImplicitAccess())
1027 return child_iterator(&Base);
John McCall129e2df2009-11-30 22:42:35 +00001028 return child_iterator(&Base + 1);
1029}
Sebastian Redl2e156222010-09-10 20:55:43 +00001030
1031Stmt::child_iterator CXXNoexceptExpr::child_begin() {
1032 return child_iterator(&Operand);
1033}
1034Stmt::child_iterator CXXNoexceptExpr::child_end() {
1035 return child_iterator(&Operand + 1);
1036}
Douglas Gregorbe230c32011-01-03 17:17:50 +00001037
1038SourceRange PackExpansionExpr::getSourceRange() const {
1039 return SourceRange(Pattern->getLocStart(), EllipsisLoc);
1040}
1041
1042Stmt::child_iterator PackExpansionExpr::child_begin() {
1043 return child_iterator(&Pattern);
1044}
1045
1046Stmt::child_iterator PackExpansionExpr::child_end() {
1047 return child_iterator(&Pattern + 1);
1048}
Douglas Gregoree8aff02011-01-04 17:33:58 +00001049
1050SourceRange SizeOfPackExpr::getSourceRange() const {
1051 return SourceRange(OperatorLoc, RParenLoc);
1052}
1053
1054Stmt::child_iterator SizeOfPackExpr::child_begin() {
1055 return child_iterator();
1056}
1057
1058Stmt::child_iterator SizeOfPackExpr::child_end() {
1059 return child_iterator();
1060}
Douglas Gregorc7793c72011-01-15 01:15:58 +00001061
1062SubstNonTypeTemplateParmPackExpr::
1063SubstNonTypeTemplateParmPackExpr(QualType T,
1064 NonTypeTemplateParmDecl *Param,
1065 SourceLocation NameLoc,
1066 const TemplateArgument &ArgPack)
1067 : Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary,
1068 true, false, true),
1069 Param(Param), Arguments(ArgPack.pack_begin()),
1070 NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) { }
1071
1072TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const {
1073 return TemplateArgument(Arguments, NumArguments);
1074}
1075
1076SourceRange SubstNonTypeTemplateParmPackExpr::getSourceRange() const {
1077 return NameLoc;
1078}
1079
1080Stmt::child_iterator SubstNonTypeTemplateParmPackExpr::child_begin() {
1081 return child_iterator();
1082}
1083
1084Stmt::child_iterator SubstNonTypeTemplateParmPackExpr::child_end() {
1085 return child_iterator();
1086}
1087
1088