More missed bits from the big __intN patch

From-SVN: r216222
This commit is contained in:
DJ Delorie 2014-10-14 16:53:29 -04:00
parent e1217ac7f2
commit 9edc6e4cf9
2 changed files with 21 additions and 18 deletions

View File

@ -9711,10 +9711,7 @@ declspecs_add_type (location_t loc, struct c_declspecs *specs,
case RID_INT_N_2:
case RID_INT_N_3:
specs->int_n_idx = i - RID_INT_N_0;
if (!in_system_header_at (input_location)
/* As a special exception, allow a type that's used
for __SIZE_TYPE__. */
&& int_n_data[specs->int_n_idx].bitsize != POINTER_SIZE)
if (!in_system_header_at (input_location))
pedwarn (loc, OPT_Wpedantic,
"ISO C does not support %<__int%d%> types",
int_n_data[specs->int_n_idx].bitsize);

View File

@ -365,20 +365,6 @@ cp_common_type (tree t1, tree t2)
: long_long_integer_type_node);
return build_type_attribute_variant (t, attributes);
}
for (i = 0; i < NUM_INT_N_ENTS; i ++)
{
if (int_n_enabled_p [i]
&& (same_type_p (TYPE_MAIN_VARIANT (t1),
int_n_trees[i].signed_type)
|| same_type_p (TYPE_MAIN_VARIANT (t2),
int_n_trees[i].signed_type)))
{
tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
? int_n_trees[i].unsigned_type
: int_n_trees[i].signed_type);
return build_type_attribute_variant (t, attributes);
}
}
/* Go through the same procedure, but for longs. */
if (same_type_p (TYPE_MAIN_VARIANT (t1), long_unsigned_type_node)
@ -392,6 +378,26 @@ cp_common_type (tree t1, tree t2)
? long_unsigned_type_node : long_integer_type_node);
return build_type_attribute_variant (t, attributes);
}
/* For __intN types, either the type is __int128 (and is lower
priority than the types checked above, but higher than other
128-bit types) or it's known to not be the same size as other
types (enforced in toplev.c). Prefer the unsigned type. */
for (i = 0; i < NUM_INT_N_ENTS; i ++)
{
if (int_n_enabled_p [i]
&& (same_type_p (TYPE_MAIN_VARIANT (t1), int_n_trees[i].signed_type)
|| same_type_p (TYPE_MAIN_VARIANT (t2), int_n_trees[i].signed_type)
|| same_type_p (TYPE_MAIN_VARIANT (t1), int_n_trees[i].unsigned_type)
|| same_type_p (TYPE_MAIN_VARIANT (t2), int_n_trees[i].unsigned_type)))
{
tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
? int_n_trees[i].unsigned_type
: int_n_trees[i].signed_type);
return build_type_attribute_variant (t, attributes);
}
}
/* Otherwise prefer the unsigned one. */
if (TYPE_UNSIGNED (t1))
return build_type_attribute_variant (t1, attributes);