From: Paolo Carlini Date: Fri, 11 Oct 2013 14:35:23 +0000 (+0000) Subject: re PR c++/58633 (ICE with decltype of destructor call) X-Git-Tag: releases/gcc-4.9.0~3568 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=20e8fa532721590da0c89a8f442a9d1197eb2083;p=thirdparty%2Fgcc.git re PR c++/58633 (ICE with decltype of destructor call) /cp 2013-10-11 Paolo Carlini PR c++/58633 * parser.c (cp_parser_commit_to_topmost_tentative_parse): New. (cp_parser_pseudo_destructor_name): Use it. /testsuite 2013-10-11 Paolo Carlini PR c++/58633 * g++.dg/cpp0x/decltype57.C: New. From-SVN: r203448 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1e0c46cd45f9..d1af38217bc3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-10-11 Paolo Carlini + + PR c++/58633 + * parser.c (cp_parser_commit_to_topmost_tentative_parse): New. + (cp_parser_pseudo_destructor_name): Use it. + 2013-10-11 Paolo Carlini PR c++/31671 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 83fdfaba40f3..4189bf6f117b 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2395,6 +2395,8 @@ static void cp_parser_parse_tentatively (cp_parser *); static void cp_parser_commit_to_tentative_parse (cp_parser *); +static void cp_parser_commit_to_topmost_tentative_parse + (cp_parser *); static void cp_parser_abort_tentative_parse (cp_parser *); static bool cp_parser_parse_definitely @@ -6741,7 +6743,7 @@ cp_parser_pseudo_destructor_name (cp_parser* parser, /* Once we see the ~, this has to be a pseudo-destructor. */ if (!processing_template_decl && !cp_parser_error_occurred (parser)) - cp_parser_commit_to_tentative_parse (parser); + cp_parser_commit_to_topmost_tentative_parse (parser); /* Look for the type-name again. We are not responsible for checking that it matches the first type-name. */ @@ -24449,6 +24451,32 @@ cp_parser_commit_to_tentative_parse (cp_parser* parser) } } +/* Commit to the topmost currently active tentative parse. + + Note that this function shouldn't be called when there are + irreversible side-effects while in a tentative state. For + example, we shouldn't create a permanent entry in the symbol + table, or issue an error message that might not apply if the + tentative parse is aborted. */ + +static void +cp_parser_commit_to_topmost_tentative_parse (cp_parser* parser) +{ + cp_parser_context *context = parser->context; + cp_lexer *lexer = parser->lexer; + + if (context) + { + if (context->status == CP_PARSER_STATUS_KIND_COMMITTED) + return; + context->status = CP_PARSER_STATUS_KIND_COMMITTED; + + while (!cp_lexer_saving_tokens (lexer)) + lexer = lexer->next; + cp_lexer_commit_tokens (lexer); + } +} + /* Abort the currently active tentative parse. All consumed tokens will be rolled back, and no diagnostics will be issued. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c27d500b211c..87ff2a7dacaf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-10-11 Paolo Carlini + + PR c++/58633 + * g++.dg/cpp0x/decltype57.C: New. + 2013-10-11 Paolo Carlini PR c++/31671 diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype57.C b/gcc/testsuite/g++.dg/cpp0x/decltype57.C new file mode 100644 index 000000000000..353cc72c3357 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype57.C @@ -0,0 +1,8 @@ +// PR c++/58633 +// { dg-do compile { target c++11 } } + +void foo(int i) +{ + typedef int I; + decltype(i.I::~I())* p; +}