blob: 1c134608a5082356fad51925924573c09701c623 [file] [log] [blame]
Ted Kremeneka758d092007-08-24 20:21:10 +00001//===--- ExprCXX.cpp - (C++) Expression AST Node Implementation -----------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Ted Kremeneka758d092007-08-24 20:21:10 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the subclesses of Expr class declared in ExprCXX.h
11//
12//===----------------------------------------------------------------------===//
13
Douglas Gregorb4609802008-11-14 16:09:21 +000014#include "clang/Basic/IdentifierTable.h"
15#include "clang/AST/DeclCXX.h"
Douglas Gregoredce4dd2009-06-30 22:34:41 +000016#include "clang/AST/DeclTemplate.h"
Ted Kremeneka758d092007-08-24 20:21:10 +000017#include "clang/AST/ExprCXX.h"
Douglas Gregor26d4ac92010-02-24 23:40:28 +000018#include "clang/AST/TypeLoc.h"
Ted Kremeneka758d092007-08-24 20:21:10 +000019using namespace clang;
20
Douglas Gregor57fdc8a2010-04-26 22:37:10 +000021
Ted Kremeneka758d092007-08-24 20:21:10 +000022//===----------------------------------------------------------------------===//
23// Child Iterators for iterating over subexpressions/substatements
24//===----------------------------------------------------------------------===//
25
Douglas Gregor57fdc8a2010-04-26 22:37:10 +000026QualType CXXTypeidExpr::getTypeOperand() const {
27 assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
28 return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType()
29 .getUnqualifiedType();
30}
31
Sebastian Redlc42e1182008-11-11 11:37:55 +000032// CXXTypeidExpr - has child iterators if the operand is an expression
33Stmt::child_iterator CXXTypeidExpr::child_begin() {
Douglas Gregor57fdc8a2010-04-26 22:37:10 +000034 return isTypeOperand() ? child_iterator()
35 : reinterpret_cast<Stmt **>(&Operand);
Sebastian Redlc42e1182008-11-11 11:37:55 +000036}
37Stmt::child_iterator CXXTypeidExpr::child_end() {
Douglas Gregor57fdc8a2010-04-26 22:37:10 +000038 return isTypeOperand() ? child_iterator()
39 : reinterpret_cast<Stmt **>(&Operand) + 1;
Sebastian Redlc42e1182008-11-11 11:37:55 +000040}
Ted Kremeneka758d092007-08-24 20:21:10 +000041
Francois Pichet01b7c302010-09-08 12:20:18 +000042QualType CXXUuidofExpr::getTypeOperand() const {
43 assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
44 return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType()
45 .getUnqualifiedType();
46}
47
48// CXXUuidofExpr - has child iterators if the operand is an expression
49Stmt::child_iterator CXXUuidofExpr::child_begin() {
50 return isTypeOperand() ? child_iterator()
51 : reinterpret_cast<Stmt **>(&Operand);
52}
53Stmt::child_iterator CXXUuidofExpr::child_end() {
54 return isTypeOperand() ? child_iterator()
55 : reinterpret_cast<Stmt **>(&Operand) + 1;
56}
57
Ted Kremeneka758d092007-08-24 20:21:10 +000058// CXXBoolLiteralExpr
Mike Stump1eb44332009-09-09 15:08:12 +000059Stmt::child_iterator CXXBoolLiteralExpr::child_begin() {
Ted Kremenek9ac59282007-10-18 23:28:49 +000060 return child_iterator();
61}
62Stmt::child_iterator CXXBoolLiteralExpr::child_end() {
63 return child_iterator();
64}
Chris Lattner50dd2892008-02-26 00:51:44 +000065
Sebastian Redl6e8ed162009-05-10 18:38:11 +000066// CXXNullPtrLiteralExpr
Mike Stump1eb44332009-09-09 15:08:12 +000067Stmt::child_iterator CXXNullPtrLiteralExpr::child_begin() {
Sebastian Redl6e8ed162009-05-10 18:38:11 +000068 return child_iterator();
69}
70Stmt::child_iterator CXXNullPtrLiteralExpr::child_end() {
71 return child_iterator();
72}
73
Douglas Gregor796da182008-11-04 14:32:21 +000074// CXXThisExpr
75Stmt::child_iterator CXXThisExpr::child_begin() { return child_iterator(); }
76Stmt::child_iterator CXXThisExpr::child_end() { return child_iterator(); }
77
Chris Lattner50dd2892008-02-26 00:51:44 +000078// CXXThrowExpr
Ted Kremenek1060aff2008-06-17 03:11:08 +000079Stmt::child_iterator CXXThrowExpr::child_begin() { return &Op; }
Chris Lattner50dd2892008-02-26 00:51:44 +000080Stmt::child_iterator CXXThrowExpr::child_end() {
81 // If Op is 0, we are processing throw; which has no children.
Ted Kremenek1060aff2008-06-17 03:11:08 +000082 return Op ? &Op+1 : &Op;
Chris Lattner50dd2892008-02-26 00:51:44 +000083}
Chris Lattner04421082008-04-08 04:40:51 +000084
85// CXXDefaultArgExpr
86Stmt::child_iterator CXXDefaultArgExpr::child_begin() {
Chris Lattner8123a952008-04-10 02:22:51 +000087 return child_iterator();
Chris Lattner04421082008-04-08 04:40:51 +000088}
89Stmt::child_iterator CXXDefaultArgExpr::child_end() {
Chris Lattner8123a952008-04-10 02:22:51 +000090 return child_iterator();
Chris Lattner04421082008-04-08 04:40:51 +000091}
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +000092
Douglas Gregored8abf12010-07-08 06:14:04 +000093// CXXScalarValueInitExpr
Douglas Gregorab6677e2010-09-08 00:15:04 +000094SourceRange CXXScalarValueInitExpr::getSourceRange() const {
95 SourceLocation Start = RParenLoc;
96 if (TypeInfo)
97 Start = TypeInfo->getTypeLoc().getBeginLoc();
98 return SourceRange(Start, RParenLoc);
99}
100
Douglas Gregored8abf12010-07-08 06:14:04 +0000101Stmt::child_iterator CXXScalarValueInitExpr::child_begin() {
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +0000102 return child_iterator();
103}
Douglas Gregored8abf12010-07-08 06:14:04 +0000104Stmt::child_iterator CXXScalarValueInitExpr::child_end() {
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +0000105 return child_iterator();
106}
Argyrios Kyrtzidis9e922b12008-09-09 23:47:53 +0000107
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000108// CXXNewExpr
Ted Kremenekad7fe862010-02-11 22:51:03 +0000109CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000110 Expr **placementArgs, unsigned numPlaceArgs,
Douglas Gregor4bd40312010-07-13 15:54:32 +0000111 SourceRange TypeIdParens, Expr *arraySize,
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000112 CXXConstructorDecl *constructor, bool initializer,
113 Expr **constructorArgs, unsigned numConsArgs,
114 FunctionDecl *operatorDelete, QualType ty,
Douglas Gregor1bb2a932010-09-07 21:49:58 +0000115 TypeSourceInfo *AllocatedTypeInfo,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000116 SourceLocation startLoc, SourceLocation endLoc,
117 SourceLocation constructorLParen,
118 SourceLocation constructorRParen)
John McCallf89e55a2010-11-18 06:31:45 +0000119 : Expr(CXXNewExprClass, ty, VK_RValue, OK_Ordinary,
120 ty->isDependentType(), ty->isDependentType()),
Douglas Gregor4bd40312010-07-13 15:54:32 +0000121 GlobalNew(globalNew),
Chris Lattner59218632010-05-10 01:22:27 +0000122 Initializer(initializer), SubExprs(0), OperatorNew(operatorNew),
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000123 OperatorDelete(operatorDelete), Constructor(constructor),
Douglas Gregor1bb2a932010-09-07 21:49:58 +0000124 AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens),
Chandler Carruth428edaf2010-10-25 08:47:36 +0000125 StartLoc(startLoc), EndLoc(endLoc), ConstructorLParen(constructorLParen),
126 ConstructorRParen(constructorRParen) {
Chris Lattner59218632010-05-10 01:22:27 +0000127 AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000128 unsigned i = 0;
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000129 if (Array)
130 SubExprs[i++] = arraySize;
131 for (unsigned j = 0; j < NumPlacementArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000132 SubExprs[i++] = placementArgs[j];
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000133 for (unsigned j = 0; j < NumConstructorArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000134 SubExprs[i++] = constructorArgs[j];
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000135}
136
Chris Lattner59218632010-05-10 01:22:27 +0000137void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray,
138 unsigned numPlaceArgs, unsigned numConsArgs){
139 assert(SubExprs == 0 && "SubExprs already allocated");
140 Array = isArray;
141 NumPlacementArgs = numPlaceArgs;
142 NumConstructorArgs = numConsArgs;
143
144 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
145 SubExprs = new (C) Stmt*[TotalSize];
146}
147
148
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000149Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
150Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000151 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000152}
153
154// CXXDeleteExpr
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000155QualType CXXDeleteExpr::getDestroyedType() const {
156 const Expr *Arg = getArgument();
157 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
158 if (ICE->getCastKind() != CK_UserDefinedConversion &&
159 ICE->getType()->isVoidPointerType())
160 Arg = ICE->getSubExpr();
161 else
162 break;
163 }
Craig Silverstein0fa0b782010-10-20 00:38:15 +0000164 // The type-to-delete may not be a pointer if it's a dependent type.
Craig Silversteinc87fa062010-10-20 00:56:01 +0000165 const QualType ArgType = Arg->getType();
Craig Silversteina437ad32010-11-16 07:16:25 +0000166
167 if (ArgType->isDependentType() && !ArgType->isPointerType())
168 return QualType();
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000169
Craig Silverstein0fa0b782010-10-20 00:38:15 +0000170 return ArgType->getAs<PointerType>()->getPointeeType();
Douglas Gregor5833b0b2010-09-14 22:55:20 +0000171}
172
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000173Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
174Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
175
Douglas Gregora71d8192009-09-04 17:36:40 +0000176// CXXPseudoDestructorExpr
177Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
178Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
179 return &Base + 1;
180}
181
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000182PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
183 : Type(Info)
184{
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000185 Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000186}
187
John McCall0e88aa72010-12-14 06:51:39 +0000188CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(ASTContext &Context,
189 Expr *Base, bool isArrow, SourceLocation OperatorLoc,
190 NestedNameSpecifier *Qualifier, SourceRange QualifierRange,
191 TypeSourceInfo *ScopeType, SourceLocation ColonColonLoc,
192 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType)
193 : Expr(CXXPseudoDestructorExprClass,
194 Context.getPointerType(Context.getFunctionType(Context.VoidTy, 0, 0,
195 FunctionProtoType::ExtProtoInfo())),
196 VK_RValue, OK_Ordinary,
197 /*isTypeDependent=*/(Base->isTypeDependent() ||
198 (DestroyedType.getTypeSourceInfo() &&
199 DestroyedType.getTypeSourceInfo()->getType()->isDependentType())),
200 /*isValueDependent=*/Base->isValueDependent()),
201 Base(static_cast<Stmt *>(Base)), IsArrow(isArrow),
202 OperatorLoc(OperatorLoc), Qualifier(Qualifier),
203 QualifierRange(QualifierRange),
204 ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc),
205 DestroyedType(DestroyedType) { }
206
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000207QualType CXXPseudoDestructorExpr::getDestroyedType() const {
208 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
209 return TInfo->getType();
210
211 return QualType();
212}
213
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000214SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000215 SourceLocation End = DestroyedType.getLocation();
216 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000217 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000218 return SourceRange(Base->getLocStart(), End);
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000219}
220
221
John McCallba135432009-11-21 08:51:07 +0000222// UnresolvedLookupExpr
John McCallf7a1a742009-11-24 19:00:30 +0000223UnresolvedLookupExpr *
224UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent,
John McCallc373d482010-01-27 01:50:18 +0000225 CXXRecordDecl *NamingClass,
John McCallf7a1a742009-11-24 19:00:30 +0000226 NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000227 SourceRange QualifierRange,
228 const DeclarationNameInfo &NameInfo,
229 bool ADL,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000230 const TemplateArgumentListInfo &Args,
231 UnresolvedSetIterator Begin,
232 UnresolvedSetIterator End)
John McCallf7a1a742009-11-24 19:00:30 +0000233{
234 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
235 ExplicitTemplateArgumentList::sizeFor(Args));
236 UnresolvedLookupExpr *ULE
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000237 = new (Mem) UnresolvedLookupExpr(C,
238 Dependent ? C.DependentTy : C.OverloadTy,
John McCallc373d482010-01-27 01:50:18 +0000239 Dependent, NamingClass,
Abramo Bagnara25777432010-08-11 22:01:17 +0000240 Qualifier, QualifierRange, NameInfo,
241 ADL,
John McCallf7a1a742009-11-24 19:00:30 +0000242 /*Overload*/ true,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000243 /*ExplicitTemplateArgs*/ true,
244 Begin, End);
John McCallf7a1a742009-11-24 19:00:30 +0000245
246 reinterpret_cast<ExplicitTemplateArgumentList*>(ULE+1)->initializeFrom(Args);
247
248 return ULE;
249}
250
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000251UnresolvedLookupExpr *
252UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
253 std::size_t size = sizeof(UnresolvedLookupExpr);
254 if (NumTemplateArgs != 0)
255 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
256
Chris Lattner32488542010-10-30 05:14:06 +0000257 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedLookupExpr>());
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000258 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
259 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
260 return E;
261}
262
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000263OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C, QualType T,
264 bool Dependent, NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000265 SourceRange QRange,
266 const DeclarationNameInfo &NameInfo,
267 bool HasTemplateArgs,
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000268 UnresolvedSetIterator Begin,
269 UnresolvedSetIterator End)
John McCallf89e55a2010-11-18 06:31:45 +0000270 : Expr(K, T, VK_LValue, OK_Ordinary, Dependent, Dependent),
Abramo Bagnara25777432010-08-11 22:01:17 +0000271 Results(0), NumResults(0), NameInfo(NameInfo), Qualifier(Qualifier),
272 QualifierRange(QRange), HasExplicitTemplateArgs(HasTemplateArgs)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000273{
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000274 initializeResults(C, Begin, End);
275}
276
277void OverloadExpr::initializeResults(ASTContext &C,
278 UnresolvedSetIterator Begin,
279 UnresolvedSetIterator End) {
280 assert(Results == 0 && "Results already initialized!");
281 NumResults = End - Begin;
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000282 if (NumResults) {
283 Results = static_cast<DeclAccessPair *>(
284 C.Allocate(sizeof(DeclAccessPair) * NumResults,
Chris Lattner32488542010-10-30 05:14:06 +0000285 llvm::alignOf<DeclAccessPair>()));
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000286 memcpy(Results, &*Begin.getIterator(),
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000287 NumResults * sizeof(DeclAccessPair));
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000288 }
289}
290
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000291
John McCall7bb12da2010-02-02 06:20:04 +0000292bool OverloadExpr::ComputeDependence(UnresolvedSetIterator Begin,
293 UnresolvedSetIterator End,
294 const TemplateArgumentListInfo *Args) {
John McCalleec51cf2010-01-20 00:46:10 +0000295 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I)
John McCallf7a1a742009-11-24 19:00:30 +0000296 if ((*I)->getDeclContext()->isDependentContext())
297 return true;
298
299 if (Args && TemplateSpecializationType::anyDependentTemplateArguments(*Args))
300 return true;
301
302 return false;
303}
304
John McCalle9ee23e2010-04-22 18:44:12 +0000305CXXRecordDecl *OverloadExpr::getNamingClass() const {
306 if (isa<UnresolvedLookupExpr>(this))
307 return cast<UnresolvedLookupExpr>(this)->getNamingClass();
308 else
309 return cast<UnresolvedMemberExpr>(this)->getNamingClass();
310}
311
John McCallba135432009-11-21 08:51:07 +0000312Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump1eb44332009-09-09 15:08:12 +0000313 return child_iterator();
Douglas Gregor5c37de72008-12-06 00:22:45 +0000314}
John McCallba135432009-11-21 08:51:07 +0000315Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregor5c37de72008-12-06 00:22:45 +0000316 return child_iterator();
317}
Sebastian Redl64b45f72009-01-05 20:52:13 +0000318// UnaryTypeTraitExpr
319Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
320 return child_iterator();
321}
322Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
323 return child_iterator();
324}
325
Francois Pichet6ad6f282010-12-07 00:08:36 +0000326//BinaryTypeTraitExpr
327Stmt::child_iterator BinaryTypeTraitExpr::child_begin() {
328 return child_iterator();
329}
330Stmt::child_iterator BinaryTypeTraitExpr::child_end() {
331 return child_iterator();
332}
333
John McCall865d4472009-11-19 22:55:06 +0000334// DependentScopeDeclRefExpr
John McCallf7a1a742009-11-24 19:00:30 +0000335DependentScopeDeclRefExpr *
336DependentScopeDeclRefExpr::Create(ASTContext &C,
337 NestedNameSpecifier *Qualifier,
338 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000339 const DeclarationNameInfo &NameInfo,
John McCallf7a1a742009-11-24 19:00:30 +0000340 const TemplateArgumentListInfo *Args) {
341 std::size_t size = sizeof(DependentScopeDeclRefExpr);
342 if (Args) size += ExplicitTemplateArgumentList::sizeFor(*Args);
343 void *Mem = C.Allocate(size);
344
345 DependentScopeDeclRefExpr *DRE
346 = new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
347 Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000348 NameInfo, Args != 0);
John McCallf7a1a742009-11-24 19:00:30 +0000349
350 if (Args)
351 reinterpret_cast<ExplicitTemplateArgumentList*>(DRE+1)
352 ->initializeFrom(*Args);
353
354 return DRE;
355}
356
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000357DependentScopeDeclRefExpr *
358DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
359 unsigned NumTemplateArgs) {
360 std::size_t size = sizeof(DependentScopeDeclRefExpr);
361 if (NumTemplateArgs)
362 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
363 void *Mem = C.Allocate(size);
364
365 return new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(),
Abramo Bagnara25777432010-08-11 22:01:17 +0000366 DeclarationNameInfo(),
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000367 NumTemplateArgs != 0);
368}
369
John McCall865d4472009-11-19 22:55:06 +0000370StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000371 return child_iterator();
372}
373
John McCall865d4472009-11-19 22:55:06 +0000374StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000375 return child_iterator();
376}
377
Chandler Carruth428edaf2010-10-25 08:47:36 +0000378SourceRange CXXConstructExpr::getSourceRange() const {
Douglas Gregor40749ee2010-11-03 00:35:38 +0000379 if (ParenRange.isValid())
380 return SourceRange(Loc, ParenRange.getEnd());
381
382 SourceLocation End = Loc;
383 for (unsigned I = getNumArgs(); I > 0; --I) {
384 const Expr *Arg = getArg(I-1);
385 if (!Arg->isDefaultArgument()) {
386 SourceLocation NewEnd = Arg->getLocEnd();
387 if (NewEnd.isValid()) {
388 End = NewEnd;
389 break;
390 }
391 }
392 }
393
394 return SourceRange(Loc, End);
Ted Kremeneke3837682009-12-23 04:00:48 +0000395}
396
Douglas Gregorb4609802008-11-14 16:09:21 +0000397SourceRange CXXOperatorCallExpr::getSourceRange() const {
398 OverloadedOperatorKind Kind = getOperator();
399 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
400 if (getNumArgs() == 1)
401 // Prefix operator
Mike Stump1eb44332009-09-09 15:08:12 +0000402 return SourceRange(getOperatorLoc(),
Douglas Gregorb4609802008-11-14 16:09:21 +0000403 getArg(0)->getSourceRange().getEnd());
404 else
405 // Postfix operator
406 return SourceRange(getArg(0)->getSourceRange().getEnd(),
407 getOperatorLoc());
408 } else if (Kind == OO_Call) {
409 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
410 } else if (Kind == OO_Subscript) {
411 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
412 } else if (getNumArgs() == 1) {
413 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
414 } else if (getNumArgs() == 2) {
415 return SourceRange(getArg(0)->getSourceRange().getBegin(),
416 getArg(1)->getSourceRange().getEnd());
417 } else {
418 return SourceRange();
419 }
420}
421
Douglas Gregor88a35142008-12-22 05:46:06 +0000422Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
423 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
424 return MemExpr->getBase();
425
426 // FIXME: Will eventually need to cope with member pointers.
427 return 0;
428}
429
Chandler Carruth007a9b12010-10-27 06:55:41 +0000430CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() {
431 Expr* ThisArg = getImplicitObjectArgument();
432 if (!ThisArg)
433 return 0;
434
435 if (ThisArg->getType()->isAnyPointerType())
436 return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
437
438 return ThisArg->getType()->getAsCXXRecordDecl();
439}
440
Douglas Gregor00b98c22009-11-12 15:31:47 +0000441SourceRange CXXMemberCallExpr::getSourceRange() const {
442 SourceLocation LocStart = getCallee()->getLocStart();
443 if (LocStart.isInvalid() && getNumArgs() > 0)
444 LocStart = getArg(0)->getLocStart();
445 return SourceRange(LocStart, getRParenLoc());
446}
447
448
Douglas Gregor49badde2008-10-27 19:41:14 +0000449//===----------------------------------------------------------------------===//
450// Named casts
451//===----------------------------------------------------------------------===//
452
453/// getCastName - Get the name of the C++ cast being used, e.g.,
454/// "static_cast", "dynamic_cast", "reinterpret_cast", or
455/// "const_cast". The returned pointer must not be freed.
456const char *CXXNamedCastExpr::getCastName() const {
457 switch (getStmtClass()) {
458 case CXXStaticCastExprClass: return "static_cast";
459 case CXXDynamicCastExprClass: return "dynamic_cast";
460 case CXXReinterpretCastExprClass: return "reinterpret_cast";
461 case CXXConstCastExprClass: return "const_cast";
462 default: return "<invalid cast>";
463 }
464}
Douglas Gregor506ae412009-01-16 18:33:17 +0000465
John McCallf871d0c2010-08-07 06:22:56 +0000466CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
John McCallf89e55a2010-11-18 06:31:45 +0000467 ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000468 CastKind K, Expr *Op,
469 const CXXCastPath *BasePath,
470 TypeSourceInfo *WrittenTy,
471 SourceLocation L) {
472 unsigned PathSize = (BasePath ? BasePath->size() : 0);
473 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
474 + PathSize * sizeof(CXXBaseSpecifier*));
475 CXXStaticCastExpr *E =
John McCallf89e55a2010-11-18 06:31:45 +0000476 new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L);
John McCallf871d0c2010-08-07 06:22:56 +0000477 if (PathSize) E->setCastPath(*BasePath);
478 return E;
479}
480
481CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
482 unsigned PathSize) {
483 void *Buffer =
484 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
485 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
486}
487
488CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
John McCallf89e55a2010-11-18 06:31:45 +0000489 ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000490 CastKind K, Expr *Op,
491 const CXXCastPath *BasePath,
492 TypeSourceInfo *WrittenTy,
493 SourceLocation L) {
494 unsigned PathSize = (BasePath ? BasePath->size() : 0);
495 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
496 + PathSize * sizeof(CXXBaseSpecifier*));
497 CXXDynamicCastExpr *E =
John McCallf89e55a2010-11-18 06:31:45 +0000498 new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L);
John McCallf871d0c2010-08-07 06:22:56 +0000499 if (PathSize) E->setCastPath(*BasePath);
500 return E;
501}
502
503CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
504 unsigned PathSize) {
505 void *Buffer =
506 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
507 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
508}
509
510CXXReinterpretCastExpr *
John McCallf89e55a2010-11-18 06:31:45 +0000511CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
512 CastKind K, Expr *Op,
John McCallf871d0c2010-08-07 06:22:56 +0000513 const CXXCastPath *BasePath,
514 TypeSourceInfo *WrittenTy, SourceLocation L) {
515 unsigned PathSize = (BasePath ? BasePath->size() : 0);
516 void *Buffer =
517 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
518 CXXReinterpretCastExpr *E =
John McCallf89e55a2010-11-18 06:31:45 +0000519 new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L);
John McCallf871d0c2010-08-07 06:22:56 +0000520 if (PathSize) E->setCastPath(*BasePath);
521 return E;
522}
523
524CXXReinterpretCastExpr *
525CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
526 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
527 + PathSize * sizeof(CXXBaseSpecifier*));
528 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
529}
530
John McCallf89e55a2010-11-18 06:31:45 +0000531CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T,
532 ExprValueKind VK, Expr *Op,
John McCallf871d0c2010-08-07 06:22:56 +0000533 TypeSourceInfo *WrittenTy,
534 SourceLocation L) {
John McCallf89e55a2010-11-18 06:31:45 +0000535 return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L);
John McCallf871d0c2010-08-07 06:22:56 +0000536}
537
538CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
539 return new (C) CXXConstCastExpr(EmptyShell());
540}
541
542CXXFunctionalCastExpr *
John McCallf89e55a2010-11-18 06:31:45 +0000543CXXFunctionalCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
John McCallf871d0c2010-08-07 06:22:56 +0000544 TypeSourceInfo *Written, SourceLocation L,
545 CastKind K, Expr *Op, const CXXCastPath *BasePath,
546 SourceLocation R) {
547 unsigned PathSize = (BasePath ? BasePath->size() : 0);
548 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
549 + PathSize * sizeof(CXXBaseSpecifier*));
550 CXXFunctionalCastExpr *E =
John McCallf89e55a2010-11-18 06:31:45 +0000551 new (Buffer) CXXFunctionalCastExpr(T, VK, Written, L, K, Op, PathSize, R);
John McCallf871d0c2010-08-07 06:22:56 +0000552 if (PathSize) E->setCastPath(*BasePath);
553 return E;
554}
555
556CXXFunctionalCastExpr *
557CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
558 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
559 + PathSize * sizeof(CXXBaseSpecifier*));
560 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
561}
562
563
Douglas Gregor65222e82009-12-23 18:19:08 +0000564CXXDefaultArgExpr *
Douglas Gregor036aed12009-12-23 23:03:06 +0000565CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
566 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor65222e82009-12-23 18:19:08 +0000567 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor036aed12009-12-23 23:03:06 +0000568 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
569 SubExpr);
Douglas Gregor65222e82009-12-23 18:19:08 +0000570}
571
Mike Stump1eb44332009-09-09 15:08:12 +0000572CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonb859f352009-05-30 20:34:37 +0000573 const CXXDestructorDecl *Destructor) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000574 return new (C) CXXTemporary(Destructor);
575}
576
Mike Stump1eb44332009-09-09 15:08:12 +0000577CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000578 CXXTemporary *Temp,
579 Expr* SubExpr) {
Mike Stump1eb44332009-09-09 15:08:12 +0000580 assert(SubExpr->getType()->isRecordType() &&
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000581 "Expression bound to a temporary must have record type!");
582
Fariborz Jahanianb8e39232010-11-02 21:05:53 +0000583 return new (C) CXXBindTemporaryExpr(Temp, SubExpr,
584 SubExpr->isTypeDependent(),
585 SubExpr->isValueDependent());
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000586}
587
Anders Carlsson8e587a12009-05-30 20:56:46 +0000588CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson26de5492009-04-24 05:23:13 +0000589 CXXConstructorDecl *Cons,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000590 TypeSourceInfo *Type,
Douglas Gregor506ae412009-01-16 18:33:17 +0000591 Expr **Args,
Mike Stump1eb44332009-09-09 15:08:12 +0000592 unsigned NumArgs,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000593 SourceRange parenRange,
Douglas Gregor1c63b9c2010-04-27 20:36:09 +0000594 bool ZeroInitialization)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000595 : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
596 Type->getType().getNonReferenceType(),
597 Type->getTypeLoc().getBeginLoc(),
Chandler Carruth428edaf2010-10-25 08:47:36 +0000598 Cons, false, Args, NumArgs, ZeroInitialization,
599 CXXConstructExpr::CK_Complete, parenRange),
600 Type(Type) {
Douglas Gregorab6677e2010-09-08 00:15:04 +0000601}
602
603SourceRange CXXTemporaryObjectExpr::getSourceRange() const {
Chandler Carruth428edaf2010-10-25 08:47:36 +0000604 return SourceRange(Type->getTypeLoc().getBeginLoc(),
605 getParenRange().getEnd());
Douglas Gregor506ae412009-01-16 18:33:17 +0000606}
Anders Carlsson19d28a62009-04-21 02:22:11 +0000607
Mike Stump1eb44332009-09-09 15:08:12 +0000608CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000609 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000610 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000611 Expr **Args, unsigned NumArgs,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000612 bool ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000613 ConstructionKind ConstructKind,
614 SourceRange ParenRange) {
Douglas Gregor99a2e602009-12-16 01:38:02 +0000615 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000616 Elidable, Args, NumArgs, ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000617 ConstructKind, ParenRange);
Anders Carlssone349bea2009-04-23 02:32:43 +0000618}
619
Mike Stump1eb44332009-09-09 15:08:12 +0000620CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000621 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000622 CXXConstructorDecl *D, bool elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000623 Expr **args, unsigned numargs,
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000624 bool ZeroInitialization,
Chandler Carruth428edaf2010-10-25 08:47:36 +0000625 ConstructionKind ConstructKind,
626 SourceRange ParenRange)
John McCallf89e55a2010-11-18 06:31:45 +0000627: Expr(SC, T, VK_RValue, OK_Ordinary,
Anders Carlssone349bea2009-04-23 02:32:43 +0000628 T->isDependentType(),
629 (T->isDependentType() ||
630 CallExpr::hasAnyValueDependentArguments(args, numargs))),
Chandler Carruth428edaf2010-10-25 08:47:36 +0000631 Constructor(D), Loc(Loc), ParenRange(ParenRange), Elidable(elidable),
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000632 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
633 Args(0), NumArgs(numargs)
Douglas Gregor16006c92009-12-16 18:50:27 +0000634{
635 if (NumArgs) {
636 Args = new (C) Stmt*[NumArgs];
637
638 for (unsigned i = 0; i != NumArgs; ++i) {
639 assert(args[i] && "NULL argument in CXXConstructExpr");
640 Args[i] = args[i];
Anders Carlssone349bea2009-04-23 02:32:43 +0000641 }
Douglas Gregor16006c92009-12-16 18:50:27 +0000642 }
Anders Carlssone349bea2009-04-23 02:32:43 +0000643}
644
John McCall4765fa02010-12-06 08:20:24 +0000645ExprWithCleanups::ExprWithCleanups(ASTContext &C,
646 Expr *subexpr,
647 CXXTemporary **temps,
648 unsigned numtemps)
649 : Expr(ExprWithCleanupsClass, subexpr->getType(),
John McCallf89e55a2010-11-18 06:31:45 +0000650 subexpr->getValueKind(), subexpr->getObjectKind(),
651 subexpr->isTypeDependent(), subexpr->isValueDependent()),
Chris Lattnerd2598362010-05-10 00:25:06 +0000652 SubExpr(subexpr), Temps(0), NumTemps(0) {
Chris Lattneraff32cb2010-05-10 00:45:12 +0000653 if (numtemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000654 setNumTemporaries(C, numtemps);
Chris Lattnerd2598362010-05-10 00:25:06 +0000655 for (unsigned i = 0; i != numtemps; ++i)
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000656 Temps[i] = temps[i];
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000657 }
658}
659
John McCall4765fa02010-12-06 08:20:24 +0000660void ExprWithCleanups::setNumTemporaries(ASTContext &C, unsigned N) {
Chris Lattnerd2598362010-05-10 00:25:06 +0000661 assert(Temps == 0 && "Cannot resize with this");
Daniel Dunbar90556d42010-05-10 15:59:37 +0000662 NumTemps = N;
Ted Kremenekd04ed412010-05-10 20:06:30 +0000663 Temps = new (C) CXXTemporary*[NumTemps];
Chris Lattnerd2598362010-05-10 00:25:06 +0000664}
665
666
John McCall4765fa02010-12-06 08:20:24 +0000667ExprWithCleanups *ExprWithCleanups::Create(ASTContext &C,
668 Expr *SubExpr,
669 CXXTemporary **Temps,
670 unsigned NumTemps) {
671 return new (C) ExprWithCleanups(C, SubExpr, Temps, NumTemps);
Anders Carlsson88eaf072009-05-30 22:38:53 +0000672}
673
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000674// CXXBindTemporaryExpr
675Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
676 return &SubExpr;
677}
678
Mike Stump1eb44332009-09-09 15:08:12 +0000679Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000680 return &SubExpr + 1;
681}
682
Anders Carlssone349bea2009-04-23 02:32:43 +0000683// CXXConstructExpr
684Stmt::child_iterator CXXConstructExpr::child_begin() {
685 return &Args[0];
686}
687Stmt::child_iterator CXXConstructExpr::child_end() {
688 return &Args[0]+NumArgs;
689}
690
John McCall4765fa02010-12-06 08:20:24 +0000691// ExprWithCleanups
692Stmt::child_iterator ExprWithCleanups::child_begin() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000693 return &SubExpr;
Anders Carlsson19d28a62009-04-21 02:22:11 +0000694}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000695
John McCall4765fa02010-12-06 08:20:24 +0000696Stmt::child_iterator ExprWithCleanups::child_end() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000697 return &SubExpr + 1;
698}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000699
Douglas Gregorab6677e2010-09-08 00:15:04 +0000700CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000701 SourceLocation LParenLoc,
702 Expr **Args,
703 unsigned NumArgs,
704 SourceLocation RParenLoc)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000705 : Expr(CXXUnresolvedConstructExprClass,
706 Type->getType().getNonReferenceType(),
John McCall09431682010-11-18 19:01:18 +0000707 VK_LValue, OK_Ordinary,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000708 Type->getType()->isDependentType(), true),
709 Type(Type),
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000710 LParenLoc(LParenLoc),
711 RParenLoc(RParenLoc),
712 NumArgs(NumArgs) {
713 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
714 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs);
715}
716
717CXXUnresolvedConstructExpr *
Mike Stump1eb44332009-09-09 15:08:12 +0000718CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000719 TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000720 SourceLocation LParenLoc,
721 Expr **Args,
722 unsigned NumArgs,
723 SourceLocation RParenLoc) {
724 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
725 sizeof(Expr *) * NumArgs);
Douglas Gregorab6677e2010-09-08 00:15:04 +0000726 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000727 Args, NumArgs, RParenLoc);
728}
729
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000730CXXUnresolvedConstructExpr *
731CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
732 Stmt::EmptyShell Empty;
733 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
734 sizeof(Expr *) * NumArgs);
735 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
736}
737
Douglas Gregorab6677e2010-09-08 00:15:04 +0000738SourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
739 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
740}
741
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000742Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
743 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
744}
745
746Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
747 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
748}
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000749
John McCall865d4472009-11-19 22:55:06 +0000750CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000751 Expr *Base, QualType BaseType,
752 bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000753 SourceLocation OperatorLoc,
754 NestedNameSpecifier *Qualifier,
755 SourceRange QualifierRange,
756 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000757 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000758 const TemplateArgumentListInfo *TemplateArgs)
John McCallf89e55a2010-11-18 06:31:45 +0000759 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
760 VK_LValue, OK_Ordinary, true, true),
John McCallaa81e162009-12-01 22:10:20 +0000761 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
762 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000763 OperatorLoc(OperatorLoc),
764 Qualifier(Qualifier), QualifierRange(QualifierRange),
765 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Abramo Bagnara25777432010-08-11 22:01:17 +0000766 MemberNameInfo(MemberNameInfo) {
John McCalld5532b62009-11-23 01:53:49 +0000767 if (TemplateArgs)
John McCall096832c2010-08-19 23:49:38 +0000768 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000769}
770
John McCall865d4472009-11-19 22:55:06 +0000771CXXDependentScopeMemberExpr *
772CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000773 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000774 SourceLocation OperatorLoc,
775 NestedNameSpecifier *Qualifier,
776 SourceRange QualifierRange,
777 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000778 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000779 const TemplateArgumentListInfo *TemplateArgs) {
780 if (!TemplateArgs)
John McCallaa81e162009-12-01 22:10:20 +0000781 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
782 IsArrow, OperatorLoc,
783 Qualifier, QualifierRange,
784 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000785 MemberNameInfo);
Mike Stump1eb44332009-09-09 15:08:12 +0000786
John McCalld5532b62009-11-23 01:53:49 +0000787 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
788 if (TemplateArgs)
789 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
790
Chris Lattner32488542010-10-30 05:14:06 +0000791 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
John McCallaa81e162009-12-01 22:10:20 +0000792 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
793 IsArrow, OperatorLoc,
794 Qualifier, QualifierRange,
795 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000796 MemberNameInfo, TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000797}
798
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000799CXXDependentScopeMemberExpr *
800CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
801 unsigned NumTemplateArgs) {
802 if (NumTemplateArgs == 0)
803 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
804 0, SourceLocation(), 0,
805 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000806 DeclarationNameInfo());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000807
808 std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
809 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
Chris Lattner32488542010-10-30 05:14:06 +0000810 void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000811 CXXDependentScopeMemberExpr *E
812 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
813 0, SourceLocation(), 0,
814 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000815 DeclarationNameInfo(), 0);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000816 E->HasExplicitTemplateArgs = true;
817 return E;
818}
819
John McCall865d4472009-11-19 22:55:06 +0000820Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000821 return child_iterator(&Base);
822}
823
John McCall865d4472009-11-19 22:55:06 +0000824Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000825 if (isImplicitAccess())
826 return child_iterator(&Base);
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000827 return child_iterator(&Base + 1);
828}
John McCall129e2df2009-11-30 22:42:35 +0000829
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000830UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, QualType T,
831 bool Dependent,
John McCall129e2df2009-11-30 22:42:35 +0000832 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000833 Expr *Base, QualType BaseType,
834 bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000835 SourceLocation OperatorLoc,
836 NestedNameSpecifier *Qualifier,
837 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000838 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000839 const TemplateArgumentListInfo *TemplateArgs,
840 UnresolvedSetIterator Begin,
841 UnresolvedSetIterator End)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000842 : OverloadExpr(UnresolvedMemberExprClass, C, T, Dependent,
Abramo Bagnara25777432010-08-11 22:01:17 +0000843 Qualifier, QualifierRange, MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000844 TemplateArgs != 0, Begin, End),
John McCall7bb12da2010-02-02 06:20:04 +0000845 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
846 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
John McCall129e2df2009-11-30 22:42:35 +0000847 if (TemplateArgs)
John McCall7bb12da2010-02-02 06:20:04 +0000848 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
John McCall129e2df2009-11-30 22:42:35 +0000849}
850
851UnresolvedMemberExpr *
852UnresolvedMemberExpr::Create(ASTContext &C, bool Dependent,
853 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000854 Expr *Base, QualType BaseType, bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000855 SourceLocation OperatorLoc,
856 NestedNameSpecifier *Qualifier,
857 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000858 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000859 const TemplateArgumentListInfo *TemplateArgs,
860 UnresolvedSetIterator Begin,
861 UnresolvedSetIterator End) {
John McCall129e2df2009-11-30 22:42:35 +0000862 std::size_t size = sizeof(UnresolvedMemberExpr);
863 if (TemplateArgs)
864 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
865
Chris Lattner32488542010-10-30 05:14:06 +0000866 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000867 return new (Mem) UnresolvedMemberExpr(C,
John McCall129e2df2009-11-30 22:42:35 +0000868 Dependent ? C.DependentTy : C.OverloadTy,
John McCallaa81e162009-12-01 22:10:20 +0000869 Dependent, HasUnresolvedUsing, Base, BaseType,
870 IsArrow, OperatorLoc, Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000871 MemberNameInfo, TemplateArgs, Begin, End);
John McCall129e2df2009-11-30 22:42:35 +0000872}
873
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000874UnresolvedMemberExpr *
875UnresolvedMemberExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
876 std::size_t size = sizeof(UnresolvedMemberExpr);
877 if (NumTemplateArgs != 0)
878 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
879
Chris Lattner32488542010-10-30 05:14:06 +0000880 void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000881 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
882 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
883 return E;
884}
885
John McCallc373d482010-01-27 01:50:18 +0000886CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
887 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
888
889 // If there was a nested name specifier, it names the naming class.
890 // It can't be dependent: after all, we were actually able to do the
891 // lookup.
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000892 CXXRecordDecl *Record = 0;
John McCall7bb12da2010-02-02 06:20:04 +0000893 if (getQualifier()) {
894 Type *T = getQualifier()->getAsType();
John McCallc373d482010-01-27 01:50:18 +0000895 assert(T && "qualifier in member expression does not name type");
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000896 Record = T->getAsCXXRecordDecl();
897 assert(Record && "qualifier in member expression does not name record");
898 }
John McCallc373d482010-01-27 01:50:18 +0000899 // Otherwise the naming class must have been the base class.
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000900 else {
John McCallc373d482010-01-27 01:50:18 +0000901 QualType BaseType = getBaseType().getNonReferenceType();
902 if (isArrow()) {
903 const PointerType *PT = BaseType->getAs<PointerType>();
904 assert(PT && "base of arrow member access is not pointer");
905 BaseType = PT->getPointeeType();
906 }
907
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000908 Record = BaseType->getAsCXXRecordDecl();
909 assert(Record && "base of member expression does not name record");
John McCallc373d482010-01-27 01:50:18 +0000910 }
911
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000912 return Record;
John McCallc373d482010-01-27 01:50:18 +0000913}
914
John McCall129e2df2009-11-30 22:42:35 +0000915Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
916 return child_iterator(&Base);
917}
918
919Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000920 if (isImplicitAccess())
921 return child_iterator(&Base);
John McCall129e2df2009-11-30 22:42:35 +0000922 return child_iterator(&Base + 1);
923}
Sebastian Redl2e156222010-09-10 20:55:43 +0000924
925Stmt::child_iterator CXXNoexceptExpr::child_begin() {
926 return child_iterator(&Operand);
927}
928Stmt::child_iterator CXXNoexceptExpr::child_end() {
929 return child_iterator(&Operand + 1);
930}