Author: Danila Kutenin Date: 2023-08-02T09:22:05-04:00 New Revision: ecdded5692f99626af338792a4191d39d2a2377e
URL: https://github.com/llvm/llvm-project/commit/ecdded5692f99626af338792a4191d39d2a2377e DIFF: https://github.com/llvm/llvm-project/commit/ecdded5692f99626af338792a4191d39d2a2377e.diff LOG: [Clang] Fix strict weak ordering in ItaniumVTableBuilder In sorting elements can compare with themselves and sometimes assert further down the line was triggered. The changes are somewhat NFC, which explains the lack of test coverage. libc++ has a debug mode that enables extra precondition checking. When Clang is built with libc++ in that special mode, a few of Clang's tests would fail with the libc++ assertion because Clang was not honoring the preconditions for std::stable_sort. However, Clang would not hit the precondition failure with any release mode STL, so the changes have no impact on users beyond ones in this very special circumstance. Differential Revision: https://reviews.llvm.org/D155809 Added: Modified: clang/lib/AST/VTableBuilder.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/VTableBuilder.cpp b/clang/lib/AST/VTableBuilder.cpp index 2a6f1e20202fd5..a587f9bdc75852 100644 --- a/clang/lib/AST/VTableBuilder.cpp +++ b/clang/lib/AST/VTableBuilder.cpp @@ -1560,6 +1560,8 @@ void ItaniumVTableBuilder::AddMethods( std::stable_sort( NewImplicitVirtualFunctions.begin(), NewImplicitVirtualFunctions.end(), [](const CXXMethodDecl *A, const CXXMethodDecl *B) { + if (A == B) + return false; if (A->isCopyAssignmentOperator() != B->isCopyAssignmentOperator()) return A->isCopyAssignmentOperator(); if (A->isMoveAssignmentOperator() != B->isMoveAssignmentOperator()) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits