decl.c (grokdeclarator): Don't treat arbitrary types as unsigned just because flag_signed_bitfields is false.

* decl.c (grokdeclarator): Don't treat arbitrary types as unsigned
	just because flag_signed_bitfields is false.

From-SVN: r27328
This commit is contained in:
Mark Mitchell 1999-06-03 10:07:18 +00:00 committed by Mark Mitchell
parent 5403593a44
commit b89c5a7b53
3 changed files with 31 additions and 8 deletions

View File

@ -1,3 +1,8 @@
1999-06-03 Mark Mitchell <mark@codesourcery.com>
* decl.c (grokdeclarator): Don't treat arbitrary types as unsigned
just because flag_signed_bitfields is false.
1999-06-03 Nathan Sidwell <nathan@acm.org>
* semantics.c (begin_class_definition): Update the struct's

View File

@ -9921,14 +9921,24 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
/* Decide whether an integer type is signed or not.
Optionally treat bitfields as signed by default. */
if (RIDBIT_SETP (RID_UNSIGNED, specbits)
|| (bitfield && ! flag_signed_bitfields
&& (explicit_int || defaulted_int || explicit_char
/* A typedef for plain `int' without `signed'
can be controlled just like plain `int'. */
|| ! (typedef_decl != NULL_TREE
&& C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
&& TREE_CODE (type) != ENUMERAL_TYPE
&& RIDBIT_NOTSETP (RID_SIGNED, specbits)))
/* [class.bit]
It is implementation-defined whether a plain (neither
explicitly signed or unsigned) char, short, int, or long
bit-field is signed or unsigned.
Naturally, we extend this to long long as well. Note that
this does not include wchar_t. */
|| (bitfield && !flag_signed_bitfields
&& RIDBIT_NOTSETP (RID_SIGNED, specbits)
/* A typedef for plain `int' without `signed' can be
controlled just like plain `int', but a typedef for
`signed int' cannot be so controlled. */
&& !(typedef_decl
&& C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
&& (TREE_CODE (type) == INTEGER_TYPE
|| TREE_CODE (type) == CHAR_TYPE)
&& !same_type_p (TYPE_MAIN_VARIANT (type), wchar_type_node))
{
if (longlong)
type = long_long_unsigned_type_node;

View File

@ -0,0 +1,8 @@
// Origin: Mark Mitchell <mark@codesourcery.com>
// Special g++ Options: -funsigned-bitfields
typedef int i[4];
struct S {
i j:12; // ERROR - array type as bitfield
};