diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -469,7 +469,7 @@ - Fix crash when redefining a variable with an invalid type again with an invalid type. (`#62447 `_) - Fix a stack overflow issue when evaluating ``consteval`` default arguments. - (`#60082` `_) + (`#60082 `_) - Fix the assertion hit when generating code for global variable initializer of _BitInt(1) type. (`#62207 `_) @@ -521,21 +521,23 @@ (`#50534 `_). - CallExpr built for C error-recovery now is always type-dependent. Fixes a crash when we encounter a unresolved TypoExpr during diagnostic emission. - (`#50244 _`). + (`#50244 `_). - Apply ``-fmacro-prefix-map`` to anonymous tags in template arguments (`#63219 `_). - Clang now properly diagnoses format string mismatches involving scoped enumeration types. A scoped enumeration type is not promoted to an integer type by the default argument promotions, and thus this is UB. Clang's behavior now matches GCC's behavior in C++. - (`#38717 _`). + (`#38717 `_). - Fixed a failing assertion when implicitly defining a function within a GNU statement expression that appears outside of a function block scope. The assertion was benign outside of asserts builds and would only fire in C. - (`#48579 _`). + (`#48579 `_). - Fixed a failing assertion when applying an attribute to an anonymous union. The assertion was benign outside of asserts builds and would only fire in C++. - (`#48512 _`). + (`#48512 `_). +- Fixed a failing assertion when parsing incomplete destructor. + (`#63503 `_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -15807,7 +15807,11 @@ return; CXXDestructorDecl *Destructor = LookupDestructor(ClassDecl); - + // The result of `LookupDestructor` might be nullptr if the destructor is + // invalid, in which case it is marked as `IneligibleOrNotSelected` and + // will not be selected by `CXXRecordDecl::getDestructor()`. + if (!Destructor) + return; // If this is an array, we'll require the destructor during initialization, so // we can skip over this. We still want to emit exit-time destructor warnings // though. diff --git a/clang/test/SemaCXX/virtuals.cpp b/clang/test/SemaCXX/virtuals.cpp --- a/clang/test/SemaCXX/virtuals.cpp +++ b/clang/test/SemaCXX/virtuals.cpp @@ -52,6 +52,19 @@ }; } +namespace issue63503 { +struct Base { + virtual ~Base() = default; +}; + +struct Derived final : Base { + using Base::Base; + virtual ~Derived() = defaul; // #62 +} do_not_crash; +// expected-error@#62 {{initializer on function does not look like a pure-specifier}} +// expected-error@#62 {{use of undeclared identifier 'defaul'}} +} + namespace VirtualFriend { // DR (filed but no number yet): reject meaningless pure-specifier on a friend declaration. struct A { virtual int f(); };