blob: a11d05a3a769fde06ac820bc7c77b3ae19923650 [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 *
Douglas Gregordef03542011-02-04 12:01:24 +0000268UnresolvedLookupExpr::CreateEmpty(ASTContext &C, bool HasExplicitTemplateArgs,
269 unsigned NumTemplateArgs) {
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000270 std::size_t size = sizeof(UnresolvedLookupExpr);
Douglas Gregordef03542011-02-04 12:01:24 +0000271 if (HasExplicitTemplateArgs)
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000272 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
273
Chris Lattner32488542010-10-30 05:14:06 +0000274 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedLookupExpr>());
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000275 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
Douglas Gregordef03542011-02-04 12:01:24 +0000276 E->HasExplicitTemplateArgs = HasExplicitTemplateArgs;
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000277 return E;
278}
279
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000280OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C,
281 NestedNameSpecifier *Qualifier, SourceRange QRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000282 const DeclarationNameInfo &NameInfo,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000283 const TemplateArgumentListInfo *TemplateArgs,
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000284 UnresolvedSetIterator Begin,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000285 UnresolvedSetIterator End,
286 bool KnownDependent,
287 bool KnownContainsUnexpandedParameterPack)
288 : Expr(K, C.OverloadTy, VK_LValue, OK_Ordinary, KnownDependent,
289 KnownDependent,
290 (KnownContainsUnexpandedParameterPack ||
291 NameInfo.containsUnexpandedParameterPack() ||
292 (Qualifier && Qualifier->containsUnexpandedParameterPack()))),
293 Results(0), NumResults(End - Begin), NameInfo(NameInfo),
294 Qualifier(Qualifier), QualifierRange(QRange),
295 HasExplicitTemplateArgs(TemplateArgs != 0)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000296{
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000297 NumResults = End - Begin;
298 if (NumResults) {
299 // Determine whether this expression is type-dependent.
300 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I) {
301 if ((*I)->getDeclContext()->isDependentContext() ||
302 isa<UnresolvedUsingValueDecl>(*I)) {
303 ExprBits.TypeDependent = true;
304 ExprBits.ValueDependent = true;
305 }
306 }
307
308 Results = static_cast<DeclAccessPair *>(
309 C.Allocate(sizeof(DeclAccessPair) * NumResults,
310 llvm::alignOf<DeclAccessPair>()));
311 memcpy(Results, &*Begin.getIterator(),
312 NumResults * sizeof(DeclAccessPair));
313 }
314
315 // If we have explicit template arguments, check for dependent
316 // template arguments and whether they contain any unexpanded pack
317 // expansions.
318 if (TemplateArgs) {
319 bool Dependent = false;
320 bool ContainsUnexpandedParameterPack = false;
321 getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent,
322 ContainsUnexpandedParameterPack);
323
324 if (Dependent) {
325 ExprBits.TypeDependent = true;
326 ExprBits.ValueDependent = true;
327 }
328 if (ContainsUnexpandedParameterPack)
329 ExprBits.ContainsUnexpandedParameterPack = true;
330 }
331
332 if (isTypeDependent())
333 setType(C.DependentTy);
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000334}
335
336void OverloadExpr::initializeResults(ASTContext &C,
337 UnresolvedSetIterator Begin,
338 UnresolvedSetIterator End) {
339 assert(Results == 0 && "Results already initialized!");
340 NumResults = End - Begin;
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000341 if (NumResults) {
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000342 Results = static_cast<DeclAccessPair *>(
343 C.Allocate(sizeof(DeclAccessPair) * NumResults,
344
345 llvm::alignOf<DeclAccessPair>()));
346 memcpy(Results, &*Begin.getIterator(),
347 NumResults * sizeof(DeclAccessPair));
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000348 }
349}
350
John McCalle9ee23e2010-04-22 18:44:12 +0000351CXXRecordDecl *OverloadExpr::getNamingClass() const {
352 if (isa<UnresolvedLookupExpr>(this))
353 return cast<UnresolvedLookupExpr>(this)->getNamingClass();
354 else
355 return cast<UnresolvedMemberExpr>(this)->getNamingClass();
356}
357
John McCallba135432009-11-21 08:51:07 +0000358Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump1eb44332009-09-09 15:08:12 +0000359 return child_iterator();
Douglas Gregor5c37de72008-12-06 00:22:45 +0000360}
John McCallba135432009-11-21 08:51:07 +0000361Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregor5c37de72008-12-06 00:22:45 +0000362 return child_iterator();
363}
Sebastian Redl64b45f72009-01-05 20:52:13 +0000364// UnaryTypeTraitExpr
365Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
366 return child_iterator();
367}
368Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
369 return child_iterator();
370}
371
Francois Pichet6ad6f282010-12-07 00:08:36 +0000372//BinaryTypeTraitExpr
373Stmt::child_iterator BinaryTypeTraitExpr::child_begin() {
374 return child_iterator();
375}
376Stmt::child_iterator BinaryTypeTraitExpr::child_end() {
377 return child_iterator();
378}
379
John McCall865d4472009-11-19 22:55:06 +0000380// DependentScopeDeclRefExpr
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000381DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
382 NestedNameSpecifier *Qualifier,
383 SourceRange QualifierRange,
384 const DeclarationNameInfo &NameInfo,
385 const TemplateArgumentListInfo *Args)
386 : Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary,
387 true, true,
388 (NameInfo.containsUnexpandedParameterPack() ||
389 (Qualifier && Qualifier->containsUnexpandedParameterPack()))),
390 NameInfo(NameInfo), QualifierRange(QualifierRange), Qualifier(Qualifier),
391 HasExplicitTemplateArgs(Args != 0)
392{
393 if (Args) {
394 bool Dependent = true;
395 bool ContainsUnexpandedParameterPack
396 = ExprBits.ContainsUnexpandedParameterPack;
397
398 reinterpret_cast<ExplicitTemplateArgumentList*>(this+1)
399 ->initializeFrom(*Args, Dependent, ContainsUnexpandedParameterPack);
400 ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
401 }
402}
403
John McCallf7a1a742009-11-24 19:00:30 +0000404DependentScopeDeclRefExpr *
405DependentScopeDeclRefExpr::Create(ASTContext &C,
406 NestedNameSpecifier *Qualifier,
407 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000408 const DeclarationNameInfo &NameInfo,
John McCallf7a1a742009-11-24 19:00:30 +0000409 const TemplateArgumentListInfo *Args) {
410 std::size_t size = sizeof(DependentScopeDeclRefExpr);
John McCallf7a1a742009-11-24 19:00:30 +0000411 if (Args)
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000412 size += ExplicitTemplateArgumentList::sizeFor(*Args);
413 void *Mem = C.Allocate(size);
414 return new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
415 Qualifier, QualifierRange,
416 NameInfo, Args);
John McCallf7a1a742009-11-24 19:00:30 +0000417}
418
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000419DependentScopeDeclRefExpr *
420DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
Douglas Gregordef03542011-02-04 12:01:24 +0000421 bool HasExplicitTemplateArgs,
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000422 unsigned NumTemplateArgs) {
423 std::size_t size = sizeof(DependentScopeDeclRefExpr);
Douglas Gregordef03542011-02-04 12:01:24 +0000424 if (HasExplicitTemplateArgs)
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000425 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
426 void *Mem = C.Allocate(size);
Douglas Gregordef03542011-02-04 12:01:24 +0000427 DependentScopeDeclRefExpr *E
428 = new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(),
429 DeclarationNameInfo(), 0);
430 E->HasExplicitTemplateArgs = HasExplicitTemplateArgs;
431 return E;
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000432}
433
John McCall865d4472009-11-19 22:55:06 +0000434StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000435 return child_iterator();
436}
437
John McCall865d4472009-11-19 22:55:06 +0000438StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000439 return child_iterator();
440}
441
Chandler Carruth428edaf2010-10-25 08:47:36 +0000442SourceRange CXXConstructExpr::getSourceRange() const {
Douglas Gregor40749ee2010-11-03 00:35:38 +0000443 if (ParenRange.isValid())
444 return SourceRange(Loc, ParenRange.getEnd());
445
446 SourceLocation End = Loc;
447 for (unsigned I = getNumArgs(); I > 0; --I) {
448 const Expr *Arg = getArg(I-1);
449 if (!Arg->isDefaultArgument()) {
450 SourceLocation NewEnd = Arg->getLocEnd();
451 if (NewEnd.isValid()) {
452 End = NewEnd;
453 break;
454 }
455 }
456 }
457
458 return SourceRange(Loc, End);
Ted Kremeneke3837682009-12-23 04:00:48 +0000459}
460
Douglas Gregorb4609802008-11-14 16:09:21 +0000461SourceRange CXXOperatorCallExpr::getSourceRange() const {
462 OverloadedOperatorKind Kind = getOperator();
463 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
464 if (getNumArgs() == 1)
465 // Prefix operator
Mike Stump1eb44332009-09-09 15:08:12 +0000466 return SourceRange(getOperatorLoc(),
Douglas Gregorb4609802008-11-14 16:09:21 +0000467 getArg(0)->getSourceRange().getEnd());
468 else
469 // Postfix operator
470 return SourceRange(getArg(0)->getSourceRange().getEnd(),
471 getOperatorLoc());
472 } else if (Kind == OO_Call) {
473 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
474 } else if (Kind == OO_Subscript) {
475 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
476 } else if (getNumArgs() == 1) {
477 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
478 } else if (getNumArgs() == 2) {
479 return SourceRange(getArg(0)->getSourceRange().getBegin(),
480 getArg(1)->getSourceRange().getEnd());
481 } else {
482 return SourceRange();
483 }
484}
485
Douglas Gregor88a35142008-12-22 05:46:06 +0000486Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
487 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
488 return MemExpr->getBase();
489
490 // FIXME: Will eventually need to cope with member pointers.
491 return 0;
492}
493
Chandler Carruth007a9b12010-10-27 06:55:41 +0000494CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() {
495 Expr* ThisArg = getImplicitObjectArgument();
496 if (!ThisArg)
497 return 0;
498
499 if (ThisArg->getType()->isAnyPointerType())
500 return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
501
502 return ThisArg->getType()->getAsCXXRecordDecl();
503}
504
Douglas Gregor00b98c22009-11-12 15:31:47 +0000505SourceRange CXXMemberCallExpr::getSourceRange() const {
506 SourceLocation LocStart = getCallee()->getLocStart();
507 if (LocStart.isInvalid() && getNumArgs() > 0)
508 LocStart = getArg(0)->getLocStart();
509 return SourceRange(LocStart, getRParenLoc());
510}
511
512
Douglas Gregor49badde2008-10-27 19:41:14 +0000513//===----------------------------------------------------------------------===//
514// Named casts
515//===----------------------------------------------------------------------===//
516
517/// getCastName - Get the name of the C++ cast being used, e.g.,
518/// "static_cast", "dynamic_cast", "reinterpret_cast", or
519/// "const_cast". The returned pointer must not be freed.
520const char *CXXNamedCastExpr::getCastName() const {
521 switch (getStmtClass()) {
522 case CXXStaticCastExprClass: return "static_cast";
523 case CXXDynamicCastExprClass: return "dynamic_cast";
524 case CXXReinterpretCastExprClass: return "reinterpret_cast";
525 case CXXConstCastExprClass: return "const_cast";
526 default: return "<invalid cast>";
527 }
528}
Douglas Gregor506ae412009-01-16 18:33:17 +0000529
John McCallf871d0c2010-08-07 06:22:56 +0000530CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
John McCallf89e55a2010-11-18 06:31:45 +0000531 ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000532 CastKind K, Expr *Op,
533 const CXXCastPath *BasePath,
534 TypeSourceInfo *WrittenTy,
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000535 SourceLocation L,
536 SourceLocation RParenLoc) {
John McCallf871d0c2010-08-07 06:22:56 +0000537 unsigned PathSize = (BasePath ? BasePath->size() : 0);
538 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
539 + PathSize * sizeof(CXXBaseSpecifier*));
540 CXXStaticCastExpr *E =
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000541 new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
542 RParenLoc);
John McCallf871d0c2010-08-07 06:22:56 +0000543 if (PathSize) E->setCastPath(*BasePath);
544 return E;
545}
546
547CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
548 unsigned PathSize) {
549 void *Buffer =
550 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
551 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
552}
553
554CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
John McCallf89e55a2010-11-18 06:31:45 +0000555 ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000556 CastKind K, Expr *Op,
557 const CXXCastPath *BasePath,
558 TypeSourceInfo *WrittenTy,
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000559 SourceLocation L,
560 SourceLocation RParenLoc) {
John McCallf871d0c2010-08-07 06:22:56 +0000561 unsigned PathSize = (BasePath ? BasePath->size() : 0);
562 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
563 + PathSize * sizeof(CXXBaseSpecifier*));
564 CXXDynamicCastExpr *E =
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000565 new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
566 RParenLoc);
John McCallf871d0c2010-08-07 06:22:56 +0000567 if (PathSize) E->setCastPath(*BasePath);
568 return E;
569}
570
571CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
572 unsigned PathSize) {
573 void *Buffer =
574 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
575 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
576}
577
578CXXReinterpretCastExpr *
John McCallf89e55a2010-11-18 06:31:45 +0000579CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
580 CastKind K, Expr *Op,
John McCallf871d0c2010-08-07 06:22:56 +0000581 const CXXCastPath *BasePath,
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000582 TypeSourceInfo *WrittenTy, SourceLocation L,
583 SourceLocation RParenLoc) {
John McCallf871d0c2010-08-07 06:22:56 +0000584 unsigned PathSize = (BasePath ? BasePath->size() : 0);
585 void *Buffer =
586 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
587 CXXReinterpretCastExpr *E =
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000588 new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
589 RParenLoc);
John McCallf871d0c2010-08-07 06:22:56 +0000590 if (PathSize) E->setCastPath(*BasePath);
591 return E;
592}
593
594CXXReinterpretCastExpr *
595CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
596 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
597 + PathSize * sizeof(CXXBaseSpecifier*));
598 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
599}
600
John McCallf89e55a2010-11-18 06:31:45 +0000601CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T,
602 ExprValueKind VK, Expr *Op,
John McCallf871d0c2010-08-07 06:22:56 +0000603 TypeSourceInfo *WrittenTy,
Douglas Gregor1d5d0b92011-01-12 22:41:29 +0000604 SourceLocation L,
605 SourceLocation RParenLoc) {
606 return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L, RParenLoc);
John McCallf871d0c2010-08-07 06:22:56 +0000607}
608
609CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
610 return new (C) CXXConstCastExpr(EmptyShell());
611}
612
613CXXFunctionalCastExpr *
John McCallf89e55a2010-11-18 06:31:45 +0000614CXXFunctionalCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000615 TypeSourceInfo *Written, SourceLocation L,
616 CastKind K, Expr *Op, const CXXCastPath *BasePath,
617 SourceLocation R) {
618 unsigned PathSize = (BasePath ? BasePath->size() : 0);
619 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
620 + PathSize * sizeof(CXXBaseSpecifier*));
621 CXXFunctionalCastExpr *E =
John McCallf89e55a2010-11-18 06:31:45 +0000622 new (Buffer) CXXFunctionalCastExpr(T, VK, Written, L, K, Op, PathSize, R);
John McCallf871d0c2010-08-07 06:22:56 +0000623 if (PathSize) E->setCastPath(*BasePath);
624 return E;
625}
626
627CXXFunctionalCastExpr *
628CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
629 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
630 + PathSize * sizeof(CXXBaseSpecifier*));
631 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
632}
633
634
Douglas Gregor65222e82009-12-23 18:19:08 +0000635CXXDefaultArgExpr *
Douglas Gregor036aed12009-12-23 23:03:06 +0000636CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
637 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor65222e82009-12-23 18:19:08 +0000638 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor036aed12009-12-23 23:03:06 +0000639 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
640 SubExpr);
Douglas Gregor65222e82009-12-23 18:19:08 +0000641}
642
Mike Stump1eb44332009-09-09 15:08:12 +0000643CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonb859f352009-05-30 20:34:37 +0000644 const CXXDestructorDecl *Destructor) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000645 return new (C) CXXTemporary(Destructor);
646}
647
Mike Stump1eb44332009-09-09 15:08:12 +0000648CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000649 CXXTemporary *Temp,
650 Expr* SubExpr) {
Mike Stump1eb44332009-09-09 15:08:12 +0000651 assert(SubExpr->getType()->isRecordType() &&
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000652 "Expression bound to a temporary must have record type!");
653
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000654 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000655}
656
Anders Carlsson8e587a12009-05-30 20:56:46 +0000657CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson26de5492009-04-24 05:23:13 +0000658 CXXConstructorDecl *Cons,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000659 TypeSourceInfo *Type,
Douglas Gregor506ae412009-01-16 18:33:17 +0000660 Expr **Args,
Mike Stump1eb44332009-09-09 15:08:12 +0000661 unsigned NumArgs,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000662 SourceRange parenRange,
Douglas Gregor1c63b9c2010-04-27 20:36:09 +0000663 bool ZeroInitialization)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000664 : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
665 Type->getType().getNonReferenceType(),
666 Type->getTypeLoc().getBeginLoc(),
Chandler Carruth428edaf2010-10-25 08:47:36 +0000667 Cons, false, Args, NumArgs, ZeroInitialization,
668 CXXConstructExpr::CK_Complete, parenRange),
669 Type(Type) {
Douglas Gregorab6677e2010-09-08 00:15:04 +0000670}
671
672SourceRange CXXTemporaryObjectExpr::getSourceRange() const {
Chandler Carruth428edaf2010-10-25 08:47:36 +0000673 return SourceRange(Type->getTypeLoc().getBeginLoc(),
674 getParenRange().getEnd());
Douglas Gregor506ae412009-01-16 18:33:17 +0000675}
Anders Carlsson19d28a62009-04-21 02:22:11 +0000676
Mike Stump1eb44332009-09-09 15:08:12 +0000677CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000678 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000679 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000680 Expr **Args, unsigned NumArgs,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000681 bool ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000682 ConstructionKind ConstructKind,
683 SourceRange ParenRange) {
Douglas Gregor99a2e602009-12-16 01:38:02 +0000684 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000685 Elidable, Args, NumArgs, ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000686 ConstructKind, ParenRange);
Anders Carlssone349bea2009-04-23 02:32:43 +0000687}
688
Mike Stump1eb44332009-09-09 15:08:12 +0000689CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000690 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000691 CXXConstructorDecl *D, bool elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000692 Expr **args, unsigned numargs,
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000693 bool ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000694 ConstructionKind ConstructKind,
695 SourceRange ParenRange)
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000696 : Expr(SC, T, VK_RValue, OK_Ordinary,
697 T->isDependentType(), T->isDependentType(),
698 T->containsUnexpandedParameterPack()),
699 Constructor(D), Loc(Loc), ParenRange(ParenRange), Elidable(elidable),
700 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
701 Args(0), NumArgs(numargs)
Douglas Gregor16006c92009-12-16 18:50:27 +0000702{
703 if (NumArgs) {
704 Args = new (C) Stmt*[NumArgs];
705
706 for (unsigned i = 0; i != NumArgs; ++i) {
707 assert(args[i] && "NULL argument in CXXConstructExpr");
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000708
709 if (args[i]->isValueDependent())
710 ExprBits.ValueDependent = true;
711 if (args[i]->containsUnexpandedParameterPack())
712 ExprBits.ContainsUnexpandedParameterPack = true;
713
Douglas Gregor16006c92009-12-16 18:50:27 +0000714 Args[i] = args[i];
Anders Carlssone349bea2009-04-23 02:32:43 +0000715 }
Douglas Gregor16006c92009-12-16 18:50:27 +0000716 }
Anders Carlssone349bea2009-04-23 02:32:43 +0000717}
718
John McCall4765fa02010-12-06 08:20:24 +0000719ExprWithCleanups::ExprWithCleanups(ASTContext &C,
720 Expr *subexpr,
721 CXXTemporary **temps,
722 unsigned numtemps)
723 : Expr(ExprWithCleanupsClass, subexpr->getType(),
John McCallf89e55a2010-11-18 06:31:45 +0000724 subexpr->getValueKind(), subexpr->getObjectKind(),
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000725 subexpr->isTypeDependent(), subexpr->isValueDependent(),
726 subexpr->containsUnexpandedParameterPack()),
Chris Lattnerd2598362010-05-10 00:25:06 +0000727 SubExpr(subexpr), Temps(0), NumTemps(0) {
Chris Lattneraff32cb2010-05-10 00:45:12 +0000728 if (numtemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000729 setNumTemporaries(C, numtemps);
Chris Lattnerd2598362010-05-10 00:25:06 +0000730 for (unsigned i = 0; i != numtemps; ++i)
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000731 Temps[i] = temps[i];
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000732 }
733}
734
John McCall4765fa02010-12-06 08:20:24 +0000735void ExprWithCleanups::setNumTemporaries(ASTContext &C, unsigned N) {
Chris Lattnerd2598362010-05-10 00:25:06 +0000736 assert(Temps == 0 && "Cannot resize with this");
Daniel Dunbar90556d42010-05-10 15:59:37 +0000737 NumTemps = N;
Ted Kremenekd04ed412010-05-10 20:06:30 +0000738 Temps = new (C) CXXTemporary*[NumTemps];
Chris Lattnerd2598362010-05-10 00:25:06 +0000739}
740
741
John McCall4765fa02010-12-06 08:20:24 +0000742ExprWithCleanups *ExprWithCleanups::Create(ASTContext &C,
743 Expr *SubExpr,
744 CXXTemporary **Temps,
745 unsigned NumTemps) {
746 return new (C) ExprWithCleanups(C, SubExpr, Temps, NumTemps);
Anders Carlsson88eaf072009-05-30 22:38:53 +0000747}
748
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000749// CXXBindTemporaryExpr
750Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
751 return &SubExpr;
752}
753
Mike Stump1eb44332009-09-09 15:08:12 +0000754Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000755 return &SubExpr + 1;
756}
757
Anders Carlssone349bea2009-04-23 02:32:43 +0000758// CXXConstructExpr
759Stmt::child_iterator CXXConstructExpr::child_begin() {
760 return &Args[0];
761}
762Stmt::child_iterator CXXConstructExpr::child_end() {
763 return &Args[0]+NumArgs;
764}
765
John McCall4765fa02010-12-06 08:20:24 +0000766// ExprWithCleanups
767Stmt::child_iterator ExprWithCleanups::child_begin() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000768 return &SubExpr;
Anders Carlsson19d28a62009-04-21 02:22:11 +0000769}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000770
John McCall4765fa02010-12-06 08:20:24 +0000771Stmt::child_iterator ExprWithCleanups::child_end() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000772 return &SubExpr + 1;
773}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000774
Douglas Gregorab6677e2010-09-08 00:15:04 +0000775CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000776 SourceLocation LParenLoc,
777 Expr **Args,
778 unsigned NumArgs,
779 SourceLocation RParenLoc)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000780 : Expr(CXXUnresolvedConstructExprClass,
781 Type->getType().getNonReferenceType(),
John McCall09431682010-11-18 19:01:18 +0000782 VK_LValue, OK_Ordinary,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000783 Type->getType()->isDependentType(), true,
784 Type->getType()->containsUnexpandedParameterPack()),
Douglas Gregorab6677e2010-09-08 00:15:04 +0000785 Type(Type),
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000786 LParenLoc(LParenLoc),
787 RParenLoc(RParenLoc),
788 NumArgs(NumArgs) {
789 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000790 for (unsigned I = 0; I != NumArgs; ++I) {
791 if (Args[I]->containsUnexpandedParameterPack())
792 ExprBits.ContainsUnexpandedParameterPack = true;
793
794 StoredArgs[I] = Args[I];
795 }
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000796}
797
798CXXUnresolvedConstructExpr *
Mike Stump1eb44332009-09-09 15:08:12 +0000799CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000800 TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000801 SourceLocation LParenLoc,
802 Expr **Args,
803 unsigned NumArgs,
804 SourceLocation RParenLoc) {
805 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
806 sizeof(Expr *) * NumArgs);
Douglas Gregorab6677e2010-09-08 00:15:04 +0000807 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000808 Args, NumArgs, RParenLoc);
809}
810
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000811CXXUnresolvedConstructExpr *
812CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
813 Stmt::EmptyShell Empty;
814 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
815 sizeof(Expr *) * NumArgs);
816 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
817}
818
Douglas Gregorab6677e2010-09-08 00:15:04 +0000819SourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
820 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
821}
822
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000823Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
824 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
825}
826
827Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
828 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
829}
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000830
John McCall865d4472009-11-19 22:55:06 +0000831CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000832 Expr *Base, QualType BaseType,
833 bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000834 SourceLocation OperatorLoc,
835 NestedNameSpecifier *Qualifier,
836 SourceRange QualifierRange,
837 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000838 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000839 const TemplateArgumentListInfo *TemplateArgs)
John McCallf89e55a2010-11-18 06:31:45 +0000840 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000841 VK_LValue, OK_Ordinary, true, true,
842 ((Base && Base->containsUnexpandedParameterPack()) ||
843 (Qualifier && Qualifier->containsUnexpandedParameterPack()) ||
844 MemberNameInfo.containsUnexpandedParameterPack())),
John McCallaa81e162009-12-01 22:10:20 +0000845 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
846 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000847 OperatorLoc(OperatorLoc),
848 Qualifier(Qualifier), QualifierRange(QualifierRange),
849 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Abramo Bagnara25777432010-08-11 22:01:17 +0000850 MemberNameInfo(MemberNameInfo) {
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000851 if (TemplateArgs) {
852 bool Dependent = true;
853 bool ContainsUnexpandedParameterPack = false;
854 getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent,
855 ContainsUnexpandedParameterPack);
856 if (ContainsUnexpandedParameterPack)
857 ExprBits.ContainsUnexpandedParameterPack = true;
858 }
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000859}
860
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000861CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
862 Expr *Base, QualType BaseType,
863 bool IsArrow,
864 SourceLocation OperatorLoc,
865 NestedNameSpecifier *Qualifier,
866 SourceRange QualifierRange,
867 NamedDecl *FirstQualifierFoundInScope,
868 DeclarationNameInfo MemberNameInfo)
869 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
870 VK_LValue, OK_Ordinary, true, true,
871 ((Base && Base->containsUnexpandedParameterPack()) ||
872 (Qualifier && Qualifier->containsUnexpandedParameterPack()) ||
873 MemberNameInfo.containsUnexpandedParameterPack())),
874 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
875 HasExplicitTemplateArgs(false), OperatorLoc(OperatorLoc),
876 Qualifier(Qualifier), QualifierRange(QualifierRange),
877 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
878 MemberNameInfo(MemberNameInfo) { }
879
John McCall865d4472009-11-19 22:55:06 +0000880CXXDependentScopeMemberExpr *
881CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000882 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000883 SourceLocation OperatorLoc,
884 NestedNameSpecifier *Qualifier,
885 SourceRange QualifierRange,
886 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000887 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000888 const TemplateArgumentListInfo *TemplateArgs) {
889 if (!TemplateArgs)
John McCallaa81e162009-12-01 22:10:20 +0000890 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
891 IsArrow, OperatorLoc,
892 Qualifier, QualifierRange,
893 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000894 MemberNameInfo);
Mike Stump1eb44332009-09-09 15:08:12 +0000895
John McCalld5532b62009-11-23 01:53:49 +0000896 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
897 if (TemplateArgs)
898 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
899
Chris Lattner32488542010-10-30 05:14:06 +0000900 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
John McCallaa81e162009-12-01 22:10:20 +0000901 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
902 IsArrow, OperatorLoc,
903 Qualifier, QualifierRange,
904 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000905 MemberNameInfo, TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000906}
907
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000908CXXDependentScopeMemberExpr *
909CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
Douglas Gregordef03542011-02-04 12:01:24 +0000910 bool HasExplicitTemplateArgs,
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000911 unsigned NumTemplateArgs) {
Douglas Gregordef03542011-02-04 12:01:24 +0000912 if (!HasExplicitTemplateArgs)
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000913 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
914 0, SourceLocation(), 0,
915 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000916 DeclarationNameInfo());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000917
918 std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
919 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
Chris Lattner32488542010-10-30 05:14:06 +0000920 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000921 CXXDependentScopeMemberExpr *E
922 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
923 0, SourceLocation(), 0,
924 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000925 DeclarationNameInfo(), 0);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000926 E->HasExplicitTemplateArgs = true;
927 return E;
928}
929
John McCall865d4472009-11-19 22:55:06 +0000930Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000931 return child_iterator(&Base);
932}
933
John McCall865d4472009-11-19 22:55:06 +0000934Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000935 if (isImplicitAccess())
936 return child_iterator(&Base);
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000937 return child_iterator(&Base + 1);
938}
John McCall129e2df2009-11-30 22:42:35 +0000939
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000940UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C,
John McCall129e2df2009-11-30 22:42:35 +0000941 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000942 Expr *Base, QualType BaseType,
943 bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000944 SourceLocation OperatorLoc,
945 NestedNameSpecifier *Qualifier,
946 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000947 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000948 const TemplateArgumentListInfo *TemplateArgs,
949 UnresolvedSetIterator Begin,
950 UnresolvedSetIterator End)
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000951 : OverloadExpr(UnresolvedMemberExprClass, C,
Abramo Bagnara25777432010-08-11 22:01:17 +0000952 Qualifier, QualifierRange, MemberNameInfo,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000953 TemplateArgs, Begin, End,
954 // Dependent
955 ((Base && Base->isTypeDependent()) ||
956 BaseType->isDependentType()),
957 // Contains unexpanded parameter pack
958 ((Base && Base->containsUnexpandedParameterPack()) ||
959 BaseType->containsUnexpandedParameterPack())),
John McCall7bb12da2010-02-02 06:20:04 +0000960 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
961 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
John McCall129e2df2009-11-30 22:42:35 +0000962}
963
964UnresolvedMemberExpr *
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000965UnresolvedMemberExpr::Create(ASTContext &C,
John McCall129e2df2009-11-30 22:42:35 +0000966 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000967 Expr *Base, QualType BaseType, bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000968 SourceLocation OperatorLoc,
969 NestedNameSpecifier *Qualifier,
970 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000971 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000972 const TemplateArgumentListInfo *TemplateArgs,
973 UnresolvedSetIterator Begin,
974 UnresolvedSetIterator End) {
John McCall129e2df2009-11-30 22:42:35 +0000975 std::size_t size = sizeof(UnresolvedMemberExpr);
976 if (TemplateArgs)
977 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
978
Chris Lattner32488542010-10-30 05:14:06 +0000979 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000980 return new (Mem) UnresolvedMemberExpr(C,
Douglas Gregorbebbe0d2010-12-15 01:34:56 +0000981 HasUnresolvedUsing, Base, BaseType,
John McCallaa81e162009-12-01 22:10:20 +0000982 IsArrow, OperatorLoc, Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000983 MemberNameInfo, TemplateArgs, Begin, End);
John McCall129e2df2009-11-30 22:42:35 +0000984}
985
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000986UnresolvedMemberExpr *
Douglas Gregordef03542011-02-04 12:01:24 +0000987UnresolvedMemberExpr::CreateEmpty(ASTContext &C, bool HasExplicitTemplateArgs,
988 unsigned NumTemplateArgs) {
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000989 std::size_t size = sizeof(UnresolvedMemberExpr);
Douglas Gregordef03542011-02-04 12:01:24 +0000990 if (HasExplicitTemplateArgs)
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000991 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
992
Chris Lattner32488542010-10-30 05:14:06 +0000993 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000994 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
Douglas Gregordef03542011-02-04 12:01:24 +0000995 E->HasExplicitTemplateArgs = HasExplicitTemplateArgs;
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000996 return E;
997}
998
John McCallc373d482010-01-27 01:50:18 +0000999CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
1000 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
1001
1002 // If there was a nested name specifier, it names the naming class.
1003 // It can't be dependent: after all, we were actually able to do the
1004 // lookup.
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001005 CXXRecordDecl *Record = 0;
John McCall7bb12da2010-02-02 06:20:04 +00001006 if (getQualifier()) {
John McCallf4c73712011-01-19 06:33:43 +00001007 const Type *T = getQualifier()->getAsType();
John McCallc373d482010-01-27 01:50:18 +00001008 assert(T && "qualifier in member expression does not name type");
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001009 Record = T->getAsCXXRecordDecl();
1010 assert(Record && "qualifier in member expression does not name record");
1011 }
John McCallc373d482010-01-27 01:50:18 +00001012 // Otherwise the naming class must have been the base class.
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001013 else {
John McCallc373d482010-01-27 01:50:18 +00001014 QualType BaseType = getBaseType().getNonReferenceType();
1015 if (isArrow()) {
1016 const PointerType *PT = BaseType->getAs<PointerType>();
1017 assert(PT && "base of arrow member access is not pointer");
1018 BaseType = PT->getPointeeType();
1019 }
1020
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001021 Record = BaseType->getAsCXXRecordDecl();
1022 assert(Record && "base of member expression does not name record");
John McCallc373d482010-01-27 01:50:18 +00001023 }
1024
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001025 return Record;
John McCallc373d482010-01-27 01:50:18 +00001026}
1027
John McCall129e2df2009-11-30 22:42:35 +00001028Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
1029 return child_iterator(&Base);
1030}
1031
1032Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +00001033 if (isImplicitAccess())
1034 return child_iterator(&Base);
John McCall129e2df2009-11-30 22:42:35 +00001035 return child_iterator(&Base + 1);
1036}
Sebastian Redl2e156222010-09-10 20:55:43 +00001037
1038Stmt::child_iterator CXXNoexceptExpr::child_begin() {
1039 return child_iterator(&Operand);
1040}
1041Stmt::child_iterator CXXNoexceptExpr::child_end() {
1042 return child_iterator(&Operand + 1);
1043}
Douglas Gregorbe230c32011-01-03 17:17:50 +00001044
1045SourceRange PackExpansionExpr::getSourceRange() const {
1046 return SourceRange(Pattern->getLocStart(), EllipsisLoc);
1047}
1048
1049Stmt::child_iterator PackExpansionExpr::child_begin() {
1050 return child_iterator(&Pattern);
1051}
1052
1053Stmt::child_iterator PackExpansionExpr::child_end() {
1054 return child_iterator(&Pattern + 1);
1055}
Douglas Gregoree8aff02011-01-04 17:33:58 +00001056
1057SourceRange SizeOfPackExpr::getSourceRange() const {
1058 return SourceRange(OperatorLoc, RParenLoc);
1059}
1060
1061Stmt::child_iterator SizeOfPackExpr::child_begin() {
1062 return child_iterator();
1063}
1064
1065Stmt::child_iterator SizeOfPackExpr::child_end() {
1066 return child_iterator();
1067}
Douglas Gregorc7793c72011-01-15 01:15:58 +00001068
1069SubstNonTypeTemplateParmPackExpr::
1070SubstNonTypeTemplateParmPackExpr(QualType T,
1071 NonTypeTemplateParmDecl *Param,
1072 SourceLocation NameLoc,
1073 const TemplateArgument &ArgPack)
1074 : Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary,
1075 true, false, true),
1076 Param(Param), Arguments(ArgPack.pack_begin()),
1077 NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) { }
1078
1079TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const {
1080 return TemplateArgument(Arguments, NumArguments);
1081}
1082
1083SourceRange SubstNonTypeTemplateParmPackExpr::getSourceRange() const {
1084 return NameLoc;
1085}
1086
1087Stmt::child_iterator SubstNonTypeTemplateParmPackExpr::child_begin() {
1088 return child_iterator();
1089}
1090
1091Stmt::child_iterator SubstNonTypeTemplateParmPackExpr::child_end() {
1092 return child_iterator();
1093}
1094
1095