[{"id":3681339,"web_url":"http://patchwork.ozlabs.org/comment/3681339/","msgid":"<CACb0b4=zj-3tHjcEgDfmHD69j8rj-jks66rR+R+w98aivZ+Vzg@mail.gmail.com>","list_archive_url":null,"date":"2026-04-23T08:53:31","subject":"Re: [PATCH v2] libstdc++: Include bool conversion in noexcept\n specification of indirect::operator==.","submitter":{"id":48004,"url":"http://patchwork.ozlabs.org/api/people/48004/","name":"Jonathan Wakely","email":"jwakely@redhat.com"},"content":"On Thu, 23 Apr 2026 at 09:17, Tomasz Kamiński <tkaminsk@redhat.com> wrote:\n>\n> This expands the resolution of LWG4325 to heterogenous comparision\n> with T per standard draft (see corresponding commit [1]).\n>\n> [1] https://github.com/cplusplus/draft/pull/8935/changes/833d635d648cdbd06c9935acccf925ee0aea3c79\n>\n> libstdc++-v3/ChangeLog:\n>\n>         * include/bits/indirect.h (indirect::operator==): Adjust\n>         noexcept specification.\n>         * testsuite/std/memory/indirect/relops.cc: New test for noexcept\n>         specification.\n>\n> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>\n> ---\n> v2 adds test for noexcept of relation operators (libsdc++ extension).\n>\n> Tested on x86_64-linux. OK for trunk?\n\nOK for trunk\n\n\n>\n>  libstdc++-v3/include/bits/indirect.h          |  4 +-\n>  .../testsuite/std/memory/indirect/relops.cc   | 72 +++++++++++++++++++\n>  2 files changed, 74 insertions(+), 2 deletions(-)\n>\n> diff --git a/libstdc++-v3/include/bits/indirect.h b/libstdc++-v3/include/bits/indirect.h\n> index 6490a77a507..5be6713eaf3 100644\n> --- a/libstdc++-v3/include/bits/indirect.h\n> +++ b/libstdc++-v3/include/bits/indirect.h\n> @@ -336,7 +336,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n>         requires requires (const _Tp& __t, const _Up& __u) { __t == __u; }\n>         friend constexpr bool\n>         operator==(const indirect& __lhs, const indirect<_Up, _Alloc2>& __rhs)\n> -       noexcept(noexcept(*__lhs == *__rhs))\n> +       noexcept(noexcept(bool(*__lhs == *__rhs)))\n>         {\n>           if (!__lhs._M_objp || !__rhs._M_objp)\n>             return bool(__lhs._M_objp) == bool(__rhs._M_objp);\n> @@ -349,7 +349,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n>           && requires (const _Tp& __t, const _Up& __u) { __t == __u; }\n>         friend constexpr bool\n>         operator==(const indirect<_Vp, _Alloc>& __lhs, const _Up& __rhs)\n> -       noexcept(noexcept(*__lhs == __rhs))\n> +       noexcept(noexcept(bool(*__lhs == __rhs)))\n>         {\n>           if (!__lhs._M_objp)\n>             return false;\n> diff --git a/libstdc++-v3/testsuite/std/memory/indirect/relops.cc b/libstdc++-v3/testsuite/std/memory/indirect/relops.cc\n> index 77d599c8086..fb957a7ad3d 100644\n> --- a/libstdc++-v3/testsuite/std/memory/indirect/relops.cc\n> +++ b/libstdc++-v3/testsuite/std/memory/indirect/relops.cc\n> @@ -68,11 +68,83 @@ test_hash()\n>    (void)std::hash<std::indirect<Obj>>{}(i);\n>  }\n>\n> +template<bool Noexcept>\n> +struct BoolConv\n> +{\n> +  bool b;\n> +\n> +  constexpr BoolConv(bool p) noexcept\n> +  : b(p)\n> +  { }\n> +\n> +  constexpr operator bool() const noexcept(Noexcept)\n> +  { return b; }\n> +};\n> +\n> +template<bool Noexcept, typename EqRet = bool>\n> +struct Comp\n> +{\n> +  friend constexpr EqRet\n> +  operator==(const Comp&, const Comp&) noexcept(Noexcept)\n> +  { return true; }\n> +\n> +  friend constexpr std::strong_ordering\n> +  operator<=>(const Comp&, const Comp&) noexcept(Noexcept)\n> +  { return std::strong_ordering::equal; }\n> +};\n> +\n> +template<bool Noexcept, typename T>\n> +void test_noexcept_eq(T t)\n> +{\n> +  std::indirect<T> i(t);\n> +  static_assert(noexcept(i == t) == Noexcept);\n> +  static_assert(noexcept(i != t) == Noexcept);\n> +  static_assert(noexcept(i == i) == Noexcept);\n> +  static_assert(noexcept(i != i) == Noexcept);\n> +}\n> +\n> +template<bool Noexcept, typename T>\n> +void test_noexcept_rel(T t)\n> +{\n> +  std::indirect<T> i(t);\n> +  static_assert(noexcept(i < t) == Noexcept);\n> +  static_assert(noexcept(i > t) == Noexcept);\n> +  static_assert(noexcept(i <= t) == Noexcept);\n> +  static_assert(noexcept(i >= t) == Noexcept);\n> +  static_assert(noexcept(i <=> t) == Noexcept);\n> +\n> +  static_assert(noexcept(t < i) == Noexcept);\n> +  static_assert(noexcept(t > i) == Noexcept);\n> +  static_assert(noexcept(t <= i) == Noexcept);\n> +  static_assert(noexcept(t >= i) == Noexcept);\n> +  static_assert(noexcept(t <=> i) == Noexcept);\n> +\n> +  static_assert(noexcept(i < i) == Noexcept);\n> +  static_assert(noexcept(i > i) == Noexcept);\n> +  static_assert(noexcept(i <= i) == Noexcept);\n> +  static_assert(noexcept(i >= i) == Noexcept);\n> +  static_assert(noexcept(i <=> i) == Noexcept);\n> +}\n> +\n> +void test_noexcept()\n> +{\n> +  test_noexcept_eq<true>(Comp<true>());\n> +  test_noexcept_eq<false>(Comp<false>());\n> +  test_noexcept_rel<true>(Comp<true>());\n> +  test_noexcept_rel<false>(Comp<false>());\n> +\n> +  test_noexcept_eq<true>(Comp<true, BoolConv<true>>());\n> +  test_noexcept_eq<false>(Comp<true, BoolConv<false>>());\n> +  test_noexcept_eq<false>(Comp<false, BoolConv<true>>());\n> +  test_noexcept_eq<false>(Comp<false, BoolConv<false>>());\n> +}\n> +\n>  int main()\n>  {\n>    test_relops();\n>    test_comp_with_t();\n>    test_hash();\n> +  test_noexcept();\n>\n>    static_assert([] {\n>      test_relops();\n> --\n> 2.53.0\n>","headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=Rt9IQKC/;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=Rt9IQKC/","sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","sourceware.org; spf=pass smtp.mailfrom=redhat.com","server2.sourceware.org;\n arc=none smtp.remote-ip=170.10.129.124"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g1VJk54qyz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 23 Apr 2026 18:54:28 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id EE8454BBCDD2\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 23 Apr 2026 08:54:25 +0000 (GMT)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by sourceware.org (Postfix) with ESMTP id 4CA054BBCDD8\n for <gcc-patches@gcc.gnu.org>; Thu, 23 Apr 2026 08:53:52 +0000 (GMT)","from mail-yx1-f72.google.com (mail-yx1-f72.google.com\n [74.125.224.72]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-467-U2zSPGsnM96f27-U3JR4Sw-1; Thu, 23 Apr 2026 04:53:50 -0400","by mail-yx1-f72.google.com with SMTP id\n 956f58d0204a3-650119f2503so7804492d50.1\n for <gcc-patches@gcc.gnu.org>; Thu, 23 Apr 2026 01:53:50 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org EE8454BBCDD2","OpenDKIM Filter v2.11.0 sourceware.org 4CA054BBCDD8"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 4CA054BBCDD8","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 4CA054BBCDD8","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776934432; cv=none;\n b=ACeSvuSCUghenlcxxorr68KiWbaqnYRy7npzt9Xf/YIBJB9pQvSprxCqjS9hCHV0c3Dd/8xngDFlwQ+If/AZHkiQwEgpD9ufmHKrfkMJh9a0t2TQDtlpeMz3q9PC0YldduF/RHPqXyF7N5+MOAbSpcBHn8FKzfy+/9qwxEtu8sE=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776934432; c=relaxed/simple;\n bh=L9Kpp+sdPFdevfZl9ZYV49fm8aybRSwN9+I1sZep5e0=;\n h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To;\n b=DB1QqUlxPYXXfmjfejQSn1RnaWV18QJkZM0o8c4KHJ7GHHEDKxHzYj25HCsbAnH/OSs5eyOR7Ma/WRJnHWnkY65sYMPoPcansokRv12cp0p3E7FwZh1Qb0HhHw91ymL5fXLcXh7vzrbHIBhKiWFGZuY3yeXbVLa1shZqw0wFkwA=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1776934432;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=lN6Xeov/8wBImdiE4hg7gt2BoaNsTqNM5Hxc+AcV4io=;\n b=Rt9IQKC/3i4SLLf30PyJfTQf5dAZGIwYMAQR/w6PCHgkmahEL3jsrFktfBumi+3EmD8Tk2\n m6wSXlaPJMWYI8RFsLG/27QcAhlQcGCB8nWmXsbOHCCE6o3g+eDO6gGi7PaIYpPQ3CAXZx\n xGrGF0GgMJwFgPbXICYiZx0HuDRsIKw=","X-MC-Unique":"U2zSPGsnM96f27-U3JR4Sw-1","X-Mimecast-MFC-AGG-ID":"U2zSPGsnM96f27-U3JR4Sw_1776934430","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776934430; x=1777539230;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=lN6Xeov/8wBImdiE4hg7gt2BoaNsTqNM5Hxc+AcV4io=;\n b=S+63iPOHMjr4/vpgXre4rIAkhmQhHeQHzdUO1rhQPUvJCvtRVR1TeG3VTtVAQV3JTF\n lCWKRL/kxKHuS8IWEkoDt82InpDZvO9Das7v3pXs7R+RCcCnt4SdPSAJfz0oVIHcll01\n /YiOOHmcEY3vFiMzkZLNAZopDkNYdk5entcBnUPh93NSAEKK7DIDd7VCEcwycNgkzhV+\n 52TWOBckksEQqkO/1LWzUVwNRgA9tj2MWyi78SVYqDNjicSD8MQ5G3LurQrXAHrrFM5v\n lxcgLfrrIZGxfYIdumbAkySrsLwh7Q6FwNd4k0RzUhRSZ9dJHp6r+W3X561fDh8cxS5+\n /I+g==","X-Forwarded-Encrypted":"i=1;\n AFNElJ9H6k8lfxK1JNhEOn9i7fEYn7n9E+Ik5N5Uojz/mxuSC+1OtywP+wjHfQ9BT3sKyfmOSdJLwXumLaqQcg==@gcc.gnu.org","X-Gm-Message-State":"AOJu0YyUD41NBIctFeDkIp2J9WrTCG8FHezbtjNHhzjA3NMZxYgbLVcf\n T4ivYCN6oUEXyrFKUNiY7hNcUvMXPkeV8UgPl/x+R3bHwwNmXOt1AInTFIm9P520xREHMsWVkrF\n ukQ9y0qL2y7axUkoa4Sw4CUGb+Wg9euP2TH5tuEpcYvFXadxbuIdmFa1zSgW998hr75kPCX3tj4\n GoNgW6VUFAK0Oxwoirmm0SOUrB4o8tT+5z9w==","X-Gm-Gg":"AeBDiesAaIYJLqtQ0DMJoxRKTD5JRztaMPhimUg3Mh1L9TDcSISHUGXIaKYBHASoEHB\n qqvbAOoolmPE80dGhvUs4iOPwG2GqwGXSayDepF/MBXAm5JDl6mAH1EbawW6tq+58S+lRdBXMlN\n H9UBh/uPSB35TxgfYhrUSUkbzpvS3FVI0Ipp2HN3BPISddfhBi3/En8zqXv8DCy1bqiEjAHnAV0\n P5ogmeUahtnkAJ04y6bFV3JtHcsiYKryVBWzgLHa1GIBFf0M5t2TK4LZQTVcvXL0xhMM/2XOHBP\n Vg==","X-Received":["by 2002:a53:ac90:0:b0:650:131b:6ee4 with SMTP id\n 956f58d0204a3-6531084fed0mr25733926d50.20.1776934429828;\n Thu, 23 Apr 2026 01:53:49 -0700 (PDT)","by 2002:a53:ac90:0:b0:650:131b:6ee4 with SMTP id\n 956f58d0204a3-6531084fed0mr25733911d50.20.1776934429341; Thu, 23 Apr 2026\n 01:53:49 -0700 (PDT)"],"MIME-Version":"1.0","References":"\n <CACb0b4mj-AUJwG0tFqoHvObSjp_X3adn7PQm-s1ztJAtH2qOyw@mail.gmail.com>\n <20260423081716.698403-1-tkaminsk@redhat.com>","In-Reply-To":"<20260423081716.698403-1-tkaminsk@redhat.com>","From":"Jonathan Wakely <jwakely@redhat.com>","Date":"Thu, 23 Apr 2026 09:53:31 +0100","X-Gm-Features":"AQROBzBW2vOgFIxD4tWNEH-80_K4a3MQi_qSmVYaMpNg25l2ukYqSTJLrHqExho","Message-ID":"\n <CACb0b4=zj-3tHjcEgDfmHD69j8rj-jks66rR+R+w98aivZ+Vzg@mail.gmail.com>","Subject":"Re: [PATCH v2] libstdc++: Include bool conversion in noexcept\n specification of indirect::operator==.","To":"=?utf-8?q?Tomasz_Kami=C5=84ski?= <tkaminsk@redhat.com>","Cc":"libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"p2ScUeqUUzn8i2OgtDNSBSy7nM0FmK9jfOkwhxfoVTo_1776934430","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"}}]