Skip to content

Commit

Permalink
Revert "List implicit operator== after implicit destructors in a vtab…
Browse files Browse the repository at this point in the history
…le."

This reverts commit add2b7e.

Failed "Clang::virtual-compare.cpp" test on the arm builders.
See
http://lab.llvm.org:8011/builders/llvm-clang-win-x-armv7l/builds/3169
for details.
  • Loading branch information
vvereschaka committed Jan 21, 2020
1 parent b0b2b7e commit 89e43f0
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 79 deletions.
46 changes: 20 additions & 26 deletions clang/lib/AST/VTableBuilder.cpp
Expand Up @@ -1474,11 +1474,11 @@ void ItaniumVTableBuilder::AddMethods(
llvm_unreachable("Found a duplicate primary base!");
}

const CXXDestructorDecl *ImplicitVirtualDtor = nullptr;

typedef llvm::SmallVector<const CXXMethodDecl *, 8> NewVirtualFunctionsTy;
NewVirtualFunctionsTy NewVirtualFunctions;

llvm::SmallVector<const CXXMethodDecl*, 4> NewImplicitVirtualFunctions;

// Now go through all virtual member functions and add them.
for (const auto *MD : RD->methods()) {
if (!MD->isVirtual())
Expand Down Expand Up @@ -1542,30 +1542,24 @@ void ItaniumVTableBuilder::AddMethods(
}
}

if (MD->isImplicit())
NewImplicitVirtualFunctions.push_back(MD);
else
NewVirtualFunctions.push_back(MD);
}

std::stable_sort(
NewImplicitVirtualFunctions.begin(), NewImplicitVirtualFunctions.end(),
[](const CXXMethodDecl *A, const CXXMethodDecl *B) {
if (A->isCopyAssignmentOperator() != B->isCopyAssignmentOperator())
return A->isCopyAssignmentOperator();
if (A->isMoveAssignmentOperator() != B->isMoveAssignmentOperator())
return A->isMoveAssignmentOperator();
if (isa<CXXDestructorDecl>(A) != isa<CXXDestructorDecl>(B))
return isa<CXXDestructorDecl>(A);
assert(A->getOverloadedOperator() == OO_EqualEqual &&
B->getOverloadedOperator() == OO_EqualEqual &&
"unexpected or duplicate implicit virtual function");
// We rely on Sema to have declared the operator== members in the
// same order as the corresponding operator<=> members.
return false;
});
NewVirtualFunctions.append(NewImplicitVirtualFunctions.begin(),
NewImplicitVirtualFunctions.end());
if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) {
if (MD->isImplicit()) {
// Itanium C++ ABI 2.5.2:
// If a class has an implicitly-defined virtual destructor,
// its entries come after the declared virtual function pointers.

assert(!ImplicitVirtualDtor &&
"Did already see an implicit virtual dtor!");
ImplicitVirtualDtor = DD;
continue;
}
}

NewVirtualFunctions.push_back(MD);
}

if (ImplicitVirtualDtor)
NewVirtualFunctions.push_back(ImplicitVirtualDtor);

for (const CXXMethodDecl *MD : NewVirtualFunctions) {
// Get the final overrider.
Expand Down
53 changes: 0 additions & 53 deletions clang/test/CodeGenCXX/virtual-compare.cpp

This file was deleted.

0 comments on commit 89e43f0

Please sign in to comment.