checked. */
code = tree_code_for_canonical_type_merging (TREE_CODE (type));
hstate.add_int (code);
- if (!RECORD_OR_UNION_TYPE_P (type))
- hstate.add_int (TYPE_MODE (type));
+ hstate.add_int (TYPE_MODE (type));
/* Incorporate common features of numerical types. */
if (INTEGRAL_TYPE_P (type)
&& (! DECL_SIZE (f)
|| ! integer_zerop (DECL_SIZE (f))))
{
- tree t = TREE_TYPE (f);
- if (!TREE_CHAIN (f)
- && TREE_CODE (t) == ARRAY_TYPE)
- t = TREE_TYPE (t);
- iterative_hash_canonical_type (t, hstate);
+ iterative_hash_canonical_type (TREE_TYPE (f), hstate);
nf++;
}
|| TREE_CODE (t1) == NULLPTR_TYPE)
return true;
- /* 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))
+ /* Can't be the same type if they have different mode. */
+ if (TYPE_MODE (t1) != TYPE_MODE (t2))
return false;
/* Non-aggregate types can be handled cheaply. */
{
case ARRAY_TYPE:
/* Array types are the same if the element types are the same and
- minimum and maximum index are the same. */
+ the number of elements are the same. */
if (!gimple_canonical_types_compatible_p (TREE_TYPE (t1), TREE_TYPE (t2),
trust_type_canonical)
|| TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2)
f1 || f2;
f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
{
- /* Skip non-fields and zero-sized fields, except zero-sized
- arrays at the end. */
+ /* Skip non-fields and zero-sized fields. */
while (f1 && (TREE_CODE (f1) != FIELD_DECL
|| (DECL_SIZE (f1)
- && integer_zerop (DECL_SIZE (f1))
- && (TREE_CHAIN (f1)
- || TREE_CODE (TREE_TYPE (f1))
- != ARRAY_TYPE))))
+ && integer_zerop (DECL_SIZE (f1)))))
f1 = TREE_CHAIN (f1);
while (f2 && (TREE_CODE (f2) != FIELD_DECL
|| (DECL_SIZE (f2)
- && integer_zerop (DECL_SIZE (f2))
- && (TREE_CHAIN (f2)
- || TREE_CODE (TREE_TYPE (f2))
- != ARRAY_TYPE))))
+ && integer_zerop (DECL_SIZE (f2)))))
f2 = TREE_CHAIN (f2);
if (!f1 || !f2)
break;
-
- tree t1 = TREE_TYPE (f1);
- tree t2 = TREE_TYPE (f2);
-
- /* If the last element are arrays, we only compare the element
- types. */
- if (TREE_CHAIN (f1) == NULL_TREE && TREE_CODE (t1) == ARRAY_TYPE
- && TREE_CHAIN (f2) == NULL_TREE && TREE_CODE (t2) == ARRAY_TYPE)
- {
- /* If both arrays have zero size, this is a match. */
- if (DECL_SIZE (f1) && integer_zerop (DECL_SIZE (f1))
- && DECL_SIZE (f2) && integer_zerop (DECL_SIZE (f2)))
- return true;
-
- t1 = TREE_TYPE (t1);
- t2 = TREE_TYPE (t2);
- }
-
+ /* The fields must have the same name, offset and type. */
if (DECL_NONADDRESSABLE_P (f1) != DECL_NONADDRESSABLE_P (f2)
|| !gimple_compare_field_offset (f1, f2)
|| !gimple_canonical_types_compatible_p
- (t1, t2, trust_type_canonical))
+ (TREE_TYPE (f1), TREE_TYPE (f2),
+ trust_type_canonical))
return false;
}
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");