[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
https://github.com/Endilll closed https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
https://github.com/Sirraide approved this pull request. LGTM https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
@@ -3893,9 +3893,12 @@ 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; +} Endilll wrote: Comments added. https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
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 Date: Fri, 26 Apr 2024 18:03:44 +0300 Subject: [PATCH 1/3] [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 Date: Fri, 26 Apr 2024 18:11:53 +0300 Subject: [PATCH 2/3] 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; >From db72205f756ab05b8d433359e824d508c5732b10 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov Date: Tue, 30 Apr 2024 20:43:48 +0300 Subject: [PATCH 3/3] Add comments per reviewer request --- clang/include/clang/AST/ExprCXX.h | 2 ++ clang/lib/AST/Expr.cpp| 2 ++ 2 files changed, 4 insertions(+) diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index a915745d2d7322..ab3f810b45192b 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -1482,6 +1482,8 @@ class CXXTemporary { /// const S &s_ref = S(); // Requires a CXXBindTemporaryExpr. /// } /// \endcode +/// +/// Destructor might be null if destructor declaration is not valid. class CXXBindTemporaryExpr : public Expr { CXXTemporary *Temp = nullptr; Stmt *SubExpr = nullptr; diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index ac5653fe9478b8..bcb5ebfc85c453 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -3893,6 +3893,8 @@ namespace { } void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *E) { + // Destructor of the temporary might be null if destructor declaration + // is not valid. if (const CXXDestructorDecl *DtorDecl = E->getTemporary()->getDestructor()) { if (DtorDecl->isTrivial()) { ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
@@ -3893,9 +3893,12 @@ 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; +} Sirraide wrote: In addition to adding a comment here, thoughts about adding one to `CXXTemporary` to indicate that the destructor can be null? Because at least the comment above `CXXBindTemporaryExpr` makes it sound like that isn’t really supposed to be the case. https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
@@ -3893,9 +3893,12 @@ 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; +} cor3ntin wrote: I think I'm happy with doing it it here, but it would be helpful to add a comment. If someone has a better idea and want to inspects all places where CXXBindTemporaryExpr is created, we can do that in a subsequent PR. https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
@@ -3893,9 +3893,12 @@ 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; +} Endilll wrote: It looks like it's normal for `nullptr` to slip into `CXXTemporary` as destructor: https://github.com/llvm/llvm-project/blob/9145514fde484916971e6bb147c18f9235a9f2b5/clang/lib/Sema/SemaExprCXX.cpp#L7611-L7630 So the check I added might be a check in the right place. https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
@@ -3893,9 +3893,12 @@ 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; +} cor3ntin wrote: The destructor seems to be invalid, we probably should add a validity checksomewhere https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
@@ -3893,9 +3893,12 @@ 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; +} Sirraide wrote: I’ve been looking at some of the other uses of `CXXTemporary`, and it does seem like there are other places where we check for it being null, but it also doesn’t seem to be consistent (at least I’m not seeing a pattern here), and doing so also seems a bit contrary to the documentation here. https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
https://github.com/Sirraide requested changes to this pull request. https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
@@ -3893,9 +3893,12 @@ 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; +} Sirraide wrote: As you already pointed out, this does seem like a weird fix for this. I’m not sure this is right. The documentation for `CXXBindTemporaryExpr` states: ``` /// This ensures the destructor is called for the temporary. It should only be /// needed for non-POD, non-trivially destructable class types. ``` To me at least, this sounds like we should never get here with the destructor being null. Perhaps another approach would be to simply ignore the `=` if the next token is `{` and parse a function body. If the next token is not `{`, then we could ignore everything following it up to the next semicolon (unless it’s `= delete`, `= default`, or `= 0`, of course), i.e. essentially treat it as though it were `~Foo();`—if that’s not too complicated. And if we’re going with that, `assert`ing that the destructor is never null here is probably a good idea. https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
https://github.com/Sirraide edited https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
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 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 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
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff d74e42acd2479eb9f3bd8077fd3be2f3395aa638 b9b17fa34dab666e4c77dad9cd4109f7a88d1c2e -- clang/lib/AST/Expr.cpp clang/test/SemaCXX/destructor.cpp `` View the diff from clang-format here. ``diff diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 52c8c95b48..ac5653fe94 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; `` https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
Endilll wrote: I have a vague feeling I might be fixing the symptom instead of the cause. https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
llvmbot wrote: @llvm/pr-subscribers-clang Author: Vlad Serebrennikov (Endilll) Changes Fixes #89544 --- Full diff: https://github.com/llvm/llvm-project/pull/90220.diff 3 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+3) - (modified) clang/lib/AST/Expr.cpp (+5-3) - (modified) clang/test/SemaCXX/destructor.cpp (+12) ``diff 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 `` https://github.com/llvm/llvm-project/pull/90220 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)
https://github.com/Endilll created https://github.com/llvm/llvm-project/pull/90220 Fixes #89544 >From b9b17fa34dab666e4c77dad9cd4109f7a88d1c2e Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov Date: Fri, 26 Apr 2024 18:03:44 +0300 Subject: [PATCH] [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 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits