From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1251) id C38833858C2C; Thu, 10 Mar 2022 07:33:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C38833858C2C MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Roger Sayle To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-7573] PR c++/39751: ICE-on-invalid parsing regression. X-Act-Checkin: gcc X-Git-Author: Roger Sayle X-Git-Refname: refs/heads/master X-Git-Oldrev: 8cc4f9cd824d195178632569c749f96b306475f9 X-Git-Newrev: 2185c9734ad977b88c519a4579187a91b3f71edd Message-Id: <20220310073319.C38833858C2C@sourceware.org> Date: Thu, 10 Mar 2022 07:33:19 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Mar 2022 07:33:19 -0000 https://gcc.gnu.org/g:2185c9734ad977b88c519a4579187a91b3f71edd commit r12-7573-g2185c9734ad977b88c519a4579187a91b3f71edd Author: Roger Sayle Date: Thu Mar 10 07:32:06 2022 +0000 PR c++/39751: ICE-on-invalid parsing regression. This is a fix for PR c++/39751 which is an ICE-on-invalid regression in the C++ parser after encountering the end of file. The one line change is to check that the tokens cached in DECL_PENDING_INLINE_INFO haven't been purged before processing them in cp_parser_late_parsing_for_member. 2022-03-10 Roger Sayle gcc/cp/ChangeLog PR c++/39751 * parser.cc (cp_parser_late_parsing_for_member): Confirm the token stream hasn't been purged before processing DECL_PENDING_INLINE. gcc/testsuite/ChangeLog PR c++/39751 * g++.dg/parse/pr39751.C: New test case. Diff: --- gcc/cp/parser.cc | 5 +++-- gcc/testsuite/g++.dg/parse/pr39751.C | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 5c342ca631b..18db9d40a01 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -32119,8 +32119,9 @@ cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function) maybe_begin_member_template_processing (member_function); /* If the body of the function has not yet been parsed, parse it - now. */ - if (DECL_PENDING_INLINE_P (member_function)) + now. Except if the tokens have been purged (PR c++/39751). */ + if (DECL_PENDING_INLINE_P (member_function) + && !DECL_PENDING_INLINE_INFO (member_function)->first->purged_p) { tree function_scope; cp_token_cache *tokens; diff --git a/gcc/testsuite/g++.dg/parse/pr39751.C b/gcc/testsuite/g++.dg/parse/pr39751.C new file mode 100644 index 00000000000..cfe803c6b2f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr39751.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ + +template < typename > +struct A +{ +A < struct +{ +f () : + +// { dg-excess-errors "" }