From 02668aba7ebce73b74ec9e5f9af08637fcedc5a7 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Thu, 20 Sep 2007 23:15:07 +0100 Subject: [PATCH] c-decl.c (check_bitfield_type_and_width): Don't allow _Bool bit-fields wider than one bit. * 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 | 5 +++++ gcc/c-decl.c | 5 +---- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/c99-bool-1.c | 14 ------------- gcc/testsuite/gcc.dg/c99-bool-2.c | 14 +++++++++++++ gcc/testsuite/gcc.dg/c99-bool-3.c | 33 +++++++++++++++++++++++++++++++ 6 files changed, 57 insertions(+), 18 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/c99-bool-2.c create mode 100644 gcc/testsuite/gcc.dg/c99-bool-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1a69d02d80d..99d77b15714 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-09-20 Joseph Myers + + * c-decl.c (check_bitfield_type_and_width): Don't allow _Bool + bit-fields wider than one bit. + 2007-09-20 Jakub Jelinek PR debug/33316 diff --git a/gcc/c-decl.c b/gcc/c-decl.c index ee8e7853383..493a57ed714 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -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)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 14fb1f344a1..e641604870e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-09-20 Joseph Myers + + * gcc.dg/c99-bool-2.c, gcc.dg/c99-bool-3.c: New tests. + 2007-09-20 Francois-Xavier Coudert PR fortran/33221 diff --git a/gcc/testsuite/gcc.dg/c99-bool-1.c b/gcc/testsuite/gcc.dg/c99-bool-1.c index 710219620b7..7ec99a76bfd 100644 --- a/gcc/testsuite/gcc.dg/c99-bool-1.c +++ b/gcc/testsuite/gcc.dg/c99-bool-1.c @@ -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 index 00000000000..5a577a428d6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c99-bool-2.c @@ -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 */ +/* { 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 index 00000000000..f93547ac016 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c99-bool-3.c @@ -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 */ +/* { 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); +} -- 2.30.2