[clang] [clang] Fix crash when destructor definition is preceded with '=' (PR #90220)

2024-05-01 Thread Vlad Serebrennikov via cfe-commits

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)

2024-04-30 Thread via cfe-commits

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)

2024-04-30 Thread Vlad Serebrennikov via cfe-commits


@@ -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)

2024-04-30 Thread Vlad Serebrennikov via cfe-commits

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)

2024-04-29 Thread via cfe-commits


@@ -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)

2024-04-29 Thread via cfe-commits


@@ -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)

2024-04-27 Thread Vlad Serebrennikov via cfe-commits


@@ -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)

2024-04-26 Thread via cfe-commits


@@ -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)

2024-04-26 Thread via cfe-commits


@@ -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)

2024-04-26 Thread via cfe-commits

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)

2024-04-26 Thread via cfe-commits


@@ -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)

2024-04-26 Thread via cfe-commits

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)

2024-04-26 Thread Vlad Serebrennikov via cfe-commits

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)

2024-04-26 Thread via cfe-commits

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)

2024-04-26 Thread Vlad Serebrennikov via cfe-commits

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)

2024-04-26 Thread via cfe-commits

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)

2024-04-26 Thread Vlad Serebrennikov via cfe-commits

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