]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
small _BitInt tweaks
authorJakub Jelinek <jakub@redhat.com>
Tue, 19 Sep 2023 07:50:35 +0000 (09:50 +0200)
committerJakub Jelinek <jakub@redhat.com>
Tue, 19 Sep 2023 07:50:35 +0000 (09:50 +0200)
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).

gcc/c-family/c-common.cc
gcc/tree.cc

index 73e739c503ddd1f9df1e6fc21682374024f5236a..aae5726009798a9fd27fced23e420a7ad25e335d 100644 (file)
@@ -2739,7 +2739,9 @@ c_common_signed_or_unsigned_type (int unsignedp, tree type)
       || 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)                                                      \
index b34d75f8c85c322a2bb19a9a414d0c50cbf04e4d..8a8d6d5091a403c0888e81f9c16204643b3c9a19 100644 (file)
@@ -7179,6 +7179,8 @@ build_bitint_type (unsigned HOST_WIDE_INT precision, int unsignedp)
 {
   tree itype, ret;
 
+  gcc_checking_assert (precision >= 1 + !unsignedp);
+
   if (unsignedp)
     unsignedp = MAX_INT_CACHED_PREC + 1;
 
@@ -11096,7 +11098,7 @@ signed_or_unsigned_type_for (int unsignedp, tree type)
   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);
 }