diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 01c7899e36c93..e442516c225f7 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 d85819b21c826..d0baedbf782d4 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -3747,7 +3747,8 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, } else if (!Pointee->isDependentType()) { // FIXME: This can result in errors if the definition was imported from a // module but is hidden. - if (!RequireCompleteType(StartLoc, Pointee, + if (Pointee->isEnumeralType() || + !RequireCompleteType(StartLoc, Pointee, LangOpts.CPlusPlus26 ? diag::err_delete_incomplete : diag::warn_delete_incomplete, diff --git a/clang/test/SemaCXX/new-delete.cpp b/clang/test/SemaCXX/new-delete.cpp index 595bdc689d694..fb4810ad673ad 100644 --- a/clang/test/SemaCXX/new-delete.cpp +++ b/clang/test/SemaCXX/new-delete.cpp @@ -540,6 +540,22 @@ 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 { + zero = decltype(delete static_cast(nullptr), 0){} + // expected-warning@-1 {{expression with side effects has no effect in an unevaluated context}} +}; +template +struct GH99278_2 { + union b {}; + struct c { + c() { delete d; } + b *d; + } f; +}; +GH99278_2 e; +#endif + struct PlacementArg {}; inline void *operator new[](size_t, const PlacementArg &) throw () { return 0;