-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[Clang] Deleting an incomplete enum type is not an error #118455
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
The changes introduced in llvm#97733 accidentally prevented to delete an incomplete enum (the validity of which has been confirmed by CWG2925 Fixes llvm#99278
@llvm/pr-subscribers-clang Author: cor3ntin (cor3ntin) ChangesThe changes introduced in #97733 accidentally prevented to delete an incomplete enum (the validity of which has been confirmed by CWG2925 Fixes #99278 Full diff: https://github.com/llvm/llvm-project/pull/118455.diff 3 Files Affected:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 01c7899e36c932..e442516c225f74 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -766,6 +766,7 @@ Bug Fixes to C++ Support
- Fixed an assertion failure caused by mangled names with invalid identifiers. (#GH112205)
- Fixed an incorrect lambda scope of generic lambdas that caused Clang to crash when computing potential lambda
captures at the end of a full expression. (#GH115931)
+- Clang no longer rejects deleting a pointer of incomplete enumeration type. (#GH99278)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index d85819b21c8265..20947ca4e35b17 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -3748,7 +3748,8 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
// FIXME: This can result in errors if the definition was imported from a
// module but is hidden.
if (!RequireCompleteType(StartLoc, Pointee,
- LangOpts.CPlusPlus26
+ Pointee->isStructureOrClassType() &&
+ LangOpts.CPlusPlus26
? diag::err_delete_incomplete
: diag::warn_delete_incomplete,
Ex.get())) {
diff --git a/clang/test/SemaCXX/new-delete.cpp b/clang/test/SemaCXX/new-delete.cpp
index 595bdc689d694b..18b26e7f0f08a1 100644
--- a/clang/test/SemaCXX/new-delete.cpp
+++ b/clang/test/SemaCXX/new-delete.cpp
@@ -540,6 +540,14 @@ namespace PR10504 {
void f(A *x) { delete x; } // expected-warning {{delete called on 'PR10504::A' that is abstract but has non-virtual destructor}}
}
+#if __cplusplus >= 201103L
+enum GH99278_1 { // expected-note {{definition of 'GH99278_1' is not complete until the closing '}'}}
+ zero = decltype(delete static_cast<GH99278_1*>(nullptr), 0){}
+ // expected-warning@-1 {{deleting pointer to incomplete type}}
+ // expected-warning@-2 {{expression with side effects has no effect in an unevaluated context}}
+};
+#endif
+
struct PlacementArg {};
inline void *operator new[](size_t, const PlacementArg &) throw () {
return 0;
|
@@ -766,6 +766,7 @@ Bug Fixes to C++ Support | |||
- Fixed an assertion failure caused by mangled names with invalid identifiers. (#GH112205) | |||
- Fixed an incorrect lambda scope of generic lambdas that caused Clang to crash when computing potential lambda | |||
captures at the end of a full expression. (#GH115931) | |||
- Clang no longer rejects deleting a pointer of incomplete enumeration type. (#GH99278) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would prefer this mentions the CWG issue perhaps? Or at least a touch of backstory?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The CWG issue is NAD - the back story is just "regression"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
Heads up: we're seeing clang crashes after this revision. Assertions-enabled clang fails this assertion (probably related?):
|
The original file is huge and template heavy, so reduction will take some time. I wonder if you can spot something obviously wrong in the commit given the information above? Failing that, can we revert in the meantime? |
We're getting a similar crash bisected to this change as well, also with a huge original file. Funnily enough, a debug build hits an assertion that happens even without this change, so I'm going to dig into that before even trying to reduce the crasher. |
In my case I don't see an assertion before this change (using Clang built from c0192a0). |
PR here #118980 - But I'd love to understand the actual issue before merging |
It'll take some time. cvise has reduced the preprocessed input from 13MB to 7.5MB so far. The input is not shareable so far. |
cvise has reduced my testcase to
... which is nowhere close to the real thing and nowhere close to legal C++ at all. Well, that definitely shouldn't trigger a crash, though. |
To avoid this I usually incorporate a validity check in my interestingness test, e.g. by running a known-good clang on the candidate input, e.g. currently I'm running cvise with this:
|
The test case was reduced to this:
|
The changes introduced in #97733 accidentally prevented to delete an incomplete enum (the validity of which has been confirmed by CWG2925
Fixes #99278