1 //===------ CXXInheritance.cpp - C++ Inheritance ----------------*- C++ -*-===// 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 provides routines that help analyzing C++ inheritance hierarchies. 11 // 12 //===----------------------------------------------------------------------===// 13 #include "clang/AST/CXXInheritance.h" 14 #include "clang/AST/ASTContext.h" 15 #include "clang/AST/RecordLayout.h" 16 #include "clang/AST/DeclCXX.h" 17 #include "llvm/ADT/SetVector.h" 18 #include <algorithm> 19 #include <set> 20 21 using namespace clang; 22 23 /// \brief Computes the set of declarations referenced by these base 24 /// paths. 25 void CXXBasePaths::ComputeDeclsFound() { 26 assert(NumDeclsFound == 0 && !DeclsFound && 27 "Already computed the set of declarations"); 28 29 llvm::SetVector<NamedDecl *, SmallVector<NamedDecl *, 8> > Decls; 30 for (paths_iterator Path = begin(), PathEnd = end(); Path != PathEnd; ++Path) 31 Decls.insert(*Path->Decls.first); 32 33 NumDeclsFound = Decls.size(); 34 DeclsFound = new NamedDecl * [NumDeclsFound]; 35 std::copy(Decls.begin(), Decls.end(), DeclsFound); 36 } 37 38 CXXBasePaths::decl_iterator CXXBasePaths::found_decls_begin() { 39 if (NumDeclsFound == 0) 40 ComputeDeclsFound(); 41 return DeclsFound; 42 } 43 44 CXXBasePaths::decl_iterator CXXBasePaths::found_decls_end() { 45 if (NumDeclsFound == 0) 46 ComputeDeclsFound(); 47 return DeclsFound + NumDeclsFound; 48 } 49 50 /// isAmbiguous - Determines whether the set of paths provided is 51 /// ambiguous, i.e., there are two or more paths that refer to 52 /// different base class subobjects of the same type. BaseType must be 53 /// an unqualified, canonical class type. 54 bool CXXBasePaths::isAmbiguous(CanQualType BaseType) { 55 BaseType = BaseType.getUnqualifiedType(); 56 std::pair<bool, unsigned>& Subobjects = ClassSubobjects[BaseType]; 57 return Subobjects.second + (Subobjects.first? 1 : 0) > 1; 58 } 59 60 /// clear - Clear out all prior path information. 61 void CXXBasePaths::clear() { 62 Paths.clear(); 63 ClassSubobjects.clear(); 64 ScratchPath.clear(); 65 DetectedVirtual = 0; 66 } 67 68 /// @brief Swaps the contents of this CXXBasePaths structure with the 69 /// contents of Other. 70 void CXXBasePaths::swap(CXXBasePaths &Other) { 71 std::swap(Origin, Other.Origin); 72 Paths.swap(Other.Paths); 73 ClassSubobjects.swap(Other.ClassSubobjects); 74 std::swap(FindAmbiguities, Other.FindAmbiguities); 75 std::swap(RecordPaths, Other.RecordPaths); 76 std::swap(DetectVirtual, Other.DetectVirtual); 77 std::swap(DetectedVirtual, Other.DetectedVirtual); 78 } 79 80 bool CXXRecordDecl::isDerivedFrom(const CXXRecordDecl *Base) const { 81 CXXBasePaths Paths(/*FindAmbiguities=*/false, /*RecordPaths=*/false, 82 /*DetectVirtual=*/false); 83 return isDerivedFrom(Base, Paths); 84 } 85 86 bool CXXRecordDecl::isDerivedFrom(const CXXRecordDecl *Base, 87 CXXBasePaths &Paths) const { 88 if (getCanonicalDecl() == Base->getCanonicalDecl()) 89 return false; 90 91 Paths.setOrigin(const_cast<CXXRecordDecl*>(this)); 92 return lookupInBases(&FindBaseClass, 93 const_cast<CXXRecordDecl*>(Base->getCanonicalDecl()), 94 Paths); 95 } 96 97 bool CXXRecordDecl::isVirtuallyDerivedFrom(const CXXRecordDecl *Base) const { 98 if (!getNumVBases()) 99 return false; 100 101 CXXBasePaths Paths(/*FindAmbiguities=*/false, /*RecordPaths=*/false, 102 /*DetectVirtual=*/false); 103 104 if (getCanonicalDecl() == Base->getCanonicalDecl()) 105 return false; 106 107 Paths.setOrigin(const_cast<CXXRecordDecl*>(this)); 108 109 const void *BasePtr = static_cast<const void*>(Base->getCanonicalDecl()); 110 return lookupInBases(&FindVirtualBaseClass, 111 const_cast<void *>(BasePtr), 112 Paths); 113 } 114 115 static bool BaseIsNot(const CXXRecordDecl *Base, void *OpaqueTarget) { 116 // OpaqueTarget is a CXXRecordDecl*. 117 return Base->getCanonicalDecl() != (const CXXRecordDecl*) OpaqueTarget; 118 } 119 120 bool CXXRecordDecl::isProvablyNotDerivedFrom(const CXXRecordDecl *Base) const { 121 return forallBases(BaseIsNot, (void*) Base->getCanonicalDecl()); 122 } 123 124 bool CXXRecordDecl::forallBases(ForallBasesCallback *BaseMatches, 125 void *OpaqueData, 126 bool AllowShortCircuit) const { 127 SmallVector<const CXXRecordDecl*, 8> Queue; 128 129 const CXXRecordDecl *Record = this; 130 bool AllMatches = true; 131 while (true) { 132 for (CXXRecordDecl::base_class_const_iterator 133 I = Record->bases_begin(), E = Record->bases_end(); I != E; ++I) { 134 const RecordType *Ty = I->getType()->getAs<RecordType>(); 135 if (!Ty) { 136 if (AllowShortCircuit) return false; 137 AllMatches = false; 138 continue; 139 } 140 141 CXXRecordDecl *Base = 142 cast_or_null<CXXRecordDecl>(Ty->getDecl()->getDefinition()); 143 if (!Base) { 144 if (AllowShortCircuit) return false; 145 AllMatches = false; 146 continue; 147 } 148 149 Queue.push_back(Base); 150 if (!BaseMatches(Base, OpaqueData)) { 151 if (AllowShortCircuit) return false; 152 AllMatches = false; 153 continue; 154 } 155 } 156 157 if (Queue.empty()) break; 158 Record = Queue.back(); // not actually a queue. 159 Queue.pop_back(); 160 } 161 162 return AllMatches; 163 } 164 165 bool CXXBasePaths::lookupInBases(ASTContext &Context, 166 const CXXRecordDecl *Record, 167 CXXRecordDecl::BaseMatchesCallback *BaseMatches, 168 void *UserData) { 169 bool FoundPath = false; 170 171 // The access of the path down to this record. 172 AccessSpecifier AccessToHere = ScratchPath.Access; 173 bool IsFirstStep = ScratchPath.empty(); 174 175 for (CXXRecordDecl::base_class_const_iterator BaseSpec = Record->bases_begin(), 176 BaseSpecEnd = Record->bases_end(); 177 BaseSpec != BaseSpecEnd; 178 ++BaseSpec) { 179 // Find the record of the base class subobjects for this type. 180 QualType BaseType = Context.getCanonicalType(BaseSpec->getType()) 181 .getUnqualifiedType(); 182 183 // C++ [temp.dep]p3: 184 // In the definition of a class template or a member of a class template, 185 // if a base class of the class template depends on a template-parameter, 186 // the base class scope is not examined during unqualified name lookup 187 // either at the point of definition of the class template or member or 188 // during an instantiation of the class tem- plate or member. 189 if (BaseType->isDependentType()) 190 continue; 191 192 // Determine whether we need to visit this base class at all, 193 // updating the count of subobjects appropriately. 194 std::pair<bool, unsigned>& Subobjects = ClassSubobjects[BaseType]; 195 bool VisitBase = true; 196 bool SetVirtual = false; 197 if (BaseSpec->isVirtual()) { 198 VisitBase = !Subobjects.first; 199 Subobjects.first = true; 200 if (isDetectingVirtual() && DetectedVirtual == 0) { 201 // If this is the first virtual we find, remember it. If it turns out 202 // there is no base path here, we'll reset it later. 203 DetectedVirtual = BaseType->getAs<RecordType>(); 204 SetVirtual = true; 205 } 206 } else 207 ++Subobjects.second; 208 209 if (isRecordingPaths()) { 210 // Add this base specifier to the current path. 211 CXXBasePathElement Element; 212 Element.Base = &*BaseSpec; 213 Element.Class = Record; 214 if (BaseSpec->isVirtual()) 215 Element.SubobjectNumber = 0; 216 else 217 Element.SubobjectNumber = Subobjects.second; 218 ScratchPath.push_back(Element); 219 220 // Calculate the "top-down" access to this base class. 221 // The spec actually describes this bottom-up, but top-down is 222 // equivalent because the definition works out as follows: 223 // 1. Write down the access along each step in the inheritance 224 // chain, followed by the access of the decl itself. 225 // For example, in 226 // class A { public: int foo; }; 227 // class B : protected A {}; 228 // class C : public B {}; 229 // class D : private C {}; 230 // we would write: 231 // private public protected public 232 // 2. If 'private' appears anywhere except far-left, access is denied. 233 // 3. Otherwise, overall access is determined by the most restrictive 234 // access in the sequence. 235 if (IsFirstStep) 236 ScratchPath.Access = BaseSpec->getAccessSpecifier(); 237 else 238 ScratchPath.Access = CXXRecordDecl::MergeAccess(AccessToHere, 239 BaseSpec->getAccessSpecifier()); 240 } 241 242 // Track whether there's a path involving this specific base. 243 bool FoundPathThroughBase = false; 244 245 if (BaseMatches(BaseSpec, ScratchPath, UserData)) { 246 // We've found a path that terminates at this base. 247 FoundPath = FoundPathThroughBase = true; 248 if (isRecordingPaths()) { 249 // We have a path. Make a copy of it before moving on. 250 Paths.push_back(ScratchPath); 251 } else if (!isFindingAmbiguities()) { 252 // We found a path and we don't care about ambiguities; 253 // return immediately. 254 return FoundPath; 255 } 256 } else if (VisitBase) { 257 CXXRecordDecl *BaseRecord 258 = cast<CXXRecordDecl>(BaseSpec->getType()->castAs<RecordType>() 259 ->getDecl()); 260 if (lookupInBases(Context, BaseRecord, BaseMatches, UserData)) { 261 // C++ [class.member.lookup]p2: 262 // A member name f in one sub-object B hides a member name f in 263 // a sub-object A if A is a base class sub-object of B. Any 264 // declarations that are so hidden are eliminated from 265 // consideration. 266 267 // There is a path to a base class that meets the criteria. If we're 268 // not collecting paths or finding ambiguities, we're done. 269 FoundPath = FoundPathThroughBase = true; 270 if (!isFindingAmbiguities()) 271 return FoundPath; 272 } 273 } 274 275 // Pop this base specifier off the current path (if we're 276 // collecting paths). 277 if (isRecordingPaths()) { 278 ScratchPath.pop_back(); 279 } 280 281 // If we set a virtual earlier, and this isn't a path, forget it again. 282 if (SetVirtual && !FoundPathThroughBase) { 283 DetectedVirtual = 0; 284 } 285 } 286 287 // Reset the scratch path access. 288 ScratchPath.Access = AccessToHere; 289 290 return FoundPath; 291 } 292 293 bool CXXRecordDecl::lookupInBases(BaseMatchesCallback *BaseMatches, 294 void *UserData, 295 CXXBasePaths &Paths) const { 296 // If we didn't find anything, report that. 297 if (!Paths.lookupInBases(getASTContext(), this, BaseMatches, UserData)) 298 return false; 299 300 // If we're not recording paths or we won't ever find ambiguities, 301 // we're done. 302 if (!Paths.isRecordingPaths() || !Paths.isFindingAmbiguities()) 303 return true; 304 305 // C++ [class.member.lookup]p6: 306 // When virtual base classes are used, a hidden declaration can be 307 // reached along a path through the sub-object lattice that does 308 // not pass through the hiding declaration. This is not an 309 // ambiguity. The identical use with nonvirtual base classes is an 310 // ambiguity; in that case there is no unique instance of the name 311 // that hides all the others. 312 // 313 // FIXME: This is an O(N^2) algorithm, but DPG doesn't see an easy 314 // way to make it any faster. 315 for (CXXBasePaths::paths_iterator P = Paths.begin(), PEnd = Paths.end(); 316 P != PEnd; /* increment in loop */) { 317 bool Hidden = false; 318 319 for (CXXBasePath::iterator PE = P->begin(), PEEnd = P->end(); 320 PE != PEEnd && !Hidden; ++PE) { 321 if (PE->Base->isVirtual()) { 322 CXXRecordDecl *VBase = 0; 323 if (const RecordType *Record = PE->Base->getType()->getAs<RecordType>()) 324 VBase = cast<CXXRecordDecl>(Record->getDecl()); 325 if (!VBase) 326 break; 327 328 // The declaration(s) we found along this path were found in a 329 // subobject of a virtual base. Check whether this virtual 330 // base is a subobject of any other path; if so, then the 331 // declaration in this path are hidden by that patch. 332 for (CXXBasePaths::paths_iterator HidingP = Paths.begin(), 333 HidingPEnd = Paths.end(); 334 HidingP != HidingPEnd; 335 ++HidingP) { 336 CXXRecordDecl *HidingClass = 0; 337 if (const RecordType *Record 338 = HidingP->back().Base->getType()->getAs<RecordType>()) 339 HidingClass = cast<CXXRecordDecl>(Record->getDecl()); 340 if (!HidingClass) 341 break; 342 343 if (HidingClass->isVirtuallyDerivedFrom(VBase)) { 344 Hidden = true; 345 break; 346 } 347 } 348 } 349 } 350 351 if (Hidden) 352 P = Paths.Paths.erase(P); 353 else 354 ++P; 355 } 356 357 return true; 358 } 359 360 bool CXXRecordDecl::FindBaseClass(const CXXBaseSpecifier *Specifier, 361 CXXBasePath &Path, 362 void *BaseRecord) { 363 assert(((Decl *)BaseRecord)->getCanonicalDecl() == BaseRecord && 364 "User data for FindBaseClass is not canonical!"); 365 return Specifier->getType()->castAs<RecordType>()->getDecl() 366 ->getCanonicalDecl() == BaseRecord; 367 } 368 369 bool CXXRecordDecl::FindVirtualBaseClass(const CXXBaseSpecifier *Specifier, 370 CXXBasePath &Path, 371 void *BaseRecord) { 372 assert(((Decl *)BaseRecord)->getCanonicalDecl() == BaseRecord && 373 "User data for FindBaseClass is not canonical!"); 374 return Specifier->isVirtual() && 375 Specifier->getType()->castAs<RecordType>()->getDecl() 376 ->getCanonicalDecl() == BaseRecord; 377 } 378 379 bool CXXRecordDecl::FindTagMember(const CXXBaseSpecifier *Specifier, 380 CXXBasePath &Path, 381 void *Name) { 382 RecordDecl *BaseRecord = 383 Specifier->getType()->castAs<RecordType>()->getDecl(); 384 385 DeclarationName N = DeclarationName::getFromOpaquePtr(Name); 386 for (Path.Decls = BaseRecord->lookup(N); 387 Path.Decls.first != Path.Decls.second; 388 ++Path.Decls.first) { 389 if ((*Path.Decls.first)->isInIdentifierNamespace(IDNS_Tag)) 390 return true; 391 } 392 393 return false; 394 } 395 396 bool CXXRecordDecl::FindOrdinaryMember(const CXXBaseSpecifier *Specifier, 397 CXXBasePath &Path, 398 void *Name) { 399 RecordDecl *BaseRecord = 400 Specifier->getType()->castAs<RecordType>()->getDecl(); 401 402 const unsigned IDNS = IDNS_Ordinary | IDNS_Tag | IDNS_Member; 403 DeclarationName N = DeclarationName::getFromOpaquePtr(Name); 404 for (Path.Decls = BaseRecord->lookup(N); 405 Path.Decls.first != Path.Decls.second; 406 ++Path.Decls.first) { 407 if ((*Path.Decls.first)->isInIdentifierNamespace(IDNS)) 408 return true; 409 } 410 411 return false; 412 } 413 414 bool CXXRecordDecl:: 415 FindNestedNameSpecifierMember(const CXXBaseSpecifier *Specifier, 416 CXXBasePath &Path, 417 void *Name) { 418 RecordDecl *BaseRecord = 419 Specifier->getType()->castAs<RecordType>()->getDecl(); 420 421 DeclarationName N = DeclarationName::getFromOpaquePtr(Name); 422 for (Path.Decls = BaseRecord->lookup(N); 423 Path.Decls.first != Path.Decls.second; 424 ++Path.Decls.first) { 425 // FIXME: Refactor the "is it a nested-name-specifier?" check 426 if (isa<TypedefNameDecl>(*Path.Decls.first) || 427 (*Path.Decls.first)->isInIdentifierNamespace(IDNS_Tag)) 428 return true; 429 } 430 431 return false; 432 } 433 434 void OverridingMethods::add(unsigned OverriddenSubobject, 435 UniqueVirtualMethod Overriding) { 436 SmallVector<UniqueVirtualMethod, 4> &SubobjectOverrides 437 = Overrides[OverriddenSubobject]; 438 if (std::find(SubobjectOverrides.begin(), SubobjectOverrides.end(), 439 Overriding) == SubobjectOverrides.end()) 440 SubobjectOverrides.push_back(Overriding); 441 } 442 443 void OverridingMethods::add(const OverridingMethods &Other) { 444 for (const_iterator I = Other.begin(), IE = Other.end(); I != IE; ++I) { 445 for (overriding_const_iterator M = I->second.begin(), 446 MEnd = I->second.end(); 447 M != MEnd; 448 ++M) 449 add(I->first, *M); 450 } 451 } 452 453 void OverridingMethods::replaceAll(UniqueVirtualMethod Overriding) { 454 for (iterator I = begin(), IEnd = end(); I != IEnd; ++I) { 455 I->second.clear(); 456 I->second.push_back(Overriding); 457 } 458 } 459 460 461 namespace { 462 class FinalOverriderCollector { 463 /// \brief The number of subobjects of a given class type that 464 /// occur within the class hierarchy. 465 llvm::DenseMap<const CXXRecordDecl *, unsigned> SubobjectCount; 466 467 /// \brief Overriders for each virtual base subobject. 468 llvm::DenseMap<const CXXRecordDecl *, CXXFinalOverriderMap *> VirtualOverriders; 469 470 CXXFinalOverriderMap FinalOverriders; 471 472 public: 473 ~FinalOverriderCollector(); 474 475 void Collect(const CXXRecordDecl *RD, bool VirtualBase, 476 const CXXRecordDecl *InVirtualSubobject, 477 CXXFinalOverriderMap &Overriders); 478 }; 479 } 480 481 void FinalOverriderCollector::Collect(const CXXRecordDecl *RD, 482 bool VirtualBase, 483 const CXXRecordDecl *InVirtualSubobject, 484 CXXFinalOverriderMap &Overriders) { 485 unsigned SubobjectNumber = 0; 486 if (!VirtualBase) 487 SubobjectNumber 488 = ++SubobjectCount[cast<CXXRecordDecl>(RD->getCanonicalDecl())]; 489 490 for (CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin(), 491 BaseEnd = RD->bases_end(); Base != BaseEnd; ++Base) { 492 if (const RecordType *RT = Base->getType()->getAs<RecordType>()) { 493 const CXXRecordDecl *BaseDecl = cast<CXXRecordDecl>(RT->getDecl()); 494 if (!BaseDecl->isPolymorphic()) 495 continue; 496 497 if (Overriders.empty() && !Base->isVirtual()) { 498 // There are no other overriders of virtual member functions, 499 // so let the base class fill in our overriders for us. 500 Collect(BaseDecl, false, InVirtualSubobject, Overriders); 501 continue; 502 } 503 504 // Collect all of the overridders from the base class subobject 505 // and merge them into the set of overridders for this class. 506 // For virtual base classes, populate or use the cached virtual 507 // overrides so that we do not walk the virtual base class (and 508 // its base classes) more than once. 509 CXXFinalOverriderMap ComputedBaseOverriders; 510 CXXFinalOverriderMap *BaseOverriders = &ComputedBaseOverriders; 511 if (Base->isVirtual()) { 512 CXXFinalOverriderMap *&MyVirtualOverriders = VirtualOverriders[BaseDecl]; 513 BaseOverriders = MyVirtualOverriders; 514 if (!MyVirtualOverriders) { 515 MyVirtualOverriders = new CXXFinalOverriderMap; 516 517 // Collect may cause VirtualOverriders to reallocate, invalidating the 518 // MyVirtualOverriders reference. Set BaseOverriders to the right 519 // value now. 520 BaseOverriders = MyVirtualOverriders; 521 522 Collect(BaseDecl, true, BaseDecl, *MyVirtualOverriders); 523 } 524 } else 525 Collect(BaseDecl, false, InVirtualSubobject, ComputedBaseOverriders); 526 527 // Merge the overriders from this base class into our own set of 528 // overriders. 529 for (CXXFinalOverriderMap::iterator OM = BaseOverriders->begin(), 530 OMEnd = BaseOverriders->end(); 531 OM != OMEnd; 532 ++OM) { 533 const CXXMethodDecl *CanonOM 534 = cast<CXXMethodDecl>(OM->first->getCanonicalDecl()); 535 Overriders[CanonOM].add(OM->second); 536 } 537 } 538 } 539 540 for (CXXRecordDecl::method_iterator M = RD->method_begin(), 541 MEnd = RD->method_end(); 542 M != MEnd; 543 ++M) { 544 // We only care about virtual methods. 545 if (!M->isVirtual()) 546 continue; 547 548 CXXMethodDecl *CanonM = cast<CXXMethodDecl>(M->getCanonicalDecl()); 549 550 if (CanonM->begin_overridden_methods() 551 == CanonM->end_overridden_methods()) { 552 // This is a new virtual function that does not override any 553 // other virtual function. Add it to the map of virtual 554 // functions for which we are tracking overridders. 555 556 // C++ [class.virtual]p2: 557 // For convenience we say that any virtual function overrides itself. 558 Overriders[CanonM].add(SubobjectNumber, 559 UniqueVirtualMethod(CanonM, SubobjectNumber, 560 InVirtualSubobject)); 561 continue; 562 } 563 564 // This virtual method overrides other virtual methods, so it does 565 // not add any new slots into the set of overriders. Instead, we 566 // replace entries in the set of overriders with the new 567 // overrider. To do so, we dig down to the original virtual 568 // functions using data recursion and update all of the methods it 569 // overrides. 570 typedef std::pair<CXXMethodDecl::method_iterator, 571 CXXMethodDecl::method_iterator> OverriddenMethods; 572 SmallVector<OverriddenMethods, 4> Stack; 573 Stack.push_back(std::make_pair(CanonM->begin_overridden_methods(), 574 CanonM->end_overridden_methods())); 575 while (!Stack.empty()) { 576 OverriddenMethods OverMethods = Stack.back(); 577 Stack.pop_back(); 578 579 for (; OverMethods.first != OverMethods.second; ++OverMethods.first) { 580 const CXXMethodDecl *CanonOM 581 = cast<CXXMethodDecl>((*OverMethods.first)->getCanonicalDecl()); 582 583 // C++ [class.virtual]p2: 584 // A virtual member function C::vf of a class object S is 585 // a final overrider unless the most derived class (1.8) 586 // of which S is a base class subobject (if any) declares 587 // or inherits another member function that overrides vf. 588 // 589 // Treating this object like the most derived class, we 590 // replace any overrides from base classes with this 591 // overriding virtual function. 592 Overriders[CanonOM].replaceAll( 593 UniqueVirtualMethod(CanonM, SubobjectNumber, 594 InVirtualSubobject)); 595 596 if (CanonOM->begin_overridden_methods() 597 == CanonOM->end_overridden_methods()) 598 continue; 599 600 // Continue recursion to the methods that this virtual method 601 // overrides. 602 Stack.push_back(std::make_pair(CanonOM->begin_overridden_methods(), 603 CanonOM->end_overridden_methods())); 604 } 605 } 606 607 // C++ [class.virtual]p2: 608 // For convenience we say that any virtual function overrides itself. 609 Overriders[CanonM].add(SubobjectNumber, 610 UniqueVirtualMethod(CanonM, SubobjectNumber, 611 InVirtualSubobject)); 612 } 613 } 614 615 FinalOverriderCollector::~FinalOverriderCollector() { 616 for (llvm::DenseMap<const CXXRecordDecl *, CXXFinalOverriderMap *>::iterator 617 VO = VirtualOverriders.begin(), VOEnd = VirtualOverriders.end(); 618 VO != VOEnd; 619 ++VO) 620 delete VO->second; 621 } 622 623 void 624 CXXRecordDecl::getFinalOverriders(CXXFinalOverriderMap &FinalOverriders) const { 625 FinalOverriderCollector Collector; 626 Collector.Collect(this, false, 0, FinalOverriders); 627 628 // Weed out any final overriders that come from virtual base class 629 // subobjects that were hidden by other subobjects along any path. 630 // This is the final-overrider variant of C++ [class.member.lookup]p10. 631 for (CXXFinalOverriderMap::iterator OM = FinalOverriders.begin(), 632 OMEnd = FinalOverriders.end(); 633 OM != OMEnd; 634 ++OM) { 635 for (OverridingMethods::iterator SO = OM->second.begin(), 636 SOEnd = OM->second.end(); 637 SO != SOEnd; 638 ++SO) { 639 SmallVector<UniqueVirtualMethod, 4> &Overriding = SO->second; 640 if (Overriding.size() < 2) 641 continue; 642 643 for (SmallVector<UniqueVirtualMethod, 4>::iterator 644 Pos = Overriding.begin(), PosEnd = Overriding.end(); 645 Pos != PosEnd; 646 /* increment in loop */) { 647 if (!Pos->InVirtualSubobject) { 648 ++Pos; 649 continue; 650 } 651 652 // We have an overriding method in a virtual base class 653 // subobject (or non-virtual base class subobject thereof); 654 // determine whether there exists an other overriding method 655 // in a base class subobject that hides the virtual base class 656 // subobject. 657 bool Hidden = false; 658 for (SmallVector<UniqueVirtualMethod, 4>::iterator 659 OP = Overriding.begin(), OPEnd = Overriding.end(); 660 OP != OPEnd && !Hidden; 661 ++OP) { 662 if (Pos == OP) 663 continue; 664 665 if (OP->Method->getParent()->isVirtuallyDerivedFrom( 666 const_cast<CXXRecordDecl *>(Pos->InVirtualSubobject))) 667 Hidden = true; 668 } 669 670 if (Hidden) { 671 // The current overriding function is hidden by another 672 // overriding function; remove this one. 673 Pos = Overriding.erase(Pos); 674 PosEnd = Overriding.end(); 675 } else { 676 ++Pos; 677 } 678 } 679 } 680 } 681 } 682 683 static void 684 AddIndirectPrimaryBases(const CXXRecordDecl *RD, ASTContext &Context, 685 CXXIndirectPrimaryBaseSet& Bases) { 686 // If the record has a virtual primary base class, add it to our set. 687 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 688 if (Layout.isPrimaryBaseVirtual()) 689 Bases.insert(Layout.getPrimaryBase()); 690 691 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 692 E = RD->bases_end(); I != E; ++I) { 693 assert(!I->getType()->isDependentType() && 694 "Cannot get indirect primary bases for class with dependent bases."); 695 696 const CXXRecordDecl *BaseDecl = 697 cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl()); 698 699 // Only bases with virtual bases participate in computing the 700 // indirect primary virtual base classes. 701 if (BaseDecl->getNumVBases()) 702 AddIndirectPrimaryBases(BaseDecl, Context, Bases); 703 } 704 705 } 706 707 void 708 CXXRecordDecl::getIndirectPrimaryBases(CXXIndirectPrimaryBaseSet& Bases) const { 709 ASTContext &Context = getASTContext(); 710 711 if (!getNumVBases()) 712 return; 713 714 for (CXXRecordDecl::base_class_const_iterator I = bases_begin(), 715 E = bases_end(); I != E; ++I) { 716 assert(!I->getType()->isDependentType() && 717 "Cannot get indirect primary bases for class with dependent bases."); 718 719 const CXXRecordDecl *BaseDecl = 720 cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl()); 721 722 // Only bases with virtual bases participate in computing the 723 // indirect primary virtual base classes. 724 if (BaseDecl->getNumVBases()) 725 AddIndirectPrimaryBases(BaseDecl, Context, Bases); 726 } 727 } 728 729