forked from OSchip/llvm-project
[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
This commit is contained in:
parent
38941da066
commit
9f6b3199d3
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue