blob: f72ab98eb877f7b52f81218121aa5b0117eb327b [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,
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000116 SourceLocation startLoc, SourceLocation endLoc)
Sebastian Redl28507842009-02-26 14:39:58 +0000117 : Expr(CXXNewExprClass, ty, ty->isDependentType(), ty->isDependentType()),
Douglas Gregor4bd40312010-07-13 15:54:32 +0000118 GlobalNew(globalNew),
Chris Lattner59218632010-05-10 01:22:27 +0000119 Initializer(initializer), SubExprs(0), OperatorNew(operatorNew),
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000120 OperatorDelete(operatorDelete), Constructor(constructor),
Douglas Gregor1bb2a932010-09-07 21:49:58 +0000121 AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens),
122 StartLoc(startLoc), EndLoc(endLoc) {
Chris Lattner59218632010-05-10 01:22:27 +0000123
124 AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000125 unsigned i = 0;
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000126 if (Array)
127 SubExprs[i++] = arraySize;
128 for (unsigned j = 0; j < NumPlacementArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000129 SubExprs[i++] = placementArgs[j];
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000130 for (unsigned j = 0; j < NumConstructorArgs; ++j)
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000131 SubExprs[i++] = constructorArgs[j];
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000132}
133
Chris Lattner59218632010-05-10 01:22:27 +0000134void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray,
135 unsigned numPlaceArgs, unsigned numConsArgs){
136 assert(SubExprs == 0 && "SubExprs already allocated");
137 Array = isArray;
138 NumPlacementArgs = numPlaceArgs;
139 NumConstructorArgs = numConsArgs;
140
141 unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
142 SubExprs = new (C) Stmt*[TotalSize];
143}
144
145
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000146Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
147Stmt::child_iterator CXXNewExpr::child_end() {
Sebastian Redlcee63fb2008-12-02 14:43:59 +0000148 return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000149}
150
151// CXXDeleteExpr
152Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
153Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
154
Douglas Gregora71d8192009-09-04 17:36:40 +0000155// CXXPseudoDestructorExpr
156Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
157Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
158 return &Base + 1;
159}
160
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000161PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
162 : Type(Info)
163{
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000164 Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000165}
166
167QualType CXXPseudoDestructorExpr::getDestroyedType() const {
168 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
169 return TInfo->getType();
170
171 return QualType();
172}
173
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000174SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000175 SourceLocation End = DestroyedType.getLocation();
176 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
Abramo Bagnarabd054db2010-05-20 10:00:11 +0000177 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
Douglas Gregora2e7dd22010-02-25 01:56:36 +0000178 return SourceRange(Base->getLocStart(), End);
Douglas Gregor26d4ac92010-02-24 23:40:28 +0000179}
180
181
John McCallba135432009-11-21 08:51:07 +0000182// UnresolvedLookupExpr
John McCallf7a1a742009-11-24 19:00:30 +0000183UnresolvedLookupExpr *
184UnresolvedLookupExpr::Create(ASTContext &C, bool Dependent,
John McCallc373d482010-01-27 01:50:18 +0000185 CXXRecordDecl *NamingClass,
John McCallf7a1a742009-11-24 19:00:30 +0000186 NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000187 SourceRange QualifierRange,
188 const DeclarationNameInfo &NameInfo,
189 bool ADL,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000190 const TemplateArgumentListInfo &Args,
191 UnresolvedSetIterator Begin,
192 UnresolvedSetIterator End)
John McCallf7a1a742009-11-24 19:00:30 +0000193{
194 void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
195 ExplicitTemplateArgumentList::sizeFor(Args));
196 UnresolvedLookupExpr *ULE
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000197 = new (Mem) UnresolvedLookupExpr(C,
198 Dependent ? C.DependentTy : C.OverloadTy,
John McCallc373d482010-01-27 01:50:18 +0000199 Dependent, NamingClass,
Abramo Bagnara25777432010-08-11 22:01:17 +0000200 Qualifier, QualifierRange, NameInfo,
201 ADL,
John McCallf7a1a742009-11-24 19:00:30 +0000202 /*Overload*/ true,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000203 /*ExplicitTemplateArgs*/ true,
204 Begin, End);
John McCallf7a1a742009-11-24 19:00:30 +0000205
206 reinterpret_cast<ExplicitTemplateArgumentList*>(ULE+1)->initializeFrom(Args);
207
208 return ULE;
209}
210
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +0000211UnresolvedLookupExpr *
212UnresolvedLookupExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
213 std::size_t size = sizeof(UnresolvedLookupExpr);
214 if (NumTemplateArgs != 0)
215 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
216
217 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedLookupExpr>());
218 UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
219 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
220 return E;
221}
222
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000223OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C, QualType T,
224 bool Dependent, NestedNameSpecifier *Qualifier,
Abramo Bagnara25777432010-08-11 22:01:17 +0000225 SourceRange QRange,
226 const DeclarationNameInfo &NameInfo,
227 bool HasTemplateArgs,
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000228 UnresolvedSetIterator Begin,
229 UnresolvedSetIterator End)
230 : Expr(K, T, Dependent, Dependent),
Abramo Bagnara25777432010-08-11 22:01:17 +0000231 Results(0), NumResults(0), NameInfo(NameInfo), Qualifier(Qualifier),
232 QualifierRange(QRange), HasExplicitTemplateArgs(HasTemplateArgs)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000233{
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000234 initializeResults(C, Begin, End);
235}
236
237void OverloadExpr::initializeResults(ASTContext &C,
238 UnresolvedSetIterator Begin,
239 UnresolvedSetIterator End) {
240 assert(Results == 0 && "Results already initialized!");
241 NumResults = End - Begin;
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000242 if (NumResults) {
243 Results = static_cast<DeclAccessPair *>(
244 C.Allocate(sizeof(DeclAccessPair) * NumResults,
245 llvm::alignof<DeclAccessPair>()));
246 memcpy(Results, &*Begin.getIterator(),
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000247 NumResults * sizeof(DeclAccessPair));
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000248 }
249}
250
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000251
John McCall7bb12da2010-02-02 06:20:04 +0000252bool OverloadExpr::ComputeDependence(UnresolvedSetIterator Begin,
253 UnresolvedSetIterator End,
254 const TemplateArgumentListInfo *Args) {
John McCalleec51cf2010-01-20 00:46:10 +0000255 for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I)
John McCallf7a1a742009-11-24 19:00:30 +0000256 if ((*I)->getDeclContext()->isDependentContext())
257 return true;
258
259 if (Args && TemplateSpecializationType::anyDependentTemplateArguments(*Args))
260 return true;
261
262 return false;
263}
264
John McCalle9ee23e2010-04-22 18:44:12 +0000265CXXRecordDecl *OverloadExpr::getNamingClass() const {
266 if (isa<UnresolvedLookupExpr>(this))
267 return cast<UnresolvedLookupExpr>(this)->getNamingClass();
268 else
269 return cast<UnresolvedMemberExpr>(this)->getNamingClass();
270}
271
John McCallba135432009-11-21 08:51:07 +0000272Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
Mike Stump1eb44332009-09-09 15:08:12 +0000273 return child_iterator();
Douglas Gregor5c37de72008-12-06 00:22:45 +0000274}
John McCallba135432009-11-21 08:51:07 +0000275Stmt::child_iterator UnresolvedLookupExpr::child_end() {
Douglas Gregor5c37de72008-12-06 00:22:45 +0000276 return child_iterator();
277}
Sebastian Redl64b45f72009-01-05 20:52:13 +0000278// UnaryTypeTraitExpr
279Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
280 return child_iterator();
281}
282Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
283 return child_iterator();
284}
285
John McCall865d4472009-11-19 22:55:06 +0000286// DependentScopeDeclRefExpr
John McCallf7a1a742009-11-24 19:00:30 +0000287DependentScopeDeclRefExpr *
288DependentScopeDeclRefExpr::Create(ASTContext &C,
289 NestedNameSpecifier *Qualifier,
290 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000291 const DeclarationNameInfo &NameInfo,
John McCallf7a1a742009-11-24 19:00:30 +0000292 const TemplateArgumentListInfo *Args) {
293 std::size_t size = sizeof(DependentScopeDeclRefExpr);
294 if (Args) size += ExplicitTemplateArgumentList::sizeFor(*Args);
295 void *Mem = C.Allocate(size);
296
297 DependentScopeDeclRefExpr *DRE
298 = new (Mem) DependentScopeDeclRefExpr(C.DependentTy,
299 Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000300 NameInfo, Args != 0);
John McCallf7a1a742009-11-24 19:00:30 +0000301
302 if (Args)
303 reinterpret_cast<ExplicitTemplateArgumentList*>(DRE+1)
304 ->initializeFrom(*Args);
305
306 return DRE;
307}
308
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000309DependentScopeDeclRefExpr *
310DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
311 unsigned NumTemplateArgs) {
312 std::size_t size = sizeof(DependentScopeDeclRefExpr);
313 if (NumTemplateArgs)
314 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
315 void *Mem = C.Allocate(size);
316
317 return new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(),
Abramo Bagnara25777432010-08-11 22:01:17 +0000318 DeclarationNameInfo(),
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +0000319 NumTemplateArgs != 0);
320}
321
John McCall865d4472009-11-19 22:55:06 +0000322StmtIterator DependentScopeDeclRefExpr::child_begin() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000323 return child_iterator();
324}
325
John McCall865d4472009-11-19 22:55:06 +0000326StmtIterator DependentScopeDeclRefExpr::child_end() {
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000327 return child_iterator();
328}
329
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000330bool UnaryTypeTraitExpr::EvaluateTrait(ASTContext& C) const {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000331 switch(UTT) {
332 default: assert(false && "Unknown type trait or not implemented");
333 case UTT_IsPOD: return QueriedType->isPODType();
Sebastian Redlccf43502009-12-03 00:13:20 +0000334 case UTT_IsLiteral: return QueriedType->isLiteralType();
Sebastian Redl64b45f72009-01-05 20:52:13 +0000335 case UTT_IsClass: // Fallthrough
336 case UTT_IsUnion:
Ted Kremenek6217b802009-07-29 21:53:49 +0000337 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000338 bool Union = Record->getDecl()->isUnion();
339 return UTT == UTT_IsUnion ? Union : !Union;
340 }
341 return false;
342 case UTT_IsEnum: return QueriedType->isEnumeralType();
343 case UTT_IsPolymorphic:
Ted Kremenek6217b802009-07-29 21:53:49 +0000344 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
Sebastian Redl64b45f72009-01-05 20:52:13 +0000345 // Type traits are only parsed in C++, so we've got CXXRecords.
346 return cast<CXXRecordDecl>(Record->getDecl())->isPolymorphic();
347 }
348 return false;
Anders Carlsson67e4dd22009-03-22 01:52:17 +0000349 case UTT_IsAbstract:
Ted Kremenek6217b802009-07-29 21:53:49 +0000350 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Anders Carlsson67e4dd22009-03-22 01:52:17 +0000351 return cast<CXXRecordDecl>(RT->getDecl())->isAbstract();
352 return false;
Eli Friedman1d954f62009-08-15 21:55:26 +0000353 case UTT_IsEmpty:
354 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
355 return !Record->getDecl()->isUnion()
356 && cast<CXXRecordDecl>(Record->getDecl())->isEmpty();
357 }
358 return false;
Anders Carlsson347ba892009-04-16 00:08:20 +0000359 case UTT_HasTrivialConstructor:
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000360 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
361 // If __is_pod (type) is true then the trait is true, else if type is
362 // a cv class or union type (or array thereof) with a trivial default
363 // constructor ([class.ctor]) then the trait is true, else it is false.
364 if (QueriedType->isPODType())
365 return true;
366 if (const RecordType *RT =
Ted Kremenek6217b802009-07-29 21:53:49 +0000367 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlsson347ba892009-04-16 00:08:20 +0000368 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialConstructor();
Anders Carlsson072abef2009-04-17 02:34:54 +0000369 return false;
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000370 case UTT_HasTrivialCopy:
371 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
372 // If __is_pod (type) is true or type is a reference type then
373 // the trait is true, else if type is a cv class or union type
374 // with a trivial copy constructor ([class.copy]) then the trait
375 // is true, else it is false.
376 if (QueriedType->isPODType() || QueriedType->isReferenceType())
377 return true;
Ted Kremenek6217b802009-07-29 21:53:49 +0000378 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000379 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyConstructor();
380 return false;
381 case UTT_HasTrivialAssign:
382 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
383 // If type is const qualified or is a reference type then the
384 // trait is false. Otherwise if __is_pod (type) is true then the
385 // trait is true, else if type is a cv class or union type with
386 // a trivial copy assignment ([class.copy]) then the trait is
387 // true, else it is false.
388 // Note: the const and reference restrictions are interesting,
389 // given that const and reference members don't prevent a class
390 // from having a trivial copy assignment operator (but do cause
391 // errors if the copy assignment operator is actually used, q.v.
392 // [class.copy]p12).
393
394 if (C.getBaseElementType(QueriedType).isConstQualified())
395 return false;
396 if (QueriedType->isPODType())
397 return true;
Ted Kremenek6217b802009-07-29 21:53:49 +0000398 if (const RecordType *RT = QueriedType->getAs<RecordType>())
Douglas Gregor5e03f9e2009-07-23 23:49:00 +0000399 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyAssignment();
400 return false;
401 case UTT_HasTrivialDestructor:
402 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
403 // If __is_pod (type) is true or type is a reference type
404 // then the trait is true, else if type is a cv class or union
405 // type (or array thereof) with a trivial destructor
406 // ([class.dtor]) then the trait is true, else it is
407 // false.
408 if (QueriedType->isPODType() || QueriedType->isReferenceType())
409 return true;
410 if (const RecordType *RT =
Ted Kremenek6217b802009-07-29 21:53:49 +0000411 C.getBaseElementType(QueriedType)->getAs<RecordType>())
Anders Carlsson072abef2009-04-17 02:34:54 +0000412 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor();
413 return false;
Sebastian Redlc238f092010-08-31 04:59:00 +0000414 // TODO: Propagate nothrowness for implicitly declared special members.
415 case UTT_HasNothrowAssign:
416 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
417 // If type is const qualified or is a reference type then the
418 // trait is false. Otherwise if __has_trivial_assign (type)
419 // is true then the trait is true, else if type is a cv class
420 // or union type with copy assignment operators that are known
421 // not to throw an exception then the trait is true, else it is
422 // false.
423 if (C.getBaseElementType(QueriedType).isConstQualified())
424 return false;
425 if (QueriedType->isReferenceType())
426 return false;
427 if (QueriedType->isPODType())
428 return true;
429 if (const RecordType *RT = QueriedType->getAs<RecordType>()) {
430 CXXRecordDecl* RD = cast<CXXRecordDecl>(RT->getDecl());
431 if (RD->hasTrivialCopyAssignment())
432 return true;
433
434 bool FoundAssign = false;
435 bool AllNoThrow = true;
436 DeclarationName Name = C.DeclarationNames.getCXXOperatorName(OO_Equal);
437 DeclContext::lookup_const_iterator Op, OpEnd;
438 for (llvm::tie(Op, OpEnd) = RD->lookup(Name);
439 Op != OpEnd; ++Op) {
440 CXXMethodDecl *Operator = cast<CXXMethodDecl>(*Op);
441 if (Operator->isCopyAssignmentOperator()) {
442 FoundAssign = true;
443 const FunctionProtoType *CPT
444 = Operator->getType()->getAs<FunctionProtoType>();
445 if (!CPT->hasEmptyExceptionSpec()) {
446 AllNoThrow = false;
447 break;
448 }
449 }
450 }
451
452 return FoundAssign && AllNoThrow;
453 }
454 return false;
455 case UTT_HasNothrowCopy:
456 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
457 // If __has_trivial_copy (type) is true then the trait is true, else
458 // if type is a cv class or union type with copy constructors that are
459 // known not to throw an exception then the trait is true, else it is
460 // false.
461 if (QueriedType->isPODType() || QueriedType->isReferenceType())
462 return true;
463 if (const RecordType *RT = QueriedType->getAs<RecordType>()) {
464 CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
465 if (RD->hasTrivialCopyConstructor())
466 return true;
467
468 bool FoundConstructor = false;
469 bool AllNoThrow = true;
470 unsigned FoundTQs;
471 DeclarationName ConstructorName
472 = C.DeclarationNames.getCXXConstructorName(
473 C.getCanonicalType(QueriedType));
474 DeclContext::lookup_const_iterator Con, ConEnd;
475 for (llvm::tie(Con, ConEnd) = RD->lookup(ConstructorName);
476 Con != ConEnd; ++Con) {
477 CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(*Con);
478 if (Constructor->isCopyConstructor(FoundTQs)) {
479 FoundConstructor = true;
480 const FunctionProtoType *CPT
481 = Constructor->getType()->getAs<FunctionProtoType>();
482 if (!CPT->hasEmptyExceptionSpec()) {
483 AllNoThrow = false;
484 break;
485 }
486 }
487 }
488
489 return FoundConstructor && AllNoThrow;
490 }
491 return false;
492 case UTT_HasNothrowConstructor:
493 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
494 // If __has_trivial_constructor (type) is true then the trait is
495 // true, else if type is a cv class or union type (or array
496 // thereof) with a default constructor that is known not to
497 // throw an exception then the trait is true, else it is false.
498 if (QueriedType->isPODType())
499 return true;
500 if (const RecordType *RT =
501 C.getBaseElementType(QueriedType)->getAs<RecordType>()) {
502 CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
503 if (RD->hasTrivialConstructor())
504 return true;
505
506 if (CXXConstructorDecl *Constructor = RD->getDefaultConstructor()) {
507 const FunctionProtoType *CPT
508 = Constructor->getType()->getAs<FunctionProtoType>();
509 // TODO: check whether evaluating default arguments can throw.
510 // For now, we'll be conservative and assume that they can throw.
511 if (CPT->hasEmptyExceptionSpec() && CPT->getNumArgs() == 0)
512 return true;
513 }
514 }
515 return false;
Sebastian Redld4b25cb2010-09-02 23:19:42 +0000516 case UTT_HasVirtualDestructor:
517 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
518 // If type is a class type with a virtual destructor ([class.dtor])
519 // then the trait is true, else it is false.
520 if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
521 CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
522 if (CXXDestructorDecl *Destructor = RD->getDestructor())
523 return Destructor->isVirtual();
524 }
525 return false;
Sebastian Redl64b45f72009-01-05 20:52:13 +0000526 }
527}
528
Ted Kremeneke3837682009-12-23 04:00:48 +0000529SourceRange CXXConstructExpr::getSourceRange() const {
530 // FIXME: Should we know where the parentheses are, if there are any?
531 for (std::reverse_iterator<Stmt**> I(&Args[NumArgs]), E(&Args[0]); I!=E;++I) {
532 // Ignore CXXDefaultExprs when computing the range, as they don't
533 // have a range.
534 if (!isa<CXXDefaultArgExpr>(*I))
535 return SourceRange(Loc, (*I)->getLocEnd());
536 }
537
538 return SourceRange(Loc);
539}
540
Douglas Gregorb4609802008-11-14 16:09:21 +0000541SourceRange CXXOperatorCallExpr::getSourceRange() const {
542 OverloadedOperatorKind Kind = getOperator();
543 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
544 if (getNumArgs() == 1)
545 // Prefix operator
Mike Stump1eb44332009-09-09 15:08:12 +0000546 return SourceRange(getOperatorLoc(),
Douglas Gregorb4609802008-11-14 16:09:21 +0000547 getArg(0)->getSourceRange().getEnd());
548 else
549 // Postfix operator
550 return SourceRange(getArg(0)->getSourceRange().getEnd(),
551 getOperatorLoc());
552 } else if (Kind == OO_Call) {
553 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
554 } else if (Kind == OO_Subscript) {
555 return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
556 } else if (getNumArgs() == 1) {
557 return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
558 } else if (getNumArgs() == 2) {
559 return SourceRange(getArg(0)->getSourceRange().getBegin(),
560 getArg(1)->getSourceRange().getEnd());
561 } else {
562 return SourceRange();
563 }
564}
565
Douglas Gregor88a35142008-12-22 05:46:06 +0000566Expr *CXXMemberCallExpr::getImplicitObjectArgument() {
567 if (MemberExpr *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
568 return MemExpr->getBase();
569
570 // FIXME: Will eventually need to cope with member pointers.
571 return 0;
572}
573
Douglas Gregor00b98c22009-11-12 15:31:47 +0000574SourceRange CXXMemberCallExpr::getSourceRange() const {
575 SourceLocation LocStart = getCallee()->getLocStart();
576 if (LocStart.isInvalid() && getNumArgs() > 0)
577 LocStart = getArg(0)->getLocStart();
578 return SourceRange(LocStart, getRParenLoc());
579}
580
581
Douglas Gregor49badde2008-10-27 19:41:14 +0000582//===----------------------------------------------------------------------===//
583// Named casts
584//===----------------------------------------------------------------------===//
585
586/// getCastName - Get the name of the C++ cast being used, e.g.,
587/// "static_cast", "dynamic_cast", "reinterpret_cast", or
588/// "const_cast". The returned pointer must not be freed.
589const char *CXXNamedCastExpr::getCastName() const {
590 switch (getStmtClass()) {
591 case CXXStaticCastExprClass: return "static_cast";
592 case CXXDynamicCastExprClass: return "dynamic_cast";
593 case CXXReinterpretCastExprClass: return "reinterpret_cast";
594 case CXXConstCastExprClass: return "const_cast";
595 default: return "<invalid cast>";
596 }
597}
Douglas Gregor506ae412009-01-16 18:33:17 +0000598
John McCallf871d0c2010-08-07 06:22:56 +0000599CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
600 CastKind K, Expr *Op,
601 const CXXCastPath *BasePath,
602 TypeSourceInfo *WrittenTy,
603 SourceLocation L) {
604 unsigned PathSize = (BasePath ? BasePath->size() : 0);
605 void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
606 + PathSize * sizeof(CXXBaseSpecifier*));
607 CXXStaticCastExpr *E =
608 new (Buffer) CXXStaticCastExpr(T, K, Op, PathSize, WrittenTy, L);
609 if (PathSize) E->setCastPath(*BasePath);
610 return E;
611}
612
613CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
614 unsigned PathSize) {
615 void *Buffer =
616 C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
617 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
618}
619
620CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
621 CastKind K, Expr *Op,
622 const CXXCastPath *BasePath,
623 TypeSourceInfo *WrittenTy,
624 SourceLocation L) {
625 unsigned PathSize = (BasePath ? BasePath->size() : 0);
626 void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
627 + PathSize * sizeof(CXXBaseSpecifier*));
628 CXXDynamicCastExpr *E =
629 new (Buffer) CXXDynamicCastExpr(T, K, Op, PathSize, WrittenTy, L);
630 if (PathSize) E->setCastPath(*BasePath);
631 return E;
632}
633
634CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
635 unsigned PathSize) {
636 void *Buffer =
637 C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
638 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
639}
640
641CXXReinterpretCastExpr *
642CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, CastKind K, Expr *Op,
643 const CXXCastPath *BasePath,
644 TypeSourceInfo *WrittenTy, SourceLocation L) {
645 unsigned PathSize = (BasePath ? BasePath->size() : 0);
646 void *Buffer =
647 C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
648 CXXReinterpretCastExpr *E =
649 new (Buffer) CXXReinterpretCastExpr(T, K, Op, PathSize, WrittenTy, L);
650 if (PathSize) E->setCastPath(*BasePath);
651 return E;
652}
653
654CXXReinterpretCastExpr *
655CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
656 void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
657 + PathSize * sizeof(CXXBaseSpecifier*));
658 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
659}
660
661CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T, Expr *Op,
662 TypeSourceInfo *WrittenTy,
663 SourceLocation L) {
664 return new (C) CXXConstCastExpr(T, Op, WrittenTy, L);
665}
666
667CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
668 return new (C) CXXConstCastExpr(EmptyShell());
669}
670
671CXXFunctionalCastExpr *
672CXXFunctionalCastExpr::Create(ASTContext &C, QualType T,
673 TypeSourceInfo *Written, SourceLocation L,
674 CastKind K, Expr *Op, const CXXCastPath *BasePath,
675 SourceLocation R) {
676 unsigned PathSize = (BasePath ? BasePath->size() : 0);
677 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
678 + PathSize * sizeof(CXXBaseSpecifier*));
679 CXXFunctionalCastExpr *E =
680 new (Buffer) CXXFunctionalCastExpr(T, Written, L, K, Op, PathSize, R);
681 if (PathSize) E->setCastPath(*BasePath);
682 return E;
683}
684
685CXXFunctionalCastExpr *
686CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
687 void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
688 + PathSize * sizeof(CXXBaseSpecifier*));
689 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
690}
691
692
Douglas Gregor65222e82009-12-23 18:19:08 +0000693CXXDefaultArgExpr *
Douglas Gregor036aed12009-12-23 23:03:06 +0000694CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
695 ParmVarDecl *Param, Expr *SubExpr) {
Douglas Gregor65222e82009-12-23 18:19:08 +0000696 void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
Douglas Gregor036aed12009-12-23 23:03:06 +0000697 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
698 SubExpr);
Douglas Gregor65222e82009-12-23 18:19:08 +0000699}
700
Mike Stump1eb44332009-09-09 15:08:12 +0000701CXXTemporary *CXXTemporary::Create(ASTContext &C,
Anders Carlssonb859f352009-05-30 20:34:37 +0000702 const CXXDestructorDecl *Destructor) {
Anders Carlsson88eaf072009-05-30 22:38:53 +0000703 return new (C) CXXTemporary(Destructor);
704}
705
Mike Stump1eb44332009-09-09 15:08:12 +0000706CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000707 CXXTemporary *Temp,
708 Expr* SubExpr) {
Mike Stump1eb44332009-09-09 15:08:12 +0000709 assert(SubExpr->getType()->isRecordType() &&
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000710 "Expression bound to a temporary must have record type!");
711
Anders Carlssonb859f352009-05-30 20:34:37 +0000712 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000713}
714
Anders Carlsson8e587a12009-05-30 20:56:46 +0000715CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
Anders Carlsson26de5492009-04-24 05:23:13 +0000716 CXXConstructorDecl *Cons,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000717 TypeSourceInfo *Type,
Douglas Gregor506ae412009-01-16 18:33:17 +0000718 Expr **Args,
Mike Stump1eb44332009-09-09 15:08:12 +0000719 unsigned NumArgs,
Douglas Gregor1c63b9c2010-04-27 20:36:09 +0000720 SourceLocation rParenLoc,
721 bool ZeroInitialization)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000722 : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
723 Type->getType().getNonReferenceType(),
724 Type->getTypeLoc().getBeginLoc(),
Douglas Gregor1c63b9c2010-04-27 20:36:09 +0000725 Cons, false, Args, NumArgs, ZeroInitialization),
Douglas Gregorab6677e2010-09-08 00:15:04 +0000726 RParenLoc(rParenLoc), Type(Type) {
727}
728
729SourceRange CXXTemporaryObjectExpr::getSourceRange() const {
730 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
Douglas Gregor506ae412009-01-16 18:33:17 +0000731}
Anders Carlsson19d28a62009-04-21 02:22:11 +0000732
Mike Stump1eb44332009-09-09 15:08:12 +0000733CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000734 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000735 CXXConstructorDecl *D, bool Elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000736 Expr **Args, unsigned NumArgs,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000737 bool ZeroInitialization,
Anders Carlssonfcaeef22010-05-02 23:53:04 +0000738 ConstructionKind ConstructKind) {
Douglas Gregor99a2e602009-12-16 01:38:02 +0000739 return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
Douglas Gregor9db7dbb2010-01-31 09:12:51 +0000740 Elidable, Args, NumArgs, ZeroInitialization,
Anders Carlssonfcaeef22010-05-02 23:53:04 +0000741 ConstructKind);
Anders Carlssone349bea2009-04-23 02:32:43 +0000742}
743
Mike Stump1eb44332009-09-09 15:08:12 +0000744CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
Douglas Gregor99a2e602009-12-16 01:38:02 +0000745 SourceLocation Loc,
Anders Carlsson8e587a12009-05-30 20:56:46 +0000746 CXXConstructorDecl *D, bool elidable,
Douglas Gregor16006c92009-12-16 18:50:27 +0000747 Expr **args, unsigned numargs,
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000748 bool ZeroInitialization,
749 ConstructionKind ConstructKind)
Anders Carlssonbd6734e2009-04-24 05:04:04 +0000750: Expr(SC, T,
Anders Carlssone349bea2009-04-23 02:32:43 +0000751 T->isDependentType(),
752 (T->isDependentType() ||
753 CallExpr::hasAnyValueDependentArguments(args, numargs))),
Douglas Gregor16006c92009-12-16 18:50:27 +0000754 Constructor(D), Loc(Loc), Elidable(elidable),
Anders Carlsson72e96fd2010-05-02 22:54:08 +0000755 ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
756 Args(0), NumArgs(numargs)
Douglas Gregor16006c92009-12-16 18:50:27 +0000757{
758 if (NumArgs) {
759 Args = new (C) Stmt*[NumArgs];
760
761 for (unsigned i = 0; i != NumArgs; ++i) {
762 assert(args[i] && "NULL argument in CXXConstructExpr");
763 Args[i] = args[i];
Anders Carlssone349bea2009-04-23 02:32:43 +0000764 }
Douglas Gregor16006c92009-12-16 18:50:27 +0000765 }
Anders Carlssone349bea2009-04-23 02:32:43 +0000766}
767
Ted Kremenekd04ed412010-05-10 20:06:30 +0000768CXXExprWithTemporaries::CXXExprWithTemporaries(ASTContext &C,
769 Expr *subexpr,
Mike Stump1eb44332009-09-09 15:08:12 +0000770 CXXTemporary **temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000771 unsigned numtemps)
Chris Lattnerd2598362010-05-10 00:25:06 +0000772 : Expr(CXXExprWithTemporariesClass, subexpr->getType(),
Mike Stump1eb44332009-09-09 15:08:12 +0000773 subexpr->isTypeDependent(), subexpr->isValueDependent()),
Chris Lattnerd2598362010-05-10 00:25:06 +0000774 SubExpr(subexpr), Temps(0), NumTemps(0) {
Chris Lattneraff32cb2010-05-10 00:45:12 +0000775 if (numtemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000776 setNumTemporaries(C, numtemps);
Chris Lattnerd2598362010-05-10 00:25:06 +0000777 for (unsigned i = 0; i != numtemps; ++i)
Anders Carlssonff6b3d62009-05-30 21:05:25 +0000778 Temps[i] = temps[i];
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000779 }
780}
781
Ted Kremenekd04ed412010-05-10 20:06:30 +0000782void CXXExprWithTemporaries::setNumTemporaries(ASTContext &C, unsigned N) {
Chris Lattnerd2598362010-05-10 00:25:06 +0000783 assert(Temps == 0 && "Cannot resize with this");
Daniel Dunbar90556d42010-05-10 15:59:37 +0000784 NumTemps = N;
Ted Kremenekd04ed412010-05-10 20:06:30 +0000785 Temps = new (C) CXXTemporary*[NumTemps];
Chris Lattnerd2598362010-05-10 00:25:06 +0000786}
787
788
Mike Stump1eb44332009-09-09 15:08:12 +0000789CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C,
Anders Carlsson88eaf072009-05-30 22:38:53 +0000790 Expr *SubExpr,
Mike Stump1eb44332009-09-09 15:08:12 +0000791 CXXTemporary **Temps,
Anders Carlsson0ece4912009-12-15 20:51:39 +0000792 unsigned NumTemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +0000793 return new (C) CXXExprWithTemporaries(C, SubExpr, Temps, NumTemps);
Anders Carlsson88eaf072009-05-30 22:38:53 +0000794}
795
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000796// CXXBindTemporaryExpr
797Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
798 return &SubExpr;
799}
800
Mike Stump1eb44332009-09-09 15:08:12 +0000801Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000802 return &SubExpr + 1;
803}
804
Anders Carlssone349bea2009-04-23 02:32:43 +0000805// CXXConstructExpr
806Stmt::child_iterator CXXConstructExpr::child_begin() {
807 return &Args[0];
808}
809Stmt::child_iterator CXXConstructExpr::child_end() {
810 return &Args[0]+NumArgs;
811}
812
Anders Carlsson55674ac2009-05-01 22:21:22 +0000813// CXXExprWithTemporaries
814Stmt::child_iterator CXXExprWithTemporaries::child_begin() {
815 return &SubExpr;
Anders Carlsson19d28a62009-04-21 02:22:11 +0000816}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000817
Mike Stump1eb44332009-09-09 15:08:12 +0000818Stmt::child_iterator CXXExprWithTemporaries::child_end() {
Anders Carlsson55674ac2009-05-01 22:21:22 +0000819 return &SubExpr + 1;
820}
Anders Carlsson02bbfa32009-04-24 22:47:04 +0000821
Douglas Gregorab6677e2010-09-08 00:15:04 +0000822CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000823 SourceLocation LParenLoc,
824 Expr **Args,
825 unsigned NumArgs,
826 SourceLocation RParenLoc)
Douglas Gregorab6677e2010-09-08 00:15:04 +0000827 : Expr(CXXUnresolvedConstructExprClass,
828 Type->getType().getNonReferenceType(),
829 Type->getType()->isDependentType(), true),
830 Type(Type),
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000831 LParenLoc(LParenLoc),
832 RParenLoc(RParenLoc),
833 NumArgs(NumArgs) {
834 Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
835 memcpy(StoredArgs, Args, sizeof(Expr *) * NumArgs);
836}
837
838CXXUnresolvedConstructExpr *
Mike Stump1eb44332009-09-09 15:08:12 +0000839CXXUnresolvedConstructExpr::Create(ASTContext &C,
Douglas Gregorab6677e2010-09-08 00:15:04 +0000840 TypeSourceInfo *Type,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000841 SourceLocation LParenLoc,
842 Expr **Args,
843 unsigned NumArgs,
844 SourceLocation RParenLoc) {
845 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
846 sizeof(Expr *) * NumArgs);
Douglas Gregorab6677e2010-09-08 00:15:04 +0000847 return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc,
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000848 Args, NumArgs, RParenLoc);
849}
850
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000851CXXUnresolvedConstructExpr *
852CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
853 Stmt::EmptyShell Empty;
854 void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
855 sizeof(Expr *) * NumArgs);
856 return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
857}
858
Douglas Gregorab6677e2010-09-08 00:15:04 +0000859SourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
860 return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
861}
862
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000863Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
864 return child_iterator(reinterpret_cast<Stmt **>(this + 1));
865}
866
867Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
868 return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
869}
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000870
John McCall865d4472009-11-19 22:55:06 +0000871CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000872 Expr *Base, QualType BaseType,
873 bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000874 SourceLocation OperatorLoc,
875 NestedNameSpecifier *Qualifier,
876 SourceRange QualifierRange,
877 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000878 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000879 const TemplateArgumentListInfo *TemplateArgs)
John McCall865d4472009-11-19 22:55:06 +0000880 : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, true, true),
John McCallaa81e162009-12-01 22:10:20 +0000881 Base(Base), BaseType(BaseType), IsArrow(IsArrow),
882 HasExplicitTemplateArgs(TemplateArgs != 0),
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000883 OperatorLoc(OperatorLoc),
884 Qualifier(Qualifier), QualifierRange(QualifierRange),
885 FirstQualifierFoundInScope(FirstQualifierFoundInScope),
Abramo Bagnara25777432010-08-11 22:01:17 +0000886 MemberNameInfo(MemberNameInfo) {
John McCalld5532b62009-11-23 01:53:49 +0000887 if (TemplateArgs)
John McCall096832c2010-08-19 23:49:38 +0000888 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000889}
890
John McCall865d4472009-11-19 22:55:06 +0000891CXXDependentScopeMemberExpr *
892CXXDependentScopeMemberExpr::Create(ASTContext &C,
John McCallaa81e162009-12-01 22:10:20 +0000893 Expr *Base, QualType BaseType, bool IsArrow,
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000894 SourceLocation OperatorLoc,
895 NestedNameSpecifier *Qualifier,
896 SourceRange QualifierRange,
897 NamedDecl *FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000898 DeclarationNameInfo MemberNameInfo,
John McCalld5532b62009-11-23 01:53:49 +0000899 const TemplateArgumentListInfo *TemplateArgs) {
900 if (!TemplateArgs)
John McCallaa81e162009-12-01 22:10:20 +0000901 return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
902 IsArrow, OperatorLoc,
903 Qualifier, QualifierRange,
904 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000905 MemberNameInfo);
Mike Stump1eb44332009-09-09 15:08:12 +0000906
John McCalld5532b62009-11-23 01:53:49 +0000907 std::size_t size = sizeof(CXXDependentScopeMemberExpr);
908 if (TemplateArgs)
909 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
910
911 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>());
John McCallaa81e162009-12-01 22:10:20 +0000912 return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
913 IsArrow, OperatorLoc,
914 Qualifier, QualifierRange,
915 FirstQualifierFoundInScope,
Abramo Bagnara25777432010-08-11 22:01:17 +0000916 MemberNameInfo, TemplateArgs);
Douglas Gregor3b6afbb2009-09-09 00:23:06 +0000917}
918
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000919CXXDependentScopeMemberExpr *
920CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
921 unsigned NumTemplateArgs) {
922 if (NumTemplateArgs == 0)
923 return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
924 0, SourceLocation(), 0,
925 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000926 DeclarationNameInfo());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000927
928 std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
929 ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
930 void *Mem = C.Allocate(size, llvm::alignof<CXXDependentScopeMemberExpr>());
931 CXXDependentScopeMemberExpr *E
932 = new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
933 0, SourceLocation(), 0,
934 SourceRange(), 0,
Abramo Bagnara25777432010-08-11 22:01:17 +0000935 DeclarationNameInfo(), 0);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000936 E->HasExplicitTemplateArgs = true;
937 return E;
938}
939
John McCall865d4472009-11-19 22:55:06 +0000940Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000941 return child_iterator(&Base);
942}
943
John McCall865d4472009-11-19 22:55:06 +0000944Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +0000945 if (isImplicitAccess())
946 return child_iterator(&Base);
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000947 return child_iterator(&Base + 1);
948}
John McCall129e2df2009-11-30 22:42:35 +0000949
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000950UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, QualType T,
951 bool Dependent,
John McCall129e2df2009-11-30 22:42:35 +0000952 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000953 Expr *Base, QualType BaseType,
954 bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000955 SourceLocation OperatorLoc,
956 NestedNameSpecifier *Qualifier,
957 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000958 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000959 const TemplateArgumentListInfo *TemplateArgs,
960 UnresolvedSetIterator Begin,
961 UnresolvedSetIterator End)
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000962 : OverloadExpr(UnresolvedMemberExprClass, C, T, Dependent,
Abramo Bagnara25777432010-08-11 22:01:17 +0000963 Qualifier, QualifierRange, MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000964 TemplateArgs != 0, Begin, End),
John McCall7bb12da2010-02-02 06:20:04 +0000965 IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
966 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
John McCall129e2df2009-11-30 22:42:35 +0000967 if (TemplateArgs)
John McCall7bb12da2010-02-02 06:20:04 +0000968 getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
John McCall129e2df2009-11-30 22:42:35 +0000969}
970
971UnresolvedMemberExpr *
972UnresolvedMemberExpr::Create(ASTContext &C, bool Dependent,
973 bool HasUnresolvedUsing,
John McCallaa81e162009-12-01 22:10:20 +0000974 Expr *Base, QualType BaseType, bool IsArrow,
John McCall129e2df2009-11-30 22:42:35 +0000975 SourceLocation OperatorLoc,
976 NestedNameSpecifier *Qualifier,
977 SourceRange QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000978 const DeclarationNameInfo &MemberNameInfo,
Douglas Gregor5a84dec2010-05-23 18:57:34 +0000979 const TemplateArgumentListInfo *TemplateArgs,
980 UnresolvedSetIterator Begin,
981 UnresolvedSetIterator End) {
John McCall129e2df2009-11-30 22:42:35 +0000982 std::size_t size = sizeof(UnresolvedMemberExpr);
983 if (TemplateArgs)
984 size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
985
986 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>());
Douglas Gregor928e6fc2010-05-23 19:36:40 +0000987 return new (Mem) UnresolvedMemberExpr(C,
John McCall129e2df2009-11-30 22:42:35 +0000988 Dependent ? C.DependentTy : C.OverloadTy,
John McCallaa81e162009-12-01 22:10:20 +0000989 Dependent, HasUnresolvedUsing, Base, BaseType,
990 IsArrow, OperatorLoc, Qualifier, QualifierRange,
Abramo Bagnara25777432010-08-11 22:01:17 +0000991 MemberNameInfo, TemplateArgs, Begin, End);
John McCall129e2df2009-11-30 22:42:35 +0000992}
993
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000994UnresolvedMemberExpr *
995UnresolvedMemberExpr::CreateEmpty(ASTContext &C, unsigned NumTemplateArgs) {
996 std::size_t size = sizeof(UnresolvedMemberExpr);
997 if (NumTemplateArgs != 0)
998 size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
999
1000 void *Mem = C.Allocate(size, llvm::alignof<UnresolvedMemberExpr>());
1001 UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
1002 E->HasExplicitTemplateArgs = NumTemplateArgs != 0;
1003 return E;
1004}
1005
John McCallc373d482010-01-27 01:50:18 +00001006CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
1007 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
1008
1009 // If there was a nested name specifier, it names the naming class.
1010 // It can't be dependent: after all, we were actually able to do the
1011 // lookup.
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001012 CXXRecordDecl *Record = 0;
John McCall7bb12da2010-02-02 06:20:04 +00001013 if (getQualifier()) {
1014 Type *T = getQualifier()->getAsType();
John McCallc373d482010-01-27 01:50:18 +00001015 assert(T && "qualifier in member expression does not name type");
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001016 Record = T->getAsCXXRecordDecl();
1017 assert(Record && "qualifier in member expression does not name record");
1018 }
John McCallc373d482010-01-27 01:50:18 +00001019 // Otherwise the naming class must have been the base class.
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001020 else {
John McCallc373d482010-01-27 01:50:18 +00001021 QualType BaseType = getBaseType().getNonReferenceType();
1022 if (isArrow()) {
1023 const PointerType *PT = BaseType->getAs<PointerType>();
1024 assert(PT && "base of arrow member access is not pointer");
1025 BaseType = PT->getPointeeType();
1026 }
1027
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001028 Record = BaseType->getAsCXXRecordDecl();
1029 assert(Record && "base of member expression does not name record");
John McCallc373d482010-01-27 01:50:18 +00001030 }
1031
Douglas Gregorc96be1e2010-04-27 18:19:34 +00001032 return Record;
John McCallc373d482010-01-27 01:50:18 +00001033}
1034
John McCall129e2df2009-11-30 22:42:35 +00001035Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
1036 return child_iterator(&Base);
1037}
1038
1039Stmt::child_iterator UnresolvedMemberExpr::child_end() {
John McCallaa81e162009-12-01 22:10:20 +00001040 if (isImplicitAccess())
1041 return child_iterator(&Base);
John McCall129e2df2009-11-30 22:42:35 +00001042 return child_iterator(&Base + 1);
1043}