1 //===--- DeclCXX.cpp - C++ Declaration AST Node Implementation ------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the C++ related Decl classes. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/AST/DeclCXX.h" 15 #include "clang/AST/DeclTemplate.h" 16 #include "clang/AST/ASTContext.h" 17 #include "clang/AST/ASTMutationListener.h" 18 #include "clang/AST/CXXInheritance.h" 19 #include "clang/AST/Expr.h" 20 #include "clang/AST/ExprCXX.h" 21 #include "clang/AST/TypeLoc.h" 22 #include "clang/Basic/IdentifierTable.h" 23 #include "llvm/ADT/STLExtras.h" 24 #include "llvm/ADT/SmallPtrSet.h" 25 using namespace clang; 26 27 //===----------------------------------------------------------------------===// 28 // Decl Allocation/Deallocation Method Implementations 29 //===----------------------------------------------------------------------===// 30 31 void AccessSpecDecl::anchor() { } 32 33 AccessSpecDecl *AccessSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 34 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(AccessSpecDecl)); 35 return new (Mem) AccessSpecDecl(EmptyShell()); 36 } 37 38 CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D) 39 : UserDeclaredConstructor(false), UserDeclaredCopyConstructor(false), 40 UserDeclaredMoveConstructor(false), UserDeclaredCopyAssignment(false), 41 UserDeclaredMoveAssignment(false), UserDeclaredDestructor(false), 42 Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false), 43 Abstract(false), IsStandardLayout(true), HasNoNonEmptyBases(true), 44 HasPrivateFields(false), HasProtectedFields(false), HasPublicFields(false), 45 HasMutableFields(false), HasOnlyCMembers(true), 46 HasTrivialDefaultConstructor(true), 47 HasConstexprNonCopyMoveConstructor(false), 48 DefaultedDefaultConstructorIsConstexpr(true), 49 DefaultedCopyConstructorIsConstexpr(true), 50 DefaultedMoveConstructorIsConstexpr(true), 51 HasConstexprDefaultConstructor(false), HasConstexprCopyConstructor(false), 52 HasConstexprMoveConstructor(false), HasTrivialCopyConstructor(true), 53 HasTrivialMoveConstructor(true), HasTrivialCopyAssignment(true), 54 HasTrivialMoveAssignment(true), HasTrivialDestructor(true), 55 HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false), 56 UserProvidedDefaultConstructor(false), DeclaredDefaultConstructor(false), 57 DeclaredCopyConstructor(false), DeclaredMoveConstructor(false), 58 DeclaredCopyAssignment(false), DeclaredMoveAssignment(false), 59 DeclaredDestructor(false), FailedImplicitMoveConstructor(false), 60 FailedImplicitMoveAssignment(false), IsLambda(false), NumBases(0), 61 NumVBases(0), Bases(), VBases(), Definition(D), FirstFriend(0) { 62 } 63 64 CXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, DeclContext *DC, 65 SourceLocation StartLoc, SourceLocation IdLoc, 66 IdentifierInfo *Id, CXXRecordDecl *PrevDecl) 67 : RecordDecl(K, TK, DC, StartLoc, IdLoc, Id, PrevDecl), 68 DefinitionData(PrevDecl ? PrevDecl->DefinitionData : 0), 69 TemplateOrInstantiation() { } 70 71 CXXRecordDecl *CXXRecordDecl::Create(const ASTContext &C, TagKind TK, 72 DeclContext *DC, SourceLocation StartLoc, 73 SourceLocation IdLoc, IdentifierInfo *Id, 74 CXXRecordDecl* PrevDecl, 75 bool DelayTypeCreation) { 76 CXXRecordDecl* R = new (C) CXXRecordDecl(CXXRecord, TK, DC, StartLoc, IdLoc, 77 Id, PrevDecl); 78 79 // FIXME: DelayTypeCreation seems like such a hack 80 if (!DelayTypeCreation) 81 C.getTypeDeclType(R, PrevDecl); 82 return R; 83 } 84 85 CXXRecordDecl *CXXRecordDecl::CreateLambda(const ASTContext &C, DeclContext *DC, 86 SourceLocation Loc, bool Dependent) { 87 CXXRecordDecl* R = new (C) CXXRecordDecl(CXXRecord, TTK_Class, DC, Loc, Loc, 88 0, 0); 89 R->IsBeingDefined = true; 90 R->DefinitionData = new (C) struct LambdaDefinitionData(R, Dependent); 91 C.getTypeDeclType(R, /*PrevDecl=*/0); 92 return R; 93 } 94 95 CXXRecordDecl * 96 CXXRecordDecl::CreateDeserialized(const ASTContext &C, unsigned ID) { 97 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXRecordDecl)); 98 return new (Mem) CXXRecordDecl(CXXRecord, TTK_Struct, 0, SourceLocation(), 99 SourceLocation(), 0, 0); 100 } 101 102 void 103 CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases, 104 unsigned NumBases) { 105 ASTContext &C = getASTContext(); 106 107 if (!data().Bases.isOffset() && data().NumBases > 0) 108 C.Deallocate(data().getBases()); 109 110 if (NumBases) { 111 // C++ [dcl.init.aggr]p1: 112 // An aggregate is [...] a class with [...] no base classes [...]. 113 data().Aggregate = false; 114 115 // C++ [class]p4: 116 // A POD-struct is an aggregate class... 117 data().PlainOldData = false; 118 } 119 120 // The set of seen virtual base types. 121 llvm::SmallPtrSet<CanQualType, 8> SeenVBaseTypes; 122 123 // The virtual bases of this class. 124 SmallVector<const CXXBaseSpecifier *, 8> VBases; 125 126 data().Bases = new(C) CXXBaseSpecifier [NumBases]; 127 data().NumBases = NumBases; 128 for (unsigned i = 0; i < NumBases; ++i) { 129 data().getBases()[i] = *Bases[i]; 130 // Keep track of inherited vbases for this base class. 131 const CXXBaseSpecifier *Base = Bases[i]; 132 QualType BaseType = Base->getType(); 133 // Skip dependent types; we can't do any checking on them now. 134 if (BaseType->isDependentType()) 135 continue; 136 CXXRecordDecl *BaseClassDecl 137 = cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl()); 138 139 // A class with a non-empty base class is not empty. 140 // FIXME: Standard ref? 141 if (!BaseClassDecl->isEmpty()) { 142 if (!data().Empty) { 143 // C++0x [class]p7: 144 // A standard-layout class is a class that: 145 // [...] 146 // -- either has no non-static data members in the most derived 147 // class and at most one base class with non-static data members, 148 // or has no base classes with non-static data members, and 149 // If this is the second non-empty base, then neither of these two 150 // clauses can be true. 151 data().IsStandardLayout = false; 152 } 153 154 data().Empty = false; 155 data().HasNoNonEmptyBases = false; 156 } 157 158 // C++ [class.virtual]p1: 159 // A class that declares or inherits a virtual function is called a 160 // polymorphic class. 161 if (BaseClassDecl->isPolymorphic()) 162 data().Polymorphic = true; 163 164 // C++0x [class]p7: 165 // A standard-layout class is a class that: [...] 166 // -- has no non-standard-layout base classes 167 if (!BaseClassDecl->isStandardLayout()) 168 data().IsStandardLayout = false; 169 170 // Record if this base is the first non-literal field or base. 171 if (!hasNonLiteralTypeFieldsOrBases() && !BaseType->isLiteralType()) 172 data().HasNonLiteralTypeFieldsOrBases = true; 173 174 // Now go through all virtual bases of this base and add them. 175 for (CXXRecordDecl::base_class_iterator VBase = 176 BaseClassDecl->vbases_begin(), 177 E = BaseClassDecl->vbases_end(); VBase != E; ++VBase) { 178 // Add this base if it's not already in the list. 179 if (SeenVBaseTypes.insert(C.getCanonicalType(VBase->getType()))) 180 VBases.push_back(VBase); 181 } 182 183 if (Base->isVirtual()) { 184 // Add this base if it's not already in the list. 185 if (SeenVBaseTypes.insert(C.getCanonicalType(BaseType))) 186 VBases.push_back(Base); 187 188 // C++0x [meta.unary.prop] is_empty: 189 // T is a class type, but not a union type, with ... no virtual base 190 // classes 191 data().Empty = false; 192 193 // C++ [class.ctor]p5: 194 // A default constructor is trivial [...] if: 195 // -- its class has [...] no virtual bases 196 data().HasTrivialDefaultConstructor = false; 197 198 // C++0x [class.copy]p13: 199 // A copy/move constructor for class X is trivial if it is neither 200 // user-provided nor deleted and if 201 // -- class X has no virtual functions and no virtual base classes, and 202 data().HasTrivialCopyConstructor = false; 203 data().HasTrivialMoveConstructor = false; 204 205 // C++0x [class.copy]p27: 206 // A copy/move assignment operator for class X is trivial if it is 207 // neither user-provided nor deleted and if 208 // -- class X has no virtual functions and no virtual base classes, and 209 data().HasTrivialCopyAssignment = false; 210 data().HasTrivialMoveAssignment = false; 211 212 // C++0x [class]p7: 213 // A standard-layout class is a class that: [...] 214 // -- has [...] no virtual base classes 215 data().IsStandardLayout = false; 216 217 // C++11 [dcl.constexpr]p4: 218 // In the definition of a constexpr constructor [...] 219 // -- the class shall not have any virtual base classes 220 data().DefaultedDefaultConstructorIsConstexpr = false; 221 data().DefaultedCopyConstructorIsConstexpr = false; 222 data().DefaultedMoveConstructorIsConstexpr = false; 223 } else { 224 // C++ [class.ctor]p5: 225 // A default constructor is trivial [...] if: 226 // -- all the direct base classes of its class have trivial default 227 // constructors. 228 if (!BaseClassDecl->hasTrivialDefaultConstructor()) 229 data().HasTrivialDefaultConstructor = false; 230 231 // C++0x [class.copy]p13: 232 // A copy/move constructor for class X is trivial if [...] 233 // [...] 234 // -- the constructor selected to copy/move each direct base class 235 // subobject is trivial, and 236 // FIXME: C++0x: We need to only consider the selected constructor 237 // instead of all of them. 238 if (!BaseClassDecl->hasTrivialCopyConstructor()) 239 data().HasTrivialCopyConstructor = false; 240 if (!BaseClassDecl->hasTrivialMoveConstructor()) 241 data().HasTrivialMoveConstructor = false; 242 243 // C++0x [class.copy]p27: 244 // A copy/move assignment operator for class X is trivial if [...] 245 // [...] 246 // -- the assignment operator selected to copy/move each direct base 247 // class subobject is trivial, and 248 // FIXME: C++0x: We need to only consider the selected operator instead 249 // of all of them. 250 if (!BaseClassDecl->hasTrivialCopyAssignment()) 251 data().HasTrivialCopyAssignment = false; 252 if (!BaseClassDecl->hasTrivialMoveAssignment()) 253 data().HasTrivialMoveAssignment = false; 254 255 // C++11 [class.ctor]p6: 256 // If that user-written default constructor would satisfy the 257 // requirements of a constexpr constructor, the implicitly-defined 258 // default constructor is constexpr. 259 if (!BaseClassDecl->hasConstexprDefaultConstructor()) 260 data().DefaultedDefaultConstructorIsConstexpr = false; 261 262 // C++11 [class.copy]p13: 263 // If the implicitly-defined constructor would satisfy the requirements 264 // of a constexpr constructor, the implicitly-defined constructor is 265 // constexpr. 266 // C++11 [dcl.constexpr]p4: 267 // -- every constructor involved in initializing [...] base class 268 // sub-objects shall be a constexpr constructor 269 if (!BaseClassDecl->hasConstexprCopyConstructor()) 270 data().DefaultedCopyConstructorIsConstexpr = false; 271 if (BaseClassDecl->hasDeclaredMoveConstructor() || 272 BaseClassDecl->needsImplicitMoveConstructor()) 273 // FIXME: If the implicit move constructor generated for the base class 274 // would be ill-formed, the implicit move constructor generated for the 275 // derived class calls the base class' copy constructor. 276 data().DefaultedMoveConstructorIsConstexpr &= 277 BaseClassDecl->hasConstexprMoveConstructor(); 278 else if (!BaseClassDecl->hasConstexprCopyConstructor()) 279 data().DefaultedMoveConstructorIsConstexpr = false; 280 } 281 282 // C++ [class.ctor]p3: 283 // A destructor is trivial if all the direct base classes of its class 284 // have trivial destructors. 285 if (!BaseClassDecl->hasTrivialDestructor()) 286 data().HasTrivialDestructor = false; 287 288 // A class has an Objective-C object member if... or any of its bases 289 // has an Objective-C object member. 290 if (BaseClassDecl->hasObjectMember()) 291 setHasObjectMember(true); 292 293 // Keep track of the presence of mutable fields. 294 if (BaseClassDecl->hasMutableFields()) 295 data().HasMutableFields = true; 296 } 297 298 if (VBases.empty()) 299 return; 300 301 // Create base specifier for any direct or indirect virtual bases. 302 data().VBases = new (C) CXXBaseSpecifier[VBases.size()]; 303 data().NumVBases = VBases.size(); 304 for (int I = 0, E = VBases.size(); I != E; ++I) 305 data().getVBases()[I] = *VBases[I]; 306 } 307 308 /// Callback function for CXXRecordDecl::forallBases that acknowledges 309 /// that it saw a base class. 310 static bool SawBase(const CXXRecordDecl *, void *) { 311 return true; 312 } 313 314 bool CXXRecordDecl::hasAnyDependentBases() const { 315 if (!isDependentContext()) 316 return false; 317 318 return !forallBases(SawBase, 0); 319 } 320 321 bool CXXRecordDecl::hasConstCopyConstructor() const { 322 return getCopyConstructor(Qualifiers::Const) != 0; 323 } 324 325 bool CXXRecordDecl::isTriviallyCopyable() const { 326 // C++0x [class]p5: 327 // A trivially copyable class is a class that: 328 // -- has no non-trivial copy constructors, 329 if (!hasTrivialCopyConstructor()) return false; 330 // -- has no non-trivial move constructors, 331 if (!hasTrivialMoveConstructor()) return false; 332 // -- has no non-trivial copy assignment operators, 333 if (!hasTrivialCopyAssignment()) return false; 334 // -- has no non-trivial move assignment operators, and 335 if (!hasTrivialMoveAssignment()) return false; 336 // -- has a trivial destructor. 337 if (!hasTrivialDestructor()) return false; 338 339 return true; 340 } 341 342 /// \brief Perform a simplistic form of overload resolution that only considers 343 /// cv-qualifiers on a single parameter, and return the best overload candidate 344 /// (if there is one). 345 static CXXMethodDecl * 346 GetBestOverloadCandidateSimple( 347 const SmallVectorImpl<std::pair<CXXMethodDecl *, Qualifiers> > &Cands) { 348 if (Cands.empty()) 349 return 0; 350 if (Cands.size() == 1) 351 return Cands[0].first; 352 353 unsigned Best = 0, N = Cands.size(); 354 for (unsigned I = 1; I != N; ++I) 355 if (Cands[Best].second.compatiblyIncludes(Cands[I].second)) 356 Best = I; 357 358 for (unsigned I = 1; I != N; ++I) 359 if (Cands[Best].second.compatiblyIncludes(Cands[I].second)) 360 return 0; 361 362 return Cands[Best].first; 363 } 364 365 CXXConstructorDecl *CXXRecordDecl::getCopyConstructor(unsigned TypeQuals) const{ 366 ASTContext &Context = getASTContext(); 367 QualType ClassType 368 = Context.getTypeDeclType(const_cast<CXXRecordDecl*>(this)); 369 DeclarationName ConstructorName 370 = Context.DeclarationNames.getCXXConstructorName( 371 Context.getCanonicalType(ClassType)); 372 unsigned FoundTQs; 373 SmallVector<std::pair<CXXMethodDecl *, Qualifiers>, 4> Found; 374 DeclContext::lookup_const_iterator Con, ConEnd; 375 for (llvm::tie(Con, ConEnd) = this->lookup(ConstructorName); 376 Con != ConEnd; ++Con) { 377 // C++ [class.copy]p2: 378 // A non-template constructor for class X is a copy constructor if [...] 379 if (isa<FunctionTemplateDecl>(*Con)) 380 continue; 381 382 CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(*Con); 383 if (Constructor->isCopyConstructor(FoundTQs)) { 384 if (((TypeQuals & Qualifiers::Const) == (FoundTQs & Qualifiers::Const)) || 385 (!(TypeQuals & Qualifiers::Const) && (FoundTQs & Qualifiers::Const))) 386 Found.push_back(std::make_pair( 387 const_cast<CXXConstructorDecl *>(Constructor), 388 Qualifiers::fromCVRMask(FoundTQs))); 389 } 390 } 391 392 return cast_or_null<CXXConstructorDecl>( 393 GetBestOverloadCandidateSimple(Found)); 394 } 395 396 CXXConstructorDecl *CXXRecordDecl::getMoveConstructor() const { 397 for (ctor_iterator I = ctor_begin(), E = ctor_end(); I != E; ++I) 398 if (I->isMoveConstructor()) 399 return *I; 400 401 return 0; 402 } 403 404 CXXMethodDecl *CXXRecordDecl::getCopyAssignmentOperator(bool ArgIsConst) const { 405 ASTContext &Context = getASTContext(); 406 QualType Class = Context.getTypeDeclType(const_cast<CXXRecordDecl *>(this)); 407 DeclarationName Name = Context.DeclarationNames.getCXXOperatorName(OO_Equal); 408 409 SmallVector<std::pair<CXXMethodDecl *, Qualifiers>, 4> Found; 410 DeclContext::lookup_const_iterator Op, OpEnd; 411 for (llvm::tie(Op, OpEnd) = this->lookup(Name); Op != OpEnd; ++Op) { 412 // C++ [class.copy]p9: 413 // A user-declared copy assignment operator is a non-static non-template 414 // member function of class X with exactly one parameter of type X, X&, 415 // const X&, volatile X& or const volatile X&. 416 const CXXMethodDecl* Method = dyn_cast<CXXMethodDecl>(*Op); 417 if (!Method || Method->isStatic() || Method->getPrimaryTemplate()) 418 continue; 419 420 const FunctionProtoType *FnType 421 = Method->getType()->getAs<FunctionProtoType>(); 422 assert(FnType && "Overloaded operator has no prototype."); 423 // Don't assert on this; an invalid decl might have been left in the AST. 424 if (FnType->getNumArgs() != 1 || FnType->isVariadic()) 425 continue; 426 427 QualType ArgType = FnType->getArgType(0); 428 Qualifiers Quals; 429 if (const LValueReferenceType *Ref = ArgType->getAs<LValueReferenceType>()) { 430 ArgType = Ref->getPointeeType(); 431 // If we have a const argument and we have a reference to a non-const, 432 // this function does not match. 433 if (ArgIsConst && !ArgType.isConstQualified()) 434 continue; 435 436 Quals = ArgType.getQualifiers(); 437 } else { 438 // By-value copy-assignment operators are treated like const X& 439 // copy-assignment operators. 440 Quals = Qualifiers::fromCVRMask(Qualifiers::Const); 441 } 442 443 if (!Context.hasSameUnqualifiedType(ArgType, Class)) 444 continue; 445 446 // Save this copy-assignment operator. It might be "the one". 447 Found.push_back(std::make_pair(const_cast<CXXMethodDecl *>(Method), Quals)); 448 } 449 450 // Use a simplistic form of overload resolution to find the candidate. 451 return GetBestOverloadCandidateSimple(Found); 452 } 453 454 CXXMethodDecl *CXXRecordDecl::getMoveAssignmentOperator() const { 455 for (method_iterator I = method_begin(), E = method_end(); I != E; ++I) 456 if (I->isMoveAssignmentOperator()) 457 return *I; 458 459 return 0; 460 } 461 462 void CXXRecordDecl::markedVirtualFunctionPure() { 463 // C++ [class.abstract]p2: 464 // A class is abstract if it has at least one pure virtual function. 465 data().Abstract = true; 466 } 467 468 void CXXRecordDecl::addedMember(Decl *D) { 469 if (!D->isImplicit() && 470 !isa<FieldDecl>(D) && 471 !isa<IndirectFieldDecl>(D) && 472 (!isa<TagDecl>(D) || cast<TagDecl>(D)->getTagKind() == TTK_Class)) 473 data().HasOnlyCMembers = false; 474 475 // Ignore friends and invalid declarations. 476 if (D->getFriendObjectKind() || D->isInvalidDecl()) 477 return; 478 479 FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D); 480 if (FunTmpl) 481 D = FunTmpl->getTemplatedDecl(); 482 483 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 484 if (Method->isVirtual()) { 485 // C++ [dcl.init.aggr]p1: 486 // An aggregate is an array or a class with [...] no virtual functions. 487 data().Aggregate = false; 488 489 // C++ [class]p4: 490 // A POD-struct is an aggregate class... 491 data().PlainOldData = false; 492 493 // Virtual functions make the class non-empty. 494 // FIXME: Standard ref? 495 data().Empty = false; 496 497 // C++ [class.virtual]p1: 498 // A class that declares or inherits a virtual function is called a 499 // polymorphic class. 500 data().Polymorphic = true; 501 502 // C++0x [class.ctor]p5 503 // A default constructor is trivial [...] if: 504 // -- its class has no virtual functions [...] 505 data().HasTrivialDefaultConstructor = false; 506 507 // C++0x [class.copy]p13: 508 // A copy/move constructor for class X is trivial if [...] 509 // -- class X has no virtual functions [...] 510 data().HasTrivialCopyConstructor = false; 511 data().HasTrivialMoveConstructor = false; 512 513 // C++0x [class.copy]p27: 514 // A copy/move assignment operator for class X is trivial if [...] 515 // -- class X has no virtual functions [...] 516 data().HasTrivialCopyAssignment = false; 517 data().HasTrivialMoveAssignment = false; 518 519 // C++0x [class]p7: 520 // A standard-layout class is a class that: [...] 521 // -- has no virtual functions 522 data().IsStandardLayout = false; 523 } 524 } 525 526 if (D->isImplicit()) { 527 // Notify that an implicit member was added after the definition 528 // was completed. 529 if (!isBeingDefined()) 530 if (ASTMutationListener *L = getASTMutationListener()) 531 L->AddedCXXImplicitMember(data().Definition, D); 532 533 // If this is a special member function, note that it was added and then 534 // return early. 535 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) { 536 if (Constructor->isDefaultConstructor()) { 537 data().DeclaredDefaultConstructor = true; 538 if (Constructor->isConstexpr()) { 539 data().HasConstexprDefaultConstructor = true; 540 data().HasConstexprNonCopyMoveConstructor = true; 541 } 542 } else if (Constructor->isCopyConstructor()) { 543 data().DeclaredCopyConstructor = true; 544 if (Constructor->isConstexpr()) 545 data().HasConstexprCopyConstructor = true; 546 } else if (Constructor->isMoveConstructor()) { 547 data().DeclaredMoveConstructor = true; 548 if (Constructor->isConstexpr()) 549 data().HasConstexprMoveConstructor = true; 550 } else 551 goto NotASpecialMember; 552 return; 553 } else if (isa<CXXDestructorDecl>(D)) { 554 data().DeclaredDestructor = true; 555 return; 556 } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 557 if (Method->isCopyAssignmentOperator()) 558 data().DeclaredCopyAssignment = true; 559 else if (Method->isMoveAssignmentOperator()) 560 data().DeclaredMoveAssignment = true; 561 else 562 goto NotASpecialMember; 563 return; 564 } 565 566 NotASpecialMember:; 567 // Any other implicit declarations are handled like normal declarations. 568 } 569 570 // Handle (user-declared) constructors. 571 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) { 572 // Note that we have a user-declared constructor. 573 data().UserDeclaredConstructor = true; 574 575 // Technically, "user-provided" is only defined for special member 576 // functions, but the intent of the standard is clearly that it should apply 577 // to all functions. 578 bool UserProvided = Constructor->isUserProvided(); 579 580 if (Constructor->isDefaultConstructor()) { 581 data().DeclaredDefaultConstructor = true; 582 if (UserProvided) { 583 // C++0x [class.ctor]p5: 584 // A default constructor is trivial if it is not user-provided [...] 585 data().HasTrivialDefaultConstructor = false; 586 data().UserProvidedDefaultConstructor = true; 587 } 588 if (Constructor->isConstexpr()) { 589 data().HasConstexprDefaultConstructor = true; 590 data().HasConstexprNonCopyMoveConstructor = true; 591 } 592 } 593 594 // Note when we have a user-declared copy or move constructor, which will 595 // suppress the implicit declaration of those constructors. 596 if (!FunTmpl) { 597 if (Constructor->isCopyConstructor()) { 598 data().UserDeclaredCopyConstructor = true; 599 data().DeclaredCopyConstructor = true; 600 601 // C++0x [class.copy]p13: 602 // A copy/move constructor for class X is trivial if it is not 603 // user-provided [...] 604 if (UserProvided) 605 data().HasTrivialCopyConstructor = false; 606 607 if (Constructor->isConstexpr()) 608 data().HasConstexprCopyConstructor = true; 609 } else if (Constructor->isMoveConstructor()) { 610 data().UserDeclaredMoveConstructor = true; 611 data().DeclaredMoveConstructor = true; 612 613 // C++0x [class.copy]p13: 614 // A copy/move constructor for class X is trivial if it is not 615 // user-provided [...] 616 if (UserProvided) 617 data().HasTrivialMoveConstructor = false; 618 619 if (Constructor->isConstexpr()) 620 data().HasConstexprMoveConstructor = true; 621 } 622 } 623 if (Constructor->isConstexpr() && !Constructor->isCopyOrMoveConstructor()) { 624 // Record if we see any constexpr constructors which are neither copy 625 // nor move constructors. 626 data().HasConstexprNonCopyMoveConstructor = true; 627 } 628 629 // C++ [dcl.init.aggr]p1: 630 // An aggregate is an array or a class with no user-declared 631 // constructors [...]. 632 // C++0x [dcl.init.aggr]p1: 633 // An aggregate is an array or a class with no user-provided 634 // constructors [...]. 635 if (!getASTContext().getLangOptions().CPlusPlus0x || UserProvided) 636 data().Aggregate = false; 637 638 // C++ [class]p4: 639 // A POD-struct is an aggregate class [...] 640 // Since the POD bit is meant to be C++03 POD-ness, clear it even if the 641 // type is technically an aggregate in C++0x since it wouldn't be in 03. 642 data().PlainOldData = false; 643 644 return; 645 } 646 647 // Handle (user-declared) destructors. 648 if (CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D)) { 649 data().DeclaredDestructor = true; 650 data().UserDeclaredDestructor = true; 651 652 // C++ [class]p4: 653 // A POD-struct is an aggregate class that has [...] no user-defined 654 // destructor. 655 // This bit is the C++03 POD bit, not the 0x one. 656 data().PlainOldData = false; 657 658 // C++11 [class.dtor]p5: 659 // A destructor is trivial if it is not user-provided and if 660 // -- the destructor is not virtual. 661 if (DD->isUserProvided() || DD->isVirtual()) { 662 data().HasTrivialDestructor = false; 663 // C++11 [dcl.constexpr]p1: 664 // The constexpr specifier shall be applied only to [...] the 665 // declaration of a static data member of a literal type. 666 // C++11 [basic.types]p10: 667 // A type is a literal type if it is [...] a class type that [...] has 668 // a trivial destructor. 669 data().DefaultedDefaultConstructorIsConstexpr = false; 670 data().DefaultedCopyConstructorIsConstexpr = false; 671 data().DefaultedMoveConstructorIsConstexpr = false; 672 } 673 674 return; 675 } 676 677 // Handle (user-declared) member functions. 678 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 679 if (Method->isCopyAssignmentOperator()) { 680 // C++ [class]p4: 681 // A POD-struct is an aggregate class that [...] has no user-defined 682 // copy assignment operator [...]. 683 // This is the C++03 bit only. 684 data().PlainOldData = false; 685 686 // This is a copy assignment operator. 687 688 // Suppress the implicit declaration of a copy constructor. 689 data().UserDeclaredCopyAssignment = true; 690 data().DeclaredCopyAssignment = true; 691 692 // C++0x [class.copy]p27: 693 // A copy/move assignment operator for class X is trivial if it is 694 // neither user-provided nor deleted [...] 695 if (Method->isUserProvided()) 696 data().HasTrivialCopyAssignment = false; 697 698 return; 699 } 700 701 if (Method->isMoveAssignmentOperator()) { 702 // This is an extension in C++03 mode, but we'll keep consistency by 703 // taking a move assignment operator to induce non-POD-ness 704 data().PlainOldData = false; 705 706 // This is a move assignment operator. 707 data().UserDeclaredMoveAssignment = true; 708 data().DeclaredMoveAssignment = true; 709 710 // C++0x [class.copy]p27: 711 // A copy/move assignment operator for class X is trivial if it is 712 // neither user-provided nor deleted [...] 713 if (Method->isUserProvided()) 714 data().HasTrivialMoveAssignment = false; 715 } 716 717 // Keep the list of conversion functions up-to-date. 718 if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) { 719 // We don't record specializations. 720 if (Conversion->getPrimaryTemplate()) 721 return; 722 723 // FIXME: We intentionally don't use the decl's access here because it 724 // hasn't been set yet. That's really just a misdesign in Sema. 725 726 if (FunTmpl) { 727 if (FunTmpl->getPreviousDecl()) 728 data().Conversions.replace(FunTmpl->getPreviousDecl(), 729 FunTmpl); 730 else 731 data().Conversions.addDecl(FunTmpl); 732 } else { 733 if (Conversion->getPreviousDecl()) 734 data().Conversions.replace(Conversion->getPreviousDecl(), 735 Conversion); 736 else 737 data().Conversions.addDecl(Conversion); 738 } 739 } 740 741 return; 742 } 743 744 // Handle non-static data members. 745 if (FieldDecl *Field = dyn_cast<FieldDecl>(D)) { 746 // C++ [class.bit]p2: 747 // A declaration for a bit-field that omits the identifier declares an 748 // unnamed bit-field. Unnamed bit-fields are not members and cannot be 749 // initialized. 750 if (Field->isUnnamedBitfield()) 751 return; 752 753 // C++ [dcl.init.aggr]p1: 754 // An aggregate is an array or a class (clause 9) with [...] no 755 // private or protected non-static data members (clause 11). 756 // 757 // A POD must be an aggregate. 758 if (D->getAccess() == AS_private || D->getAccess() == AS_protected) { 759 data().Aggregate = false; 760 data().PlainOldData = false; 761 } 762 763 // C++0x [class]p7: 764 // A standard-layout class is a class that: 765 // [...] 766 // -- has the same access control for all non-static data members, 767 switch (D->getAccess()) { 768 case AS_private: data().HasPrivateFields = true; break; 769 case AS_protected: data().HasProtectedFields = true; break; 770 case AS_public: data().HasPublicFields = true; break; 771 case AS_none: llvm_unreachable("Invalid access specifier"); 772 }; 773 if ((data().HasPrivateFields + data().HasProtectedFields + 774 data().HasPublicFields) > 1) 775 data().IsStandardLayout = false; 776 777 // Keep track of the presence of mutable fields. 778 if (Field->isMutable()) 779 data().HasMutableFields = true; 780 781 // C++0x [class]p9: 782 // A POD struct is a class that is both a trivial class and a 783 // standard-layout class, and has no non-static data members of type 784 // non-POD struct, non-POD union (or array of such types). 785 // 786 // Automatic Reference Counting: the presence of a member of Objective-C pointer type 787 // that does not explicitly have no lifetime makes the class a non-POD. 788 // However, we delay setting PlainOldData to false in this case so that 789 // Sema has a chance to diagnostic causes where the same class will be 790 // non-POD with Automatic Reference Counting but a POD without Instant Objects. 791 // In this case, the class will become a non-POD class when we complete 792 // the definition. 793 ASTContext &Context = getASTContext(); 794 QualType T = Context.getBaseElementType(Field->getType()); 795 if (T->isObjCRetainableType() || T.isObjCGCStrong()) { 796 if (!Context.getLangOptions().ObjCAutoRefCount || 797 T.getObjCLifetime() != Qualifiers::OCL_ExplicitNone) 798 setHasObjectMember(true); 799 } else if (!T.isPODType(Context)) 800 data().PlainOldData = false; 801 802 if (T->isReferenceType()) { 803 data().HasTrivialDefaultConstructor = false; 804 805 // C++0x [class]p7: 806 // A standard-layout class is a class that: 807 // -- has no non-static data members of type [...] reference, 808 data().IsStandardLayout = false; 809 } 810 811 // Record if this field is the first non-literal or volatile field or base. 812 if (!T->isLiteralType() || T.isVolatileQualified()) 813 data().HasNonLiteralTypeFieldsOrBases = true; 814 815 if (Field->hasInClassInitializer()) { 816 // C++0x [class]p5: 817 // A default constructor is trivial if [...] no non-static data member 818 // of its class has a brace-or-equal-initializer. 819 data().HasTrivialDefaultConstructor = false; 820 821 // C++0x [dcl.init.aggr]p1: 822 // An aggregate is a [...] class with [...] no 823 // brace-or-equal-initializers for non-static data members. 824 data().Aggregate = false; 825 826 // C++0x [class]p10: 827 // A POD struct is [...] a trivial class. 828 data().PlainOldData = false; 829 } 830 831 if (const RecordType *RecordTy = T->getAs<RecordType>()) { 832 CXXRecordDecl* FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl()); 833 if (FieldRec->getDefinition()) { 834 // C++0x [class.ctor]p5: 835 // A default constructor is trivial [...] if: 836 // -- for all the non-static data members of its class that are of 837 // class type (or array thereof), each such class has a trivial 838 // default constructor. 839 if (!FieldRec->hasTrivialDefaultConstructor()) 840 data().HasTrivialDefaultConstructor = false; 841 842 // C++0x [class.copy]p13: 843 // A copy/move constructor for class X is trivial if [...] 844 // [...] 845 // -- for each non-static data member of X that is of class type (or 846 // an array thereof), the constructor selected to copy/move that 847 // member is trivial; 848 // FIXME: C++0x: We don't correctly model 'selected' constructors. 849 if (!FieldRec->hasTrivialCopyConstructor()) 850 data().HasTrivialCopyConstructor = false; 851 if (!FieldRec->hasTrivialMoveConstructor()) 852 data().HasTrivialMoveConstructor = false; 853 854 // C++0x [class.copy]p27: 855 // A copy/move assignment operator for class X is trivial if [...] 856 // [...] 857 // -- for each non-static data member of X that is of class type (or 858 // an array thereof), the assignment operator selected to 859 // copy/move that member is trivial; 860 // FIXME: C++0x: We don't correctly model 'selected' operators. 861 if (!FieldRec->hasTrivialCopyAssignment()) 862 data().HasTrivialCopyAssignment = false; 863 if (!FieldRec->hasTrivialMoveAssignment()) 864 data().HasTrivialMoveAssignment = false; 865 866 if (!FieldRec->hasTrivialDestructor()) 867 data().HasTrivialDestructor = false; 868 if (FieldRec->hasObjectMember()) 869 setHasObjectMember(true); 870 871 // C++0x [class]p7: 872 // A standard-layout class is a class that: 873 // -- has no non-static data members of type non-standard-layout 874 // class (or array of such types) [...] 875 if (!FieldRec->isStandardLayout()) 876 data().IsStandardLayout = false; 877 878 // C++0x [class]p7: 879 // A standard-layout class is a class that: 880 // [...] 881 // -- has no base classes of the same type as the first non-static 882 // data member. 883 // We don't want to expend bits in the state of the record decl 884 // tracking whether this is the first non-static data member so we 885 // cheat a bit and use some of the existing state: the empty bit. 886 // Virtual bases and virtual methods make a class non-empty, but they 887 // also make it non-standard-layout so we needn't check here. 888 // A non-empty base class may leave the class standard-layout, but not 889 // if we have arrived here, and have at least on non-static data 890 // member. If IsStandardLayout remains true, then the first non-static 891 // data member must come through here with Empty still true, and Empty 892 // will subsequently be set to false below. 893 if (data().IsStandardLayout && data().Empty) { 894 for (CXXRecordDecl::base_class_const_iterator BI = bases_begin(), 895 BE = bases_end(); 896 BI != BE; ++BI) { 897 if (Context.hasSameUnqualifiedType(BI->getType(), T)) { 898 data().IsStandardLayout = false; 899 break; 900 } 901 } 902 } 903 904 // Keep track of the presence of mutable fields. 905 if (FieldRec->hasMutableFields()) 906 data().HasMutableFields = true; 907 908 // C++11 [class.copy]p13: 909 // If the implicitly-defined constructor would satisfy the 910 // requirements of a constexpr constructor, the implicitly-defined 911 // constructor is constexpr. 912 // C++11 [dcl.constexpr]p4: 913 // -- every constructor involved in initializing non-static data 914 // members [...] shall be a constexpr constructor 915 if (!Field->hasInClassInitializer() && 916 !FieldRec->hasConstexprDefaultConstructor()) 917 // The standard requires any in-class initializer to be a constant 918 // expression. We consider this to be a defect. 919 data().DefaultedDefaultConstructorIsConstexpr = false; 920 921 if (!FieldRec->hasConstexprCopyConstructor()) 922 data().DefaultedCopyConstructorIsConstexpr = false; 923 924 if (FieldRec->hasDeclaredMoveConstructor() || 925 FieldRec->needsImplicitMoveConstructor()) 926 // FIXME: If the implicit move constructor generated for the member's 927 // class would be ill-formed, the implicit move constructor generated 928 // for this class calls the member's copy constructor. 929 data().DefaultedMoveConstructorIsConstexpr &= 930 FieldRec->hasConstexprMoveConstructor(); 931 else if (!FieldRec->hasConstexprCopyConstructor()) 932 data().DefaultedMoveConstructorIsConstexpr = false; 933 } 934 } else { 935 // Base element type of field is a non-class type. 936 if (!T->isLiteralType()) { 937 data().DefaultedDefaultConstructorIsConstexpr = false; 938 data().DefaultedCopyConstructorIsConstexpr = false; 939 data().DefaultedMoveConstructorIsConstexpr = false; 940 } else if (!Field->hasInClassInitializer()) 941 data().DefaultedDefaultConstructorIsConstexpr = false; 942 } 943 944 // C++0x [class]p7: 945 // A standard-layout class is a class that: 946 // [...] 947 // -- either has no non-static data members in the most derived 948 // class and at most one base class with non-static data members, 949 // or has no base classes with non-static data members, and 950 // At this point we know that we have a non-static data member, so the last 951 // clause holds. 952 if (!data().HasNoNonEmptyBases) 953 data().IsStandardLayout = false; 954 955 // If this is not a zero-length bit-field, then the class is not empty. 956 if (data().Empty) { 957 if (!Field->isBitField() || 958 (!Field->getBitWidth()->isTypeDependent() && 959 !Field->getBitWidth()->isValueDependent() && 960 Field->getBitWidthValue(Context) != 0)) 961 data().Empty = false; 962 } 963 } 964 965 // Handle using declarations of conversion functions. 966 if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(D)) 967 if (Shadow->getDeclName().getNameKind() 968 == DeclarationName::CXXConversionFunctionName) 969 data().Conversions.addDecl(Shadow, Shadow->getAccess()); 970 } 971 972 bool CXXRecordDecl::isCLike() const { 973 if (getTagKind() == TTK_Class || !TemplateOrInstantiation.isNull()) 974 return false; 975 if (!hasDefinition()) 976 return true; 977 978 return isPOD() && data().HasOnlyCMembers; 979 } 980 981 void CXXRecordDecl::getCaptureFields( 982 llvm::DenseMap<const VarDecl *, FieldDecl *> &Captures, 983 FieldDecl *&ThisCapture) const { 984 Captures.clear(); 985 ThisCapture = 0; 986 987 LambdaDefinitionData &Lambda = getLambdaData(); 988 RecordDecl::field_iterator Field = field_begin(); 989 for (LambdaExpr::Capture *C = Lambda.Captures, *CEnd = C + Lambda.NumCaptures; 990 C != CEnd; ++C, ++Field) { 991 if (C->capturesThis()) { 992 ThisCapture = *Field; 993 continue; 994 } 995 996 Captures[C->getCapturedVar()] = *Field; 997 } 998 } 999 1000 1001 static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) { 1002 QualType T; 1003 if (isa<UsingShadowDecl>(Conv)) 1004 Conv = cast<UsingShadowDecl>(Conv)->getTargetDecl(); 1005 if (FunctionTemplateDecl *ConvTemp = dyn_cast<FunctionTemplateDecl>(Conv)) 1006 T = ConvTemp->getTemplatedDecl()->getResultType(); 1007 else 1008 T = cast<CXXConversionDecl>(Conv)->getConversionType(); 1009 return Context.getCanonicalType(T); 1010 } 1011 1012 /// Collect the visible conversions of a base class. 1013 /// 1014 /// \param Base a base class of the class we're considering 1015 /// \param InVirtual whether this base class is a virtual base (or a base 1016 /// of a virtual base) 1017 /// \param Access the access along the inheritance path to this base 1018 /// \param ParentHiddenTypes the conversions provided by the inheritors 1019 /// of this base 1020 /// \param Output the set to which to add conversions from non-virtual bases 1021 /// \param VOutput the set to which to add conversions from virtual bases 1022 /// \param HiddenVBaseCs the set of conversions which were hidden in a 1023 /// virtual base along some inheritance path 1024 static void CollectVisibleConversions(ASTContext &Context, 1025 CXXRecordDecl *Record, 1026 bool InVirtual, 1027 AccessSpecifier Access, 1028 const llvm::SmallPtrSet<CanQualType, 8> &ParentHiddenTypes, 1029 UnresolvedSetImpl &Output, 1030 UnresolvedSetImpl &VOutput, 1031 llvm::SmallPtrSet<NamedDecl*, 8> &HiddenVBaseCs) { 1032 // The set of types which have conversions in this class or its 1033 // subclasses. As an optimization, we don't copy the derived set 1034 // unless it might change. 1035 const llvm::SmallPtrSet<CanQualType, 8> *HiddenTypes = &ParentHiddenTypes; 1036 llvm::SmallPtrSet<CanQualType, 8> HiddenTypesBuffer; 1037 1038 // Collect the direct conversions and figure out which conversions 1039 // will be hidden in the subclasses. 1040 UnresolvedSetImpl &Cs = *Record->getConversionFunctions(); 1041 if (!Cs.empty()) { 1042 HiddenTypesBuffer = ParentHiddenTypes; 1043 HiddenTypes = &HiddenTypesBuffer; 1044 1045 for (UnresolvedSetIterator I = Cs.begin(), E = Cs.end(); I != E; ++I) { 1046 bool Hidden = 1047 !HiddenTypesBuffer.insert(GetConversionType(Context, I.getDecl())); 1048 1049 // If this conversion is hidden and we're in a virtual base, 1050 // remember that it's hidden along some inheritance path. 1051 if (Hidden && InVirtual) 1052 HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())); 1053 1054 // If this conversion isn't hidden, add it to the appropriate output. 1055 else if (!Hidden) { 1056 AccessSpecifier IAccess 1057 = CXXRecordDecl::MergeAccess(Access, I.getAccess()); 1058 1059 if (InVirtual) 1060 VOutput.addDecl(I.getDecl(), IAccess); 1061 else 1062 Output.addDecl(I.getDecl(), IAccess); 1063 } 1064 } 1065 } 1066 1067 // Collect information recursively from any base classes. 1068 for (CXXRecordDecl::base_class_iterator 1069 I = Record->bases_begin(), E = Record->bases_end(); I != E; ++I) { 1070 const RecordType *RT = I->getType()->getAs<RecordType>(); 1071 if (!RT) continue; 1072 1073 AccessSpecifier BaseAccess 1074 = CXXRecordDecl::MergeAccess(Access, I->getAccessSpecifier()); 1075 bool BaseInVirtual = InVirtual || I->isVirtual(); 1076 1077 CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl()); 1078 CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess, 1079 *HiddenTypes, Output, VOutput, HiddenVBaseCs); 1080 } 1081 } 1082 1083 /// Collect the visible conversions of a class. 1084 /// 1085 /// This would be extremely straightforward if it weren't for virtual 1086 /// bases. It might be worth special-casing that, really. 1087 static void CollectVisibleConversions(ASTContext &Context, 1088 CXXRecordDecl *Record, 1089 UnresolvedSetImpl &Output) { 1090 // The collection of all conversions in virtual bases that we've 1091 // found. These will be added to the output as long as they don't 1092 // appear in the hidden-conversions set. 1093 UnresolvedSet<8> VBaseCs; 1094 1095 // The set of conversions in virtual bases that we've determined to 1096 // be hidden. 1097 llvm::SmallPtrSet<NamedDecl*, 8> HiddenVBaseCs; 1098 1099 // The set of types hidden by classes derived from this one. 1100 llvm::SmallPtrSet<CanQualType, 8> HiddenTypes; 1101 1102 // Go ahead and collect the direct conversions and add them to the 1103 // hidden-types set. 1104 UnresolvedSetImpl &Cs = *Record->getConversionFunctions(); 1105 Output.append(Cs.begin(), Cs.end()); 1106 for (UnresolvedSetIterator I = Cs.begin(), E = Cs.end(); I != E; ++I) 1107 HiddenTypes.insert(GetConversionType(Context, I.getDecl())); 1108 1109 // Recursively collect conversions from base classes. 1110 for (CXXRecordDecl::base_class_iterator 1111 I = Record->bases_begin(), E = Record->bases_end(); I != E; ++I) { 1112 const RecordType *RT = I->getType()->getAs<RecordType>(); 1113 if (!RT) continue; 1114 1115 CollectVisibleConversions(Context, cast<CXXRecordDecl>(RT->getDecl()), 1116 I->isVirtual(), I->getAccessSpecifier(), 1117 HiddenTypes, Output, VBaseCs, HiddenVBaseCs); 1118 } 1119 1120 // Add any unhidden conversions provided by virtual bases. 1121 for (UnresolvedSetIterator I = VBaseCs.begin(), E = VBaseCs.end(); 1122 I != E; ++I) { 1123 if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()))) 1124 Output.addDecl(I.getDecl(), I.getAccess()); 1125 } 1126 } 1127 1128 /// getVisibleConversionFunctions - get all conversion functions visible 1129 /// in current class; including conversion function templates. 1130 const UnresolvedSetImpl *CXXRecordDecl::getVisibleConversionFunctions() { 1131 // If root class, all conversions are visible. 1132 if (bases_begin() == bases_end()) 1133 return &data().Conversions; 1134 // If visible conversion list is already evaluated, return it. 1135 if (data().ComputedVisibleConversions) 1136 return &data().VisibleConversions; 1137 CollectVisibleConversions(getASTContext(), this, data().VisibleConversions); 1138 data().ComputedVisibleConversions = true; 1139 return &data().VisibleConversions; 1140 } 1141 1142 void CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) { 1143 // This operation is O(N) but extremely rare. Sema only uses it to 1144 // remove UsingShadowDecls in a class that were followed by a direct 1145 // declaration, e.g.: 1146 // class A : B { 1147 // using B::operator int; 1148 // operator int(); 1149 // }; 1150 // This is uncommon by itself and even more uncommon in conjunction 1151 // with sufficiently large numbers of directly-declared conversions 1152 // that asymptotic behavior matters. 1153 1154 UnresolvedSetImpl &Convs = *getConversionFunctions(); 1155 for (unsigned I = 0, E = Convs.size(); I != E; ++I) { 1156 if (Convs[I].getDecl() == ConvDecl) { 1157 Convs.erase(I); 1158 assert(std::find(Convs.begin(), Convs.end(), ConvDecl) == Convs.end() 1159 && "conversion was found multiple times in unresolved set"); 1160 return; 1161 } 1162 } 1163 1164 llvm_unreachable("conversion not found in set!"); 1165 } 1166 1167 CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const { 1168 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) 1169 return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom()); 1170 1171 return 0; 1172 } 1173 1174 MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const { 1175 return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>(); 1176 } 1177 1178 void 1179 CXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD, 1180 TemplateSpecializationKind TSK) { 1181 assert(TemplateOrInstantiation.isNull() && 1182 "Previous template or instantiation?"); 1183 assert(!isa<ClassTemplateSpecializationDecl>(this)); 1184 TemplateOrInstantiation 1185 = new (getASTContext()) MemberSpecializationInfo(RD, TSK); 1186 } 1187 1188 TemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() const{ 1189 if (const ClassTemplateSpecializationDecl *Spec 1190 = dyn_cast<ClassTemplateSpecializationDecl>(this)) 1191 return Spec->getSpecializationKind(); 1192 1193 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) 1194 return MSInfo->getTemplateSpecializationKind(); 1195 1196 return TSK_Undeclared; 1197 } 1198 1199 void 1200 CXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) { 1201 if (ClassTemplateSpecializationDecl *Spec 1202 = dyn_cast<ClassTemplateSpecializationDecl>(this)) { 1203 Spec->setSpecializationKind(TSK); 1204 return; 1205 } 1206 1207 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) { 1208 MSInfo->setTemplateSpecializationKind(TSK); 1209 return; 1210 } 1211 1212 llvm_unreachable("Not a class template or member class specialization"); 1213 } 1214 1215 CXXDestructorDecl *CXXRecordDecl::getDestructor() const { 1216 ASTContext &Context = getASTContext(); 1217 QualType ClassType = Context.getTypeDeclType(this); 1218 1219 DeclarationName Name 1220 = Context.DeclarationNames.getCXXDestructorName( 1221 Context.getCanonicalType(ClassType)); 1222 1223 DeclContext::lookup_const_iterator I, E; 1224 llvm::tie(I, E) = lookup(Name); 1225 if (I == E) 1226 return 0; 1227 1228 CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(*I); 1229 return Dtor; 1230 } 1231 1232 void CXXRecordDecl::completeDefinition() { 1233 completeDefinition(0); 1234 } 1235 1236 void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) { 1237 RecordDecl::completeDefinition(); 1238 1239 if (hasObjectMember() && getASTContext().getLangOptions().ObjCAutoRefCount) { 1240 // Objective-C Automatic Reference Counting: 1241 // If a class has a non-static data member of Objective-C pointer 1242 // type (or array thereof), it is a non-POD type and its 1243 // default constructor (if any), copy constructor, copy assignment 1244 // operator, and destructor are non-trivial. 1245 struct DefinitionData &Data = data(); 1246 Data.PlainOldData = false; 1247 Data.HasTrivialDefaultConstructor = false; 1248 Data.HasTrivialCopyConstructor = false; 1249 Data.HasTrivialCopyAssignment = false; 1250 Data.HasTrivialDestructor = false; 1251 } 1252 1253 // If the class may be abstract (but hasn't been marked as such), check for 1254 // any pure final overriders. 1255 if (mayBeAbstract()) { 1256 CXXFinalOverriderMap MyFinalOverriders; 1257 if (!FinalOverriders) { 1258 getFinalOverriders(MyFinalOverriders); 1259 FinalOverriders = &MyFinalOverriders; 1260 } 1261 1262 bool Done = false; 1263 for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(), 1264 MEnd = FinalOverriders->end(); 1265 M != MEnd && !Done; ++M) { 1266 for (OverridingMethods::iterator SO = M->second.begin(), 1267 SOEnd = M->second.end(); 1268 SO != SOEnd && !Done; ++SO) { 1269 assert(SO->second.size() > 0 && 1270 "All virtual functions have overridding virtual functions"); 1271 1272 // C++ [class.abstract]p4: 1273 // A class is abstract if it contains or inherits at least one 1274 // pure virtual function for which the final overrider is pure 1275 // virtual. 1276 if (SO->second.front().Method->isPure()) { 1277 data().Abstract = true; 1278 Done = true; 1279 break; 1280 } 1281 } 1282 } 1283 } 1284 1285 // Set access bits correctly on the directly-declared conversions. 1286 for (UnresolvedSetIterator I = data().Conversions.begin(), 1287 E = data().Conversions.end(); 1288 I != E; ++I) 1289 data().Conversions.setAccess(I, (*I)->getAccess()); 1290 } 1291 1292 bool CXXRecordDecl::mayBeAbstract() const { 1293 if (data().Abstract || isInvalidDecl() || !data().Polymorphic || 1294 isDependentContext()) 1295 return false; 1296 1297 for (CXXRecordDecl::base_class_const_iterator B = bases_begin(), 1298 BEnd = bases_end(); 1299 B != BEnd; ++B) { 1300 CXXRecordDecl *BaseDecl 1301 = cast<CXXRecordDecl>(B->getType()->getAs<RecordType>()->getDecl()); 1302 if (BaseDecl->isAbstract()) 1303 return true; 1304 } 1305 1306 return false; 1307 } 1308 1309 void CXXMethodDecl::anchor() { } 1310 1311 CXXMethodDecl * 1312 CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1313 SourceLocation StartLoc, 1314 const DeclarationNameInfo &NameInfo, 1315 QualType T, TypeSourceInfo *TInfo, 1316 bool isStatic, StorageClass SCAsWritten, bool isInline, 1317 bool isConstexpr, SourceLocation EndLocation) { 1318 return new (C) CXXMethodDecl(CXXMethod, RD, StartLoc, NameInfo, T, TInfo, 1319 isStatic, SCAsWritten, isInline, isConstexpr, 1320 EndLocation); 1321 } 1322 1323 CXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1324 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXMethodDecl)); 1325 return new (Mem) CXXMethodDecl(CXXMethod, 0, SourceLocation(), 1326 DeclarationNameInfo(), QualType(), 1327 0, false, SC_None, false, false, 1328 SourceLocation()); 1329 } 1330 1331 bool CXXMethodDecl::isUsualDeallocationFunction() const { 1332 if (getOverloadedOperator() != OO_Delete && 1333 getOverloadedOperator() != OO_Array_Delete) 1334 return false; 1335 1336 // C++ [basic.stc.dynamic.deallocation]p2: 1337 // A template instance is never a usual deallocation function, 1338 // regardless of its signature. 1339 if (getPrimaryTemplate()) 1340 return false; 1341 1342 // C++ [basic.stc.dynamic.deallocation]p2: 1343 // If a class T has a member deallocation function named operator delete 1344 // with exactly one parameter, then that function is a usual (non-placement) 1345 // deallocation function. [...] 1346 if (getNumParams() == 1) 1347 return true; 1348 1349 // C++ [basic.stc.dynamic.deallocation]p2: 1350 // [...] If class T does not declare such an operator delete but does 1351 // declare a member deallocation function named operator delete with 1352 // exactly two parameters, the second of which has type std::size_t (18.1), 1353 // then this function is a usual deallocation function. 1354 ASTContext &Context = getASTContext(); 1355 if (getNumParams() != 2 || 1356 !Context.hasSameUnqualifiedType(getParamDecl(1)->getType(), 1357 Context.getSizeType())) 1358 return false; 1359 1360 // This function is a usual deallocation function if there are no 1361 // single-parameter deallocation functions of the same kind. 1362 for (DeclContext::lookup_const_result R = getDeclContext()->lookup(getDeclName()); 1363 R.first != R.second; ++R.first) { 1364 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*R.first)) 1365 if (FD->getNumParams() == 1) 1366 return false; 1367 } 1368 1369 return true; 1370 } 1371 1372 bool CXXMethodDecl::isCopyAssignmentOperator() const { 1373 // C++0x [class.copy]p17: 1374 // A user-declared copy assignment operator X::operator= is a non-static 1375 // non-template member function of class X with exactly one parameter of 1376 // type X, X&, const X&, volatile X& or const volatile X&. 1377 if (/*operator=*/getOverloadedOperator() != OO_Equal || 1378 /*non-static*/ isStatic() || 1379 /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate()) 1380 return false; 1381 1382 QualType ParamType = getParamDecl(0)->getType(); 1383 if (const LValueReferenceType *Ref = ParamType->getAs<LValueReferenceType>()) 1384 ParamType = Ref->getPointeeType(); 1385 1386 ASTContext &Context = getASTContext(); 1387 QualType ClassType 1388 = Context.getCanonicalType(Context.getTypeDeclType(getParent())); 1389 return Context.hasSameUnqualifiedType(ClassType, ParamType); 1390 } 1391 1392 bool CXXMethodDecl::isMoveAssignmentOperator() const { 1393 // C++0x [class.copy]p19: 1394 // A user-declared move assignment operator X::operator= is a non-static 1395 // non-template member function of class X with exactly one parameter of type 1396 // X&&, const X&&, volatile X&&, or const volatile X&&. 1397 if (getOverloadedOperator() != OO_Equal || isStatic() || 1398 getPrimaryTemplate() || getDescribedFunctionTemplate()) 1399 return false; 1400 1401 QualType ParamType = getParamDecl(0)->getType(); 1402 if (!isa<RValueReferenceType>(ParamType)) 1403 return false; 1404 ParamType = ParamType->getPointeeType(); 1405 1406 ASTContext &Context = getASTContext(); 1407 QualType ClassType 1408 = Context.getCanonicalType(Context.getTypeDeclType(getParent())); 1409 return Context.hasSameUnqualifiedType(ClassType, ParamType); 1410 } 1411 1412 void CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) { 1413 assert(MD->isCanonicalDecl() && "Method is not canonical!"); 1414 assert(!MD->getParent()->isDependentContext() && 1415 "Can't add an overridden method to a class template!"); 1416 1417 getASTContext().addOverriddenMethod(this, MD); 1418 } 1419 1420 CXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const { 1421 return getASTContext().overridden_methods_begin(this); 1422 } 1423 1424 CXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const { 1425 return getASTContext().overridden_methods_end(this); 1426 } 1427 1428 unsigned CXXMethodDecl::size_overridden_methods() const { 1429 return getASTContext().overridden_methods_size(this); 1430 } 1431 1432 QualType CXXMethodDecl::getThisType(ASTContext &C) const { 1433 // C++ 9.3.2p1: The type of this in a member function of a class X is X*. 1434 // If the member function is declared const, the type of this is const X*, 1435 // if the member function is declared volatile, the type of this is 1436 // volatile X*, and if the member function is declared const volatile, 1437 // the type of this is const volatile X*. 1438 1439 assert(isInstance() && "No 'this' for static methods!"); 1440 1441 QualType ClassTy = C.getTypeDeclType(getParent()); 1442 ClassTy = C.getQualifiedType(ClassTy, 1443 Qualifiers::fromCVRMask(getTypeQualifiers())); 1444 return C.getPointerType(ClassTy); 1445 } 1446 1447 bool CXXMethodDecl::hasInlineBody() const { 1448 // If this function is a template instantiation, look at the template from 1449 // which it was instantiated. 1450 const FunctionDecl *CheckFn = getTemplateInstantiationPattern(); 1451 if (!CheckFn) 1452 CheckFn = this; 1453 1454 const FunctionDecl *fn; 1455 return CheckFn->hasBody(fn) && !fn->isOutOfLine(); 1456 } 1457 1458 bool CXXMethodDecl::isLambdaStaticInvoker() const { 1459 return getParent()->isLambda() && 1460 getIdentifier() && getIdentifier()->getName() == "__invoke"; 1461 } 1462 1463 1464 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1465 TypeSourceInfo *TInfo, bool IsVirtual, 1466 SourceLocation L, Expr *Init, 1467 SourceLocation R, 1468 SourceLocation EllipsisLoc) 1469 : Initializee(TInfo), MemberOrEllipsisLocation(EllipsisLoc), Init(Init), 1470 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual), 1471 IsWritten(false), SourceOrderOrNumArrayIndices(0) 1472 { 1473 } 1474 1475 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1476 FieldDecl *Member, 1477 SourceLocation MemberLoc, 1478 SourceLocation L, Expr *Init, 1479 SourceLocation R) 1480 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init), 1481 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false), 1482 IsWritten(false), SourceOrderOrNumArrayIndices(0) 1483 { 1484 } 1485 1486 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1487 IndirectFieldDecl *Member, 1488 SourceLocation MemberLoc, 1489 SourceLocation L, Expr *Init, 1490 SourceLocation R) 1491 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init), 1492 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false), 1493 IsWritten(false), SourceOrderOrNumArrayIndices(0) 1494 { 1495 } 1496 1497 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1498 TypeSourceInfo *TInfo, 1499 SourceLocation L, Expr *Init, 1500 SourceLocation R) 1501 : Initializee(TInfo), MemberOrEllipsisLocation(), Init(Init), 1502 LParenLoc(L), RParenLoc(R), IsDelegating(true), IsVirtual(false), 1503 IsWritten(false), SourceOrderOrNumArrayIndices(0) 1504 { 1505 } 1506 1507 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1508 FieldDecl *Member, 1509 SourceLocation MemberLoc, 1510 SourceLocation L, Expr *Init, 1511 SourceLocation R, 1512 VarDecl **Indices, 1513 unsigned NumIndices) 1514 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init), 1515 LParenLoc(L), RParenLoc(R), IsVirtual(false), 1516 IsWritten(false), SourceOrderOrNumArrayIndices(NumIndices) 1517 { 1518 VarDecl **MyIndices = reinterpret_cast<VarDecl **> (this + 1); 1519 memcpy(MyIndices, Indices, NumIndices * sizeof(VarDecl *)); 1520 } 1521 1522 CXXCtorInitializer *CXXCtorInitializer::Create(ASTContext &Context, 1523 FieldDecl *Member, 1524 SourceLocation MemberLoc, 1525 SourceLocation L, Expr *Init, 1526 SourceLocation R, 1527 VarDecl **Indices, 1528 unsigned NumIndices) { 1529 void *Mem = Context.Allocate(sizeof(CXXCtorInitializer) + 1530 sizeof(VarDecl *) * NumIndices, 1531 llvm::alignOf<CXXCtorInitializer>()); 1532 return new (Mem) CXXCtorInitializer(Context, Member, MemberLoc, L, Init, R, 1533 Indices, NumIndices); 1534 } 1535 1536 TypeLoc CXXCtorInitializer::getBaseClassLoc() const { 1537 if (isBaseInitializer()) 1538 return Initializee.get<TypeSourceInfo*>()->getTypeLoc(); 1539 else 1540 return TypeLoc(); 1541 } 1542 1543 const Type *CXXCtorInitializer::getBaseClass() const { 1544 if (isBaseInitializer()) 1545 return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr(); 1546 else 1547 return 0; 1548 } 1549 1550 SourceLocation CXXCtorInitializer::getSourceLocation() const { 1551 if (isAnyMemberInitializer()) 1552 return getMemberLocation(); 1553 1554 if (isInClassMemberInitializer()) 1555 return getAnyMember()->getLocation(); 1556 1557 if (TypeSourceInfo *TSInfo = Initializee.get<TypeSourceInfo*>()) 1558 return TSInfo->getTypeLoc().getLocalSourceRange().getBegin(); 1559 1560 return SourceLocation(); 1561 } 1562 1563 SourceRange CXXCtorInitializer::getSourceRange() const { 1564 if (isInClassMemberInitializer()) { 1565 FieldDecl *D = getAnyMember(); 1566 if (Expr *I = D->getInClassInitializer()) 1567 return I->getSourceRange(); 1568 return SourceRange(); 1569 } 1570 1571 return SourceRange(getSourceLocation(), getRParenLoc()); 1572 } 1573 1574 void CXXConstructorDecl::anchor() { } 1575 1576 CXXConstructorDecl * 1577 CXXConstructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1578 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXConstructorDecl)); 1579 return new (Mem) CXXConstructorDecl(0, SourceLocation(),DeclarationNameInfo(), 1580 QualType(), 0, false, false, false,false); 1581 } 1582 1583 CXXConstructorDecl * 1584 CXXConstructorDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1585 SourceLocation StartLoc, 1586 const DeclarationNameInfo &NameInfo, 1587 QualType T, TypeSourceInfo *TInfo, 1588 bool isExplicit, bool isInline, 1589 bool isImplicitlyDeclared, bool isConstexpr) { 1590 assert(NameInfo.getName().getNameKind() 1591 == DeclarationName::CXXConstructorName && 1592 "Name must refer to a constructor"); 1593 return new (C) CXXConstructorDecl(RD, StartLoc, NameInfo, T, TInfo, 1594 isExplicit, isInline, isImplicitlyDeclared, 1595 isConstexpr); 1596 } 1597 1598 CXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const { 1599 assert(isDelegatingConstructor() && "Not a delegating constructor!"); 1600 Expr *E = (*init_begin())->getInit()->IgnoreImplicit(); 1601 if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(E)) 1602 return Construct->getConstructor(); 1603 1604 return 0; 1605 } 1606 1607 bool CXXConstructorDecl::isDefaultConstructor() const { 1608 // C++ [class.ctor]p5: 1609 // A default constructor for a class X is a constructor of class 1610 // X that can be called without an argument. 1611 return (getNumParams() == 0) || 1612 (getNumParams() > 0 && getParamDecl(0)->hasDefaultArg()); 1613 } 1614 1615 bool 1616 CXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const { 1617 return isCopyOrMoveConstructor(TypeQuals) && 1618 getParamDecl(0)->getType()->isLValueReferenceType(); 1619 } 1620 1621 bool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const { 1622 return isCopyOrMoveConstructor(TypeQuals) && 1623 getParamDecl(0)->getType()->isRValueReferenceType(); 1624 } 1625 1626 /// \brief Determine whether this is a copy or move constructor. 1627 bool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const { 1628 // C++ [class.copy]p2: 1629 // A non-template constructor for class X is a copy constructor 1630 // if its first parameter is of type X&, const X&, volatile X& or 1631 // const volatile X&, and either there are no other parameters 1632 // or else all other parameters have default arguments (8.3.6). 1633 // C++0x [class.copy]p3: 1634 // A non-template constructor for class X is a move constructor if its 1635 // first parameter is of type X&&, const X&&, volatile X&&, or 1636 // const volatile X&&, and either there are no other parameters or else 1637 // all other parameters have default arguments. 1638 if ((getNumParams() < 1) || 1639 (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) || 1640 (getPrimaryTemplate() != 0) || 1641 (getDescribedFunctionTemplate() != 0)) 1642 return false; 1643 1644 const ParmVarDecl *Param = getParamDecl(0); 1645 1646 // Do we have a reference type? 1647 const ReferenceType *ParamRefType = Param->getType()->getAs<ReferenceType>(); 1648 if (!ParamRefType) 1649 return false; 1650 1651 // Is it a reference to our class type? 1652 ASTContext &Context = getASTContext(); 1653 1654 CanQualType PointeeType 1655 = Context.getCanonicalType(ParamRefType->getPointeeType()); 1656 CanQualType ClassTy 1657 = Context.getCanonicalType(Context.getTagDeclType(getParent())); 1658 if (PointeeType.getUnqualifiedType() != ClassTy) 1659 return false; 1660 1661 // FIXME: other qualifiers? 1662 1663 // We have a copy or move constructor. 1664 TypeQuals = PointeeType.getCVRQualifiers(); 1665 return true; 1666 } 1667 1668 bool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const { 1669 // C++ [class.conv.ctor]p1: 1670 // A constructor declared without the function-specifier explicit 1671 // that can be called with a single parameter specifies a 1672 // conversion from the type of its first parameter to the type of 1673 // its class. Such a constructor is called a converting 1674 // constructor. 1675 if (isExplicit() && !AllowExplicit) 1676 return false; 1677 1678 return (getNumParams() == 0 && 1679 getType()->getAs<FunctionProtoType>()->isVariadic()) || 1680 (getNumParams() == 1) || 1681 (getNumParams() > 1 && getParamDecl(1)->hasDefaultArg()); 1682 } 1683 1684 bool CXXConstructorDecl::isSpecializationCopyingObject() const { 1685 if ((getNumParams() < 1) || 1686 (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) || 1687 (getPrimaryTemplate() == 0) || 1688 (getDescribedFunctionTemplate() != 0)) 1689 return false; 1690 1691 const ParmVarDecl *Param = getParamDecl(0); 1692 1693 ASTContext &Context = getASTContext(); 1694 CanQualType ParamType = Context.getCanonicalType(Param->getType()); 1695 1696 // Is it the same as our our class type? 1697 CanQualType ClassTy 1698 = Context.getCanonicalType(Context.getTagDeclType(getParent())); 1699 if (ParamType.getUnqualifiedType() != ClassTy) 1700 return false; 1701 1702 return true; 1703 } 1704 1705 const CXXConstructorDecl *CXXConstructorDecl::getInheritedConstructor() const { 1706 // Hack: we store the inherited constructor in the overridden method table 1707 method_iterator It = begin_overridden_methods(); 1708 if (It == end_overridden_methods()) 1709 return 0; 1710 1711 return cast<CXXConstructorDecl>(*It); 1712 } 1713 1714 void 1715 CXXConstructorDecl::setInheritedConstructor(const CXXConstructorDecl *BaseCtor){ 1716 // Hack: we store the inherited constructor in the overridden method table 1717 assert(size_overridden_methods() == 0 && "Base ctor already set."); 1718 addOverriddenMethod(BaseCtor); 1719 } 1720 1721 void CXXDestructorDecl::anchor() { } 1722 1723 CXXDestructorDecl * 1724 CXXDestructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1725 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXDestructorDecl)); 1726 return new (Mem) CXXDestructorDecl(0, SourceLocation(), DeclarationNameInfo(), 1727 QualType(), 0, false, false); 1728 } 1729 1730 CXXDestructorDecl * 1731 CXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1732 SourceLocation StartLoc, 1733 const DeclarationNameInfo &NameInfo, 1734 QualType T, TypeSourceInfo *TInfo, 1735 bool isInline, bool isImplicitlyDeclared) { 1736 assert(NameInfo.getName().getNameKind() 1737 == DeclarationName::CXXDestructorName && 1738 "Name must refer to a destructor"); 1739 return new (C) CXXDestructorDecl(RD, StartLoc, NameInfo, T, TInfo, isInline, 1740 isImplicitlyDeclared); 1741 } 1742 1743 void CXXConversionDecl::anchor() { } 1744 1745 CXXConversionDecl * 1746 CXXConversionDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1747 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(CXXConversionDecl)); 1748 return new (Mem) CXXConversionDecl(0, SourceLocation(), DeclarationNameInfo(), 1749 QualType(), 0, false, false, false, 1750 SourceLocation()); 1751 } 1752 1753 CXXConversionDecl * 1754 CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1755 SourceLocation StartLoc, 1756 const DeclarationNameInfo &NameInfo, 1757 QualType T, TypeSourceInfo *TInfo, 1758 bool isInline, bool isExplicit, 1759 bool isConstexpr, SourceLocation EndLocation) { 1760 assert(NameInfo.getName().getNameKind() 1761 == DeclarationName::CXXConversionFunctionName && 1762 "Name must refer to a conversion function"); 1763 return new (C) CXXConversionDecl(RD, StartLoc, NameInfo, T, TInfo, 1764 isInline, isExplicit, isConstexpr, 1765 EndLocation); 1766 } 1767 1768 bool CXXConversionDecl::isLambdaToBlockPointerConversion() const { 1769 return isImplicit() && getParent()->isLambda() && 1770 getConversionType()->isBlockPointerType(); 1771 } 1772 1773 void LinkageSpecDecl::anchor() { } 1774 1775 LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, 1776 DeclContext *DC, 1777 SourceLocation ExternLoc, 1778 SourceLocation LangLoc, 1779 LanguageIDs Lang, 1780 SourceLocation RBraceLoc) { 1781 return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, RBraceLoc); 1782 } 1783 1784 LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1785 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(LinkageSpecDecl)); 1786 return new (Mem) LinkageSpecDecl(0, SourceLocation(), SourceLocation(), 1787 lang_c, SourceLocation()); 1788 } 1789 1790 void UsingDirectiveDecl::anchor() { } 1791 1792 UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC, 1793 SourceLocation L, 1794 SourceLocation NamespaceLoc, 1795 NestedNameSpecifierLoc QualifierLoc, 1796 SourceLocation IdentLoc, 1797 NamedDecl *Used, 1798 DeclContext *CommonAncestor) { 1799 if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Used)) 1800 Used = NS->getOriginalNamespace(); 1801 return new (C) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc, 1802 IdentLoc, Used, CommonAncestor); 1803 } 1804 1805 UsingDirectiveDecl * 1806 UsingDirectiveDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1807 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UsingDirectiveDecl)); 1808 return new (Mem) UsingDirectiveDecl(0, SourceLocation(), SourceLocation(), 1809 NestedNameSpecifierLoc(), 1810 SourceLocation(), 0, 0); 1811 } 1812 1813 NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() { 1814 if (NamespaceAliasDecl *NA = 1815 dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace)) 1816 return NA->getNamespace(); 1817 return cast_or_null<NamespaceDecl>(NominatedNamespace); 1818 } 1819 1820 void NamespaceDecl::anchor() { } 1821 1822 NamespaceDecl::NamespaceDecl(DeclContext *DC, bool Inline, 1823 SourceLocation StartLoc, 1824 SourceLocation IdLoc, IdentifierInfo *Id, 1825 NamespaceDecl *PrevDecl) 1826 : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace), 1827 LocStart(StartLoc), RBraceLoc(), AnonOrFirstNamespaceAndInline(0, Inline) 1828 { 1829 setPreviousDeclaration(PrevDecl); 1830 1831 if (PrevDecl) 1832 AnonOrFirstNamespaceAndInline.setPointer(PrevDecl->getOriginalNamespace()); 1833 } 1834 1835 NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC, 1836 bool Inline, SourceLocation StartLoc, 1837 SourceLocation IdLoc, IdentifierInfo *Id, 1838 NamespaceDecl *PrevDecl) { 1839 return new (C) NamespaceDecl(DC, Inline, StartLoc, IdLoc, Id, PrevDecl); 1840 } 1841 1842 NamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1843 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NamespaceDecl)); 1844 return new (Mem) NamespaceDecl(0, false, SourceLocation(), SourceLocation(), 1845 0, 0); 1846 } 1847 1848 void NamespaceAliasDecl::anchor() { } 1849 1850 NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC, 1851 SourceLocation UsingLoc, 1852 SourceLocation AliasLoc, 1853 IdentifierInfo *Alias, 1854 NestedNameSpecifierLoc QualifierLoc, 1855 SourceLocation IdentLoc, 1856 NamedDecl *Namespace) { 1857 if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Namespace)) 1858 Namespace = NS->getOriginalNamespace(); 1859 return new (C) NamespaceAliasDecl(DC, UsingLoc, AliasLoc, Alias, 1860 QualifierLoc, IdentLoc, Namespace); 1861 } 1862 1863 NamespaceAliasDecl * 1864 NamespaceAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1865 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NamespaceAliasDecl)); 1866 return new (Mem) NamespaceAliasDecl(0, SourceLocation(), SourceLocation(), 0, 1867 NestedNameSpecifierLoc(), 1868 SourceLocation(), 0); 1869 } 1870 1871 void UsingShadowDecl::anchor() { } 1872 1873 UsingShadowDecl * 1874 UsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1875 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UsingShadowDecl)); 1876 return new (Mem) UsingShadowDecl(0, SourceLocation(), 0, 0); 1877 } 1878 1879 UsingDecl *UsingShadowDecl::getUsingDecl() const { 1880 const UsingShadowDecl *Shadow = this; 1881 while (const UsingShadowDecl *NextShadow = 1882 dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow)) 1883 Shadow = NextShadow; 1884 return cast<UsingDecl>(Shadow->UsingOrNextShadow); 1885 } 1886 1887 void UsingDecl::anchor() { } 1888 1889 void UsingDecl::addShadowDecl(UsingShadowDecl *S) { 1890 assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() && 1891 "declaration already in set"); 1892 assert(S->getUsingDecl() == this); 1893 1894 if (FirstUsingShadow.getPointer()) 1895 S->UsingOrNextShadow = FirstUsingShadow.getPointer(); 1896 FirstUsingShadow.setPointer(S); 1897 } 1898 1899 void UsingDecl::removeShadowDecl(UsingShadowDecl *S) { 1900 assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() && 1901 "declaration not in set"); 1902 assert(S->getUsingDecl() == this); 1903 1904 // Remove S from the shadow decl chain. This is O(n) but hopefully rare. 1905 1906 if (FirstUsingShadow.getPointer() == S) { 1907 FirstUsingShadow.setPointer( 1908 dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow)); 1909 S->UsingOrNextShadow = this; 1910 return; 1911 } 1912 1913 UsingShadowDecl *Prev = FirstUsingShadow.getPointer(); 1914 while (Prev->UsingOrNextShadow != S) 1915 Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow); 1916 Prev->UsingOrNextShadow = S->UsingOrNextShadow; 1917 S->UsingOrNextShadow = this; 1918 } 1919 1920 UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL, 1921 NestedNameSpecifierLoc QualifierLoc, 1922 const DeclarationNameInfo &NameInfo, 1923 bool IsTypeNameArg) { 1924 return new (C) UsingDecl(DC, UL, QualifierLoc, NameInfo, IsTypeNameArg); 1925 } 1926 1927 UsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1928 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UsingDecl)); 1929 return new (Mem) UsingDecl(0, SourceLocation(), NestedNameSpecifierLoc(), 1930 DeclarationNameInfo(), false); 1931 } 1932 1933 void UnresolvedUsingValueDecl::anchor() { } 1934 1935 UnresolvedUsingValueDecl * 1936 UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC, 1937 SourceLocation UsingLoc, 1938 NestedNameSpecifierLoc QualifierLoc, 1939 const DeclarationNameInfo &NameInfo) { 1940 return new (C) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc, 1941 QualifierLoc, NameInfo); 1942 } 1943 1944 UnresolvedUsingValueDecl * 1945 UnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1946 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(UnresolvedUsingValueDecl)); 1947 return new (Mem) UnresolvedUsingValueDecl(0, QualType(), SourceLocation(), 1948 NestedNameSpecifierLoc(), 1949 DeclarationNameInfo()); 1950 } 1951 1952 void UnresolvedUsingTypenameDecl::anchor() { } 1953 1954 UnresolvedUsingTypenameDecl * 1955 UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC, 1956 SourceLocation UsingLoc, 1957 SourceLocation TypenameLoc, 1958 NestedNameSpecifierLoc QualifierLoc, 1959 SourceLocation TargetNameLoc, 1960 DeclarationName TargetName) { 1961 return new (C) UnresolvedUsingTypenameDecl(DC, UsingLoc, TypenameLoc, 1962 QualifierLoc, TargetNameLoc, 1963 TargetName.getAsIdentifierInfo()); 1964 } 1965 1966 UnresolvedUsingTypenameDecl * 1967 UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1968 void *Mem = AllocateDeserializedDecl(C, ID, 1969 sizeof(UnresolvedUsingTypenameDecl)); 1970 return new (Mem) UnresolvedUsingTypenameDecl(0, SourceLocation(), 1971 SourceLocation(), 1972 NestedNameSpecifierLoc(), 1973 SourceLocation(), 1974 0); 1975 } 1976 1977 void StaticAssertDecl::anchor() { } 1978 1979 StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC, 1980 SourceLocation StaticAssertLoc, 1981 Expr *AssertExpr, 1982 StringLiteral *Message, 1983 SourceLocation RParenLoc) { 1984 return new (C) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message, 1985 RParenLoc); 1986 } 1987 1988 StaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C, 1989 unsigned ID) { 1990 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(StaticAssertDecl)); 1991 return new (Mem) StaticAssertDecl(0, SourceLocation(), 0, 0,SourceLocation()); 1992 } 1993 1994 static const char *getAccessName(AccessSpecifier AS) { 1995 switch (AS) { 1996 case AS_none: 1997 llvm_unreachable("Invalid access specifier!"); 1998 case AS_public: 1999 return "public"; 2000 case AS_private: 2001 return "private"; 2002 case AS_protected: 2003 return "protected"; 2004 } 2005 llvm_unreachable("Invalid access specifier!"); 2006 } 2007 2008 const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB, 2009 AccessSpecifier AS) { 2010 return DB << getAccessName(AS); 2011 } 2012 2013 const PartialDiagnostic &clang::operator<<(const PartialDiagnostic &DB, 2014 AccessSpecifier AS) { 2015 return DB << getAccessName(AS); 2016 } 2017