public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Handle _Bool bit-fields according to C99 TC2
@ 2007-09-20 22:45 Joseph S. Myers
  0 siblings, 0 replies; only message in thread
From: Joseph S. Myers @ 2007-09-20 22:45 UTC (permalink / raw)
  To: gcc-patches

C99 TC2 changed the rules for bit-fields so that their widths are limited 
by the width (number of sign and value bits) of the underlying type, not 
including any padding bits, rather than by the total number of bits in an 
object of the underlying type.

This had the effect of limiting the width of _Bool bit-fields to that of 
_Bool.  The width of _Bool is implementation-defined and can be deduced 
not to exceed that of unsigned char.  But for it to be wider than 1 the 
implementation would have to define representations of values other than 0 
and 1 in type _Bool (though such representations could only get there by 
memcpy etc.) and not optimize on the basis that _Bool objects have value 0 
or 1.  GCC does not define such representations and does I believe presume 
a _Bool object is properly initialized to value 0 or 1.

So _Bool bit-fields should be restricted to width 1 for now (which 
actually simplifies the implementation); I've applied this patch to do so.  
The view on DR#335 at the London WG14 meeting was, in addition to _Bool 
bit-fields wider than 1 not being usable portably, that they should have 
the semantics of _Bool for conversions (rather than those of unsigned:1) 
so I've added a testcase for that.  (Having the semantics of _Bool was the 
existing semantics in GCC for _Bool:1 bit-fields; those wider than 1 bit 
behaved like normal unsigned types of the given width.)

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 128633)
+++ ChangeLog	(working copy)
@@ -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: testsuite/gcc.dg/c99-bool-1.c
===================================================================
--- testsuite/gcc.dg/c99-bool-1.c	(revision 128633)
+++ testsuite/gcc.dg/c99-bool-1.c	(working copy)
@@ -32,8 +32,6 @@
 struct foo
 {
   _Bool a : 1;
-  _Bool b : 2;
-  _Bool c : 7;
 } sf;
 
 #define str(x) xstr(x)
@@ -242,21 +240,9 @@
     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);
 }
Index: testsuite/gcc.dg/c99-bool-3.c
===================================================================
--- testsuite/gcc.dg/c99-bool-3.c	(revision 0)
+++ testsuite/gcc.dg/c99-bool-3.c	(revision 0)
@@ -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);
+}
Index: testsuite/gcc.dg/c99-bool-2.c
===================================================================
--- testsuite/gcc.dg/c99-bool-2.c	(revision 0)
+++ testsuite/gcc.dg/c99-bool-2.c	(revision 0)
@@ -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" } */
+};
Index: testsuite/ChangeLog
===================================================================
--- testsuite/ChangeLog	(revision 128633)
+++ testsuite/ChangeLog	(working copy)
@@ -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: c-decl.c
===================================================================
--- c-decl.c	(revision 128633)
+++ c-decl.c	(working copy)
@@ -3853,10 +3853,7 @@
       && 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))
     {

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2007-09-20 22:30 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-09-20 22:45 Handle _Bool bit-fields according to C99 TC2 Joseph S. Myers

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).