aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Uecker <uecker@tugraz.at>2024-12-09 12:07:57 +0100
committerMartin Uecker <uecker@gcc.gnu.org>2024-12-12 13:26:09 +0100
commit1f48225a0ddfaf74a229105343b22f3086c4b8cb (patch)
tree92de074f0c02528a90aa0a9670331859971aaf17
parente7615f6c99f93056b344ad07ee909114ee54f471 (diff)
downloadgcc-1f48225a0ddfaf74a229105343b22f3086c4b8cb.zip
gcc-1f48225a0ddfaf74a229105343b22f3086c4b8cb.tar.gz
gcc-1f48225a0ddfaf74a229105343b22f3086c4b8cb.tar.bz2
Fix type compatibility for types with flexible array member 1/2 [PR113688,PR114713,PR117724]
Allow the TYPE_MODE of a type with an array as last member to differ from another compatible type. gcc/ChangeLog: * tree.cc (gimple_canonical_types_compatible_p): Add exception. (verify_type): Add exception. gcc/lto/ChangeLog: * lto-common.cc (hash_canonical_type): Add exception.
-rw-r--r--gcc/lto/lto-common.cc3
-rw-r--r--gcc/tree.cc12
2 files changed, 11 insertions, 4 deletions
diff --git a/gcc/lto/lto-common.cc b/gcc/lto/lto-common.cc
index 86a309f..940502099 100644
--- a/gcc/lto/lto-common.cc
+++ b/gcc/lto/lto-common.cc
@@ -254,7 +254,8 @@ hash_canonical_type (tree type)
checked. */
code = tree_code_for_canonical_type_merging (TREE_CODE (type));
hstate.add_int (code);
- hstate.add_int (TYPE_MODE (type));
+ if (!RECORD_OR_UNION_TYPE_P (type))
+ hstate.add_int (TYPE_MODE (type));
/* Incorporate common features of numerical types. */
if (INTEGRAL_TYPE_P (type)
diff --git a/gcc/tree.cc b/gcc/tree.cc
index 83a0337..1391af6 100644
--- a/gcc/tree.cc
+++ b/gcc/tree.cc
@@ -13914,8 +13914,11 @@ gimple_canonical_types_compatible_p (const_tree t1, const_tree t2,
|| TREE_CODE (t1) == NULLPTR_TYPE)
return true;
- /* Can't be the same type if they have different mode. */
- if (TYPE_MODE (t1) != TYPE_MODE (t2))
+ /* Can't be compatible types if they have different mode. Because of
+ flexible array members, we allow mismatching modes for structures or
+ unions. */
+ if (!RECORD_OR_UNION_TYPE_P (t1)
+ && TYPE_MODE (t1) != TYPE_MODE (t2))
return false;
/* Non-aggregate types can be handled cheaply. */
@@ -14218,8 +14221,11 @@ verify_type (const_tree t)
debug_tree (ct);
error_found = true;
}
-
if (COMPLETE_TYPE_P (t) && TYPE_CANONICAL (t)
+ /* We allow a mismatch for structure or union because of
+ flexible array members. */
+ && !RECORD_OR_UNION_TYPE_P (t)
+ && !RECORD_OR_UNION_TYPE_P (TYPE_CANONICAL (t))
&& TYPE_MODE (t) != TYPE_MODE (TYPE_CANONICAL (t)))
{
error ("%<TYPE_MODE%> of %<TYPE_CANONICAL%> is not compatible");