c++: ICE when late parsing noexcept/NSDMI [PR98333]
authorMarek Polacek <polacek@redhat.com>
Fri, 8 Jan 2021 20:48:41 +0000 (15:48 -0500)
committerMarek Polacek <polacek@redhat.com>
Tue, 19 Jan 2021 20:38:12 +0000 (15:38 -0500)
commitc37f1d4081f5a19e39192d13e2a3acea13662e5a
tree2b54eeb11741ed9b45176013a08267250ec546b6
parent7266ff2a243715e20882850b2fc4211ac7db4d34
c++: ICE when late parsing noexcept/NSDMI [PR98333]

Since certain members of a class are a complete-class context
[class.mem.general]p7, we delay their parsing untile the whole class has
been parsed.  For instance, NSDMIs and noexcept-specifiers.  The order
in which we perform this delayed parsing matters; we were first parsing
NSDMIs and only they did we parse noexcept-specifiers.   That turns out
to be wrong: since NSDMIs may use noexcept-specifiers, we must process
noexcept-specifiers first.  Otherwise we'll ICE in code that doesn't
expect to see DEFERRED_PARSE.

This doesn't just shift the problem, noexcept-specifiers can use members
with a NSDMI just fine, and I've also tested a similar test with this
member function:

  bool f() { return __has_nothrow_constructor (S<true>); }

and that compiled fine too.

gcc/cp/ChangeLog:

PR c++/98333
* parser.c (cp_parser_class_specifier_1): Perform late-parsing
of NSDMIs before late-parsing of noexcept-specifiers.

gcc/testsuite/ChangeLog:

PR c++/98333
* g++.dg/cpp0x/noexcept62.C: New test.
gcc/cp/parser.c
gcc/testsuite/g++.dg/cpp0x/noexcept62.C [new file with mode: 0644]