[PATCH] D133177: [Clang] Fix lambda CheckForDefaultedFunction(...) so that it checks the CXXMethodDecl is not deleted before attempting to call DefineDefaultedFunction(...)
Shafik Yaghmour via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 1 18:52:12 PDT 2022
shafik created this revision.
shafik added reviewers: aaron.ballman, erichkeane.
Herald added a project: All.
shafik requested review of this revision.
I discovered this additional bug at the end of working on D132906 <https://reviews.llvm.org/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
https://reviews.llvm.org/D133177
Files:
clang/lib/Sema/SemaDeclCXX.cpp
clang/test/SemaCXX/constant-expression-cxx2a.cpp
Index: clang/test/SemaCXX/constant-expression-cxx2a.cpp
===================================================================
--- clang/test/SemaCXX/constant-expression-cxx2a.cpp
+++ clang/test/SemaCXX/constant-expression-cxx2a.cpp
@@ -1483,3 +1483,12 @@
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 at -1 {{destructor of 'D' is implicitly deleted because base class 'B' has an inaccessible destructor}}
+}
Index: clang/lib/Sema/SemaDeclCXX.cpp
===================================================================
--- clang/lib/Sema/SemaDeclCXX.cpp
+++ clang/lib/Sema/SemaDeclCXX.cpp
@@ -6954,8 +6954,8 @@
// 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)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D133177.457473.patch
Type: text/x-patch
Size: 1445 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220902/a66a2733/attachment.bin>
More information about the cfe-commits
mailing list