aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2016-12-08 09:26:06 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-12-08 09:26:06 +0100
commit1d09844a1cff1a78d24eba41a1443903da0bacfd (patch)
tree5ecd32fc451a6802fb2f17da35cdfddb84b114d3 /gcc/cp/parser.c
parent23b88fda665d2f995c73336f74dcf8931f5fdf71 (diff)
downloadgcc-1d09844a1cff1a78d24eba41a1443903da0bacfd.zip
gcc-1d09844a1cff1a78d24eba41a1443903da0bacfd.tar.gz
gcc-1d09844a1cff1a78d24eba41a1443903da0bacfd.tar.bz2
P0003R5 - removal of dynamic exception specification from C++17
P0003R5 - removal of dynamic exception specification from C++17 * parser.c (cp_parser_exception_specification_opt): For C++17 error out on throw ( type-id-list ), for C++11 and C++14 issue -Wdeprecated warning on it. Formatting fix. Treat throw() in C++17 as noexcept(true). * g++.dg/compat/eh/ctor1.h: Adjust for deprecation of throw (type-id-list) in C++11 and C++14 and removal in C++17. * g++.dg/compat/eh/ctor1_y.C: Likewise. * g++.dg/compat/eh/new1_x.C: Likewise. * g++.dg/compat/eh/new1_y.C: Likewise. * g++.dg/compat/eh/spec3_x.C: Likewise. * g++.dg/compat/eh/spec3_y.C: Likewise. * g++.dg/compat/eh/template1.h: Likewise. * g++.dg/compat/eh/template1_y.C: Likewise. * g++.dg/compat/eh/unexpected1_x.C: Likewise. * g++.dg/compat/eh/unexpected1_y.C: Likewise. * g++.dg/cpp0x/auto9.C: Likewise. * g++.dg/cpp0x/defaulted23.C: Likewise. * g++.dg/cpp0x/error5.C: Likewise. * g++.dg/cpp0x/lambda/lambda-eh2.C: Likewise. * g++.dg/cpp0x/noexcept02.C: Likewise. * g++.dg/cpp0x/noexcept07.C: Likewise. * g++.dg/cpp0x/noexcept08.C: Likewise. * g++.dg/cpp0x/noexcept19.C: Likewise. * g++.dg/cpp0x/variadic73.C: Likewise. * g++.dg/cpp0x/variadic-throw.C: Likewise. * g++.dg/cpp1z/noexcept-type1.C: Likewise. * g++.dg/eh/async-unwind2.C: Likewise. * g++.dg/eh/cond4.C: Likewise. * g++.dg/eh/delete1.C: Likewise. * g++.dg/eh/ehopt1.C: Likewise. * g++.dg/eh/forced3.C: Likewise. * g++.dg/eh/forced4.C: Likewise. * g++.dg/eh/init-temp2.C: Likewise. * g++.dg/eh/pr38662.C: Likewise. * g++.dg/eh/pr41819.C: Likewise. * g++.dg/eh/shadow1.C: Likewise. * g++.dg/eh/spec2.C: Likewise. * g++.dg/eh/spec3.C: Likewise. * g++.dg/eh/spec5.C: Likewise. * g++.dg/eh/spec6.C: Likewise. * g++.dg/eh/spec7.C: Likewise. * g++.dg/eh/spec8.C: Likewise. * g++.dg/eh/spec9.C: Likewise. * g++.dg/eh/template1.C: Likewise. * g++.dg/eh/unexpected1.C: Likewise. * g++.dg/ext/has_nothrow_assign.C: Likewise. * g++.dg/ext/has_nothrow_constructor.C: Likewise. * g++.dg/ext/has_nothrow_copy-1.C: Likewise. * g++.dg/ext/has_nothrow_copy-2.C: Likewise. * g++.dg/ext/has_nothrow_copy-4.C: Likewise. * g++.dg/ext/has_nothrow_copy-5.C: Likewise. * g++.dg/ext/has_nothrow_copy-6.C: Likewise. * g++.dg/ext/has_nothrow_copy-7.C: Likewise. * g++.dg/gcov/gcov-7.C: Likewise. * g++.dg/init/new13.C: Likewise. * g++.dg/init/new25.C: Likewise. * g++.dg/lookup/exception1.C: Likewise. * g++.dg/opt/noreturn-1.C: Likewise. * g++.dg/other/error3.C: Likewise. * g++.dg/rtti/crash3.C: Likewise. * g++.dg/template/eh2.C: Likewise. * g++.dg/template/error36.C: Likewise. * g++.dg/tm/pr46567.C: Likewise. * g++.dg/tm/pr47340.C: Likewise. * g++.dg/torture/pr46364.C: Likewise. * g++.dg/torture/pr49394.C: Likewise. * g++.dg/torture/pr52918-1.C: Likewise. * g++.dg/torture/pr57190.C: Likewise. * g++.dg/torture/stackalign/eh-alloca-1.C: Likewise. * g++.dg/torture/stackalign/eh-fastcall-1.C: Likewise. * g++.dg/torture/stackalign/eh-global-1.C: Likewise. * g++.dg/torture/stackalign/eh-inline-1.C: Likewise. * g++.dg/torture/stackalign/eh-inline-2.C: Likewise. * g++.dg/torture/stackalign/eh-thiscall-1.C: Likewise. * g++.dg/torture/stackalign/eh-vararg-1.C: Likewise. * g++.dg/torture/stackalign/eh-vararg-2.C: Likewise. * g++.dg/tree-ssa/pr45605.C: Likewise. * g++.dg/warn/Wreturn-type-3.C: Likewise. * g++.old-deja/g++.eh/badalloc1.C: Likewise. * g++.old-deja/g++.eh/cleanup2.C: Likewise. * g++.old-deja/g++.eh/spec1.C: Likewise. * g++.old-deja/g++.eh/spec2.C: Likewise. * g++.old-deja/g++.eh/spec3.C: Likewise. * g++.old-deja/g++.eh/spec4.C: Likewise. * g++.old-deja/g++.eh/spec6.C: Likewise. * g++.old-deja/g++.eh/throw1.C: Likewise. * g++.old-deja/g++.eh/throw2.C: Likewise. * g++.old-deja/g++.eh/tmpl1.C: Likewise. * g++.old-deja/g++.eh/tmpl3.C: Likewise. * g++.old-deja/g++.mike/eh15.C: Likewise. * g++.old-deja/g++.mike/eh25.C: Likewise. * g++.old-deja/g++.mike/eh33.C: Likewise. * g++.old-deja/g++.mike/eh34.C: Likewise. * g++.old-deja/g++.mike/eh50.C: Likewise. * g++.old-deja/g++.mike/eh51.C: Likewise. * g++.old-deja/g++.mike/eh55.C: Likewise. * g++.old-deja/g++.mike/p10416.C: Likewise. * g++.old-deja/g++.other/crash28.C: Likewise. * g++.old-deja/g++.other/crash30.C: Likewise. * g++.old-deja/g++.other/new7.C: Likewise. * g++.old-deja/g++.pt/ehspec1.C: Likewise. * g++.old-deja/g++.robertl/eb123.C: Likewise. * testsuite/util/testsuite_new_operators.h: Include testsuite_hooks.h. (operator new): Use THROW macro. From-SVN: r243429
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r--gcc/cp/parser.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 08f5f9e..70e5fb3 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -23786,8 +23786,8 @@ cp_parser_exception_specification_opt (cp_parser* parser)
token = cp_lexer_peek_token (parser->lexer);
/* Is it a noexcept-specification? */
- type_id_list = cp_parser_noexcept_specification_opt(parser, true, NULL,
- false);
+ type_id_list = cp_parser_noexcept_specification_opt (parser, true, NULL,
+ false);
if (type_id_list != NULL_TREE)
return type_id_list;
@@ -23795,12 +23795,7 @@ cp_parser_exception_specification_opt (cp_parser* parser)
if (!cp_parser_is_keyword (token, RID_THROW))
return NULL_TREE;
-#if 0
- /* Enable this once a lot of code has transitioned to noexcept? */
- if (cxx_dialect >= cxx11 && !in_system_header_at (input_location))
- warning (OPT_Wdeprecated, "dynamic exception specifications are "
- "deprecated in C++0x; use %<noexcept%> instead");
-#endif
+ location_t loc = token->location;
/* Consume the `throw'. */
cp_lexer_consume_token (parser->lexer);
@@ -23821,7 +23816,23 @@ cp_parser_exception_specification_opt (cp_parser* parser)
type_id_list = cp_parser_type_id_list (parser);
/* Restore the saved message. */
parser->type_definition_forbidden_message = saved_message;
+
+ if (cxx_dialect >= cxx1z)
+ {
+ error_at (loc, "ISO C++1z does not allow dynamic exception "
+ "specifications");
+ type_id_list = NULL_TREE;
+ }
+ else if (cxx_dialect >= cxx11 && !in_system_header_at (loc))
+ warning_at (loc, OPT_Wdeprecated,
+ "dynamic exception specifications are deprecated in C++11;"
+ " use %<noexcept%> instead");
}
+ /* In C++17, throw() is equivalent to noexcept (true). throw()
+ is deprecated in C++11 and above as well, but is still widely used,
+ so don't warn about it yet. */
+ else if (cxx_dialect >= cxx1z)
+ type_id_list = noexcept_true_spec;
else
type_id_list = empty_except_spec;