https://github.com/TPPPP72 updated 
https://github.com/llvm/llvm-project/pull/198830

>From fb18b67152e8561be3c993f31021381ebd86a31a Mon Sep 17 00:00:00 2001
From: TPPPP <[email protected]>
Date: Thu, 21 May 2026 15:41:36 +0800
Subject: [PATCH 1/2] [Clang] Fixed a crash in constant evaluation when using a
 defaulted comparison operator in a union

---
 clang/docs/ReleaseNotes.rst     |  1 +
 clang/lib/AST/ExprConstant.cpp  | 19 +++++++++++++------
 clang/test/SemaCXX/gh147127.cpp | 12 ++++++++++++
 3 files changed, 26 insertions(+), 6 deletions(-)
 create mode 100644 clang/test/SemaCXX/gh147127.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 843a01f57c39f..7b8b4dba85d4c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -570,6 +570,7 @@ Bug Fixes in This Version
   an array via an element-at-a-time copy loop (#GH192026)
 - Fixed an issue where certain designated initializers would be rejected for 
constexpr variables. (#GH193373)
 - Fixed a crash when ``#embed`` is used with C++ modules (#GH195350)
+- Fixed a assertion in constant evaluation when using a defaulted comparison 
operator in a ``union``. (#GH147127)
 
 Bug Fixes to Compiler Builtins
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 38aa5798cfeb9..1374f837aa0a3 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -7020,13 +7020,20 @@ static bool HandleFunctionCall(SourceLocation CallLoc,
   // Skip this for non-union classes with no fields; in that case, the 
defaulted
   // copy/move does not actually read the object.
   const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Callee);
-  if (MD && MD->isDefaulted() &&
-      (MD->getParent()->isUnion() ||
-       (MD->isTrivial() &&
-        isReadByLvalueToRvalueConversion(MD->getParent())))) {
+
+  auto IsTrivialMemoryOperation = [&](const CXXMethodDecl *MD) {
+    if (!MD || !MD->isDefaulted())
+      return false;
+    if (!MD->isCopyAssignmentOperator() && !MD->isMoveAssignmentOperator())
+      return false;
+    return MD->getParent()->isUnion() ||
+           (MD->isTrivial() &&
+            isReadByLvalueToRvalueConversion(MD->getParent()));
+  };
+
+  if (IsTrivialMemoryOperation(MD)) {
     unsigned ExplicitOffset = MD->isExplicitObjectMemberFunction() ? 1 : 0;
-    assert(ObjectArg &&
-           (MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator()));
+    assert(ObjectArg);
     APValue RHSValue;
     if (!handleTrivialCopy(Info, MD->getParamDecl(0), Args[0], RHSValue,
                            MD->getParent()->isUnion()))
diff --git a/clang/test/SemaCXX/gh147127.cpp b/clang/test/SemaCXX/gh147127.cpp
new file mode 100644
index 0000000000000..35bdc663c798f
--- /dev/null
+++ b/clang/test/SemaCXX/gh147127.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++17 -Wc++20-extensions -verify=cxx17 %s
+// RUN: %clang_cc1 -fsyntax-only -std=c++20 -verify=cxx20 %s
+// RUN: %clang_cc1 -fsyntax-only -std=c++17 -Wc++20-extensions 
-fexperimental-new-constant-interpreter -verify=cxx17 %s
+// RUN: %clang_cc1 -fsyntax-only -std=c++20 
-fexperimental-new-constant-interpreter -verify=cxx20 %s
+
+union A {
+  // cxx20-no-diagnostics
+  bool operator==(const A&) const = default; // cxx17-warning {{defaulted 
comparison operators are a C++20 extension}}
+};
+
+A a;
+bool b = a == a;

>From c428087adac45528244e608fd16cfd2c673cad85 Mon Sep 17 00:00:00 2001
From: TPPPP <[email protected]>
Date: Fri, 29 May 2026 16:17:11 +0800
Subject: [PATCH 2/2] Update ReleaseNotes.rst

---
 clang/docs/ReleaseNotes.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7b8b4dba85d4c..9ec306fcc1cb6 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -570,7 +570,7 @@ Bug Fixes in This Version
   an array via an element-at-a-time copy loop (#GH192026)
 - Fixed an issue where certain designated initializers would be rejected for 
constexpr variables. (#GH193373)
 - Fixed a crash when ``#embed`` is used with C++ modules (#GH195350)
-- Fixed a assertion in constant evaluation when using a defaulted comparison 
operator in a ``union``. (#GH147127)
+- Fixed an assertion in constant evaluation when using a defaulted comparison 
operator in a ``union``. (#GH147127)
 
 Bug Fixes to Compiler Builtins
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to