]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: workaround -Wrestrict false positive [PR114385]
authorMarc Poulhiès <dkm@kataplop.net>
Thu, 28 May 2026 20:11:52 +0000 (22:11 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Fri, 29 May 2026 13:45:59 +0000 (15:45 +0200)
Recent change gives:

In file included from /gccrs/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/include/string:45,
                 from ../../gcc/rust/rust-system.h:34,
                 from ../../gcc/rust/lex/rust-token.cc:19:
In static member function 'static constexpr std::char_traits<char>::char_type* std::char_traits<char>::copy(char_type*, const char_type*, std::size_t)',
    inlined from 'static constexpr void std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_S_copy(_CharT*, const _CharT*, size_type) [with _CharT = char; _Traits = std:
:char_traits<char>; _Alloc = std::allocator<char>]' at /gccrs/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:4
87:21,
    inlined from 'static constexpr void std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_S_copy(_CharT*, const _CharT*, size_type) [with _CharT = char; _Traits = std:
:char_traits<char>; _Alloc = std::allocator<char>]' at /gccrs/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:4
82:7,
    inlined from 'constexpr void std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_M_mutate(size_type, size_type, const _CharT*, size_type) [with _CharT = char; _Trait
s = std::char_traits<char>; _Alloc = std::allocator<char>]' at /gccrs/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_st
ring.tcc:403:15,
    inlined from 'constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_M_append(const _CharT*, size_type) [
with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]' at /gccrs/build/prev-x86_64-pc-linux-gnu/libstdc+
+-v3/include/bits/basic_string.tcc:498:17,
    inlined from 'constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::append(const _CharT*, size_type) [wit
h _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]' at /gccrs/build/prev-x86_64-pc-linux-gnu/libstdc++-v
3/include/bits/basic_string.h:1624:18,
    inlined from 'constexpr _Str std::__str_concat(const typename _Str::value_type*, typename _Str::size_type, const typename _Str::value_type*, typename _Str::size_type,
const typename _Str::allocator_type&) [with _Str = __cxx11::basic_string<char>]' at /gccrs/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/
include/bits/basic_string.h:3908:19,
    inlined from 'constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc> std::operator+(const __cxx11::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*) [with
_CharT = char; _Traits = char_traits<char>; _Alloc = allocator<char>]' at /gccrs/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/include/bi
ts/basic_string.h:3984:31,
    inlined from 'std::string Rust::Token::as_string() const' at ../../gcc/rust/lex/rust-token.cc:251:45:
/gccrs/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/include/bits/char_traits.h:432:56: error: 'void* __builtin_memcpy(void*, const void*
, long unsigned int)' accessing 18446744073709551609 or more bytes at offsets 0 and 0 overlaps 9223372036854775795 bytes at offset -9223372036854775802 [-Werror=restrict]
  432 |         return static_cast<char_type*>(__builtin_memcpy(__s1, __s2, __n));
      |                                        ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~

Split the concatenation to avoid the warning.

Fix comes from https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125404#c2

gcc/rust/ChangeLog:
PR tree-optimization/114385
* lex/rust-token.cc (Token::as_string): split concatenation.

Co-authored-by: Andreas Schwab <schwab@linux-m68k.org>
Signed-off-by: Marc Poulhiès <dkm@kataplop.net>
gcc/rust/lex/rust-token.cc

index a19bed5bc5b28f47ccca6249ebe1e4341055286a..41861d1b219719a1bc7682f48f9fb2d1289bd386 100644 (file)
@@ -248,12 +248,31 @@ Token::as_string () const
          if (get_type_hint () == CORETYPE_UNKNOWN)
            return get_str ();
          else
-           return get_str () + get_type_hint_str ();
+           /* FIXME: This is a workaround for an overzealous -Wrestrict,
+              #125404 - we should remove it once it is fixed
+
+              return get_str () + get_type_hint_str ();
+              */
+           {
+             std::string s = get_str ();
+             s += get_type_hint_str ();
+             return s;
+           }
        case FLOAT_LITERAL:
          if (get_type_hint () == CORETYPE_UNKNOWN)
            return get_str ();
          else
-           return get_str () + get_type_hint_str ();
+           /* FIXME: This is a workaround for an overzealous -Wrestrict,
+              #125404 - we should remove it once it is fixed
+
+              return get_str () + get_type_hint_str ();
+              */
+           {
+             std::string s = get_str ();
+             s += get_type_hint_str ();
+             return s;
+           }
+
        default:
          return get_str ();
        }