I think it is undesirable when being asked for signed_type_for
of unsigned _BitInt(1) (which is valid) to get signed _BitInt(1) (which is
invalid, the standard only allows signed _BitInt(2) and larger), so the
patch returns 1-bit signed INTEGER_TYPE for those cases.
Furthermore it asserts in build_bitint_type that nothing attempts to create
signed _BitInt(0), unsigned _BitInt(0) or signed _BitInt(1) types.
2023-09-18 Jakub Jelinek <jakub@redhat.com>
gcc/
* tree.cc (build_bitint_type): Assert precision is not 0, or
for signed types 1.
(signed_or_unsigned_type_for): Return INTEGER_TYPE for signed variant
of unsigned _BitInt(1).
gcc/c-family/
* c-common.cc (c_common_signed_or_unsigned_type): Return INTEGER_TYPE
for signed variant of unsigned _BitInt(1).
|| TYPE_UNSIGNED (type) == unsignedp)
return type;
- if (TREE_CODE (type) == BITINT_TYPE)
+ if (TREE_CODE (type) == BITINT_TYPE
+ /* signed _BitInt(1) is invalid, avoid creating that. */
+ && (unsignedp || TYPE_PRECISION (type) > 1))
return build_bitint_type (TYPE_PRECISION (type), unsignedp);
#define TYPE_OK(node) \
{
tree itype, ret;
+ gcc_checking_assert (precision >= 1 + !unsignedp);
+
if (unsignedp)
unsignedp = MAX_INT_CACHED_PREC + 1;
else
return NULL_TREE;
- if (TREE_CODE (type) == BITINT_TYPE)
+ if (TREE_CODE (type) == BITINT_TYPE && (unsignedp || bits > 1))
return build_bitint_type (bits, unsignedp);
return build_nonstandard_integer_type (bits, unsignedp);
}