blob: 458206276c467e7800f1e31e27f69b19cb11b696 [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
Ted Kremeneka758d092007-08-24 20:21:10 +000042// CXXBoolLiteralExpr
Mike Stump1eb44332009-09-09 15:08:12 +000043Stmt::child_iterator CXXBoolLiteralExpr::child_begin() {
Ted Kremenek9ac59282007-10-18 23:28:49 +000044 return child_iterator();
45}
46Stmt::child_iterator CXXBoolLiteralExpr::child_end() {
47 return child_iterator();
48}
Chris Lattner50dd2892008-02-26 00:51:44 +000049
Sebastian Redl6e8ed162009-05-10 18:38:11 +000050// CXXNullPtrLiteralExpr
Mike Stump1eb44332009-09-09 15:08:12 +000051Stmt::child_iterator CXXNullPtrLiteralExpr::child_begin() {
Sebastian Redl6e8ed162009-05-10 18:38:11 +000052 return child_iterator();
53}
54Stmt::child_iterator CXXNullPtrLiteralExpr::child_end() {
55 return child_iterator();
56}
57
Douglas Gregor796da182008-11-04 14:32:21 +000058// CXXThisExpr
59Stmt::child_iterator CXXThisExpr::child_begin() { return child_iterator(); }
60Stmt::child_iterator CXXThisExpr::child_end() { return child_iterator(); }
61
Chris Lattner50dd2892008-02-26 00:51:44 +000062// CXXThrowExpr
Ted Kremenek1060aff2008-06-17 03:11:08 +000063Stmt::child_iterator CXXThrowExpr::child_begin() { return &Op; }
Chris Lattner50dd2892008-02-26 00:51:44 +000064Stmt::child_iterator CXXThrowExpr::child_end() {
65 // If Op is 0, we are processing throw; which has no children.
Ted Kremenek1060aff2008-06-17 03:11:08 +000066 return Op ? &Op+1 : &Op;
Chris Lattner50dd2892008-02-26 00:51:44 +000067}
Chris Lattner04421082008-04-08 04:40:51 +000068
69// CXXDefaultArgExpr
70Stmt::child_iterator CXXDefaultArgExpr::child_begin() {
Chris Lattner8123a952008-04-10 02:22:51 +000071 return child_iterator();
Chris Lattner04421082008-04-08 04:40:51 +000072}
73Stmt::child_iterator CXXDefaultArgExpr::child_end() {
Chris Lattner8123a952008-04-10 02:22:51 +000074 return child_iterator();
Chris Lattner04421082008-04-08 04:40:51 +000075}
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +000076
Douglas Gregored8abf12010-07-08 06:14:04 +000077// CXXScalarValueInitExpr
78Stmt::child_iterator CXXScalarValueInitExpr::child_begin() {
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +000079 return child_iterator();
80}
Douglas Gregored8abf12010-07-08 06:14:04 +000081Stmt::child_iterator CXXScalarValueInitExpr::child_end() {
Argyrios Kyrtzidis987a14b2008-08-22 15:38:55 +000082 return child_iterator();
83}
Argyrios Kyrtzidis9e922b12008-09-09 23:47:53 +000084
Sebastian Redl4c5d3202008-11-21 19:14:01 +000085// CXXNewExpr
Ted Kremenekad7fe862010-02-11 22:51:03 +000086CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
Sebastian Redl4c5d3202008-11-21 19:14:01 +000087 Expr **placementArgs, unsigned numPlaceArgs,
Douglas Gregor4bd40312010-07-13 15:54:32 +000088 SourceRange TypeIdParens, Expr *arraySize,
Sebastian Redl4c5d3202008-11-21 19:14:01 +000089 CXXConstructorDecl *constructor, bool initializer,
90 Expr **constructorArgs, unsigned numConsArgs,
91 FunctionDecl *operatorDelete, QualType ty,
92 SourceLocation startLoc, SourceLocation endLoc)
Sebastian Redl28507842009-02-26 14:39:58 +000093 : Expr(CXXNewExprClass, ty, ty->isDependentType(), ty->isDependentType()),
Douglas Gregor4bd40312010-07-13 15:54:32 +000094 GlobalNew(globalNew),
Chris Lattner59218632010-05-10 01:22:27 +000095 Initializer(initializer), SubExprs(0), OperatorNew(operatorNew),
Sebastian Redlcee63fb2008-12-02 14:43:59 +000096 OperatorDelete(operatorDelete), Constructor(constructor),
Douglas Gregor4bd40312010-07-13 15:54:32 +000097 TypeIdParens(TypeIdParens), StartLoc(startLoc), EndLoc(endLoc) {
Chris Lattner59218632010-05-10 01:22:27 +000098
99 AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000100 unsigned i = 0;
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000101 if (Array)
102 SubExprs[i++] = arraySize;
103 for (unsigned j = 0; j < NumPlacementArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000104 SubExprs[i++] = placementArgs[j];
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000105 for (unsigned j = 0; j < NumConstructorArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000106 SubExprs[i++] = constructorArgs[j];
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000107}
108
Chris Lattner59218632010-05-10 01:22:27 +0000109void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray,
110 unsigned numPlaceArgs, unsigned numConsArgs){
111 assert(SubExprs == 0 && "SubExprs already allocated");
112 Array = isArray;
113 NumPlacementArgs = numPlaceArgs;
114 NumConstructorArgs = numConsArgs;
115
116 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
117 SubExprs = new (C) Stmt*[TotalSize];
118}
119
120
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000121Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
122Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000123 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000124}
125
126// CXXDeleteExpr
127Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
128Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
129
Douglas Gregora71d8192009-09-04 17:36:40 +0000130// CXXPseudoDestructorExpr
131Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
132Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
133 return &Base + 1;
134}
135
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000136PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
137 : Type(Info)
138{
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000139 Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000140}
141
142QualType CXXPseudoDestructorExpr::getDestroyedType() const {
143 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
144 return TInfo->getType();
145
146 return QualType();
147}
148
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000149SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000150 SourceLocation End = DestroyedType.getLocation();
151 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000152 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000153 return SourceRange(Base->getLocStart(), End);
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000154}
155
156
John McCallba135432009-11-21 08:51:07 +0000157// UnresolvedLookupExpr
John McCallf7a1a742009-11-24 19:00:30 +0000158UnresolvedLookupExpr *
159UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent,
John McCallc373d482010-01-27 01:50:18 +0000160 CXXRecordDecl *NamingClass,
John McCallf7a1a742009-11-24 19:00:30 +0000161 NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000162 SourceRange QualifierRange,
163 const DeclarationNameInfo &NameInfo,
164 bool ADL,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000165 const TemplateArgumentListInfo &Args,
166 UnresolvedSetIterator Begin,
167 UnresolvedSetIterator End)
John McCallf7a1a742009-11-24 19:00:30 +0000168{
169 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
170 ExplicitTemplateArgumentList::sizeFor(Args));
171 UnresolvedLookupExpr *ULE
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000172 = new (Mem) UnresolvedLookupExpr(C,
173 Dependent ? C.DependentTy : C.OverloadTy,
John McCallc373d482010-01-27 01:50:18 +0000174 Dependent, NamingClass,
Abramo Bagnara25777432010-08-11 22:01:17 +0000175 Qualifier, QualifierRange, NameInfo,
176 ADL,
John McCallf7a1a742009-11-24 19:00:30 +0000177 /*Overload*/ true,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000178 /*ExplicitTemplateArgs*/ true,
179 Begin, End);
John McCallf7a1a742009-11-24 19:00:30 +0000180
181 reinterpret_cast<ExplicitTemplateArgumentList*>(ULE+1)->initializeFrom(Args);
182
183 return ULE;
184}
185
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000186UnresolvedLookupExpr *
187UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
188 std::size_t size = sizeof(UnresolvedLookupExpr);
189 if (NumTemplateArgs != 0)
190 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
191
192 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedLookupExpr>());
193 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
194 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
195 return E;
196}
197
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000198OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C, QualType T,
199 bool Dependent, NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000200 SourceRange QRange,
201 const DeclarationNameInfo &NameInfo,
202 bool HasTemplateArgs,
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000203 UnresolvedSetIterator Begin,
204 UnresolvedSetIterator End)
205 : Expr(K, T, Dependent, Dependent),
Abramo Bagnara25777432010-08-11 22:01:17 +0000206 Results(0), NumResults(0), NameInfo(NameInfo), Qualifier(Qualifier),
207 QualifierRange(QRange), HasExplicitTemplateArgs(HasTemplateArgs)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000208{
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000209 initializeResults(C, Begin, End);
210}
211
212void OverloadExpr::initializeResults(ASTContext &C,
213 UnresolvedSetIterator Begin,
214 UnresolvedSetIterator End) {
215 assert(Results == 0 && "Results already initialized!");
216 NumResults = End - Begin;
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000217 if (NumResults) {
218 Results = static_cast<DeclAccessPair *>(
219 C.Allocate(sizeof(DeclAccessPair) * NumResults,
220 llvm::alignof<DeclAccessPair>()));
221 memcpy(Results, &*Begin.getIterator(),
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000222 NumResults * sizeof(DeclAccessPair));
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000223 }
224}
225
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000226
John McCall7bb12da2010-02-02 06:20:04 +0000227bool OverloadExpr::ComputeDependence(UnresolvedSetIterator Begin,
228 UnresolvedSetIterator End,
229 const TemplateArgumentListInfo *Args) {
John McCalleec51cf2010-01-20 00:46:10 +0000230 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I)
John McCallf7a1a742009-11-24 19:00:30 +0000231 if ((*I)->getDeclContext()->isDependentContext())
232 return true;
233
234 if (Args && TemplateSpecializationType::anyDependentTemplateArguments(*Args))
235 return true;
236
237 return false;
238}
239
John McCalle9ee23e2010-04-22 18:44:12 +0000240CXXRecordDecl *OverloadExpr::getNamingClass() const {
241 if (isa<UnresolvedLookupExpr>(this))
242 return cast<UnresolvedLookupExpr>(this)->getNamingClass();
243 else
244 return cast<UnresolvedMemberExpr>(this)->getNamingClass();
245}
246
John McCallba135432009-11-21 08:51:07 +0000247Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump1eb44332009-09-09 15:08:12 +0000248 return child_iterator();
Douglas Gregor5c37de72008-12-06 00:22:45 +0000249}
John McCallba135432009-11-21 08:51:07 +0000250Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregor5c37de72008-12-06 00:22:45 +0000251 return child_iterator();
252}
Sebastian Redl64b45f72009-01-05 20:52:13 +0000253// UnaryTypeTraitExpr
254Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
255 return child_iterator();
256}
257Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
258 return child_iterator();
259}
260
John McCall865d4472009-11-19 22:55:06 +0000261// DependentScopeDeclRefExpr
John McCallf7a1a742009-11-24 19:00:30 +0000262DependentScopeDeclRefExpr *
263DependentScopeDeclRefExpr::Create(ASTContext &C,
264 NestedNameSpecifier *Qualifier,
265 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000266 const DeclarationNameInfo &NameInfo,
John McCallf7a1a742009-11-24 19:00:30 +0000267 const TemplateArgumentListInfo *Args) {
268 std::size_t size = sizeof(DependentScopeDeclRefExpr);
269 if (Args) size += ExplicitTemplateArgumentList::sizeFor(*Args);
270 void *Mem = C.Allocate(size);
271
272 DependentScopeDeclRefExpr *DRE
273 = new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
274 Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000275 NameInfo, Args != 0);
John McCallf7a1a742009-11-24 19:00:30 +0000276
277 if (Args)
278 reinterpret_cast<ExplicitTemplateArgumentList*>(DRE+1)
279 ->initializeFrom(*Args);
280
281 return DRE;
282}
283
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000284DependentScopeDeclRefExpr *
285DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
286 unsigned NumTemplateArgs) {
287 std::size_t size = sizeof(DependentScopeDeclRefExpr);
288 if (NumTemplateArgs)
289 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
290 void *Mem = C.Allocate(size);
291
292 return new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(),
Abramo Bagnara25777432010-08-11 22:01:17 +0000293 DeclarationNameInfo(),
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000294 NumTemplateArgs != 0);
295}
296
John McCall865d4472009-11-19 22:55:06 +0000297StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000298 return child_iterator();
299}
300
John McCall865d4472009-11-19 22:55:06 +0000301StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000302 return child_iterator();
303}
304
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000305bool UnaryTypeTraitExpr::EvaluateTrait(ASTContext& C) const {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000306 switch(UTT) {
307 default: assert(false && "Unknown type trait or not implemented");
308 case UTT_IsPOD: return QueriedType->isPODType();
Sebastian Redlccf43502009-12-03 00:13:20 +0000309 case UTT_IsLiteral: return QueriedType->isLiteralType();
Sebastian Redl64b45f72009-01-05 20:52:13 +0000310 case UTT_IsClass: // Fallthrough
311 case UTT_IsUnion:
Ted Kremenek6217b802009-07-29 21:53:49 +0000312 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000313 bool Union = Record->getDecl()->isUnion();
314 return UTT == UTT_IsUnion ? Union : !Union;
315 }
316 return false;
317 case UTT_IsEnum: return QueriedType->isEnumeralType();
318 case UTT_IsPolymorphic:
Ted Kremenek6217b802009-07-29 21:53:49 +0000319 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000320 // Type traits are only parsed in C++, so we've got CXXRecords.
321 return cast<CXXRecordDecl>(Record->getDecl())->isPolymorphic();
322 }
323 return false;
Anders Carlsson67e4dd22009-03-22 01:52:17 +0000324 case UTT_IsAbstract:
Ted Kremenek6217b802009-07-29 21:53:49 +0000325 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Anders Carlsson67e4dd22009-03-22 01:52:17 +0000326 return cast<CXXRecordDecl>(RT->getDecl())->isAbstract();
327 return false;
Eli Friedman1d954f62009-08-15 21:55:26 +0000328 case UTT_IsEmpty:
329 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
330 return !Record->getDecl()->isUnion()
331 && cast<CXXRecordDecl>(Record->getDecl())->isEmpty();
332 }
333 return false;
Anders Carlsson347ba892009-04-16 00:08:20 +0000334 case UTT_HasTrivialConstructor:
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000335 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
336 // If __is_pod (type) is true then the trait is true, else if type is
337 // a cv class or union type (or array thereof) with a trivial default
338 // constructor ([class.ctor]) then the trait is true, else it is false.
339 if (QueriedType->isPODType())
340 return true;
341 if (const RecordType *RT =
Ted Kremenek6217b802009-07-29 21:53:49 +0000342 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlsson347ba892009-04-16 00:08:20 +0000343 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialConstructor();
Anders Carlsson072abef2009-04-17 02:34:54 +0000344 return false;
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000345 case UTT_HasTrivialCopy:
346 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
347 // If __is_pod (type) is true or type is a reference type then
348 // the trait is true, else if type is a cv class or union type
349 // with a trivial copy constructor ([class.copy]) then the trait
350 // is true, else it is false.
351 if (QueriedType->isPODType() || QueriedType->isReferenceType())
352 return true;
Ted Kremenek6217b802009-07-29 21:53:49 +0000353 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000354 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyConstructor();
355 return false;
356 case UTT_HasTrivialAssign:
357 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
358 // If type is const qualified or is a reference type then the
359 // trait is false. Otherwise if __is_pod (type) is true then the
360 // trait is true, else if type is a cv class or union type with
361 // a trivial copy assignment ([class.copy]) then the trait is
362 // true, else it is false.
363 // Note: the const and reference restrictions are interesting,
364 // given that const and reference members don't prevent a class
365 // from having a trivial copy assignment operator (but do cause
366 // errors if the copy assignment operator is actually used, q.v.
367 // [class.copy]p12).
368
369 if (C.getBaseElementType(QueriedType).isConstQualified())
370 return false;
371 if (QueriedType->isPODType())
372 return true;
Ted Kremenek6217b802009-07-29 21:53:49 +0000373 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000374 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyAssignment();
375 return false;
376 case UTT_HasTrivialDestructor:
377 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
378 // If __is_pod (type) is true or type is a reference type
379 // then the trait is true, else if type is a cv class or union
380 // type (or array thereof) with a trivial destructor
381 // ([class.dtor]) then the trait is true, else it is
382 // false.
383 if (QueriedType->isPODType() || QueriedType->isReferenceType())
384 return true;
385 if (const RecordType *RT =
Ted Kremenek6217b802009-07-29 21:53:49 +0000386 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlsson072abef2009-04-17 02:34:54 +0000387 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor();
388 return false;
Sebastian Redl64b45f72009-01-05 20:52:13 +0000389 }
390}
391
Ted Kremeneke3837682009-12-23 04:00:48 +0000392SourceRange CXXConstructExpr::getSourceRange() const {
393 // FIXME: Should we know where the parentheses are, if there are any?
394 for (std::reverse_iterator<Stmt**> I(&Args[NumArgs]), E(&Args[0]); I!=E;++I) {
395 // Ignore CXXDefaultExprs when computing the range, as they don't
396 // have a range.
397 if (!isa<CXXDefaultArgExpr>(*I))
398 return SourceRange(Loc, (*I)->getLocEnd());
399 }
400
401 return SourceRange(Loc);
402}
403
Douglas Gregorb4609802008-11-14 16:09:21 +0000404SourceRange CXXOperatorCallExpr::getSourceRange() const {
405 OverloadedOperatorKind Kind = getOperator();
406 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
407 if (getNumArgs() == 1)
408 // Prefix operator
Mike Stump1eb44332009-09-09 15:08:12 +0000409 return SourceRange(getOperatorLoc(),
Douglas Gregorb4609802008-11-14 16:09:21 +0000410 getArg(0)->getSourceRange().getEnd());
411 else
412 // Postfix operator
413 return SourceRange(getArg(0)->getSourceRange().getEnd(),
414 getOperatorLoc());
415 } else if (Kind == OO_Call) {
416 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
417 } else if (Kind == OO_Subscript) {
418 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
419 } else if (getNumArgs() == 1) {
420 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
421 } else if (getNumArgs() == 2) {
422 return SourceRange(getArg(0)->getSourceRange().getBegin(),
423 getArg(1)->getSourceRange().getEnd());
424 } else {
425 return SourceRange();
426 }
427}
428
Douglas Gregor88a35142008-12-22 05:46:06 +0000429Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
430 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
431 return MemExpr->getBase();
432
433 // FIXME: Will eventually need to cope with member pointers.
434 return 0;
435}
436
Douglas Gregor00b98c22009-11-12 15:31:47 +0000437SourceRange CXXMemberCallExpr::getSourceRange() const {
438 SourceLocation LocStart = getCallee()->getLocStart();
439 if (LocStart.isInvalid() && getNumArgs() > 0)
440 LocStart = getArg(0)->getLocStart();
441 return SourceRange(LocStart, getRParenLoc());
442}
443
444
Douglas Gregor49badde2008-10-27 19:41:14 +0000445//===----------------------------------------------------------------------===//
446// Named casts
447//===----------------------------------------------------------------------===//
448
449/// getCastName - Get the name of the C++ cast being used, e.g.,
450/// "static_cast", "dynamic_cast", "reinterpret_cast", or
451/// "const_cast". The returned pointer must not be freed.
452const char *CXXNamedCastExpr::getCastName() const {
453 switch (getStmtClass()) {
454 case CXXStaticCastExprClass: return "static_cast";
455 case CXXDynamicCastExprClass: return "dynamic_cast";
456 case CXXReinterpretCastExprClass: return "reinterpret_cast";
457 case CXXConstCastExprClass: return "const_cast";
458 default: return "<invalid cast>";
459 }
460}
Douglas Gregor506ae412009-01-16 18:33:17 +0000461
John McCallf871d0c2010-08-07 06:22:56 +0000462CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
463 CastKind K, Expr *Op,
464 const CXXCastPath *BasePath,
465 TypeSourceInfo *WrittenTy,
466 SourceLocation L) {
467 unsigned PathSize = (BasePath ? BasePath->size() : 0);
468 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
469 + PathSize * sizeof(CXXBaseSpecifier*));
470 CXXStaticCastExpr *E =
471 new (Buffer) CXXStaticCastExpr(T, K, Op, PathSize, WrittenTy, L);
472 if (PathSize) E->setCastPath(*BasePath);
473 return E;
474}
475
476CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
477 unsigned PathSize) {
478 void *Buffer =
479 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
480 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
481}
482
483CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
484 CastKind K, Expr *Op,
485 const CXXCastPath *BasePath,
486 TypeSourceInfo *WrittenTy,
487 SourceLocation L) {
488 unsigned PathSize = (BasePath ? BasePath->size() : 0);
489 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
490 + PathSize * sizeof(CXXBaseSpecifier*));
491 CXXDynamicCastExpr *E =
492 new (Buffer) CXXDynamicCastExpr(T, K, Op, PathSize, WrittenTy, L);
493 if (PathSize) E->setCastPath(*BasePath);
494 return E;
495}
496
497CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
498 unsigned PathSize) {
499 void *Buffer =
500 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
501 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
502}
503
504CXXReinterpretCastExpr *
505CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, CastKind K, Expr *Op,
506 const CXXCastPath *BasePath,
507 TypeSourceInfo *WrittenTy, SourceLocation L) {
508 unsigned PathSize = (BasePath ? BasePath->size() : 0);
509 void *Buffer =
510 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
511 CXXReinterpretCastExpr *E =
512 new (Buffer) CXXReinterpretCastExpr(T, K, Op, PathSize, WrittenTy, L);
513 if (PathSize) E->setCastPath(*BasePath);
514 return E;
515}
516
517CXXReinterpretCastExpr *
518CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
519 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
520 + PathSize * sizeof(CXXBaseSpecifier*));
521 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
522}
523
524CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T, Expr *Op,
525 TypeSourceInfo *WrittenTy,
526 SourceLocation L) {
527 return new (C) CXXConstCastExpr(T, Op, WrittenTy, L);
528}
529
530CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
531 return new (C) CXXConstCastExpr(EmptyShell());
532}
533
534CXXFunctionalCastExpr *
535CXXFunctionalCastExpr::Create(ASTContext &C, QualType T,
536 TypeSourceInfo *Written, SourceLocation L,
537 CastKind K, Expr *Op, const CXXCastPath *BasePath,
538 SourceLocation R) {
539 unsigned PathSize = (BasePath ? BasePath->size() : 0);
540 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
541 + PathSize * sizeof(CXXBaseSpecifier*));
542 CXXFunctionalCastExpr *E =
543 new (Buffer) CXXFunctionalCastExpr(T, Written, L, K, Op, PathSize, R);
544 if (PathSize) E->setCastPath(*BasePath);
545 return E;
546}
547
548CXXFunctionalCastExpr *
549CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
550 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
551 + PathSize * sizeof(CXXBaseSpecifier*));
552 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
553}
554
555
Douglas Gregor65222e82009-12-23 18:19:08 +0000556CXXDefaultArgExpr *
Douglas Gregor036aed12009-12-23 23:03:06 +0000557CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
558 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor65222e82009-12-23 18:19:08 +0000559 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor036aed12009-12-23 23:03:06 +0000560 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
561 SubExpr);
Douglas Gregor65222e82009-12-23 18:19:08 +0000562}
563
Mike Stump1eb44332009-09-09 15:08:12 +0000564CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonb859f352009-05-30 20:34:37 +0000565 const CXXDestructorDecl *Destructor) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000566 return new (C) CXXTemporary(Destructor);
567}
568
Mike Stump1eb44332009-09-09 15:08:12 +0000569CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000570 CXXTemporary *Temp,
571 Expr* SubExpr) {
Mike Stump1eb44332009-09-09 15:08:12 +0000572 assert(SubExpr->getType()->isRecordType() &&
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000573 "Expression bound to a temporary must have record type!");
574
Anders Carlssonb859f352009-05-30 20:34:37 +0000575 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000576}
577
Anders Carlssoneb60edf2010-01-29 02:39:32 +0000578CXXBindReferenceExpr *CXXBindReferenceExpr::Create(ASTContext &C, Expr *SubExpr,
579 bool ExtendsLifetime,
580 bool RequiresTemporaryCopy) {
581 return new (C) CXXBindReferenceExpr(SubExpr,
582 ExtendsLifetime,
583 RequiresTemporaryCopy);
584}
585
Anders Carlsson8e587a12009-05-30 20:56:46 +0000586CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson26de5492009-04-24 05:23:13 +0000587 CXXConstructorDecl *Cons,
Douglas Gregor506ae412009-01-16 18:33:17 +0000588 QualType writtenTy,
Mike Stump1eb44332009-09-09 15:08:12 +0000589 SourceLocation tyBeginLoc,
Douglas Gregor506ae412009-01-16 18:33:17 +0000590 Expr **Args,
Mike Stump1eb44332009-09-09 15:08:12 +0000591 unsigned NumArgs,
Douglas Gregor1c63b9c2010-04-27 20:36:09 +0000592 SourceLocation rParenLoc,
593 bool ZeroInitialization)
Douglas Gregor99a2e602009-12-16 01:38:02 +0000594 : CXXConstructExpr(C, CXXTemporaryObjectExprClass, writtenTy, tyBeginLoc,
Douglas Gregor1c63b9c2010-04-27 20:36:09 +0000595 Cons, false, Args, NumArgs, ZeroInitialization),
Anders Carlsson524fa132009-04-24 17:34:38 +0000596 TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {
Douglas Gregor506ae412009-01-16 18:33:17 +0000597}
Anders Carlsson19d28a62009-04-21 02:22:11 +0000598
Mike Stump1eb44332009-09-09 15:08:12 +0000599CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000600 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000601 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000602 Expr **Args, unsigned NumArgs,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000603 bool ZeroInitialization,
Anders Carlssonfcaeef22010-05-02 23:53:04 +0000604 ConstructionKind ConstructKind) {
Douglas Gregor99a2e602009-12-16 01:38:02 +0000605 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000606 Elidable, Args, NumArgs, ZeroInitialization,
Anders Carlssonfcaeef22010-05-02 23:53:04 +0000607 ConstructKind);
Anders Carlssone349bea2009-04-23 02:32:43 +0000608}
609
Mike Stump1eb44332009-09-09 15:08:12 +0000610CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000611 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000612 CXXConstructorDecl *D, bool elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000613 Expr **args, unsigned numargs,
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000614 bool ZeroInitialization,
615 ConstructionKind ConstructKind)
Anders Carlssonbd6734e2009-04-24 05:04:04 +0000616: Expr(SC, T,
Anders Carlssone349bea2009-04-23 02:32:43 +0000617 T->isDependentType(),
618 (T->isDependentType() ||
619 CallExpr::hasAnyValueDependentArguments(args, numargs))),
Douglas Gregor16006c92009-12-16 18:50:27 +0000620 Constructor(D), Loc(Loc), Elidable(elidable),
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000621 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
622 Args(0), NumArgs(numargs)
Douglas Gregor16006c92009-12-16 18:50:27 +0000623{
624 if (NumArgs) {
625 Args = new (C) Stmt*[NumArgs];
626
627 for (unsigned i = 0; i != NumArgs; ++i) {
628 assert(args[i] && "NULL argument in CXXConstructExpr");
629 Args[i] = args[i];
Anders Carlssone349bea2009-04-23 02:32:43 +0000630 }
Douglas Gregor16006c92009-12-16 18:50:27 +0000631 }
Anders Carlssone349bea2009-04-23 02:32:43 +0000632}
633
Ted Kremenekd04ed412010-05-10 20:06:30 +0000634CXXExprWithTemporaries::CXXExprWithTemporaries(ASTContext &C,
635 Expr *subexpr,
Mike Stump1eb44332009-09-09 15:08:12 +0000636 CXXTemporary **temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000637 unsigned numtemps)
Chris Lattnerd2598362010-05-10 00:25:06 +0000638 : Expr(CXXExprWithTemporariesClass, subexpr->getType(),
Mike Stump1eb44332009-09-09 15:08:12 +0000639 subexpr->isTypeDependent(), subexpr->isValueDependent()),
Chris Lattnerd2598362010-05-10 00:25:06 +0000640 SubExpr(subexpr), Temps(0), NumTemps(0) {
Chris Lattneraff32cb2010-05-10 00:45:12 +0000641 if (numtemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000642 setNumTemporaries(C, numtemps);
Chris Lattnerd2598362010-05-10 00:25:06 +0000643 for (unsigned i = 0; i != numtemps; ++i)
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000644 Temps[i] = temps[i];
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000645 }
646}
647
Ted Kremenekd04ed412010-05-10 20:06:30 +0000648void CXXExprWithTemporaries::setNumTemporaries(ASTContext &C, unsigned N) {
Chris Lattnerd2598362010-05-10 00:25:06 +0000649 assert(Temps == 0 && "Cannot resize with this");
Daniel Dunbar90556d42010-05-10 15:59:37 +0000650 NumTemps = N;
Ted Kremenekd04ed412010-05-10 20:06:30 +0000651 Temps = new (C) CXXTemporary*[NumTemps];
Chris Lattnerd2598362010-05-10 00:25:06 +0000652}
653
654
Mike Stump1eb44332009-09-09 15:08:12 +0000655CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C,
Anders Carlsson88eaf072009-05-30 22:38:53 +0000656 Expr *SubExpr,
Mike Stump1eb44332009-09-09 15:08:12 +0000657 CXXTemporary **Temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000658 unsigned NumTemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000659 return new (C) CXXExprWithTemporaries(C, SubExpr, Temps, NumTemps);
Anders Carlsson88eaf072009-05-30 22:38:53 +0000660}
661
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000662// CXXBindTemporaryExpr
663Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
664 return &SubExpr;
665}
666
Mike Stump1eb44332009-09-09 15:08:12 +0000667Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000668 return &SubExpr + 1;
669}
670
Anders Carlssoneb60edf2010-01-29 02:39:32 +0000671// CXXBindReferenceExpr
672Stmt::child_iterator CXXBindReferenceExpr::child_begin() {
673 return &SubExpr;
674}
675
676Stmt::child_iterator CXXBindReferenceExpr::child_end() {
677 return &SubExpr + 1;
678}
679
Anders Carlssone349bea2009-04-23 02:32:43 +0000680// CXXConstructExpr
681Stmt::child_iterator CXXConstructExpr::child_begin() {
682 return &Args[0];
683}
684Stmt::child_iterator CXXConstructExpr::child_end() {
685 return &Args[0]+NumArgs;
686}
687
Anders Carlsson55674ac2009-05-01 22:21:22 +0000688// CXXExprWithTemporaries
689Stmt::child_iterator CXXExprWithTemporaries::child_begin() {
690 return &SubExpr;
Anders Carlsson19d28a62009-04-21 02:22:11 +0000691}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000692
Mike Stump1eb44332009-09-09 15:08:12 +0000693Stmt::child_iterator CXXExprWithTemporaries::child_end() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000694 return &SubExpr + 1;
695}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000696
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000697CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(
698 SourceLocation TyBeginLoc,
699 QualType T,
700 SourceLocation LParenLoc,
701 Expr **Args,
702 unsigned NumArgs,
703 SourceLocation RParenLoc)
704 : Expr(CXXUnresolvedConstructExprClass, T.getNonReferenceType(),
705 T->isDependentType(), true),
706 TyBeginLoc(TyBeginLoc),
707 Type(T),
708 LParenLoc(LParenLoc),
709 RParenLoc(RParenLoc),
710 NumArgs(NumArgs) {
711 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
712 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs);
713}
714
715CXXUnresolvedConstructExpr *
Mike Stump1eb44332009-09-09 15:08:12 +0000716CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000717 SourceLocation TyBegin,
718 QualType T,
719 SourceLocation LParenLoc,
720 Expr **Args,
721 unsigned NumArgs,
722 SourceLocation RParenLoc) {
723 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
724 sizeof(Expr *) * NumArgs);
725 return new (Mem) CXXUnresolvedConstructExpr(TyBegin, T, LParenLoc,
726 Args, NumArgs, RParenLoc);
727}
728
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000729CXXUnresolvedConstructExpr *
730CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
731 Stmt::EmptyShell Empty;
732 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
733 sizeof(Expr *) * NumArgs);
734 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
735}
736
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000737Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
738 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
739}
740
741Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
742 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
743}
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000744
John McCall865d4472009-11-19 22:55:06 +0000745CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000746 Expr *Base, QualType BaseType,
747 bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000748 SourceLocation OperatorLoc,
749 NestedNameSpecifier *Qualifier,
750 SourceRange QualifierRange,
751 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000752 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000753 const TemplateArgumentListInfo *TemplateArgs)
John McCall865d4472009-11-19 22:55:06 +0000754 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, true, true),
John McCallaa81e162009-12-01 22:10:20 +0000755 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
756 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000757 OperatorLoc(OperatorLoc),
758 Qualifier(Qualifier), QualifierRange(QualifierRange),
759 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Abramo Bagnara25777432010-08-11 22:01:17 +0000760 MemberNameInfo(MemberNameInfo) {
John McCalld5532b62009-11-23 01:53:49 +0000761 if (TemplateArgs)
762 getExplicitTemplateArgumentList()->initializeFrom(*TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000763}
764
John McCall865d4472009-11-19 22:55:06 +0000765CXXDependentScopeMemberExpr *
766CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000767 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000768 SourceLocation OperatorLoc,
769 NestedNameSpecifier *Qualifier,
770 SourceRange QualifierRange,
771 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000772 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000773 const TemplateArgumentListInfo *TemplateArgs) {
774 if (!TemplateArgs)
John McCallaa81e162009-12-01 22:10:20 +0000775 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
776 IsArrow, OperatorLoc,
777 Qualifier, QualifierRange,
778 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000779 MemberNameInfo);
Mike Stump1eb44332009-09-09 15:08:12 +0000780
John McCalld5532b62009-11-23 01:53:49 +0000781 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
782 if (TemplateArgs)
783 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
784
785 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>());
John McCallaa81e162009-12-01 22:10:20 +0000786 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
787 IsArrow, OperatorLoc,
788 Qualifier, QualifierRange,
789 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000790 MemberNameInfo, TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000791}
792
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000793CXXDependentScopeMemberExpr *
794CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
795 unsigned NumTemplateArgs) {
796 if (NumTemplateArgs == 0)
797 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
798 0, SourceLocation(), 0,
799 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000800 DeclarationNameInfo());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000801
802 std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
803 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
804 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>());
805 CXXDependentScopeMemberExpr *E
806 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
807 0, SourceLocation(), 0,
808 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000809 DeclarationNameInfo(), 0);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000810 E->HasExplicitTemplateArgs = true;
811 return E;
812}
813
John McCall865d4472009-11-19 22:55:06 +0000814Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000815 return child_iterator(&Base);
816}
817
John McCall865d4472009-11-19 22:55:06 +0000818Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000819 if (isImplicitAccess())
820 return child_iterator(&Base);
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000821 return child_iterator(&Base + 1);
822}
John McCall129e2df2009-11-30 22:42:35 +0000823
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000824UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, QualType T,
825 bool Dependent,
John McCall129e2df2009-11-30 22:42:35 +0000826 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000827 Expr *Base, QualType BaseType,
828 bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000829 SourceLocation OperatorLoc,
830 NestedNameSpecifier *Qualifier,
831 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000832 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000833 const TemplateArgumentListInfo *TemplateArgs,
834 UnresolvedSetIterator Begin,
835 UnresolvedSetIterator End)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000836 : OverloadExpr(UnresolvedMemberExprClass, C, T, Dependent,
Abramo Bagnara25777432010-08-11 22:01:17 +0000837 Qualifier, QualifierRange, MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000838 TemplateArgs != 0, Begin, End),
John McCall7bb12da2010-02-02 06:20:04 +0000839 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
840 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
John McCall129e2df2009-11-30 22:42:35 +0000841 if (TemplateArgs)
John McCall7bb12da2010-02-02 06:20:04 +0000842 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
John McCall129e2df2009-11-30 22:42:35 +0000843}
844
845UnresolvedMemberExpr *
846UnresolvedMemberExpr::Create(ASTContext &C, bool Dependent,
847 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000848 Expr *Base, QualType BaseType, bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000849 SourceLocation OperatorLoc,
850 NestedNameSpecifier *Qualifier,
851 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000852 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000853 const TemplateArgumentListInfo *TemplateArgs,
854 UnresolvedSetIterator Begin,
855 UnresolvedSetIterator End) {
John McCall129e2df2009-11-30 22:42:35 +0000856 std::size_t size = sizeof(UnresolvedMemberExpr);
857 if (TemplateArgs)
858 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
859
860 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>());
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000861 return new (Mem) UnresolvedMemberExpr(C,
John McCall129e2df2009-11-30 22:42:35 +0000862 Dependent ? C.DependentTy : C.OverloadTy,
John McCallaa81e162009-12-01 22:10:20 +0000863 Dependent, HasUnresolvedUsing, Base, BaseType,
864 IsArrow, OperatorLoc, Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000865 MemberNameInfo, TemplateArgs, Begin, End);
John McCall129e2df2009-11-30 22:42:35 +0000866}
867
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000868UnresolvedMemberExpr *
869UnresolvedMemberExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
870 std::size_t size = sizeof(UnresolvedMemberExpr);
871 if (NumTemplateArgs != 0)
872 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
873
874 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>());
875 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
876 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
877 return E;
878}
879
John McCallc373d482010-01-27 01:50:18 +0000880CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
881 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
882
883 // If there was a nested name specifier, it names the naming class.
884 // It can't be dependent: after all, we were actually able to do the
885 // lookup.
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000886 CXXRecordDecl *Record = 0;
John McCall7bb12da2010-02-02 06:20:04 +0000887 if (getQualifier()) {
888 Type *T = getQualifier()->getAsType();
John McCallc373d482010-01-27 01:50:18 +0000889 assert(T && "qualifier in member expression does not name type");
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000890 Record = T->getAsCXXRecordDecl();
891 assert(Record && "qualifier in member expression does not name record");
892 }
John McCallc373d482010-01-27 01:50:18 +0000893 // Otherwise the naming class must have been the base class.
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000894 else {
John McCallc373d482010-01-27 01:50:18 +0000895 QualType BaseType = getBaseType().getNonReferenceType();
896 if (isArrow()) {
897 const PointerType *PT = BaseType->getAs<PointerType>();
898 assert(PT && "base of arrow member access is not pointer");
899 BaseType = PT->getPointeeType();
900 }
901
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000902 Record = BaseType->getAsCXXRecordDecl();
903 assert(Record && "base of member expression does not name record");
John McCallc373d482010-01-27 01:50:18 +0000904 }
905
Douglas Gregorc96be1e2010-04-27 18:19:34 +0000906 return Record;
John McCallc373d482010-01-27 01:50:18 +0000907}
908
John McCall129e2df2009-11-30 22:42:35 +0000909Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
910 return child_iterator(&Base);
911}
912
913Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000914 if (isImplicitAccess())
915 return child_iterator(&Base);
John McCall129e2df2009-11-30 22:42:35 +0000916 return child_iterator(&Base + 1);
917}