On 7/23/26 5:07 AM, Jakub Jelinek wrote:
Hi!This PR complains about g++ not diagnosing return from [[noreturn]] function (which is UB) during constant evaluation. This patch diagnoses that. I haven't included the [[noreturn]] function name in the diagnostics as it is printed in the context: /home/jakub/src/gcc/gcc/testsuite/g++.dg/cpp1y/pr126354.C:18:24: in 'constexpr' expansion of 'bar()' /home/jakub/src/gcc/gcc/testsuite/g++.dg/cpp1y/pr126354.C:15:7: in 'constexpr' expansion of 'foo(false)' /home/jakub/src/gcc/gcc/testsuite/g++.dg/cpp1y/pr126354.C:15:7: error: '[[noreturn]]' call returns But if you think it is better to emit error ("%<[[noreturn]]%> %qD call returns", fun); instead, I can certainly do that. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? Or with the above mentioned change?
OK as is.
2026-07-23 Jakub Jelinek <[email protected]> PR c++/126354 * constexpr.cc (cxx_eval_call_expression): Diagnose return from [[noreturn]] function. * g++.dg/cpp1y/pr126354.C: New test. * g++.dg/cpp26/pr126354.C: New test. --- gcc/cp/constexpr.cc.jj 2026-07-22 17:07:06.558244058 +0200 +++ gcc/cp/constexpr.cc 2026-07-22 18:17:43.577203062 +0200 @@ -4606,6 +4606,13 @@ cxx_eval_call_expression (const constexp cacheable = false; *jump_target = jmp_target; } + else if (!*non_constant_p && TREE_THIS_VOLATILE (fun)) + { + /* Return from a [[noreturn]] function. */ + if (!ctx->quiet) + error ("%<[[noreturn]]%> call returns"); + *non_constant_p = true; + } else if (DECL_CONSTRUCTOR_P (fun)) /* This can be null for a subobject constructor call, in which case what we care about is the initialization --- gcc/testsuite/g++.dg/cpp1y/pr126354.C.jj 2026-07-22 18:25:26.663075467 +0200 +++ gcc/testsuite/g++.dg/cpp1y/pr126354.C 2026-07-22 18:25:01.211412160 +0200 @@ -0,0 +1,18 @@ +// PR c++/126354 +// { dg-do compile { target c++14 } } + +[[noreturn]] constexpr void +foo (bool x) +{ + if (x) + for (;;) + ; +} + +constexpr bool +bar () +{ + foo (false); // { dg-error "'\\\[\\\[noreturn\\\]\\\]' call returns" } +} + +constexpr bool a = bar (); --- gcc/testsuite/g++.dg/cpp26/pr126354.C.jj 2026-07-22 18:23:09.457890533 +0200 +++ gcc/testsuite/g++.dg/cpp26/pr126354.C 2026-07-22 18:22:41.383261931 +0200 @@ -0,0 +1,28 @@ +// PR c++/126354 +// { dg-do compile { target c++26 } } + +[[noreturn]] constexpr void +foo (bool x) +{ + if (x) + throw 42; +} + +consteval { + try + { + foo (true); + throw nullptr; + } + catch (int x) + { + if (x != 42) + throw nullptr; + return; + } + throw nullptr; +} + +consteval { + foo (false); // { dg-error "'\\\[\\\[noreturn\\\]\\\]' call returns" } +} Jakub
