https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/109271
>From 6d541092e00f0c59861ad17c8bf6988d849c42f0 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Thu, 19 Sep 2024 11:41:51 +0100 Subject: [PATCH 1/2] [clang][CodeGen] Check initializer of zero-size fields for nullptr https://github.com/llvm/llvm-project/pull/96422 changed treats empty records as zero-sized for the purpose of layout. In `C`, empty fields were never considered `isZeroSize`, so we would never have tried to call `Init->hasSideEffects` on them. But since https://github.com/llvm/llvm-project/pull/96422 we can get here when compiling `C`, but the `Init` need to exist. This patch adds a null-check to account for this situtation. --- clang/lib/CodeGen/CGExprConstant.cpp | 2 +- clang/test/CodeGenCXX/union-empty-field-init.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeGenCXX/union-empty-field-init.c diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index f22321f0e738a1..dd65080a840446 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -738,7 +738,7 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) { // Zero-sized fields are not emitted, but their initializers may still // prevent emission of this struct as a constant. if (isEmptyFieldForLayout(CGM.getContext(), Field)) { - if (Init->HasSideEffects(CGM.getContext())) + if (Init && Init->HasSideEffects(CGM.getContext())) return false; continue; } diff --git a/clang/test/CodeGenCXX/union-empty-field-init.c b/clang/test/CodeGenCXX/union-empty-field-init.c new file mode 100644 index 00000000000000..1ca8d84473e781 --- /dev/null +++ b/clang/test/CodeGenCXX/union-empty-field-init.c @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefixes=CHECK +// RUN: %clang_cc1 -x c++ %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefixes=CHECK-CXX + +union Foo { + struct Empty {} val; +}; + +union Foo foo = {}; + +// CHECK: @foo = {{.*}}global %union.Foo undef, align 1 +// CHECK-CXX: @foo = {{.*}}global %union.Foo undef, align 1 >From 38072fe90fbfc52c07e5dbcb838524626055e9ec Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Fri, 20 Sep 2024 10:43:30 +0100 Subject: [PATCH 2/2] fixup! move test --- clang/test/CodeGen/union-init2.c | 8 ++++++++ clang/test/CodeGenCXX/union-empty-field-init.c | 11 ----------- 2 files changed, 8 insertions(+), 11 deletions(-) delete mode 100644 clang/test/CodeGenCXX/union-empty-field-init.c diff --git a/clang/test/CodeGen/union-init2.c b/clang/test/CodeGen/union-init2.c index 2c167683c4e55d..048ff00517b4e8 100644 --- a/clang/test/CodeGen/union-init2.c +++ b/clang/test/CodeGen/union-init2.c @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -emit-llvm %s -o - -triple i686-pc-linux-gnu | FileCheck %s +// RUN: %clang_cc1 -x c++ %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefixes=CHECK-CXX // Make sure we generate something sane instead of a ptrtoint // CHECK: @r, [4 x i8] undef @@ -11,3 +12,10 @@ union z { long long b; }; union z y = {}; + +// CHECK: @foo = {{.*}}global %union.Foo undef, align 1 +// CHECK-CXX: @foo = {{.*}}global %union.Foo undef, align 1 +union Foo { + struct Empty {} val; +}; +union Foo foo = {}; diff --git a/clang/test/CodeGenCXX/union-empty-field-init.c b/clang/test/CodeGenCXX/union-empty-field-init.c deleted file mode 100644 index 1ca8d84473e781..00000000000000 --- a/clang/test/CodeGenCXX/union-empty-field-init.c +++ /dev/null @@ -1,11 +0,0 @@ -// RUN: %clang_cc1 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefixes=CHECK -// RUN: %clang_cc1 -x c++ %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefixes=CHECK-CXX - -union Foo { - struct Empty {} val; -}; - -union Foo foo = {}; - -// CHECK: @foo = {{.*}}global %union.Foo undef, align 1 -// CHECK-CXX: @foo = {{.*}}global %union.Foo undef, align 1 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits