My P2246R1 patch caused diagnostics reported by running ubsan
instrumented compiler on cpp26/static_assert1.C - if len is 0,
we don't bother to allocate msg, so it stays NULL, and when I've added
cpp_translate_string call, that can invoke memcpy (something, NULL, 0);
in that case.
While that is no longer UB in C2Y since N3322, libsanitizer doesn't
know that yet and reports it anyway.
While we could just do
if (len)
{
...
}
else
msg = "";
there is really no point in trying to translate "" and allocate memory
for that, so the following patch instead by passes that translation for
len == 0.
2026-02-03 Jakub Jelinek <jakub@redhat.com>
PR c++/123918
* semantics.cc (cexpr_str::extract): Bypass cpp_translate_string
for len == 0.
cpp_string istr, ostr;
istr.len = len;
istr.text = (const unsigned char *) msg;
- if (!cpp_translate_string (parse_in, &istr, &ostr, CPP_STRING, true))
+ if (len == 0)
+ ;
+ else if (!cpp_translate_string (parse_in, &istr, &ostr, CPP_STRING,
+ true))
{
error_at (location, "could not convert constexpr string from "
"ordinary literal encoding to source character "