https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94013
Bug ID: 94013 Summary: [10 Regression] library algos need to work around cwg 2094 Product: gcc Version: 10.0 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- r271435 changed is_trivially_copyable_v<volatile int> to true, which breaks this: #include <algorithm> int main() { volatile int i = 0; volatile int j; std::copy(&i, &i + 1, &j); } In file included from /home/jwakely/gcc/10/include/c++/10.0.1/algorithm:61, from vol.cc:1: /home/jwakely/gcc/10/include/c++/10.0.1/bits/stl_algobase.h: In instantiation of 'static _Tp* std::__copy_move<_IsMove, true, std::random_access_iterator_tag>::__copy_m(const _Tp*, const _Tp*, _Tp*) [with _Tp = volatile int; bool _IsMove = false]': /home/jwakely/gcc/10/include/c++/10.0.1/bits/stl_algobase.h:475:30: required from '_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false; _II = volatile int*; _OI = volatile int*]' /home/jwakely/gcc/10/include/c++/10.0.1/bits/stl_algobase.h:509:42: required from '_OI std::__copy_move_a1(_II, _II, _OI) [with bool _IsMove = false; _II = volatile int*; _OI = volatile int*]' /home/jwakely/gcc/10/include/c++/10.0.1/bits/stl_algobase.h:517:31: required from '_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false; _II = volatile int*; _OI = volatile int*]' /home/jwakely/gcc/10/include/c++/10.0.1/bits/stl_algobase.h:572:7: required from '_OI std::copy(_II, _II, _OI) [with _II = volatile int*; _OI = volatile int*]' vol.cc:7:27: required from here /home/jwakely/gcc/10/include/c++/10.0.1/bits/stl_algobase.h:423:24: error: invalid conversion from 'volatile void*' to 'void*' [-fpermissive] 423 | __builtin_memmove(__result, __first, sizeof(_Tp) * _Num); | ^~~~~~~~ | | | volatile void* <built-in>: note: initializing argument 1 of 'void* __builtin_memmove(void*, const void*, long unsigned int)' /home/jwakely/gcc/10/include/c++/10.0.1/bits/stl_algobase.h:423:34: error: invalid conversion from 'const volatile void*' to 'const void*' [-fpermissive] 423 | __builtin_memmove(__result, __first, sizeof(_Tp) * _Num); | ^~~~~~~ | | | const volatile void* <built-in>: note: initializing argument 2 of 'void* __builtin_memmove(void*, const void*, long unsigned int)' It's no longer possible to use is_trivially_copyable to tell if something can be copied with memcpy. There are probably similar issues with the algos using memcmp (std::equal, std::lexicographical_compare).