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

Reply via email to