Index: include/clang/AST/VTableBuilder.h =================================================================== --- include/clang/AST/VTableBuilder.h +++ include/clang/AST/VTableBuilder.h @@ -254,6 +254,17 @@ return VTableThunks; } + llvm::SmallVector virtualFunctions() const { + llvm::SmallVector VFunctions; + for (const auto &VtableComponent : vtable_components()) { + // Skip everything except functions. + if (!VtableComponent.isUsedFunctionPointerKind()) + continue; + VFunctions.push_back(VtableComponent.getFunctionDecl()); + } + return VFunctions; + } + AddressPointLocation getAddressPoint(BaseSubobject Base) const { assert(AddressPoints.count(Base) && "Did not find address point!"); return AddressPoints.find(Base)->second; Index: lib/CodeGen/ItaniumCXXABI.cpp =================================================================== --- lib/CodeGen/ItaniumCXXABI.cpp +++ lib/CodeGen/ItaniumCXXABI.cpp @@ -367,19 +367,12 @@ private: bool hasAnyVirtualInlineFunction(const CXXRecordDecl *RD) const { - const auto &VtableLayout = - CGM.getItaniumVTableContext().getVTableLayout(RD); - - for (const auto &VtableComponent : VtableLayout.vtable_components()) { - // Skip empty slot. - if (!VtableComponent.isUsedFunctionPointerKind()) - continue; - - const CXXMethodDecl *Method = VtableComponent.getFunctionDecl(); - if (Method->getCanonicalDecl()->isInlined()) - return true; - } - return false; + const auto &VTableLayout = + CGM.getItaniumVTableContext().getVTableLayout(RD); + for (const auto *VFunction : VTableLayout.virtualFunctions()) + if (VFunction->getCanonicalDecl()->isInlined()) + return true; + return false; } bool isVTableHidden(const CXXRecordDecl *RD) const {