On 3/10/26 3:02 AM, Jakub Jelinek wrote:
Hi!__builtin_constexpr_diag works fine with string literals or class arguments like std::{,u8}string_view or string view like classes, but as the following testcase shows doesn't work with std::string argument. I believe the important difference is that std::string has non-trivial destructor and so needs to be passed by invisible reference while std::string_view doesn't.
Yes, so convert_for_arg_passing makes that adjustment. cxx_bind_parameters_in_call similarly does convert_from_reference.
Anyway, the following patch makes it work even with std::string. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
2026-03-10 Jakub Jelinek <[email protected]> PR c++/124404 * constexpr.cc (cxx_eval_constexpr_diag): Call convert_from_reference on arguments. * g++.dg/ext/constexpr-diag7.C: New test. --- gcc/cp/constexpr.cc.jj 2026-03-05 21:43:38.305131069 +0100 +++ gcc/cp/constexpr.cc 2026-03-09 14:01:03.969046239 +0100 @@ -2350,7 +2350,7 @@ cxx_eval_constexpr_diag (const constexpr tree args[3]; for (int i = 0; i < 3; ++i) { - tree arg = CALL_EXPR_ARG (t, i); + tree arg = convert_from_reference (CALL_EXPR_ARG (t, i)); arg = cxx_eval_constant_expression (ctx, arg, (i == 0 || POINTER_TYPE_P (TREE_TYPE (arg))) --- gcc/testsuite/g++.dg/ext/constexpr-diag7.C.jj 2026-03-09 14:05:20.441687088 +0100 +++ gcc/testsuite/g++.dg/ext/constexpr-diag7.C 2026-03-09 14:05:12.930814747 +0100 @@ -0,0 +1,9 @@ +// PR c++/124404 +// { dg-do compile { target c++26 } } + +#include <string> + +consteval { + std::string msg = "my message"; + __builtin_constexpr_diag (2, "", msg); // { dg-error "constexpr message: my message" } +} Jakub
