PR c++/86476 - noexcept-specifier is a complete-class context.
authorMarek Polacek <polacek@redhat.com>
Sat, 22 Jun 2019 15:14:30 +0000 (15:14 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Sat, 22 Jun 2019 15:14:30 +0000 (15:14 +0000)
commit78f7607db4c53f8cfe4653a6c91c0328bc2854c3
treed8c288e122322c16f7c0c600df65e9b34feaf7c2
parent7f3db013dc8264e39339ee4b83900ef25d0d32aa
PR c++/86476 - noexcept-specifier is a complete-class context.

PR c++/52869
* cp-tree.def (DEFAULT_ARG): Update commentary.
* cp-tree.h (UNPARSED_NOEXCEPT_SPEC_P): New macro.
(tree_default_arg): Use tree_base instead of tree_common.
(do_push_parm_decls, maybe_check_overriding_exception_spec): Declare.
* decl.c (do_push_parm_decls): New function, broken out of...
(store_parm_decls): ...here.  Call it.
* except.c (nothrow_spec_p): Accept DEFAULT_ARG in the assert.
* parser.c (cp_parser_noexcept_specification_opt,
cp_parser_late_noexcept_specifier, noexcept_override_late_checks):
Forward-declare.
(unparsed_noexcepts): New macro.
(push_unparsed_function_queues): Update initializer.
(cp_parser_direct_declarator): Pass FRIEND_P to
cp_parser_exception_specification_opt.
(inject_parm_decls): New.
(pop_injected_parms): New.
(cp_parser_class_specifier_1): Implement delayed parsing of
noexcept-specifiers.
(cp_parser_save_noexcept): New.
(cp_parser_late_noexcept_specifier): New.
(noexcept_override_late_checks): New.
(cp_parser_noexcept_specification_opt): Add FRIEND_P parameter.  Call
cp_parser_save_noexcept instead of the normal processing if needed.
(cp_parser_exception_specification_opt): Add FRIEND_P parameter and
pass it to cp_parser_noexcept_specification_opt.
(cp_parser_save_member_function_body): Fix comment.
(cp_parser_save_default_args): Maybe save the noexcept-specifier to
post process.
(cp_parser_transaction): Update call to
cp_parser_noexcept_specification_opt.
(cp_parser_transaction_expression): Likewise.
* parser.h (cp_unparsed_functions_entry): Add new field to carry
a noexcept-specifier.
* pt.c (dependent_type_p_r): Handle unparsed noexcept expression.
* search.c (maybe_check_overriding_exception_spec): New function, broken
out of...
(check_final_overrider): ...here.  Call
maybe_check_overriding_exception_spec.
* tree.c (canonical_eh_spec): Handle UNPARSED_NOEXCEPT_SPEC_P.
(cp_tree_equal): Handle DEFAULT_ARG.

* g++.dg/cpp0x/noexcept45.C: New test.
* g++.dg/cpp0x/noexcept46.C: New test.
* g++.dg/cpp0x/noexcept47.C: New test.
* g++.dg/cpp0x/noexcept48.C: New test.
* g++.dg/cpp0x/noexcept49.C: New test.
* g++.dg/cpp0x/noexcept50.C: New test.
* g++.dg/cpp0x/noexcept51.C: New test.
* g++.dg/cpp0x/noexcept52.C: New test.
* g++.dg/cpp0x/noexcept53.C: New test.
* g++.dg/eh/shadow1.C: Adjust dg-error.

From-SVN: r272586
21 files changed:
gcc/cp/ChangeLog
gcc/cp/cp-tree.def
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/except.c
gcc/cp/parser.c
gcc/cp/parser.h
gcc/cp/pt.c
gcc/cp/search.c
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/noexcept45.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/noexcept46.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/noexcept47.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/noexcept48.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/noexcept49.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/noexcept50.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/noexcept51.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/noexcept52.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/noexcept53.C [new file with mode: 0644]
gcc/testsuite/g++.dg/eh/shadow1.C