public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-10724] c++: Treat unnamed bitfields as padding for __has_unique_object_representations [PR109096]
@ 2023-05-02 20:15 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2023-05-02 20:15 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:66d35a0cb88f83f085b2ba4c46d0429ba0cfe574

commit r11-10724-g66d35a0cb88f83f085b2ba4c46d0429ba0cfe574
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Tue Mar 14 16:17:32 2023 +0100

    c++: Treat unnamed bitfields as padding for __has_unique_object_representations [PR109096]
    
    As reported in the PR, for __has_unique_object_representations we
    were treating unnamed bitfields as named ones, which is wrong, they
    are actually padding.
    
    THe following patch fixes that.
    
    2023-03-14  Jakub Jelinek  <jakub@redhat.com>
    
            PR c++/109096
            * tree.c (record_has_unique_obj_representations): Ignore unnamed
            bitfields.
    
            * g++.dg/cpp1z/has-unique-obj-representations3.C: New test.
    
    (cherry picked from commit c35cf160a0ed81570cff6600dba465cf95fa80fa)

Diff:
---
 gcc/cp/tree.c                                                |  4 ++--
 gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations3.C | 10 ++++++++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index b499f38be15..e414d8cfd18 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -4641,7 +4641,7 @@ record_has_unique_obj_representations (const_tree t, const_tree sz)
 						    DECL_SIZE (field)))
 	  return false;
       }
-    else if (DECL_C_BIT_FIELD (field))
+    else if (DECL_C_BIT_FIELD (field) && !DECL_UNNAMED_BIT_FIELD (field))
       {
 	tree btype = DECL_BIT_FIELD_TYPE (field);
 	if (!type_has_unique_obj_representations (btype))
@@ -4652,7 +4652,7 @@ record_has_unique_obj_representations (const_tree t, const_tree sz)
 
   offset_int cur = 0;
   for (tree field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field))
-    if (TREE_CODE (field) == FIELD_DECL)
+    if (TREE_CODE (field) == FIELD_DECL && !DECL_UNNAMED_BIT_FIELD (field))
       {
 	offset_int fld = wi::to_offset (DECL_FIELD_OFFSET (field));
 	offset_int bitpos = wi::to_offset (DECL_FIELD_BIT_OFFSET (field));
diff --git a/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations3.C b/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations3.C
new file mode 100644
index 00000000000..349c93e3c2b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations3.C
@@ -0,0 +1,10 @@
+// PR c++/109096
+// { dg-do compile { target c++11 } }
+
+#define INTB (__SIZEOF_INT__ * __CHAR_BIT__)
+struct U { int i : INTB * 3 / 4; int : INTB / 4; };
+struct V { int : INTB * 3 / 4; int j : INTB / 4; };
+struct W { int i; int : 0; int j; };
+static_assert (__has_unique_object_representations (U) == false, "");
+static_assert (__has_unique_object_representations (V) == false, "");
+static_assert (sizeof (W) != 2 * sizeof (int) || __has_unique_object_representations (W) == true, "");

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-05-02 20:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-02 20:15 [gcc r11-10724] c++: Treat unnamed bitfields as padding for __has_unique_object_representations [PR109096] Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).