[clang] Fix a crash on invalid destructor

This is a follow-up patch to D126194 in order to
fix https://github.com/llvm/llvm-project/issues/63503.

Reviewed By: shafik

Differential Revision: https://reviews.llvm.org/D153724
This commit is contained in:
Younan Zhang 2023-06-26 00:33:16 +08:00
parent 86f564edc0
commit 76d72a7150
3 changed files with 24 additions and 6 deletions

View File

@ -471,7 +471,7 @@ Bug Fixes in This Version
- Fix crash when redefining a variable with an invalid type again with an - Fix crash when redefining a variable with an invalid type again with an
invalid type. (`#62447 <https://github.com/llvm/llvm-project/issues/62447>`_) invalid type. (`#62447 <https://github.com/llvm/llvm-project/issues/62447>`_)
- Fix a stack overflow issue when evaluating ``consteval`` default arguments. - Fix a stack overflow issue when evaluating ``consteval`` default arguments.
(`#60082` <https://github.com/llvm/llvm-project/issues/60082>`_) (`#60082 <https://github.com/llvm/llvm-project/issues/60082>`_)
- Fix the assertion hit when generating code for global variable initializer of - Fix the assertion hit when generating code for global variable initializer of
_BitInt(1) type. _BitInt(1) type.
(`#62207 <https://github.com/llvm/llvm-project/issues/62207>`_) (`#62207 <https://github.com/llvm/llvm-project/issues/62207>`_)
@ -523,21 +523,23 @@ Bug Fixes in This Version
(`#50534 <https://github.com/llvm/llvm-project/issues/50534>`_). (`#50534 <https://github.com/llvm/llvm-project/issues/50534>`_).
- CallExpr built for C error-recovery now is always type-dependent. Fixes a - CallExpr built for C error-recovery now is always type-dependent. Fixes a
crash when we encounter a unresolved TypoExpr during diagnostic emission. crash when we encounter a unresolved TypoExpr during diagnostic emission.
(`#50244 <https://github.com/llvm/llvm-project/issues/50244>_`). (`#50244 <https://github.com/llvm/llvm-project/issues/50244>`_).
- Apply ``-fmacro-prefix-map`` to anonymous tags in template arguments - Apply ``-fmacro-prefix-map`` to anonymous tags in template arguments
(`#63219 <https://github.com/llvm/llvm-project/issues/63219>`_). (`#63219 <https://github.com/llvm/llvm-project/issues/63219>`_).
- Clang now properly diagnoses format string mismatches involving scoped - Clang now properly diagnoses format string mismatches involving scoped
enumeration types. A scoped enumeration type is not promoted to an integer 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 type by the default argument promotions, and thus this is UB. Clang's
behavior now matches GCC's behavior in C++. behavior now matches GCC's behavior in C++.
(`#38717 <https://github.com/llvm/llvm-project/issues/38717>_`). (`#38717 <https://github.com/llvm/llvm-project/issues/38717>`_).
- Fixed a failing assertion when implicitly defining a function within a GNU - Fixed a failing assertion when implicitly defining a function within a GNU
statement expression that appears outside of a function block scope. The statement expression that appears outside of a function block scope. The
assertion was benign outside of asserts builds and would only fire in C. assertion was benign outside of asserts builds and would only fire in C.
(`#48579 <https://github.com/llvm/llvm-project/issues/48579>_`). (`#48579 <https://github.com/llvm/llvm-project/issues/48579>`_).
- Fixed a failing assertion when applying an attribute to an anonymous union. - 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++. The assertion was benign outside of asserts builds and would only fire in C++.
(`#48512 <https://github.com/llvm/llvm-project/issues/48512>_`). (`#48512 <https://github.com/llvm/llvm-project/issues/48512>`_).
- Fixed a failing assertion when parsing incomplete destructor.
(`#63503 <https://github.com/llvm/llvm-project/issues/63503>`_)
Bug Fixes to Compiler Builtins Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -15807,7 +15807,11 @@ void Sema::FinalizeVarWithDestructor(VarDecl *VD, const RecordType *Record) {
return; return;
CXXDestructorDecl *Destructor = LookupDestructor(ClassDecl); 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 // 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 // we can skip over this. We still want to emit exit-time destructor warnings
// though. // though.

View File

@ -52,6 +52,18 @@ namespace pr8264 {
}; };
} }
namespace issue63503 {
struct Base {
virtual ~Base() = default;
};
struct Derived final : Base {
virtual ~Derived() = defaul; // #default
} do_not_crash;
// expected-error@#default {{initializer on function does not look like a pure-specifier}}
// expected-error@#default {{use of undeclared identifier 'defaul'}}
}
namespace VirtualFriend { namespace VirtualFriend {
// DR (filed but no number yet): reject meaningless pure-specifier on a friend declaration. // DR (filed but no number yet): reject meaningless pure-specifier on a friend declaration.
struct A { virtual int f(); }; struct A { virtual int f(); };