re PR c++/35320 (ICE with invalid friend declaration)
authorSimon Martin <simartin@users.sourceforge.net>
Sat, 14 Jun 2008 05:21:30 +0000 (05:21 +0000)
committerSimon Martin <simartin@gcc.gnu.org>
Sat, 14 Jun 2008 05:21:30 +0000 (05:21 +0000)
gcc/cp/

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.

From-SVN: r136778

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 77f1c0c1583bc246c4dff7bb18e8ac8e31c125f5..0ff9cf447bb668f06135c2726c19e8876edb6362 100644 (file)
@@ -1,3 +1,14 @@
+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
index 952020ad0457981cc7511c43318f9a5a680b1f39..8ad4fe34b9e9fa9ebabe49bc9f339086964a437d 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 41af32faec406109e8d1d0f0d2dbb8950790d396..ca9440f4230a962554715083d0fe882550133d54 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 12d1a2d8ad98f81208828df74e58d4387ced34e1..467a603f99232def5ffdcc67a87315f64f339ba4 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 c68ba4144676225f41bede26ca4b6144e8c205f3..eed09251e9659911fdbb35ceca9070acf339e4cd 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" } */
+};