Hi!
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.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2026-02-03 Jakub Jelinek <[email protected]>
PR c++/123918
* semantics.cc (cexpr_str::extract): Bypass cpp_translate_string
for len == 0.
--- gcc/cp/semantics.cc.jj 2026-01-28 19:17:49.532306466 +0100
+++ gcc/cp/semantics.cc 2026-02-02 10:52:20.787120028 +0100
@@ -12860,7 +12860,10 @@ cexpr_str::extract (location_t location,
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 "
Jakub