OSDN Git Service

gcc/cp/
authorsimartin <simartin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 14 Jun 2008 05:21:30 +0000 (05:21 +0000)
committersimartin <simartin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 14 Jun 2008 05:21:30 +0000 (05:21 +0000)
2008-06-14  Simon Martin  <simartin@users.sourceforge.net>

PR c++/35320
* decl2.c (grokbitfield): Receive the list of attributes, pass it to
grokdeclarator and apply it to the created declaration.
* cp-tree.h (grokbitfield): Update prototype.
* parser.c (cp_parser_member_declaration): Don't apply the attributes
since they are now applied in grokbitfield. Adjusted the call to
grokbitfield.
(cp_parser_objc_class_ivars): Likewise.

gcc/testsuite/

2008-06-14  Simon Martin  <simartin@users.sourceforge.net>

PR c++/35320
* g++.dg/parse/bitfield3.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@136778 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/bitfield3.C [new file with mode: 0644]

index 77f1c0c..0ff9cf4 100644 (file)
@@ -1,5 +1,16 @@
 2008-06-14  Simon Martin  <simartin@users.sourceforge.net>
 
+       PR c++/35320
+       * decl2.c (grokbitfield): Receive the list of attributes, pass it to
+       grokdeclarator and apply it to the created declaration.
+       * cp-tree.h (grokbitfield): Update prototype.
+       * parser.c (cp_parser_member_declaration): Don't apply the attributes
+       since they are now applied in grokbitfield. Adjusted the call to
+       grokbitfield.
+       (cp_parser_objc_class_ivars): Likewise.
+
+2008-06-14  Simon Martin  <simartin@users.sourceforge.net>
+
        PR c++/35317
        * class.c (type_requires_array_cookie): Do not consider delete[]
        operators with an ellipsis as second argument.
index 952020a..8ad4fe3 100644 (file)
@@ -4283,7 +4283,7 @@ extern void check_member_template         (tree);
 extern tree grokfield (const cp_declarator *, cp_decl_specifier_seq *,
                       tree, bool, tree, tree);
 extern tree grokbitfield (const cp_declarator *, cp_decl_specifier_seq *,
-                         tree);
+                         tree, tree);
 extern tree cp_reconstruct_complex_type                (tree, tree);
 extern void cplus_decl_attributes              (tree *, tree, int);
 extern void finish_anon_union                  (tree);
index 41af32f..ca9440f 100644 (file)
@@ -914,9 +914,10 @@ grokfield (const cp_declarator *declarator,
 
 tree
 grokbitfield (const cp_declarator *declarator,
-             cp_decl_specifier_seq *declspecs, tree width)
+             cp_decl_specifier_seq *declspecs, tree width,
+             tree attrlist)
 {
-  tree value = grokdeclarator (declarator, declspecs, BITFIELD, 0, NULL);
+  tree value = grokdeclarator (declarator, declspecs, BITFIELD, 0, &attrlist);
 
   if (value == error_mark_node) 
     return NULL_TREE; /* friends went bad.  */
@@ -972,6 +973,10 @@ grokbitfield (const cp_declarator *declarator,
     }
 
   DECL_IN_AGGR_P (value) = 1;
+
+  if (attrlist)
+    cplus_decl_attributes (&value, attrlist, /*flags=*/0);
+
   return value;
 }
 
index 12d1a2d..467a603 100644 (file)
@@ -15238,9 +15238,8 @@ cp_parser_member_declaration (cp_parser* parser)
                                                         sfk_none)
                                   : NULL,
                                   &decl_specifiers,
-                                  width);
-             /* Apply the attributes.  */
-             cplus_decl_attributes (&decl, attributes, /*flags=*/0);
+                                  width,
+                                  attributes);
            }
          else
            {
@@ -19150,11 +19149,10 @@ cp_parser_objc_class_ivars (cp_parser* parser)
          attributes = chainon (prefix_attributes, attributes);
 
          if (width)
-           {
              /* Create the bitfield declaration.  */
-             decl = grokbitfield (declarator, &declspecs, width);
-             cplus_decl_attributes (&decl, attributes, /*flags=*/0);
-           }
+             decl = grokbitfield (declarator, &declspecs,
+                                  width,
+                                  attributes);
          else
            decl = grokfield (declarator, &declspecs,
                              NULL_TREE, /*init_const_expr_p=*/false,
index c68ba41..eed0925 100644 (file)
@@ -1,3 +1,8 @@
+2008-06-14  Simon Martin  <simartin@users.sourceforge.net>
+
+       PR c++/35320
+       * g++.dg/parse/bitfield3.C: New test.
+
 2008-06-14  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/36538
diff --git a/gcc/testsuite/g++.dg/parse/bitfield3.C b/gcc/testsuite/g++.dg/parse/bitfield3.C
new file mode 100644 (file)
index 0000000..d907dcd
--- /dev/null
@@ -0,0 +1,9 @@
+/* PR c++/35320 */
+/* { dg-do "compile" } */
+
+typedef void (func_type)();
+
+struct A
+{
+  friend func_type f : 2; /* { dg-error "with non-integral type" } */
+};