From: Simon Martin Date: Sat, 14 Jun 2008 05:21:30 +0000 (+0000) Subject: re PR c++/35320 (ICE with invalid friend declaration) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a6d9bc9dda3c7e4fe4475016fff3a9c45bc97c54;p=gcc.git re PR c++/35320 (ICE with invalid friend declaration) gcc/cp/ 2008-06-14 Simon Martin 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 PR c++/35320 * g++.dg/parse/bitfield3.C: New test. From-SVN: r136778 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 77f1c0c1583..0ff9cf447bb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2008-06-14 Simon Martin + + 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 PR c++/35317 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 952020ad045..8ad4fe34b9e 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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); diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 41af32faec4..ca9440f4230 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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; } diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 12d1a2d8ad9..467a603f992 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c68ba414467..eed09251e96 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-06-14 Simon Martin + + PR c++/35320 + * g++.dg/parse/bitfield3.C: New test. + 2008-06-14 Jerry DeLisle 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 index 00000000000..d907dcdd19b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/bitfield3.C @@ -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" } */ +};