c-decl.c (check_bitfield_type_and_width): Don't allow _Bool bit-fields wider than...
authorJoseph Myers <joseph@codesourcery.com>
Thu, 20 Sep 2007 22:15:07 +0000 (23:15 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Thu, 20 Sep 2007 22:15:07 +0000 (23:15 +0100)
* c-decl.c (check_bitfield_type_and_width): Don't allow _Bool
bit-fields wider than one bit.

testsuite:
* gcc.dg/c99-bool-2.c, gcc.dg/c99-bool-3.c: New tests.

From-SVN: r128634

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/c99-bool-1.c
gcc/testsuite/gcc.dg/c99-bool-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c99-bool-3.c [new file with mode: 0644]

index 1a69d02d80df8c175f545c17b049625c73a383bb..99d77b157144917187d2b67f26e0a94b2160711a 100644 (file)
@@ -1,3 +1,8 @@
+2007-09-20  Joseph Myers  <joseph@codesourcery.com>
+
+       * c-decl.c (check_bitfield_type_and_width): Don't allow _Bool
+       bit-fields wider than one bit.
+
 2007-09-20  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/33316
index ee8e7853383b3955abb4fc19abd7278807a7d7e0..493a57ed714c6fea2d9b59f955d7dd842cbc703b 100644 (file)
@@ -3853,10 +3853,7 @@ check_bitfield_type_and_width (tree *type, tree *width, const char *orig_name)
       && type_mv != boolean_type_node)
     pedwarn ("type of bit-field %qs is a GCC extension", name);
 
-  if (type_mv == boolean_type_node)
-    max_width = CHAR_TYPE_SIZE;
-  else
-    max_width = TYPE_PRECISION (*type);
+  max_width = TYPE_PRECISION (*type);
 
   if (0 < compare_tree_int (*width, max_width))
     {
index 14fb1f344a1a115c0daa302338cf61470f6a5b8f..e641604870ef2ff412cb5797bcc3d4b93d6fa619 100644 (file)
@@ -1,3 +1,7 @@
+2007-09-20  Joseph Myers  <joseph@codesourcery.com>
+
+       * gcc.dg/c99-bool-2.c, gcc.dg/c99-bool-3.c: New tests.
+
 2007-09-20  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        PR fortran/33221
index 710219620b7e334b86ef12980be9fe13b14cbdd5..7ec99a76bfdeb40f9ccaafc0f8af1e8640e04229 100644 (file)
@@ -32,8 +32,6 @@ int c = __bool_true_false_are_defined;
 struct foo
 {
   _Bool a : 1;
-  _Bool b : 2;
-  _Bool c : 7;
 } sf;
 
 #define str(x) xstr(x)
@@ -242,21 +240,9 @@ main (void)
     sf.a = 1;
     if (sf.a != 1)
       abort ();
-    sf.b = 1;
-    if (sf.b != 1)
-      abort ();
-    sf.c = 1;
-    if (sf.c != 1)
-      abort ();
     sf.a = 0;
     if (sf.a != 0)
       abort ();
-    sf.b = 0;
-    if (sf.b != 0)
-      abort ();
-    sf.c = 0;
-    if (sf.c != 0)
-      abort ();
   }
   exit (0);
 }
diff --git a/gcc/testsuite/gcc.dg/c99-bool-2.c b/gcc/testsuite/gcc.dg/c99-bool-2.c
new file mode 100644 (file)
index 0000000..5a577a4
--- /dev/null
@@ -0,0 +1,14 @@
+/* Test for _Bool bit-fields.  After TC2, the width of a _Bool
+   bit-field must not extend the width (number of sign and value bits)
+   of _Bool, which is implementation-defined but is 1 unless the
+   implementation defines representations for values greater than 1 in
+   type _Bool and allows for _Bool objects to have such types, which
+   GCC does not.  */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+struct foo
+{
+  _Bool b : 2; /* { dg-error "width" } */
+};
diff --git a/gcc/testsuite/gcc.dg/c99-bool-3.c b/gcc/testsuite/gcc.dg/c99-bool-3.c
new file mode 100644 (file)
index 0000000..f93547a
--- /dev/null
@@ -0,0 +1,33 @@
+/* Test for _Bool bit-fields.  They have the semantics of _Bool, at
+   least for now (DR#335 Spring 2007 discussion).  */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do run } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+struct foo
+{
+  _Bool a : 1;
+} sf;
+
+extern void abort (void);
+extern void exit (int);
+
+int
+main (void)
+{
+  int i;
+  for (i = 0; i < sizeof (struct foo); i++)
+    *((unsigned char *)&sf + i) = (unsigned char) -1;
+  sf.a = 2;
+  if (sf.a != 1)
+    abort ();
+  sf.a = 0;
+  if (sf.a != 0)
+    abort ();
+  sf.a = 0.2;
+  if (sf.a != 1)
+    abort ();
+  sf.a = &sf;
+  if (sf.a != 1)
+    abort ();
+  exit (0);
+}