Author: Shafik Yaghmour Date: 2022-09-02T18:59:15-07:00 New Revision: 9f6b3199d33c146937f29feb62e123f34138f770
URL: https://github.com/llvm/llvm-project/commit/9f6b3199d33c146937f29feb62e123f34138f770 DIFF: https://github.com/llvm/llvm-project/commit/9f6b3199d33c146937f29feb62e123f34138f770.diff LOG: [Clang] Fix lambda CheckForDefaultedFunction(...) so that it checks the CXXMethodDecl is not deleted before attempting to call DefineDefaultedFunction(...) I discovered this additional bug at the end of working on D132906 In Sema::CheckCompletedCXXClass(...) uses a lambda CheckForDefaultedFunction to verify each CXXMethodDecl holds to the expected invariants before passing them on to CheckForDefaultedFunction. It is currently missing a check that it is not deleted, this adds that check and a test that crashed without this check. This fixes: https://github.com/llvm/llvm-project/issues/57516 Differential Revision: https://reviews.llvm.org/D133177 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaDeclCXX.cpp clang/test/SemaCXX/constant-expression-cxx2a.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 41371fe0e04f2..146b2149f9d7e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -89,6 +89,8 @@ Bug Fixes - Fix a crash when attempting to default a virtual constexpr non-special member function in a derived class. This fixes `Issue 57431 <https://github.com/llvm/llvm-project/issues/57431>`_ +- Fix a crash where we attempt to define a deleted destructor. This fixes + `Issue 57516 <https://github.com/llvm/llvm-project/issues/57516>`_ Improvements to Clang's diagnostics diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 76db4e5a7a3b9..7c70255fd3e5d 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -6954,8 +6954,8 @@ void Sema::CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record) { // Define defaulted constexpr virtual functions that override a base class // function right away. // FIXME: We can defer doing this until the vtable is marked as used. - if (CSM != CXXInvalid && M->isDefaulted() && M->isConstexpr() && - M->size_overridden_methods()) + if (CSM != CXXInvalid && !M->isDeleted() && M->isDefaulted() && + M->isConstexpr() && M->size_overridden_methods()) DefineDefaultedFunction(*this, M, M->getLocation()); if (!Incomplete) diff --git a/clang/test/SemaCXX/constant-expression-cxx2a.cpp b/clang/test/SemaCXX/constant-expression-cxx2a.cpp index 63ea42995582e..34881d7446e58 100644 --- a/clang/test/SemaCXX/constant-expression-cxx2a.cpp +++ b/clang/test/SemaCXX/constant-expression-cxx2a.cpp @@ -1483,3 +1483,12 @@ class D : B { virtual int constexpr f() = default; // expected-error {{only special member functions and comparison operators may be defaulted}} }; } + +namespace GH57516 { +class B{ + virtual constexpr ~B() = 0; // expected-note {{overridden virtual function is here}} +}; + +class D : B{}; // expected-error {{deleted function '~D' cannot override a non-deleted function}} +// expected-note@-1 {{destructor of 'D' is implicitly deleted because base class 'B' has an inaccessible destructor}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits