From: Jason Merrill Date: Sat, 23 Mar 2013 05:01:12 +0000 (-0400) Subject: re PR c++/56646 (ICE: in cp_parser_late_return_type_opt, at cp/parser.c:16970) X-Git-Tag: releases/gcc-4.7.3~106 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0600d3dd70310a34886f206cc35d14578858911c;p=thirdparty%2Fgcc.git re PR c++/56646 (ICE: in cp_parser_late_return_type_opt, at cp/parser.c:16970) PR c++/56646 * parser.c (cp_parser_late_return_type_opt): Save and restore current_class_ptr/ref. From-SVN: r197000 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index acecb5add443..7cf4e6666088 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-03-20 Jason Merrill + + PR c++/56646 + * parser.c (cp_parser_late_return_type_opt): Save and restore + current_class_ptr/ref. + 2013-03-14 Jason Merrill PR c++/56614 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index cdb524e2f033..f875b66ffa4a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -16699,17 +16699,21 @@ cp_parser_late_return_type_opt (cp_parser* parser, cp_cv_quals quals) /* Consume the ->. */ cp_lexer_consume_token (parser->lexer); + tree save_ccp = current_class_ptr; + tree save_ccr = current_class_ref; if (quals >= 0) { /* DR 1207: 'this' is in scope in the trailing return type. */ - gcc_assert (current_class_ptr == NULL_TREE); inject_this_parameter (current_class_type, quals); } type = cp_parser_trailing_type_id (parser); if (quals >= 0) - current_class_ptr = current_class_ref = NULL_TREE; + { + current_class_ptr = save_ccp; + current_class_ref = save_ccr; + } return type; } diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing9.C b/gcc/testsuite/g++.dg/cpp0x/trailing9.C new file mode 100644 index 000000000000..d7895b38e3ef --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trailing9.C @@ -0,0 +1,12 @@ +// PR c++/56646 +// { dg-require-effective-target c++11 } + +struct A { + void f(); +}; + +void A::f() { + struct B { + auto g() -> void { } + }; +}