aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/ports/llvm/82407.patch
diff options
context:
space:
mode:
authorEthan Morgan <ethan@gweithio.com>2026-02-14 16:44:06 +0000
committerEthan Morgan <ethan@gweithio.com>2026-02-14 16:44:06 +0000
commit54409423f767d8b1cf30cb7d0efca6b4ca138823 (patch)
treed915ac7828703ce4b963efdd9728a1777ba18c1e /vcpkg/ports/llvm/82407.patch
move to own git serverHEADmaster
Diffstat (limited to 'vcpkg/ports/llvm/82407.patch')
-rw-r--r--vcpkg/ports/llvm/82407.patch112
1 files changed, 112 insertions, 0 deletions
diff --git a/vcpkg/ports/llvm/82407.patch b/vcpkg/ports/llvm/82407.patch
new file mode 100644
index 0000000..c51086b
--- /dev/null
+++ b/vcpkg/ports/llvm/82407.patch
@@ -0,0 +1,112 @@
+From 5fcaeaddccc0f7e370bf7bebce113d8d52e1b1bd Mon Sep 17 00:00:00 2001
+From: Shafik Yaghmour <shafik.yaghmour@intel.com>
+Date: Tue, 20 Feb 2024 11:22:39 -0800
+Subject: [PATCH] [Clang][Sema] Fix incorrect rejection default construction of
+ union with nontrivial member
+
+In 765d8a192180f8f33618087b15c022fe758044af we impelemented a fix for incorrect deletion of
+default constructors in unions. This fix missed a case and so this PR will
+extend the fix to cover the additional case.
+
+Fixes: https://github.com/llvm/llvm-project/issues/81774
+---
+ clang/lib/Sema/SemaDeclCXX.cpp | 18 +++++++++++++++---
+ .../test/CodeGen/union-non-trivial-member.cpp | 17 +++++++++++++++++
+ clang/test/SemaCXX/cxx0x-nontrivial-union.cpp | 11 +++++++++++
+ 4 files changed, 46 insertions(+), 3 deletions(-)
+
+ Bug Fixes to AST Handling
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
+index 79263bc3ff671..25a4b4381ca25 100644
+--- a/clang/lib/Sema/SemaDeclCXX.cpp
++++ b/clang/lib/Sema/SemaDeclCXX.cpp
+@@ -9442,9 +9442,21 @@ bool SpecialMemberDeletionInfo::shouldDeleteForSubobjectCall(
+
+ int DiagKind = -1;
+
+- if (SMOR.getKind() == Sema::SpecialMemberOverloadResult::NoMemberOrDeleted)
+- DiagKind = !Decl ? 0 : 1;
+- else if (SMOR.getKind() == Sema::SpecialMemberOverloadResult::Ambiguous)
++ if (SMOR.getKind() == Sema::SpecialMemberOverloadResult::NoMemberOrDeleted) {
++ if (CSM == Sema::CXXDefaultConstructor && Field &&
++ Field->getParent()->isUnion()) {
++ // [class.default.ctor]p2:
++ // A defaulted default constructor for class X is defined as deleted if
++ // - X is a union that has a variant member with a non-trivial default
++ // constructor and no variant member of X has a default member
++ // initializer
++ const auto *RD = cast<CXXRecordDecl>(Field->getParent());
++ if (!RD->hasInClassInitializer())
++ DiagKind = !Decl ? 0 : 1;
++ } else {
++ DiagKind = !Decl ? 0 : 1;
++ }
++ } else if (SMOR.getKind() == Sema::SpecialMemberOverloadResult::Ambiguous)
+ DiagKind = 2;
+ else if (!isAccessible(Subobj, Decl))
+ DiagKind = 3;
+diff --git a/clang/test/CodeGen/union-non-trivial-member.cpp b/clang/test/CodeGen/union-non-trivial-member.cpp
+index fdc9fd16911e1..8b055a9970fc7 100644
+--- a/clang/test/CodeGen/union-non-trivial-member.cpp
++++ b/clang/test/CodeGen/union-non-trivial-member.cpp
+@@ -15,14 +15,25 @@ union UnionNonTrivial {
+ non_trivial_constructor b{};
+ };
+
++struct Handle {
++ Handle(int) {}
++};
++
++union UnionNonTrivialEqualInit {
++ int NoState = 0;
++ Handle CustomState;
++};
++
+ void f() {
+ UnionInt u1;
+ UnionNonTrivial u2;
++ UnionNonTrivialEqualInit u3;
+ }
+
+ // CHECK: define dso_local void @_Z1fv()
+ // CHECK: call void @_ZN8UnionIntC1Ev
+ // CHECK-NEXT: call void @_ZN15UnionNonTrivialC1Ev
++// CHECK-NEXT: call void @_ZN24UnionNonTrivialEqualInitC1Ev
+
+ // CHECK: define {{.*}}void @_ZN8UnionIntC1Ev
+ // CHECK: call void @_ZN8UnionIntC2Ev
+@@ -30,8 +41,14 @@ void f() {
+ // CHECK: define {{.*}}void @_ZN15UnionNonTrivialC1Ev
+ // CHECK: call void @_ZN15UnionNonTrivialC2Ev
+
++// CHECK: define {{.*}}void @_ZN24UnionNonTrivialEqualInitC1Ev
++// CHECK: call void @_ZN24UnionNonTrivialEqualInitC2Ev
++
+ // CHECK: define {{.*}}void @_ZN8UnionIntC2Ev
+ // CHECK: store i32 1000
+
+ // CHECK: define {{.*}}void @_ZN15UnionNonTrivialC2Ev
+ // CHECK: call void @_ZN23non_trivial_constructorC1Ev
++
++// CHECK: define {{.*}}void @_ZN24UnionNonTrivialEqualInitC2Ev
++// CHECK: store i32 0
+diff --git a/clang/test/SemaCXX/cxx0x-nontrivial-union.cpp b/clang/test/SemaCXX/cxx0x-nontrivial-union.cpp
+index c7cdf76d850db..833642b3d739a 100644
+--- a/clang/test/SemaCXX/cxx0x-nontrivial-union.cpp
++++ b/clang/test/SemaCXX/cxx0x-nontrivial-union.cpp
+@@ -188,3 +188,14 @@ static_assert(U2().b.x == 100, "");
+ static_assert(U3().b.x == 100, "");
+
+ } // namespace GH48416
++
++namespace GH81774 {
++struct Handle {
++ Handle(int) {}
++};
++// Should be well-formed because NoState has a brace-or-equal-initializer.
++union a {
++ int NoState = 0;
++ Handle CustomState;
++} b;
++} // namespace GH81774