From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1734) id 563913858D39; Sat, 17 Feb 2024 14:29:38 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 563913858D39 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1708180178; bh=2sU5LiIdMvuOY62ZOKnNOP9yqibCao23WDBLSgZ7FZM=; h=From:To:Subject:Date:From; b=s8PbLn/gMY8BUqDdqe9Kk8JcglSyXSl9BAvqGuL6FfjNyLFD2kp7pzLd3tEsvuhGg wGIGAhQCOiNj+BhiYyKCgLD5+JlrN9AKTqRaVt5Li2r0oU6xsWLyOv2PDPwTxlloTb oXU3t8sd9M5qqL+4D0u0nr/wiQ8Jw1RH43S5W/Ls= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Marek Polacek To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-9047] c++: wrong looser excep spec for dep noexcept [PR113158] X-Act-Checkin: gcc X-Git-Author: Marek Polacek X-Git-Refname: refs/heads/trunk X-Git-Oldrev: 9739d7ebf05aefcdd85477900528d8bee69df215 X-Git-Newrev: 876fa432ef4074053fa65b1855e7d43320515576 Message-Id: <20240217142938.563913858D39@sourceware.org> Date: Sat, 17 Feb 2024 14:29:38 +0000 (GMT) List-Id: https://gcc.gnu.org/g:876fa432ef4074053fa65b1855e7d43320515576 commit r14-9047-g876fa432ef4074053fa65b1855e7d43320515576 Author: Marek Polacek Date: Thu Feb 15 17:07:43 2024 -0500 c++: wrong looser excep spec for dep noexcept [PR113158] Here we find ourselves in maybe_check_overriding_exception_spec in a template context where we can't instantiate a dependent noexcept. That's OK, but we have to defer the checking otherwise we give wrong errors. PR c++/113158 gcc/cp/ChangeLog: * search.cc (maybe_check_overriding_exception_spec): Defer checking when a noexcept couldn't be instantiated & evaluated to false/true. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/noexcept83.C: New test. Diff: --- gcc/cp/search.cc | 11 ++++++++++ gcc/testsuite/g++.dg/cpp0x/noexcept83.C | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/gcc/cp/search.cc b/gcc/cp/search.cc index c948839dc533..827f48e8604f 100644 --- a/gcc/cp/search.cc +++ b/gcc/cp/search.cc @@ -1975,6 +1975,17 @@ maybe_check_overriding_exception_spec (tree overrider, tree basefn) || UNPARSED_NOEXCEPT_SPEC_P (over_throw)) return true; + /* We also have to defer checking when we're in a template and couldn't + instantiate & evaluate the noexcept to true/false. */ + if (processing_template_decl) + if ((base_throw + && base_throw != noexcept_true_spec + && base_throw != noexcept_false_spec) + || (over_throw + && over_throw != noexcept_true_spec + && over_throw != noexcept_false_spec)) + return true; + if (!comp_except_specs (base_throw, over_throw, ce_derived)) { auto_diagnostic_group d; diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept83.C b/gcc/testsuite/g++.dg/cpp0x/noexcept83.C new file mode 100644 index 000000000000..47832bbb44d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept83.C @@ -0,0 +1,37 @@ +// PR c++/113158 +// { dg-do compile { target c++11 } } + +template +struct V { + static constexpr bool t = false; +}; +struct base { + virtual int f() = 0; +}; + +template +struct derived : base { + int f() noexcept(V::t) override; +}; + +struct base2 { + virtual int f() noexcept = 0; +}; + +template +struct W { + static constexpr bool t = B; +}; + +template +struct derived2 : base2 { + int f() noexcept(W::t) override; // { dg-error "looser exception specification" } +}; + +void +g () +{ + derived d1; + derived2 d2; // { dg-message "required from here" } + derived2 d3; +}