[clang] Fix to msvc::no_unique_address causing assert when used with __declspec(empty_bases) (PR #74776)
https://github.com/amykhuang closed https://github.com/llvm/llvm-project/pull/74776 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Fix to msvc::no_unique_address causing assert when used with __declspec(empty_bases) (PR #74776)
https://github.com/zmodem approved this pull request. lgtm, thanks for fixing! https://github.com/llvm/llvm-project/pull/74776 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Fix to msvc::no_unique_address causing assert when used with __declspec(empty_bases) (PR #74776)
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 c6805ea44af3bfd57e6b46f2d65ec6b0d0d6c64a c3dedfd535f037fb54a8e04640f9332e655a9a7d -- clang/lib/AST/RecordLayoutBuilder.cpp clang/test/Layout/ms-x86-declspec-empty_bases.cpp `` View the diff from clang-format here. ``diff diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 73b248ffe5..4af8770db2 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2267,9 +2267,12 @@ ItaniumRecordLayoutBuilder::updateExternalFieldOffset(const FieldDecl *Field, /// \returns diagnostic %select index. static unsigned getPaddingDiagFromTagKind(TagTypeKind Tag) { switch (Tag) { - case TTK_Struct: return 0; - case TTK_Interface: return 1; - case TTK_Class: return 2; + case TTK_Struct: +return 0; + case TTK_Interface: +return 1; + case TTK_Class: +return 2; default: llvm_unreachable("Invalid tag kind for field padding diagnostic!"); } } @@ -2300,15 +2303,13 @@ void ItaniumRecordLayoutBuilder::CheckFieldPadding( if (D->getIdentifier()) Diag(D->getLocation(), diag::warn_padded_struct_field) << getPaddingDiagFromTagKind(D->getParent()->getTagKind()) - << Context.getTypeDeclType(D->getParent()) - << PadSize + << Context.getTypeDeclType(D->getParent()) << PadSize << (InBits ? 1 : 0) // (byte|bit) << D->getIdentifier(); else Diag(D->getLocation(), diag::warn_padded_struct_anon_field) << getPaddingDiagFromTagKind(D->getParent()->getTagKind()) - << Context.getTypeDeclType(D->getParent()) - << PadSize + << Context.getTypeDeclType(D->getParent()) << PadSize << (InBits ? 1 : 0); // (byte|bit) } if (isPacked && Offset != UnpackedOffset) { `` https://github.com/llvm/llvm-project/pull/74776 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Fix to msvc::no_unique_address causing assert when used with __declspec(empty_bases) (PR #74776)
llvmbot wrote: @llvm/pr-subscribers-clang Author: Amy Huang (amykhuang) Changes no_unique_address makes it possible for a class to be empty and have non-zero virtual size, so just remove this assert. Bug: https://github.com/llvm/llvm-project/issues/74442 --- Full diff: https://github.com/llvm/llvm-project/pull/74776.diff 2 Files Affected: - (modified) clang/lib/AST/RecordLayoutBuilder.cpp (+2-2) - (modified) clang/test/Layout/ms-x86-declspec-empty_bases.cpp (+60) ``diff diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index f1f2275da44dc..73b248ffe5899 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2936,8 +2936,8 @@ void MicrosoftRecordLayoutBuilder::layoutNonVirtualBase( } if (!FoundBase) { -if (MDCUsesEBO && BaseDecl->isEmpty()) { - assert(BaseLayout.getNonVirtualSize() == CharUnits::Zero()); +if (MDCUsesEBO && BaseDecl->isEmpty() && +(BaseLayout.getNonVirtualSize() == CharUnits::Zero())) { BaseOffset = CharUnits::Zero(); } else { // Otherwise, lay the base out at the end of the MDC. diff --git a/clang/test/Layout/ms-x86-declspec-empty_bases.cpp b/clang/test/Layout/ms-x86-declspec-empty_bases.cpp index cc13a980cb5db..4738ce5720f75 100644 --- a/clang/test/Layout/ms-x86-declspec-empty_bases.cpp +++ b/clang/test/Layout/ms-x86-declspec-empty_bases.cpp @@ -264,3 +264,63 @@ int _ = sizeof(G); // CHECK-NEXT:| [sizeof=12, align=4, // CHECK-NEXT:| nvsize=12, nvalign=4] } + +namespace test5 { + +struct A { + int a; +}; +struct B { + int b; +}; +struct C {}; +struct __declspec(align(16)) D {}; +struct E { + [[msvc::no_unique_address]] C c; +}; +struct __declspec(empty_bases) X : A, D, B, C, E { +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::A +// CHECK-NEXT: 0 | int a +// CHECK-NEXT:| [sizeof=4, align=4, +// CHECK-NEXT:| nvsize=4, nvalign=4] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::D (empty) +// CHECK-NEXT:| [sizeof=16, align=16, +// CHECK-NEXT:| nvsize=0, nvalign=16] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::B +// CHECK-NEXT: 0 | int b +// CHECK-NEXT:| [sizeof=4, align=4, +// CHECK-NEXT:| nvsize=4, nvalign=4] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::C (empty) +// CHECK-NEXT:| [sizeof=1, align=1, +// CHECK-NEXT:| nvsize=0, nvalign=1] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::E (empty) +// CHECK-NEXT: 0 | struct test5::C c (empty) +// CHECK-NEXT:| [sizeof=1, align=1, +// CHECK-NEXT:| nvsize=1, nvalign=1] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::X +// CHECK-NEXT: 0 | struct test5::A (base) +// CHECK-NEXT: 0 | int a +// CHECK-NEXT: 0 | struct test5::D (base) (empty) +// CHECK-NEXT: 0 | struct test5::C (base) (empty) +// CHECK-NEXT: 4 | struct test5::B (base) +// CHECK-NEXT: 4 | int b +// CHECK-NEXT: 8 | struct test5::E (base) (empty) +// CHECK-NEXT: 8 | struct test5::C c (empty) +// CHECK-NEXT:| [sizeof=16, align=16, +// CHECK-NEXT:| nvsize=16, nvalign=16] + +int _ = sizeof(X); +} `` https://github.com/llvm/llvm-project/pull/74776 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Fix to msvc::no_unique_address causing assert when used with __declspec(empty_bases) (PR #74776)
https://github.com/amykhuang created https://github.com/llvm/llvm-project/pull/74776 no_unique_address makes it possible for a class to be empty and have non-zero virtual size, so just remove this assert. Bug: https://github.com/llvm/llvm-project/issues/74442 >From c3dedfd535f037fb54a8e04640f9332e655a9a7d Mon Sep 17 00:00:00 2001 From: Amy Huang Date: Thu, 7 Dec 2023 14:08:24 -0800 Subject: [PATCH] Fix to msvc::no_unique_address not interacting well with __declspec(empty_bases) --- clang/lib/AST/RecordLayoutBuilder.cpp | 4 +- .../Layout/ms-x86-declspec-empty_bases.cpp| 60 +++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index f1f2275da44dc..73b248ffe5899 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2936,8 +2936,8 @@ void MicrosoftRecordLayoutBuilder::layoutNonVirtualBase( } if (!FoundBase) { -if (MDCUsesEBO && BaseDecl->isEmpty()) { - assert(BaseLayout.getNonVirtualSize() == CharUnits::Zero()); +if (MDCUsesEBO && BaseDecl->isEmpty() && +(BaseLayout.getNonVirtualSize() == CharUnits::Zero())) { BaseOffset = CharUnits::Zero(); } else { // Otherwise, lay the base out at the end of the MDC. diff --git a/clang/test/Layout/ms-x86-declspec-empty_bases.cpp b/clang/test/Layout/ms-x86-declspec-empty_bases.cpp index cc13a980cb5db..4738ce5720f75 100644 --- a/clang/test/Layout/ms-x86-declspec-empty_bases.cpp +++ b/clang/test/Layout/ms-x86-declspec-empty_bases.cpp @@ -264,3 +264,63 @@ int _ = sizeof(G); // CHECK-NEXT:| [sizeof=12, align=4, // CHECK-NEXT:| nvsize=12, nvalign=4] } + +namespace test5 { + +struct A { + int a; +}; +struct B { + int b; +}; +struct C {}; +struct __declspec(align(16)) D {}; +struct E { + [[msvc::no_unique_address]] C c; +}; +struct __declspec(empty_bases) X : A, D, B, C, E { +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::A +// CHECK-NEXT: 0 | int a +// CHECK-NEXT:| [sizeof=4, align=4, +// CHECK-NEXT:| nvsize=4, nvalign=4] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::D (empty) +// CHECK-NEXT:| [sizeof=16, align=16, +// CHECK-NEXT:| nvsize=0, nvalign=16] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::B +// CHECK-NEXT: 0 | int b +// CHECK-NEXT:| [sizeof=4, align=4, +// CHECK-NEXT:| nvsize=4, nvalign=4] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::C (empty) +// CHECK-NEXT:| [sizeof=1, align=1, +// CHECK-NEXT:| nvsize=0, nvalign=1] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::E (empty) +// CHECK-NEXT: 0 | struct test5::C c (empty) +// CHECK-NEXT:| [sizeof=1, align=1, +// CHECK-NEXT:| nvsize=1, nvalign=1] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test5::X +// CHECK-NEXT: 0 | struct test5::A (base) +// CHECK-NEXT: 0 | int a +// CHECK-NEXT: 0 | struct test5::D (base) (empty) +// CHECK-NEXT: 0 | struct test5::C (base) (empty) +// CHECK-NEXT: 4 | struct test5::B (base) +// CHECK-NEXT: 4 | int b +// CHECK-NEXT: 8 | struct test5::E (base) (empty) +// CHECK-NEXT: 8 | struct test5::C c (empty) +// CHECK-NEXT:| [sizeof=16, align=16, +// CHECK-NEXT:| nvsize=16, nvalign=16] + +int _ = sizeof(X); +} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits