decl.c (grokdeclarator): Don't treat arbitrary types as unsigned just because flag_si...
authorMark Mitchell <mark@codesourcery.com>
Thu, 3 Jun 1999 10:07:18 +0000 (10:07 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 3 Jun 1999 10:07:18 +0000 (10:07 +0000)
* decl.c (grokdeclarator): Don't treat arbitrary types as unsigned
just because flag_signed_bitfields is false.

From-SVN: r27328

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.old-deja/g++.other/bitfld2.C [new file with mode: 0644]

index 49ea8bc609eac9aa352514d2607d776e8076c8bf..b7f428906ab400bb12788cf66f80b4964a3ca1a8 100644 (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
index ac9933c819ae9858add858205cf228b5a3250b4a..1592a64b21115837f5c4be2bbd8f217ecb9a4d6a 100644 (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;
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 (file)
index 0000000..466c5ce
--- /dev/null
@@ -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
+};