This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [C PATCH] Don't pedwarn for C99/C11 enum bit-fields (PR c/57773)
- From: Marek Polacek <polacek at redhat dot com>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 6 Jan 2014 12:42:21 +0100
- Subject: Re: [C PATCH] Don't pedwarn for C99/C11 enum bit-fields (PR c/57773)
- Authentication-results: sourceware.org; auth=none
- References: <20140103165342 dot GB29237 at redhat dot com> <Pine dot LNX dot 4 dot 64 dot 1401031714380 dot 6742 at digraph dot polyomino dot org dot uk>
On Fri, Jan 03, 2014 at 05:17:28PM +0000, Joseph S. Myers wrote:
> Implementation-defined behavior is documented in implement-c.texi, so this
> patch is incomplete as it doesn't update that file where it says:
>
> No other types are permitted in strictly conforming mode.
> @c Would it be better to restrict the pedwarn for other types to C90
> @c mode and document the other types for C99/C11 mode?
Sorry for missing this one.
> (And this isn't just about enums, but other integer types as well, so the
> test should cover those.)
I've put some more types in the test.
Ok now? Thanks,
2014-01-06 Marek Polacek <polacek@redhat.com>
PR c/57773
* doc/implement-c.texi: Mention that other integer types are
permitted as bit-field types in strictly conforming mode.
c/
* c-decl.c (check_bitfield_type_and_width): Warn for implementation
defined bit-field types only in ISO C.
testsuite/
* gcc.dg/pr57773.c: New test.
--- gcc/doc/implement-c.texi.mp 2014-01-03 18:22:47.320742545 +0100
+++ gcc/doc/implement-c.texi 2014-01-06 12:34:02.280756348 +0100
@@ -479,9 +479,8 @@ by the @option{-funsigned-bitfields} opt
@cite{Allowable bit-field types other than @code{_Bool}, @code{signed int},
and @code{unsigned int} (C99 and C11 6.7.2.1).}
-No other types are permitted in strictly conforming mode.
-@c Would it be better to restrict the pedwarn for other types to C90
-@c mode and document the other types for C99/C11 mode?
+Other integer types, such as @code{long int}, and enumerated types are
+permitted even in strictly conforming mode.
@item
@cite{Whether atomic types are permitted for bit-fields (C11 6.7.2.1).}
--- gcc/c/c-decl.c.mp 2014-01-03 13:50:37.041997222 +0100
+++ gcc/c/c-decl.c 2014-01-03 14:46:29.115816235 +0100
@@ -4840,7 +4840,8 @@ check_bitfield_type_and_width (tree *typ
if (!in_system_header_at (input_location)
&& type_mv != integer_type_node
&& type_mv != unsigned_type_node
- && type_mv != boolean_type_node)
+ && type_mv != boolean_type_node
+ && !flag_isoc99)
pedwarn (input_location, OPT_Wpedantic,
"type of bit-field %qs is a GCC extension", name);
--- gcc/testsuite/gcc.dg/pr57773.c.mp 2014-01-03 14:50:51.097902818 +0100
+++ gcc/testsuite/gcc.dg/pr57773.c 2014-01-06 12:34:24.000000000 +0100
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -Wpedantic" } */
+
+enum e { A };
+struct { enum e b: 2; } s1;
+struct { signed char b: 2; } s2;
+struct { unsigned char b: 2; } s3;
+struct { short b: 2; } s4;
+struct { unsigned short b: 2; } s5;
+struct { long int b: 2; } s6;
+struct { unsigned long int b: 2; } s7;
+struct { long long int b: 2; } s8;
+struct { unsigned long long int b: 2; } s9;
Marek