https://github.com/Endilll updated https://github.com/llvm/llvm-project/pull/90220
>From b9b17fa34dab666e4c77dad9cd4109f7a88d1c2e Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Fri, 26 Apr 2024 18:03:44 +0300 Subject: [PATCH 1/2] [clang] Fix crash when destructor definition is preceded with '=' Fixes #89544 --- clang/docs/ReleaseNotes.rst | 3 +++ clang/lib/AST/Expr.cpp | 8 +++++--- clang/test/SemaCXX/destructor.cpp | 12 ++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 92563262cc6737..5d1260fbca7beb 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -436,6 +436,9 @@ Bug Fixes in This Version - Clang now correctly generates overloads for bit-precise integer types for builtin operators in C++. Fixes #GH82998. +- Fix crash when destructor definition is preceded with an equals sign. + Fixes (#GH89544). + - When performing mixed arithmetic between ``_Complex`` floating-point types and integers, Clang now correctly promotes the integer to its corresponding real floating-point type only rather than to the complex type (e.g. ``_Complex float / int`` is now evaluated diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 63dcdb919c7117..52c8c95b48abf7 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -3893,9 +3893,11 @@ namespace { } void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *E) { - if (E->getTemporary()->getDestructor()->isTrivial()) { - Inherited::VisitStmt(E); - return; + if (const CXXDestructorDecl *DtorDecl = E->getTemporary()->getDestructor()) { + if (DtorDecl->isTrivial()) { + Inherited::VisitStmt(E); + return; + } } NonTrivial = true; diff --git a/clang/test/SemaCXX/destructor.cpp b/clang/test/SemaCXX/destructor.cpp index beac50e449e96d..028bc7cc196989 100644 --- a/clang/test/SemaCXX/destructor.cpp +++ b/clang/test/SemaCXX/destructor.cpp @@ -565,4 +565,16 @@ struct Foo : public Baz { // expected-error {{cannot override a non-deleted func }; } +namespace GH89544 { +class Foo { + ~Foo() = {} + // expected-error@-1 {{initializer on function does not look like a pure-specifier}} + // expected-error@-2 {{expected ';' at end of declaration list}} +}; + +static_assert(!__is_trivially_constructible(Foo), ""); +static_assert(!__is_trivially_constructible(Foo, const Foo &), ""); +static_assert(!__is_trivially_constructible(Foo, Foo &&), ""); +} // namespace GH89544 + #endif // BE_THE_HEADER >From 3633a834d382e4ed5890b3e3d4eb9662c643bc22 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Fri, 26 Apr 2024 18:11:53 +0300 Subject: [PATCH 2/2] Run clang-format --- clang/lib/AST/Expr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 52c8c95b48abf7..ac5653fe9478b8 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -3893,7 +3893,8 @@ namespace { } void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *E) { - if (const CXXDestructorDecl *DtorDecl = E->getTemporary()->getDestructor()) { + if (const CXXDestructorDecl *DtorDecl = + E->getTemporary()->getDestructor()) { if (DtorDecl->isTrivial()) { Inherited::VisitStmt(E); return; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits