{"id":2230497,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2230497/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/tencent_6643D30414E51F9CE20CC76E6C2C65AB3D05@qq.com/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/1.1/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<tencent_6643D30414E51F9CE20CC76E6C2C65AB3D05@qq.com>","date":"2026-04-29T19:22:49","name":"[v5] c++, contracts: fix testsuite basic.contract.eval.p8 failed","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"bf3440b2f66edf7e7c27accbe0a24b9568d180e0","submitter":{"id":89506,"url":"http://patchwork.ozlabs.org/api/1.1/people/89506/?format=json","name":"yxj-github-437","email":"2457369732@qq.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/tencent_6643D30414E51F9CE20CC76E6C2C65AB3D05@qq.com/mbox/","series":[{"id":502139,"url":"http://patchwork.ozlabs.org/api/1.1/series/502139/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=502139","date":"2026-04-29T19:22:49","name":"[v5] c++, contracts: fix testsuite basic.contract.eval.p8 failed","version":5,"mbox":"http://patchwork.ozlabs.org/series/502139/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2230497/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2230497/checks/","tags":{},"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=qq.com header.i=@qq.com header.a=rsa-sha256\n header.s=s201512 header.b=H+Ndphtf;\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=qq.com header.i=@qq.com header.a=rsa-sha256\n header.s=s201512 header.b=H+Ndphtf","sourceware.org;\n dmarc=pass (p=quarantine dis=none) header.from=qq.com","sourceware.org; spf=pass smtp.mailfrom=qq.com","server2.sourceware.org;\n arc=none smtp.remote-ip=203.205.221.191"],"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 4g5S2C0RXcz1yHZ\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 05:25:37 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 4AEA14BBCDA3\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 29 Apr 2026 19:25:35 +0000 (GMT)","from out203-205-221-191.mail.qq.com (out203-205-221-191.mail.qq.com\n [203.205.221.191])\n by sourceware.org (Postfix) with UTF8SMTPS id C34A64B99F5D;\n Wed, 29 Apr 2026 19:24:57 +0000 (GMT)","from localhost.localdomain ([123.139.164.214])\n by newxmesmtplogicsvrszb51-0.qq.com (NewEsmtp) with SMTP\n id 6330D287; Thu, 30 Apr 2026 03:24:51 +0800"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 4AEA14BBCDA3","OpenDKIM Filter v2.11.0 sourceware.org C34A64B99F5D"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org C34A64B99F5D","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org C34A64B99F5D","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777490698; cv=none;\n b=ou3V0Z9S9+V2x7I+zfiag+y3eQaOT8O2BkF6FUTDauTXbo8AEcEn8fx2ezQDoNPBNrR9KU/pLTHGeuEzKfYR5ebBeeoDvzi6lENDM+EFJ7qGrl5ONUjCy3v73hEALKmiTGOPSfjJZElXSGxtj4cZTUmpDSHqcqxQpPye/q52fN8=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777490698; c=relaxed/simple;\n bh=RX37YjUW44WcUXBMDFjUjRE+NQdr/l12g2a/oFVFkus=;\n h=DKIM-Signature:Message-ID:From:To:Subject:Date:MIME-Version;\n b=m3bVi12Yn+b5bvbBFgbqEOwvhSjuk4yJ3mHp+M15Er8h7jGxxFWp3STd11urbbVFWBMl6323oEX7XUiH4zj0GwjBHVZlRX5yJqF+56cUfUvO7ijL8I/kZYK6u+TatdNx22IjJJwmzSTaqWmUTz8Blw48mb++AZwz8zK05S4CTCE=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512;\n t=1777490693; bh=KWUOXCs+SUnSt8z4ACVlYt2r1f62uu+6ZjwZNgtKEhc=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References;\n b=H+Ndphtf3+NFvsLeaeJYHg9ZXD3is793SI8Z4CDlRrDj4ac35S/xqTs8tH9OiK5IA\n aUodf7xY9D8O97qKcRp1xYTPC5HJgB8Cst4gNoyRvkU6Mgg2UWYynNPBBeCCYaDdVS\n nUL3HNBe9VZucAA+t8BgasiECijS05tOYaFYtXsM=","X-QQ-mid":"xmsmtpt1777490691th4yvuorn","Message-ID":"<tencent_6643D30414E51F9CE20CC76E6C2C65AB3D05@qq.com>","X-QQ-XMAILINFO":"NVQMfSTXSDo/YBN+Rb6CJtgDJ9o4m+0L6j4ivlaZWjzrOjoh3noe0XENlr5dKv\n ZhVPsq4UWVQ3CZU0QG/c2zgLA5k6UlqizcvtI9Oy27UKpNUT/J7DnUIIfUiCigR2Z+8HGwbd1b7B\n AFVzz0m2A7NKuDcJ3o+yIRAmeDKrfSJeKxbjuq0KyibxBfCddLrM+NBJtEEGYkjE7ZJQBre2WilD\n v6LPqFTUBSh40LvNsuwNuMAU0UkQ6akopO4iMho1nFVGA4RPmRzDtIv3NLv+7gMs9GK57uhV9K7O\n nBpg7EX7uAGJoetoqS5HUKQNcxdjH/9NPQQMErZN5WWqb3V7LU0I8/EYdp0cTvN/CSXRct68MlNz\n /pZDVt0wovWlCq4cXGQxwMhkJskBeh4FAfIpJMMmfmyP9yculpoF2Bg+Nn4m//znZoTbOH+z7POa\n r203D0ljue+uK6PJRnETcaF1VkSNiPTQn2GD+guvprTyEB9UDXOCDH4khnXvTzW+HjPTmEm4+iez\n FzRFLn6KEn2S1KLhgAo/h6630v4oeB42CERyjWnnSSAXj4ryPMPId1b/HBO1oSJRsNHy6lgvpLn/\n gI9QWvzZvDab1uTeK5oy0Zj98+GvNe1pdGRJ37bIu8M+Tn+WSoahKU1fE4pAcD0fZuROuGHzshaL\n d0sYzL5NwJP9DQr+686KBwrd4wuocHFX7jCQX9zsUUojbgpmz1vHIRlywRR3gL7O9M9PGt6MLmBR\n hwBfpx8kOOHFtlL0lsjcWVhJWNr+XLADSSiTLxrDE0rNKAbz75D0H8pWJ4I76ouCNE7daTU+FvIq\n /iRc3UCeffBvWv7kdQUvqV2oJieZhVxLQHOQ8lZiQwxKkaY7z9ZXtF4dHxINliRz4HUMLwfavGc4\n 1XFa6eh8PmF5vV28ub5hGL2kN78Y3BsCFWPGZB6SlzLIPZQ1A5X6ckn0fOlT8OuQbwCwuuHeYksl\n 1klyR9AIAZWe4hUqsy/bCQG9Wpb02iwHa8tgkEJGyKJU1JU9WuzbuM8Ko2yYqTV7ayynhC6ppJjj\n yeO4j8pA==","X-QQ-XMRINFO":"NI4Ajvh11aEjEMj13RCX7UuhPEoou2bs1g==","From":"yxj-github-437 <2457369732@qq.com>","To":"jason@redhat.com","Cc":"gcc-patches@gcc.gnu.org, nathan@acm.org, ppalka@gcc.gnu.org,\n yxj-github-437 <2457369732@qq.com>","Subject":"[PATCH v5] c++,\n contracts: fix testsuite basic.contract.eval.p8 failed","Date":"Thu, 30 Apr 2026 03:22:49 +0800","X-OQ-MSGID":"<20260429192249.72503-1-2457369732@qq.com>","X-Mailer":"git-send-email 2.43.0","In-Reply-To":"<a49890f7-d8b9-4b40-bf35-de461b42fb3d@redhat.com>","References":"<a49890f7-d8b9-4b40-bf35-de461b42fb3d@redhat.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","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"},"content":">>>> If in a context that is manifestly constant-evaluated ([expr.const]),\n>>>> a contract violation occurs and the evaluation semantic is terminating\n>>>> or contract stmt isnot constant-evaluated, the non_constant_p should be\n>>>> set true.\n>>>\n>>> Please add a testcase?  If this is supposed to improve the test in\n>>> [basic.contract.eval]/8, then I don't see how, since with this patch\n>>> we emit the error twice:\n>>>\n>>> q.C:3:3: error: contract condition is not constant\n>>>      3 |   contract_assert((++const_cast<int&>(i), true));\n>>>        |   ^~~~~~~~~~~~~~~\n>>> q.C:3:3: error: contract condition is not constant\n>>>\n>>> instead of just once as before.  That doesn't seem like an improvement.\n>>\n>> Yes, the patch was wrong.The reason for the test case failure may be that\n>> constexpr_call did not cache contract violation information.\n>> The new patch as following.\n>>\n>> ----------------8<-----------------\n>>\n>> I noticed that the following code passed.\n>>\n>> 1 | consteval void foo( auto x ) pre( false ) { return x; }\n>> 2 |\n>> 3 | static_assert (foo( 1 ) == 1, \"\");\n>> 4 |\n>> 5 | int main() {\n>> 6 |   foo( 1 );\n>> 7 | }\n>>\n>> However, the code has a contract violation.\n>> In constexpr_call, the result will be cached, but not cache the\n>> existence of contract violations.\n>>\n>> gcc/cp/ChangeLog:\n>>  * constexpr.cc (cxx_eval_constant_expression): cache failed or\n>>  no constant contract statement\n>\n> I think it would be simpler to set cacheable to false if there are\n> contract violations.\n\nIt's great! The change is very small.\nAnd I notice that:\n\nbasic.contract.eval.p8.C: In function 'int main()':\nbasic.contract.eval.p8.C:8:30: error: contract predicate is false in constant expression\n    8 | consteval void foo( auto x ) pre( false ) {}\n      |                              ^~~~~~~~~~~~\nbasic.contract.eval.p8.C:11:6: error: call to consteval function 'foo<int>(42)' is not a constant expression\n   11 |   foo( 42 ); // { dg-error {call to consteval function 'foo<int>\\(42\\)' is not a constant expression} }\n      |   ~~~^~~~~~\nbasic.contract.eval.p8.C:8:30: error: contract predicate is false in constant expression\n    8 | consteval void foo( auto x ) pre( false ) {}\n      |                              ^~~~~~~~~~~~\n\nThe error report abort contract violations appeared twice. It's expected?\nIf it only needs to be reported once, consider adding the following code in the function `check_for_failed_contracts`.\n\n  if (!ctx->quiet)\n    return error;\n\nHow abort it?\n\n----------------8<-----------------\n\nI noticed that the following code passed.\n\n1 | consteval void foo( auto x ) pre( false ) { return x; }\n2 |\n3 | static_assert (foo( 1 ) == 1, \"\");\n4 |\n5 | int main() {\n6 |   foo( 1 );\n7 | }\n\nHowever, the code has contract violations.\nIn constexpr_call, a result with contract violations should\nnot be cached.\n\ngcc/cp/ChangeLog:\n\t* constexpr.cc (cxx_eval_constant_expression): donot cache\n\tresult with contract violation.\ngcc/testsuite/ChangeLog:\n\t* g++.dg/contracts/cpp26/basic.contract.eval.p8-3.C: New\n---\n gcc/cp/constexpr.cc                               |  4 ++++\n .../contracts/cpp26/basic.contract.eval.p8-3.C    | 15 +++++++++++++++\n 2 files changed, 19 insertions(+)\n create mode 100644 gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8-3.C\n\n--\n2.43.0","diff":"diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc\nindex a593b66dd41..efb7a42014b 100644\n--- a/gcc/cp/constexpr.cc\n+++ b/gcc/cp/constexpr.cc\n@@ -4639,6 +4639,10 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,\n \t  /* Only cache a permitted result of a constant expression.  */\n \t  if (cacheable && !reduced_constant_expression_p (result))\n \t    cacheable = false;\n+\n+\t  /* Only cache a result without contract violations */\n+\t  if (cacheable && ctx->global->contract_statement)\n+\t    cacheable = false;\n \t}\n       else\n \t/* Couldn't get a function copy to evaluate.  */\ndiff --git a/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8-3.C b/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8-3.C\nnew file mode 100644\nindex 00000000000..869d7dc35e6\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8-3.C\n@@ -0,0 +1,15 @@\n+// basic.contract.eval/p8\n+// If a contract violation occurs in a context that is manifestly\n+// constant-evaluated ([expr.const]), and the evaluation semantic is a\n+// terminating semantic, the program is ill-formed.\n+// { dg-do compile { target c++23 } }\n+// { dg-additional-options \"-fcontracts  \" }\n+\n+consteval auto foo( auto x ) pre( false ) { return x; }\n+// { dg-error {contract predicate is false in constant expression} \"\" { target *-*-* } .-1 }\n+\n+static_assert(foo( 42 ) == 42, \"\");\n+\n+int main() {\n+  foo( 42 ); // { dg-error {call to consteval function 'foo<int>\\(42\\)' is not a constant expression} }\n+}\n","prefixes":["v5"]}