aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
authorMartin Uecker <uecker@tugraz.at>2024-11-28 20:06:16 +0100
committerMartin Uecker <uecker@gcc.gnu.org>2024-11-29 14:14:56 +0100
commitb6a513909793a87b62ca52da85ff3baa44f6b4b6 (patch)
tree1aeb78f43f57ca5e22a1e5b9ad3837287e7091e0 /gcc/c
parent5b0e4ed3081e6648460661ff5013e9f03e318505 (diff)
downloadgcc-b6a513909793a87b62ca52da85ff3baa44f6b4b6.zip
gcc-b6a513909793a87b62ca52da85ff3baa44f6b4b6.tar.gz
gcc-b6a513909793a87b62ca52da85ff3baa44f6b4b6.tar.bz2
c: Correct type compatibility for bit-fields [PR117828]
Add missing test for consistency of bit-fields when comparing tagged types for compatibility. PR c/117828 gcc/c/ChangeLog: * c-typeck.cc (tagged_types_tu_compatible_p): Add check. gcc/testsuite/ChangeLog: * gcc.dg/c23-tag-bitfields-1.c: New test. * gcc.dg/pr117828.c: New test.
Diffstat (limited to 'gcc/c')
-rw-r--r--gcc/c/c-typeck.cc17
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index 0189a80..611dacc 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -1909,18 +1909,33 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2,
gcc_assert (TREE_CODE (s1) == FIELD_DECL);
gcc_assert (TREE_CODE (s2) == FIELD_DECL);
+ tree ft1 = TREE_TYPE (s1);
+ tree ft2 = TREE_TYPE (s2);
+
if (DECL_NAME (s1) != DECL_NAME (s2))
return false;
if (DECL_ALIGN (s1) != DECL_ALIGN (s2))
return false;
+ if (DECL_C_BIT_FIELD (s1) != DECL_C_BIT_FIELD (s2))
+ return false;
+
+ if (DECL_C_BIT_FIELD (s1))
+ {
+ if (!tree_int_cst_equal (DECL_SIZE (s1), DECL_SIZE (s2)))
+ return false;
+
+ ft1 = DECL_BIT_FIELD_TYPE (s1);
+ ft2 = DECL_BIT_FIELD_TYPE (s2);
+ }
+
data->anon_field = !DECL_NAME (s1);
data->pointedto = false;
const struct tagged_tu_seen_cache *cache = data->cache;
data->cache = &entry;
- bool ret = comptypes_internal (TREE_TYPE (s1), TREE_TYPE (s2), data);
+ bool ret = comptypes_internal (ft1, ft2, data);
data->cache = cache;
if (!ret)
return false;