c-tree.h (struct c_declspecs): Remove typedef_decl.
authorJoseph Myers <jsm@polyomino.org.uk>
Fri, 10 Sep 2004 23:10:05 +0000 (00:10 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Fri, 10 Sep 2004 23:10:05 +0000 (00:10 +0100)
* c-tree.h (struct c_declspecs): Remove typedef_decl.  Add
typedef_p and typedef_signed_p.
* c-decl.c (shadow_tag_warned): Check typedef_p, not typedef_decl.
(grokdeclarator): Don't use typedef_decl for warn_deprecated_use.
Check typedef_p and typedef_signed_p, not typedef_decl.
(grokfield): Check typedef_p, not typedef_decl.
(build_null_declspecs): Initialize typedef_p and typedef_signed_p,
not typedef_decl.
(declspecs_add_type): Set typedef_p and typedef_signed_p, not
typedef_decl.

testsuite:
* gcc.dg/bitfld-9.c: New test.

From-SVN: r87326

gcc/ChangeLog
gcc/c-decl.c
gcc/c-tree.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/bitfld-9.c [new file with mode: 0644]

index f4af2480d8c2c6a6fb41243c22b63b8764309a9b..4e691a19a49f3c17e143d7eea4580f37537255a7 100644 (file)
@@ -1,3 +1,16 @@
+2004-09-11  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+       * c-tree.h (struct c_declspecs): Remove typedef_decl.  Add
+       typedef_p and typedef_signed_p.
+       * c-decl.c (shadow_tag_warned): Check typedef_p, not typedef_decl.
+       (grokdeclarator): Don't use typedef_decl for warn_deprecated_use.
+       Check typedef_p and typedef_signed_p, not typedef_decl.
+       (grokfield): Check typedef_p, not typedef_decl.
+       (build_null_declspecs): Initialize typedef_p and typedef_signed_p,
+       not typedef_decl.
+       (declspecs_add_type): Set typedef_p and typedef_signed_p, not
+       typedef_decl.
+
 2004-09-10  Kazu Hirata  <kazu@cs.umass.edu>
 
        * doc/tm.texi, doc/tree-ssa.texi: Fix typos.
index 12e27a0053dc3518be3de01c5f17eceaaf2de159..dd0e42f0ab2421f5cdf6b7f461f1af9d77a37dde 100644 (file)
@@ -2681,7 +2681,7 @@ shadow_tag_warned (const struct c_declspecs *declspecs, int warned)
 
   pending_invalid_xref = 0;
 
-  if (declspecs->type && !declspecs->typedef_decl)
+  if (declspecs->type && !declspecs->typedef_p)
     {
       tree value = declspecs->type;
       enum tree_code code = TREE_CODE (value);
@@ -2724,7 +2724,7 @@ shadow_tag_warned (const struct c_declspecs *declspecs, int warned)
            }
        }
     }
-  else if (warned != 1 && !in_system_header && declspecs->typedef_decl)
+  else if (warned != 1 && !in_system_header && declspecs->typedef_p)
     {
       pedwarn ("useless type name in empty declaration");
       warned = 1;
@@ -3666,9 +3666,7 @@ grokdeclarator (const struct c_declarator *declarator,
     decl_context = PARM;
 
   if (declspecs->deprecated_p && deprecated_state != DEPRECATED_SUPPRESS)
-    warn_deprecated_use (declspecs->typedef_decl
-                        ? declspecs->typedef_decl
-                        : declspecs->type);
+    warn_deprecated_use (declspecs->type);
 
   typedef_type = type;
   if (type)
@@ -3782,8 +3780,7 @@ grokdeclarator (const struct c_declarator *declarator,
              || declspecs->explicit_char_p
              /* A typedef for plain `int' without `signed'
                 can be controlled just like plain `int'.  */
-             || ! (declspecs->typedef_decl != 0
-                   && C_TYPEDEF_EXPLICITLY_SIGNED (declspecs->typedef_decl)))
+             || !declspecs->typedef_signed_p)
          && TREE_CODE (type) != ENUMERAL_TYPE
          && !(specbits & 1 << (int) RID_SIGNED)))
     {
@@ -3795,7 +3792,7 @@ grokdeclarator (const struct c_declarator *declarator,
        type = short_unsigned_type_node;
       else if (type == char_type_node)
        type = unsigned_char_type_node;
-      else if (declspecs->typedef_decl)
+      else if (declspecs->typedef_p)
        type = c_common_unsigned_type (type);
       else
        type = unsigned_type_node;
@@ -4352,8 +4349,7 @@ grokdeclarator (const struct c_declarator *declarator,
        type = c_build_qualified_type (type, type_quals);
       decl = build_decl (TYPE_DECL, declarator->u.id, type);
       if ((specbits & (1 << (int) RID_SIGNED))
-         || (declspecs->typedef_decl
-             && C_TYPEDEF_EXPLICITLY_SIGNED (declspecs->typedef_decl)))
+         || declspecs->typedef_signed_p)
        C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1;
       decl_attributes (&decl, returned_attrs, 0);
       return decl;
@@ -5099,7 +5095,7 @@ grokfield (struct c_declarator *declarator, struct c_declspecs *declspecs,
       if (type
          && (TREE_CODE (type) == RECORD_TYPE
              || TREE_CODE (type) == UNION_TYPE)
-         && (flag_ms_extensions || !declspecs->typedef_decl))
+         && (flag_ms_extensions || !declspecs->typedef_p))
        {
          if (flag_ms_extensions)
            ; /* ok */
@@ -6728,11 +6724,12 @@ build_null_declspecs (void)
 {
   struct c_declspecs *ret = XOBNEW (&parser_obstack, struct c_declspecs);
   ret->type = 0;
-  ret->typedef_decl = 0;
   ret->decl_attr = 0;
   ret->attrs = 0;
   ret->specbits = 0;
   ret->non_sc_seen_p = false;
+  ret->typedef_p = false;
+  ret->typedef_signed_p = false;
   ret->deprecated_p = false;
   ret->explicit_int_p = false;
   ret->explicit_char_p = false;
@@ -6807,7 +6804,8 @@ declspecs_add_type (struct c_declspecs *specs, tree type)
        {
          specs->type = TREE_TYPE (type);
          specs->decl_attr = DECL_ATTRIBUTES (type);
-         specs->typedef_decl = type;
+         specs->typedef_p = true;
+         specs->typedef_signed_p = C_TYPEDEF_EXPLICITLY_SIGNED (type);
        }
     }
   /* Built-in types come as identifiers.  */
index 37075518b83138fc52f56f43c2c28b806597103d..dde8dc3249d01b0ed87726c203053f4abfc0693f 100644 (file)
@@ -136,8 +136,6 @@ struct c_declspecs {
   /* The type specified, not reflecting modifiers such as "short" and
      "unsigned", or NULL_TREE if none.  */
   tree type;
-  /* If the type was specified with a typedef, that typedef decl.  */
-  tree typedef_decl;
   /* The attributes from a typedef decl.  */
   tree decl_attr;
   /* When parsing, the attributes.  Outside the parser, this will be
@@ -153,6 +151,11 @@ struct c_declspecs {
      specifiers to be handled separately from storage class
      specifiers.)  */
   BOOL_BITFIELD non_sc_seen_p : 1;
+  /* Whether the type is specified by a typedef.  */
+  BOOL_BITFIELD typedef_p : 1;
+  /* Whether the type is specified by a typedef whose type is
+     explicitly "signed".  */
+  BOOL_BITFIELD typedef_signed_p : 1;
   /* Whether the specifiers include a deprecated typedef.  */
   BOOL_BITFIELD deprecated_p : 1;
   /* Whether "int" was explicitly specified.  */
index 80dd8b05c5d08d37393eb2bfc552b7c7acddc5c0..056073cce16048acb324e31cfc37ae6e3dce3527 100644 (file)
@@ -1,3 +1,7 @@
+2004-09-11  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+       * gcc.dg/bitfld-9.c: New test.
+
 2004-09-10  Richard Sandiford  <rsandifo@redhat.com>
 
        * gcc.c-torture/execute/ieee/acc1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/bitfld-9.c b/gcc/testsuite/gcc.dg/bitfld-9.c
new file mode 100644 (file)
index 0000000..d6ae0ac
--- /dev/null
@@ -0,0 +1,119 @@
+/* Test -funsigned-bitfields works.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do run } */
+/* { dg-options "-funsigned-bitfields -fsigned-char" } */
+
+typedef char c;
+typedef signed char sc;
+typedef unsigned char uc;
+typedef short s;
+typedef signed short ss;
+typedef unsigned short us;
+typedef n;
+typedef int i;
+typedef signed int si;
+typedef unsigned int ui;
+typedef long l;
+typedef signed long sl;
+typedef unsigned long ul;
+typedef long long ll;
+typedef signed long long sll;
+typedef unsigned long long ull;
+
+typedef c ct;
+typedef sc sct;
+typedef uc uct;
+typedef s st;
+typedef ss sst;
+typedef us ust;
+typedef n nt;
+typedef i it;
+typedef si sit;
+typedef ui uit;
+typedef l lt;
+typedef sl slt;
+typedef ul ult;
+typedef ll llt;
+typedef sll sllt;
+typedef ull ullt;
+
+struct foo {
+  char char0 : 1;
+  c char1 : 1;
+  ct char2 : 1;
+  signed char schar0 : 1;
+  sc schar1 : 1;
+  sct schar2 : 1;
+  unsigned char uchar0 : 1;
+  uc uchar1 : 1;
+  uct uchar2 : 1;
+  short short0 : 1;
+  s short1 : 1;
+  st short2 : 1;
+  signed short sshort0 : 1;
+  ss sshort1 : 1;
+  sst sshort2 : 1;
+  unsigned short ushort0 : 1;
+  us ushort1 : 1;
+  ust ushort2 : 1;
+  __attribute__((dummy)) int0 : 1; /* { dg-warning "attribute directive ignored" } */
+  n int1 : 1;
+  nt int2 : 1;
+  int int3 : 1;
+  i int4 : 1;
+  it int5 : 1;
+  signed int sint0 : 1;
+  si sint1 : 1;
+  sit sint2 : 1;
+  unsigned int uint0 : 1;
+  ui uint1 : 1;
+  uit uint2 : 1;
+  long long0 : 1;
+  l long1 : 1;
+  lt long2 : 1;
+  signed long slong0 : 1;
+  sl slong1 : 1;
+  slt slong2 : 1;
+  unsigned long ulong0 : 1;
+  ul ulong1 : 1;
+  ult ulong2 : 1;
+  long long llong0 : 1;
+  ll llong1 : 1;
+  llt llong2 : 1;
+  signed long long sllong0 : 1;
+  sll sllong1 : 1;
+  sllt sllong2 : 1;
+  unsigned long long ullong0 : 1;
+  ull ullong1 : 1;
+  ullt ullong2 : 1;
+};
+
+struct foo x;
+
+extern void abort (void);
+extern void exit (int);
+extern void *memset (void *, int, __SIZE_TYPE__);
+
+int
+main (void)
+{
+  memset (&x, (unsigned char)-1, sizeof(x));
+  if (x.char0 != 1 || x.char1 != 1 || x.char2 != 1
+      || x.schar0 != -1 || x.schar1 != -1 || x.schar2 != -1
+      || x.uchar0 != 1 || x.uchar1 != 1 || x.uchar2 != 1
+      || x.short0 != 1 || x.short1 != 1 || x.short2 != 1
+      || x.sshort0 != -1 || x.sshort1 != -1 || x.sshort2 != -1
+      || x.ushort0 != 1 || x.ushort1 != 1 || x.ushort2 != 1
+      || x.int0 != 1 || x.int1 != 1 || x.int2 != 1
+      || x.int3 != 1 || x.int4 != 1 || x.int5 != 1
+      || x.sint0 != -1 || x.sint1 != -1 || x.sint2 != -1
+      || x.uint0 != 1 || x.uint1 != 1 || x.uint2 != 1
+      || x.long0 != 1 || x.long1 != 1 || x.long2 != 1
+      || x.slong0 != -1 || x.slong1 != -1 || x.slong2 != -1
+      || x.ulong0 != 1 || x.ulong1 != 1 || x.ulong2 != 1
+      || x.llong0 != 1 || x.llong1 != 1 || x.llong2 != 1
+      || x.sllong0 != -1 || x.sllong1 != -1 || x.sllong2 != -1
+      || x.ullong0 != 1 || x.ullong1 != 1 || x.ullong2 != 1)
+    abort ();
+  exit (0);
+}