[{"id":3682085,"web_url":"http://patchwork.ozlabs.org/comment/3682085/","msgid":"<CACb0b4mpGCx+nMWiuQc7bA12idV_k910NEdAjh47ttT94WTSDg@mail.gmail.com>","list_archive_url":null,"date":"2026-04-24T15:37:49","subject":"Re: [PATCH v2] libstdc++: Disallow duration of cv-qualified types and\n references.","submitter":{"id":48004,"url":"http://patchwork.ozlabs.org/api/people/48004/","name":"Jonathan Wakely","email":"jwakely@redhat.com"},"content":"On Fri, 24 Apr 2026 at 16:25, Tomasz Kamiński <tkaminsk@redhat.com> wrote:\n>\n> This implements LWG 4481, \"Disallow chrono::duration<const T, P>\",\n> which was approved in Croydon 2026.\n>\n> libstdc++-v3/ChangeLog:\n>\n>         * include/bits/chrono.h: Add static_assert requiring cv-unqualified\n>         non-reference type.\n>         * testsuite/20_util/duration/io.cc: Remove const-qualifier in\n>         stream manipluators tests.\n>         * testsuite/20_util/duration/requirements/typedefs_neg4.cc:\n>         New test.\n> ---\n> v2 removes const from manipulators test instead of nuking them completly.\n>\n> Testing on x86_64-linux. *duration* test passed again.\n> OK for trunk when all tests passes?\n\nOK, thanks\n\n>\n>  libstdc++-v3/include/bits/chrono.h                   |  4 ++++\n>  libstdc++-v3/testsuite/20_util/duration/io.cc        | 12 ++++++------\n>  .../20_util/duration/requirements/typedefs_neg4.cc   | 11 +++++++++++\n>  3 files changed, 21 insertions(+), 6 deletions(-)\n>  create mode 100644 libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg4.cc\n>\n> diff --git a/libstdc++-v3/include/bits/chrono.h b/libstdc++-v3/include/bits/chrono.h\n> index fd91505c16f..d639cfaa485 100644\n> --- a/libstdc++-v3/include/bits/chrono.h\n> +++ b/libstdc++-v3/include/bits/chrono.h\n> @@ -514,6 +514,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n>      template<typename _Rep, typename _Period>\n>        class duration\n>        {\n> +       // _GLIBCXX_RESOLVE_LIB_DEFECTS\n> +       // 4481. Disallow chrono::duration<const T, P>\n> +       static_assert(is_same<_Rep, __remove_cvref_t<_Rep>>::value,\n> +                     \"rep should be cv-unqualified object type\");\n>         static_assert(!__is_duration<_Rep>::value,\n>                       \"rep cannot be a std::chrono::duration\");\n>         static_assert(__is_ratio<_Period>::value,\n> diff --git a/libstdc++-v3/testsuite/20_util/duration/io.cc b/libstdc++-v3/testsuite/20_util/duration/io.cc\n> index 6ada4fcfa84..83ecd33c038 100644\n> --- a/libstdc++-v3/testsuite/20_util/duration/io.cc\n> +++ b/libstdc++-v3/testsuite/20_util/duration/io.cc\n> @@ -40,10 +40,10 @@ test01()\n>    VERIFY( ss.str() == \"121s 122s 123s 124s 125s 126s 127s \" );\n>\n>    ss.str(\"\");\n> -  ss << std::hex << std::uppercase << duration<const char>(0x1A) << ' ';\n> -  ss << std::hex << std::uppercase << duration<const wchar_t>(0x2A) << ' ';\n> +  ss << std::hex << std::uppercase << duration<char>(0x1A) << ' ';\n> +  ss << std::hex << std::uppercase << duration<wchar_t>(0x2A) << ' ';\n>    ss << std::hex << std::uppercase << duration<signed char>(0x3A) << ' ';\n> -  ss << std::scientific << duration<const double>(4.5) << ' ';\n> +  ss << std::scientific << duration<double>(4.5) << ' ';\n>    VERIFY( ss.str() == \"1As 2As 3As 4.500000E+00s \" );\n>  }\n>\n> @@ -79,10 +79,10 @@ test02()\n>    VERIFY( ss.str() == L\"121s 122s 123s 124s 125s 126s 127s \" );\n>\n>    ss.str(L\"\");\n> -  ss << std::hex << std::uppercase << duration<const char>(0x1A) << ' ';\n> -  ss << std::hex << std::uppercase << duration<const wchar_t>(0x2A) << ' ';\n> +  ss << std::hex << std::uppercase << duration<char>(0x1A) << ' ';\n> +  ss << std::hex << std::uppercase << duration<wchar_t>(0x2A) << ' ';\n>    ss << std::hex << std::uppercase << duration<signed char>(0x3A) << ' ';\n> -  ss << std::scientific << duration<const double>(4.5) << ' ';\n> +  ss << std::scientific << duration<double>(4.5) << ' ';\n>    VERIFY( ss.str() == L\"1As 2As 3As 4.500000E+00s \" );\n>  #endif\n>  }\n> diff --git a/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg4.cc b/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg4.cc\n> new file mode 100644\n> index 00000000000..52a5d92cc8b\n> --- /dev/null\n> +++ b/libstdc++-v3/testsuite/20_util/duration/requirements/typedefs_neg4.cc\n> @@ -0,0 +1,11 @@\n> +// { dg-do compile { target c++11 } }\n> +\n> +#include <chrono>\n> +\n> +const int i = 10;\n> +// Check if rep is a cv-unqualifed object type\n> +std::chrono::duration<const int> d1(i); // { dg-error \"required from here\" }\n> +std::chrono::duration<volatile int> d2(i); // { dg-error \"required from here\" }\n> +std::chrono::duration<const int&> d3(i); // { dg-error \"required from here\" }\n> +\n> +// { dg-error \"rep should be cv-unqualified object type\" \"\" { target *-*-* } 0 }\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=TReKU75f;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::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=TReKU75f","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.133.124"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::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 4g2HDv41x0z1yD5\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 25 Apr 2026 01:38:54 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 24C144BB593D\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 24 Apr 2026 15:38:52 +0000 (GMT)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by sourceware.org (Postfix) with ESMTP id 1DE024BB58D1\n for <gcc-patches@gcc.gnu.org>; Fri, 24 Apr 2026 15:38:09 +0000 (GMT)","from mail-oa1-f71.google.com (mail-oa1-f71.google.com\n [209.85.160.71]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-384-nN_VgY06NWio-uLHzmcHZQ-1; Fri, 24 Apr 2026 11:38:07 -0400","by mail-oa1-f71.google.com with SMTP id\n 586e51a60fabf-42fb9d10232so7355791fac.2\n for <gcc-patches@gcc.gnu.org>; Fri, 24 Apr 2026 08:38:07 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 24C144BB593D","OpenDKIM Filter v2.11.0 sourceware.org 1DE024BB58D1"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 1DE024BB58D1","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 1DE024BB58D1","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777045089; cv=none;\n b=Ls8bNY9xwb5ncd9UwuGb1pPK+I6tMUNUpbVJVjs9cYD6dv5TTho4NvqcvnzmuwFQpvQsbmyVuDzAnCmaUuO+HsBdZvsBuhYOnXoAGRUgjstT3KAgkNNQnIfNwdt21enEVKDh4WkDohrFzF3M/hX7NjPiRliWkJsnek+gDS+teW4=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777045089; c=relaxed/simple;\n bh=9m7BNkrub/PJMr/pFARknB2/h4s9CaI2thWZtywpI0c=;\n h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To;\n b=O/6YU24cXE4106iuI12R8DzG/buwwjRH8lmuKl1M9rEG7i+EnKfbWrYMqHs/vdQGemRdPX0F7mkD2hhFylDKcRHE2c/2d6eKCfSMcL5pugI1NEYUD4bB+dnszrWaO8d8kuZrX8xTDwO+e3Xg3liqoXlqMugx2j+9w6QshQ/ei7M=","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=1777045088;\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=ip+CbVA/CCbpKooGHZI7M06k7nBofcRXBITXI+zONpc=;\n b=TReKU75fUzOCAHOBY3mgN4ueDOiIQIT9uKOEmDKjyp4pgrpESYNNIpLYmPMdxfteJ3XuZh\n q/H2MfvF8ueGf/onDubK/B//iq+RQiV2JEpQr3QY0xLI82CQektuTIFZ6FEVLsuugsrJ45\n T5F4/UiyZhfOCkVkHxz0UqIYfHt/kRk=","X-MC-Unique":"nN_VgY06NWio-uLHzmcHZQ-1","X-Mimecast-MFC-AGG-ID":"nN_VgY06NWio-uLHzmcHZQ_1777045086","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777045086; x=1777649886;\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=ip+CbVA/CCbpKooGHZI7M06k7nBofcRXBITXI+zONpc=;\n b=ptdex8jSVGVubMi4tkA4JW7lmuPz2SpP6x+L4tQgPY/GLthzagtJAZeAC9S1NiWDJD\n lER3S/ZOAFbFcE7b0btturCEofLj0QYGxM104m8S4BZdC84BazmbhNccaaouPQV0Prvs\n tRz5y/sRa4VPQiojQvxXwxEMHt7JwJ7I1/Ssga7G6Hp19SMLvPGatbg8vfSEAZLgp27/\n baQrtLZu2NE/msqVPDzZI050vd9JyQuegHcQD+xInKfWq4dN3ejjsRvokixSRco45IjM\n jc8HhKuCozOEqL2nPnBf7V9gkxHFMPrr98i9PmlhueJATY7ls7JnfMo+Ro437lLLf4WF\n ynQQ==","X-Forwarded-Encrypted":"i=1;\n AFNElJ8l5zGRsgFtNmXT4M132VFAyHdAaziY9MOfgy9pHmE/aaY6ijzD5jSwYniq0sBULBfWNeYcURyGA3MQdA==@gcc.gnu.org","X-Gm-Message-State":"AOJu0YwAJKn7wQv8VP6HR7DQzWxFGsMdJVYXOLHXSUHmpuoM+/wCV4/y\n oMGZd8MWy7zq7xj7zCR7smDJcMdotA4h8qhi6DFLdK/6k14ZzcTYArEj3Vi0JzkK5pJfWUBr0dp\n FSijh0FGQh2Opziglj+uecZf0dAT/ZeFi00xOpnjJsqmxjer1o9GkYpOSOjJ//YdFtHcTSs2m2l\n SxQUdw4KCnwCvrx2LWPuzlKyKxi3q+BbAU+Q==","X-Gm-Gg":"AeBDiesuEfR49J7BIlAjxTYX8Sbs9Qt5uCagt8oTiRWJHCnAe1CQLxD+OsFRb6yYVbH\n MHRgG6U5UjmLpZauJ0HcTJMCRb+Nx6I+u+m/iKRuqP2QeZK+aXF2Mfr49PTkCMz6L1BLZKfdHSk\n oyvwX6RiFFmQTXHSg4dbLTrlRWCLz33HdQSGXUOnID+jq+ECQ72KMIFvveZ/hFBeVrXsLveTYmf\n 0AE1NftrfQcPkEGwW4YLxbHZ685RHFt9QKkoRUzdq+YfksrSNVfF24AdXpUmK9CVXkrEPtFjlrP\n UQ==","X-Received":["by 2002:a05:6820:1c8e:b0:694:8b8a:b44f with SMTP id\n 006d021491bc7-6948b8abb5bmr12098971eaf.13.1777045086526;\n Fri, 24 Apr 2026 08:38:06 -0700 (PDT)","by 2002:a05:6820:1c8e:b0:694:8b8a:b44f with SMTP id\n 006d021491bc7-6948b8abb5bmr12098946eaf.13.1777045086049; Fri, 24 Apr 2026\n 08:38:06 -0700 (PDT)"],"MIME-Version":"1.0","References":"\n <CACb0b4kjp2FhyWF7inC8Z7YtKp3m+7GUJLsO4w78vN5SQmzfDA@mail.gmail.com>\n <20260424152301.2386133-1-tkaminsk@redhat.com>","In-Reply-To":"<20260424152301.2386133-1-tkaminsk@redhat.com>","From":"Jonathan Wakely <jwakely@redhat.com>","Date":"Fri, 24 Apr 2026 16:37:49 +0100","X-Gm-Features":"AQROBzCO1706qD_hd-YRWwFyA4wWHW38ftkNGSXQP62-DMajsUJlq0Rrszc9k-0","Message-ID":"\n <CACb0b4mpGCx+nMWiuQc7bA12idV_k910NEdAjh47ttT94WTSDg@mail.gmail.com>","Subject":"Re: [PATCH v2] libstdc++: Disallow duration of cv-qualified types and\n references.","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":"hLh5OLibHDJq8UtukBGDXOUhNP_-YUxC3zmspTcGvcY_1777045086","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"}}]