public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jakub Jelinek <jakub@redhat.com>
To: Joseph Myers <joseph@codesourcery.com>, gcc-patches@gcc.gnu.org
Subject: [PATCH 13/12 v2] C _BitInt incremental fixes [PR102989]
Date: Thu, 10 Aug 2023 17:22:59 +0200	[thread overview]
Message-ID: <ZNUA0zC/RG/cqnB5@tucnak> (raw)
In-Reply-To: <ZNS3f14lkWcbBDpR@tucnak>

On Thu, Aug 10, 2023 at 12:10:07PM +0200, Jakub Jelinek via Gcc-patches wrote:
> Here is an incremental patch which does that:

Bootstrap/regtest on i686-linux (next to x86_64-linux where it went fine)
revealed I forgot to add { target bitint } to dg-do compile lines.

Here is an updated patch which does that and passes even on i686-linux.

2023-08-10  Jakub Jelinek  <jakub@redhat.com>

	PR c/102989
gcc/c/
	* c-decl.cc (finish_declspecs): Emit pedwarn_c11 on _BitInt.
	* c-typeck.cc (c_common_type): Emit sorry for common type between
	_Complex integer and larger _BitInt and return the _Complex integer.
gcc/c-family/
	* c-attribs.cc (type_valid_for_vector_size): Reject vector types
	with BITINT_TYPE elements even if they have mode precision and
	suitable size.
gcc/testsuite/
	* gcc.dg/bitint-19.c: New test.
	* gcc.dg/bitint-20.c: New test.
	* gcc.dg/bitint-21.c: New test.
	* gcc.dg/bitint-22.c: New test.
	* gcc.dg/bitint-23.c: New test.
	* gcc.dg/bitint-24.c: New test.
	* gcc.dg/bitint-25.c: New test.
	* gcc.dg/bitint-26.c: New test.
	* gcc.dg/bitint-27.c: New test.
	* g++.dg/ext/bitint1.C: New test.
	* g++.dg/ext/bitint2.C: New test.
	* g++.dg/ext/bitint3.C: New test.
	* g++.dg/ext/bitint4.C: New test.
libcpp/
	* expr.cc (cpp_classify_number): Diagnose wb literal suffixes
	for -pedantic* before C2X or -Wc11-c2x-compat.

--- gcc/c/c-decl.cc.jj	2023-08-10 09:26:39.776509713 +0200
+++ gcc/c/c-decl.cc	2023-08-10 11:14:12.686238299 +0200
@@ -12933,8 +12933,15 @@ finish_declspecs (struct c_declspecs *sp
       if (specs->u.bitint_prec == -1)
 	specs->type = integer_type_node;
       else
-	specs->type = build_bitint_type (specs->u.bitint_prec,
-					 specs->unsigned_p);
+	{
+	  pedwarn_c11 (specs->locations[cdw_typespec], OPT_Wpedantic,
+		       "ISO C does not support %<%s_BitInt(%d)%> before C2X",
+		       specs->unsigned_p ? "unsigned "
+		       : specs->signed_p ? "signed " : "",
+		       specs->u.bitint_prec);
+	  specs->type = build_bitint_type (specs->u.bitint_prec,
+					   specs->unsigned_p);
+	}
       break;
     default:
       gcc_unreachable ();
--- gcc/c/c-typeck.cc.jj	2023-08-10 09:26:39.781509641 +0200
+++ gcc/c/c-typeck.cc	2023-08-10 10:03:00.722917789 +0200
@@ -819,6 +819,12 @@ c_common_type (tree t1, tree t2)
 	return t1;
       else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype)
 	return t2;
+      else if (TREE_CODE (subtype) == BITINT_TYPE)
+	{
+	  sorry ("%<_Complex _BitInt(%d)%> unsupported",
+		 TYPE_PRECISION (subtype));
+	  return code1 == COMPLEX_TYPE ? t1 : t2;
+	}
       else
 	return build_complex_type (subtype);
     }
--- gcc/c-family/c-attribs.cc.jj	2023-06-03 15:32:04.311412926 +0200
+++ gcc/c-family/c-attribs.cc	2023-08-10 10:07:05.222377604 +0200
@@ -4366,7 +4366,8 @@ type_valid_for_vector_size (tree type, t
 	  && GET_MODE_CLASS (orig_mode) != MODE_INT
 	  && !ALL_SCALAR_FIXED_POINT_MODE_P (orig_mode))
       || !tree_fits_uhwi_p (TYPE_SIZE_UNIT (type))
-      || TREE_CODE (type) == BOOLEAN_TYPE)
+      || TREE_CODE (type) == BOOLEAN_TYPE
+      || TREE_CODE (type) == BITINT_TYPE)
     {
       if (error_p)
 	error ("invalid vector type for attribute %qE", atname);
--- gcc/testsuite/gcc.dg/bitint-19.c.jj	2023-08-10 09:33:49.205287806 +0200
+++ gcc/testsuite/gcc.dg/bitint-19.c	2023-08-10 09:36:43.312765194 +0200
@@ -0,0 +1,16 @@
+/* PR c/102989 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-std=gnu2x" } */
+
+#define expr_has_type(e, t) _Generic (e, default : 0, t : 1)
+
+void
+foo (_Complex int ci, _Complex long long cl)
+{
+  _BitInt(__SIZEOF_INT__ * __CHAR_BIT__ - 1) bi = 0wb;
+  _BitInt(__SIZEOF_LONG_LONG__ * __CHAR_BIT__ - 1) bl = 0wb;
+  static_assert (expr_has_type (ci + bi, _Complex int));
+  static_assert (expr_has_type (cl + bl, _Complex long long));
+  static_assert (expr_has_type (bi + ci, _Complex int));
+  static_assert (expr_has_type (bl + cl, _Complex long long));
+}
--- gcc/testsuite/gcc.dg/bitint-20.c.jj	2023-08-10 09:40:14.340707650 +0200
+++ gcc/testsuite/gcc.dg/bitint-20.c	2023-08-10 10:04:35.306548279 +0200
@@ -0,0 +1,16 @@
+/* PR c/102989 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-std=gnu2x" } */
+
+void
+foo (_Complex int ci, _Complex long long cl)
+{
+  _BitInt(__SIZEOF_INT__ * __CHAR_BIT__ + 1) bi = 0wb;
+  ci + bi;			/* { dg-message "unsupported" } */
+  bi + ci;			/* { dg-message "unsupported" } */
+#if __BITINT_MAXWIDTH__ >= 575
+  _BitInt(575) bw = 0wb;
+  cl + bw;			/* { dg-message "unsupported" "" { target bitint575 } } */
+  bw + cl;			/* { dg-message "unsupported" "" { target bitint575 } } */
+#endif
+}
--- gcc/testsuite/gcc.dg/bitint-21.c.jj	2023-08-10 10:07:31.393998652 +0200
+++ gcc/testsuite/gcc.dg/bitint-21.c	2023-08-10 10:14:14.303164800 +0200
@@ -0,0 +1,11 @@
+/* PR c/102989 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-std=gnu2x" } */
+
+#define IB __SIZEOF_INT__ * __CHAR_BIT__
+typedef _BitInt(IB) V1 __attribute__((vector_size (sizeof (_BitInt(IB)))));		/* { dg-error "invalid vector type for attribute 'vector_size'" } */
+typedef _BitInt(IB) V2 __attribute__((vector_size (8 * sizeof (_BitInt(IB)))));		/* { dg-error "invalid vector type for attribute 'vector_size'" } */
+#if __BITINT_MAXWIDTH__ >= 575
+typedef _BitInt(575) V3 __attribute__((vector_size (sizeof (_BitInt(575)))));		/* { dg-error "invalid vector type for attribute 'vector_size'" "" { target bitint575 } } */
+typedef _BitInt(575) V3 __attribute__((vector_size (16 * sizeof (_BitInt(575)))));	/* { dg-error "invalid vector type for attribute 'vector_size'" "" { target bitint575 } } */
+#endif
--- gcc/testsuite/gcc.dg/bitint-22.c.jj	2023-08-10 11:51:51.975802981 +0200
+++ gcc/testsuite/gcc.dg/bitint-22.c	2023-08-10 11:52:16.923446548 +0200
@@ -0,0 +1,18 @@
+// PR c/102989
+// { dg-do compile { target bitint } }
+// { dg-options "-std=c2x -pedantic-errors" }
+
+_BitInt(63) a;
+signed _BitInt(15) b;
+unsigned _BitInt(31) c;
+int d = 21wb;
+long long e = 60594869054uwb;
+__extension__ _BitInt(63) f;
+__extension__ _BitInt(15) g;
+__extension__ unsigned _BitInt(31) h;
+int i = __extension__ 21wb;
+long long j = __extension__ 60594869054uwb;
+#if 0wb == 0
+#endif
+#if 0uwb == 0
+#endif
--- gcc/testsuite/gcc.dg/bitint-23.c.jj	2023-08-10 11:52:29.611265273 +0200
+++ gcc/testsuite/gcc.dg/bitint-23.c	2023-08-10 11:55:03.702063742 +0200
@@ -0,0 +1,18 @@
+// PR c/102989
+// { dg-do compile { target bitint } }
+// { dg-options "-std=c2x -pedantic-errors -Wc11-c2x-compat" }
+
+_BitInt(63) a;					/* { dg-warning "ISO C does not support '_BitInt\\\(63\\\)' before C2X" } */
+signed _BitInt(15) b;				/* { dg-warning "ISO C does not support 'signed _BitInt\\\(15\\\)' before C2X" } */
+unsigned _BitInt(31) c;				/* { dg-warning "ISO C does not support 'unsigned _BitInt\\\(31\\\)' before C2X" } */
+int d = 21wb;					/* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
+long long e = 60594869054uwb;			/* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
+__extension__ _BitInt(63) f;
+__extension__ _BitInt(15) g;
+__extension__ unsigned _BitInt(31) h;
+int i = __extension__ 21wb;
+long long j = __extension__ 60594869054uwb;
+#if 0wb == 0					/* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
+#endif
+#if 0uwb == 0					/* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
+#endif
--- gcc/testsuite/gcc.dg/bitint-24.c.jj	2023-08-10 11:56:03.403210774 +0200
+++ gcc/testsuite/gcc.dg/bitint-24.c	2023-08-10 11:56:13.037073138 +0200
@@ -0,0 +1,18 @@
+// PR c/102989
+// { dg-do compile { target bitint } }
+// { dg-options "-std=c11" }
+
+_BitInt(63) a;
+signed _BitInt(15) b;
+unsigned _BitInt(31) c;
+int d = 21wb;
+long long e = 60594869054uwb;
+__extension__ _BitInt(63) f;
+__extension__ _BitInt(15) g;
+__extension__ unsigned _BitInt(31) h;
+int i = __extension__ 21wb;
+long long j = __extension__ 60594869054uwb;
+#if 0wb == 0
+#endif
+#if 0uwb == 0
+#endif
--- gcc/testsuite/gcc.dg/bitint-25.c.jj	2023-08-10 11:56:21.499952227 +0200
+++ gcc/testsuite/gcc.dg/bitint-25.c	2023-08-10 11:56:36.468738364 +0200
@@ -0,0 +1,18 @@
+// PR c/102989
+// { dg-do compile { target bitint } }
+// { dg-options "-std=c11 -Wno-c11-c2x-compat -pedantic-errors" }
+
+_BitInt(63) a;
+signed _BitInt(15) b;
+unsigned _BitInt(31) c;
+int d = 21wb;
+long long e = 60594869054uwb;
+__extension__ _BitInt(63) f;
+__extension__ _BitInt(15) g;
+__extension__ unsigned _BitInt(31) h;
+int i = __extension__ 21wb;
+long long j = __extension__ 60594869054uwb;
+#if 0wb == 0
+#endif
+#if 0uwb == 0
+#endif
--- gcc/testsuite/gcc.dg/bitint-26.c.jj	2023-08-10 11:56:56.423453266 +0200
+++ gcc/testsuite/gcc.dg/bitint-26.c	2023-08-10 11:57:41.335811588 +0200
@@ -0,0 +1,18 @@
+// PR c/102989
+// { dg-do compile { target bitint } }
+// { dg-options "-std=c11 -pedantic" }
+
+_BitInt(63) a;					/* { dg-warning "ISO C does not support '_BitInt\\\(63\\\)' before C2X" } */
+signed _BitInt(15) b;				/* { dg-warning "ISO C does not support 'signed _BitInt\\\(15\\\)' before C2X" } */
+unsigned _BitInt(31) c;				/* { dg-warning "ISO C does not support 'unsigned _BitInt\\\(31\\\)' before C2X" } */
+int d = 21wb;					/* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
+long long e = 60594869054uwb;			/* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
+__extension__ _BitInt(63) f;
+__extension__ _BitInt(15) g;
+__extension__ unsigned _BitInt(31) h;
+int i = __extension__ 21wb;
+long long j = __extension__ 60594869054uwb;
+#if 0wb == 0					/* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
+#endif
+#if 0uwb == 0					/* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */
+#endif
--- gcc/testsuite/gcc.dg/bitint-27.c.jj	2023-08-10 11:57:23.690063697 +0200
+++ gcc/testsuite/gcc.dg/bitint-27.c	2023-08-10 11:57:57.352582755 +0200
@@ -0,0 +1,18 @@
+// PR c/102989
+// { dg-do compile { target bitint } }
+// { dg-options "-std=c11 -pedantic-errors" }
+
+_BitInt(63) a;					/* { dg-error "ISO C does not support '_BitInt\\\(63\\\)' before C2X" } */
+signed _BitInt(15) b;				/* { dg-error "ISO C does not support 'signed _BitInt\\\(15\\\)' before C2X" } */
+unsigned _BitInt(31) c;				/* { dg-error "ISO C does not support 'unsigned _BitInt\\\(31\\\)' before C2X" } */
+int d = 21wb;					/* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */
+long long e = 60594869054uwb;			/* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */
+__extension__ _BitInt(63) f;
+__extension__ _BitInt(15) g;
+__extension__ unsigned _BitInt(31) h;
+int i = __extension__ 21wb;
+long long j = __extension__ 60594869054uwb;
+#if 0wb == 0					/* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */
+#endif
+#if 0uwb == 0					/* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */
+#endif
--- gcc/testsuite/g++.dg/ext/bitint1.C.jj	2023-08-10 10:42:33.884601671 +0200
+++ gcc/testsuite/g++.dg/ext/bitint1.C	2023-08-10 10:41:44.595312345 +0200
@@ -0,0 +1,9 @@
+// PR c/102989
+// { dg-do compile }
+
+_BitInt(63) a;			// { dg-error "expected" }
+unsigned _BitInt(31) b;		// { dg-error "expected" }
+int c = 21wb;			// { dg-error "invalid suffix \"wb\" on integer constant" "" { target c++98_only } }
+				// { dg-error "unable to find numeric literal operator 'operator\"\"wb'" "" { target c++11 } .-1 }
+long long d = 60594869054uwb;	// { dg-error "invalid suffix \"uwb\" on integer constant" "" { target c++98_only } }
+				// { dg-error "unable to find numeric literal operator 'operator\"\"uwb'" "" { target c++11 } .-1 }
--- gcc/testsuite/g++.dg/ext/bitint2.C.jj	2023-08-10 10:42:41.950485375 +0200
+++ gcc/testsuite/g++.dg/ext/bitint2.C	2023-08-10 10:42:57.033267905 +0200
@@ -0,0 +1,10 @@
+// PR c/102989
+// { dg-do compile }
+// { dg-options "" }
+
+_BitInt(63) a;			// { dg-error "expected" }
+unsigned _BitInt(31) b;		// { dg-error "expected" }
+int c = 21wb;			// { dg-error "invalid suffix \"wb\" on integer constant" "" { target c++98_only } }
+				// { dg-error "unable to find numeric literal operator 'operator\"\"wb'" "" { target c++11 } .-1 }
+long long d = 60594869054uwb;	// { dg-error "invalid suffix \"uwb\" on integer constant" "" { target c++98_only } }
+				// { dg-error "unable to find numeric literal operator 'operator\"\"uwb'" "" { target c++11 } .-1 }
--- gcc/testsuite/g++.dg/ext/bitint3.C.jj	2023-08-10 10:43:51.410483886 +0200
+++ gcc/testsuite/g++.dg/ext/bitint3.C	2023-08-10 10:50:06.969068962 +0200
@@ -0,0 +1,8 @@
+// PR c/102989
+// { dg-do compile { target c++11 } }
+
+constexpr int operator""wb (unsigned long long) { return 0; }	// { dg-warning "reserved for future standardization" }
+constexpr int operator""uwb (unsigned long long) { return 1; }	// { dg-warning "reserved for future standardization" }
+
+static_assert (-42wb == 0, "");
+static_assert (81uwb == 1, "");
--- gcc/testsuite/g++.dg/ext/bitint4.C.jj	2023-08-10 10:45:20.503199319 +0200
+++ gcc/testsuite/g++.dg/ext/bitint4.C	2023-08-10 10:50:21.345861685 +0200
@@ -0,0 +1,9 @@
+// PR c/102989
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+constexpr int operator""wb (unsigned long long) { return 0; }	// { dg-warning "reserved for future standardization" }
+constexpr int operator""uwb (unsigned long long) { return 1; }	// { dg-warning "reserved for future standardization" }
+
+static_assert (-42wb == 0, "");
+static_assert (81uwb == 1, "");
--- libcpp/expr.cc.jj	2023-08-10 09:26:39.782509626 +0200
+++ libcpp/expr.cc	2023-08-10 11:44:29.337127064 +0200
@@ -856,6 +856,29 @@ cpp_classify_number (cpp_reader *pfile,
 				 virtual_location, 0, message);
        }
 
+      if ((result & CPP_N_BITINT) != 0
+	  && CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) != 0)
+	{
+	  if (CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) > 0)
+	    {
+	      const char *message = N_("ISO C does not support literal "
+				       "%<wb%> suffixes before C2X");
+	      if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, true_false))
+		cpp_pedwarning_with_line (pfile, CPP_W_C11_C2X_COMPAT,
+					  virtual_location, 0, message);
+	      else
+		cpp_warning_with_line (pfile, CPP_W_C11_C2X_COMPAT,
+				       virtual_location, 0, message);
+	    }
+	  else if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, true_false))
+	    {
+	      const char *message = N_("ISO C does not support literal "
+				       "%<wb%> suffixes before C2X");
+	      cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
+				   message);
+	    }
+	}
+
       result |= CPP_N_INTEGER;
     }
 


	Jakub


  reply	other threads:[~2023-08-10 15:23 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-09 18:14 [PATCH 0/12] GCC _BitInt support [PR102989] Jakub Jelinek
2023-08-09 21:17 ` Joseph Myers
2023-08-10  6:55   ` Richard Biener
2023-08-10  7:12     ` Jakub Jelinek
2023-08-10  7:26       ` Andrew Pinski
2023-08-10 10:10   ` [PATCH 13/12] C _BitInt incremental fixes [PR102989] Jakub Jelinek
2023-08-10 15:22     ` Jakub Jelinek [this message]
2023-09-05 22:26       ` [PATCH 13/12 v2] " Joseph Myers
2023-08-21 15:24 ` Patch ping Re: [PATCH 0/12] GCC _BitInt support [PR102989] Jakub Jelinek
2023-08-21 17:32   ` Joseph Myers
2023-08-22 11:28     ` [PATCH 14/12] libgcc _BitInt helper documentation [PR102989] Jakub Jelinek
2023-09-01 21:32       ` Joseph Myers
2023-09-02 11:41         ` Jakub Jelinek
2023-08-22 22:48   ` Patch ping Re: [PATCH 0/12] GCC _BitInt support [PR102989] Andrew Pinski
2023-08-28  9:04   ` Patch ping^2 " Jakub Jelinek
2023-09-18 11:39 ` Matthew Malcomson
2023-09-18 21:31   ` Joseph Myers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZNUA0zC/RG/cqnB5@tucnak \
    --to=jakub@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=joseph@codesourcery.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).