From: Paolo Carlini Date: Thu, 3 Oct 2013 22:50:59 +0000 (+0000) Subject: re PR c++/58584 ([c++11] ICE with invalid argument for alignas) X-Git-Tag: releases/gcc-4.9.0~3714 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2765f897251f68fa66b4a115a84f431d5402d88a;p=thirdparty%2Fgcc.git re PR c++/58584 ([c++11] ICE with invalid argument for alignas) /cp 2013-10-04 Paolo Carlini PR c++/58584 * decl2.c (save_template_attributes): Handle error_mark_node as *attr_p argument. (cp_check_const_attributes): Likewise for attributes. * parser.c (cp_parser_std_attribute_spec): When alignas_expr is an error_mark_node call cp_parser_skip_to_end_of_statement. /testsuite 2013-10-04 Paolo Carlini PR c++/58584 * g++.dg/cpp0x/gen-attrs-55.C: New. From-SVN: r203193 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cd7509427318..f618475d85bc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2013-10-04 Paolo Carlini + + PR c++/58584 + * decl2.c (save_template_attributes): Handle error_mark_node as + *attr_p argument. + (cp_check_const_attributes): Likewise for attributes. + * parser.c (cp_parser_std_attribute_spec): When alignas_expr is an + error_mark_node call cp_parser_skip_to_end_of_statement. + 2013-10-03 Easwaran Raman PR c++/33911 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 4ac9445ecc99..53e6bc9da1b7 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1218,10 +1218,12 @@ splice_template_attributes (tree *attr_p, tree decl) static void save_template_attributes (tree *attr_p, tree *decl_p) { - tree late_attrs = splice_template_attributes (attr_p, *decl_p); tree *q; - tree old_attrs = NULL_TREE; + if (attr_p && *attr_p == error_mark_node) + return; + + tree late_attrs = splice_template_attributes (attr_p, *decl_p); if (!late_attrs) return; @@ -1230,7 +1232,7 @@ save_template_attributes (tree *attr_p, tree *decl_p) else q = &TYPE_ATTRIBUTES (*decl_p); - old_attrs = *q; + tree old_attrs = *q; /* Merge the late attributes at the beginning with the attribute list. */ @@ -1318,6 +1320,9 @@ cp_reconstruct_complex_type (tree type, tree bottom) static void cp_check_const_attributes (tree attributes) { + if (attributes == error_mark_node) + return; + tree attr; for (attr = attributes; attr; attr = TREE_CHAIN (attr)) { diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 42b4e60219ee..1a9d6b9dfb1d 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -21458,6 +21458,8 @@ cp_parser_std_attribute_spec (cp_parser *parser) alignas_expr = cp_parser_assignment_expression (parser, /*cast_p=*/false, /**cp_id_kind=*/NULL); + if (alignas_expr == error_mark_node) + cp_parser_skip_to_end_of_statement (parser); if (alignas_expr == NULL_TREE || alignas_expr == error_mark_node) return alignas_expr; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b423b92620a3..d631f0f5775c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-10-04 Paolo Carlini + + PR c++/58584 + * g++.dg/cpp0x/gen-attrs-55.C: New. + 2013-10-03 Easwaran Raman PR c++/33911 diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C new file mode 100644 index 000000000000..c4e6deabe1dc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C @@ -0,0 +1,12 @@ +// PR c++/58584 +// { dg-do compile { target c++11 } } + +struct A +{ + int i alignas(this); // { dg-error "17:invalid use of 'this'" } +}; + +template struct B +{ + int j alignas(this); // { dg-error "17:invalid use of 'this'" } +};