From 4c3bd1e3cabbca5928c1d091e7ce1d77d6d5c63c Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 1 Apr 2016 12:10:17 +0000 Subject: [PATCH] PR c++/68475 * decl.c (check_redeclaration_exception_specification): Check regardless of -fno-exceptions. * typeck2.c (merge_exception_specifiers): Relax assert by checking flag_exceptions too. * g++.dg/g++.dg/cpp0x/noexcept29.C: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234667 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/decl.c | 11 +++++++---- gcc/cp/typeck2.c | 2 +- gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/cpp0x/noexcept29.C | 19 +++++++++++++++++++ 5 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/noexcept29.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d457acc..e44818d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2016-04-01 Nathan Sidwell + + PR c++/68475 + * decl.c (check_redeclaration_exception_specification): Check + regardless of -fno-exceptions. + * typeck2.c (merge_exception_specifiers): Relax assert by checking + flag_exceptions too. + 2016-03-31 Nathan Sidwell * decl.c (start_preparsed_function): Remove unnecessary bracing. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index a6c5855..9260f4c 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -1202,16 +1202,19 @@ check_redeclaration_exception_specification (tree new_decl, specialization, of that function shall have an exception-specification with the same set of type-ids. */ if (! DECL_IS_BUILTIN (old_decl) - && flag_exceptions && !comp_except_specs (new_exceptions, old_exceptions, ce_normal)) { const char *msg = "declaration of %q+F has a different exception specifier"; bool complained = true; - if (! DECL_IN_SYSTEM_HEADER (old_decl)) - error (msg, new_decl); - else + if (DECL_IN_SYSTEM_HEADER (old_decl)) complained = pedwarn (0, OPT_Wsystem_headers, msg, new_decl); + else if (!flag_exceptions) + /* We used to silently permit mismatched eh specs with + -fno-exceptions, so make them a pedwarn now. */ + complained = pedwarn (0, OPT_Wpedantic, msg, new_decl); + else + error (msg, new_decl); if (complained) inform (0, "from previous declaration %q+F", old_decl); } diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 4ab77cd..b921689 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -2143,7 +2143,7 @@ merge_exception_specifiers (tree list, tree add) return add; noex = TREE_PURPOSE (list); gcc_checking_assert (!TREE_PURPOSE (add) - || errorcount + || errorcount || !flag_exceptions || cp_tree_equal (noex, TREE_PURPOSE (add))); /* Combine the dynamic-exception-specifiers, if any. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8f6210a..519a926 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,5 @@ +2016-04-01 Nathan Sidwell + 2016-04-01 Ilya Enkovich PR target/69890 diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept29.C b/gcc/testsuite/g++.dg/cpp0x/noexcept29.C new file mode 100644 index 0000000..8b920c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept29.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } +// { dg-additional-options "-fno-exceptions" } + +// PR68475 we used to not check eh spec matching with -fno-exceptions, +// but this could lead to ICEs. + +template struct traits; + +template struct X +{ + void Foo () noexcept (traits ::foo ()); // { dg-message "previous declaration" } +}; + +template +void +X::Foo () noexcept (traits ::bar ()) // { dg-error "different exception specifier" } +{ +} + -- 2.7.4