Commit 977a173c by Marek Polacek

c++: Fix ICE with delayed parsing of noexcept-specifier [PR95562]

Here we ICE because a DEFERRED_PARSE expression leaked to tsubst_copy.
We create these expressions for deferred noexcept-specifiers in
cp_parser_save_noexcept; they are supposed to be re-parsed in
cp_parser_late_noexcept_specifier.  In this case we never got around
to re-parsing it because the noexcept-specifier was attached to a
pointer to a function, not to a function declaration.  But we should
not have delayed the parsing here in the first place; we already
avoid delaying the parsing for alias-decls, typedefs, and friend
function declarations.  (Clang++ also doesn't delay the parsing
for pointers to function.)

gcc/cp/ChangeLog:

	PR c++/95562
	* parser.c (cp_parser_direct_declarator): Clear
	CP_PARSER_FLAGS_DELAY_NOEXCEPT if the declarator kind is not
	cdk_id.

gcc/testsuite/ChangeLog:

	PR c++/95562
	* g++.dg/cpp0x/noexcept60.C: New test.
parent cc00eb0a
...@@ -21225,6 +21225,12 @@ cp_parser_direct_declarator (cp_parser* parser, ...@@ -21225,6 +21225,12 @@ cp_parser_direct_declarator (cp_parser* parser,
ref_qual = cp_parser_ref_qualifier_opt (parser); ref_qual = cp_parser_ref_qualifier_opt (parser);
/* Parse the tx-qualifier. */ /* Parse the tx-qualifier. */
tree tx_qual = cp_parser_tx_qualifier_opt (parser); tree tx_qual = cp_parser_tx_qualifier_opt (parser);
/* If it turned out that this is e.g. a pointer to a
function, we don't want to delay noexcept parsing. */
if (declarator == NULL || declarator->kind != cdk_id)
flags &= ~CP_PARSER_FLAGS_DELAY_NOEXCEPT;
/* And the exception-specification. */ /* And the exception-specification. */
exception_specification exception_specification
= cp_parser_exception_specification_opt (parser, = cp_parser_exception_specification_opt (parser,
// PR c++/95562
// { dg-do compile { target c++11 } }
template <bool Nothrow>
struct Functions
{
void (*func)(void*) noexcept(Nothrow);
};
void test()
{
Functions<true> f{};
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment