From b89c5a7b53874bf0fa55f53a8ebbf16cc23ed345 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Thu, 3 Jun 1999 10:07:18 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 ++++ gcc/cp/decl.c | 26 +++++++++++++------ .../g++.old-deja/g++.other/bitfld2.C | 8 ++++++ 3 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/bitfld2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 49ea8bc609e..b7f428906ab 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +1999-06-03 Mark Mitchell + + * decl.c (grokdeclarator): Don't treat arbitrary types as unsigned + just because flag_signed_bitfields is false. + 1999-06-03 Nathan Sidwell * semantics.c (begin_class_definition): Update the struct's diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index ac9933c819a..1592a64b211 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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; diff --git a/gcc/testsuite/g++.old-deja/g++.other/bitfld2.C b/gcc/testsuite/g++.old-deja/g++.other/bitfld2.C new file mode 100644 index 00000000000..466c5cec728 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/bitfld2.C @@ -0,0 +1,8 @@ +// Origin: Mark Mitchell +// Special g++ Options: -funsigned-bitfields + +typedef int i[4]; + +struct S { + i j:12; // ERROR - array type as bitfield +}; -- 2.30.2