================
@@ -102,7 +102,7 @@ struct __aliasing_iterator_wrapper {
 
     _LIBCPP_HIDE_FROM_ABI _Alias operator*() const _NOEXCEPT {
       _Alias __val;
-      __builtin_memcpy(&__val, std::__to_address(__base_), sizeof(value_type));
+      __builtin_memcpy(&__val, static_cast<const 
void*>(std::__to_address(__base_)), sizeof(value_type));
----------------
carlosgalvezp wrote:

If we take the perspective of "anything not explicitly defined in the Standard 
is undefined", then the Standard never specifies the behavior of calling 
std::memcpy on non-trivially copyable types. It only specifies the behavior for 
trivially-copyable types in 
[[basic.types]#2](https://eel.is/c++draft/basic.types.general#2) and 
[[basic.types]#3](https://eel.is/c++draft/basic.types.general#3).

But if we look at this with a more pragmatic look, I guess the real problem is 
bypassing the `dst` class constructor, potentially breaking invariants and 
causing UB due to that. This is perhaps why GCC only warns about the `dst` type 
being non-trivial. It does **not** warn about the `src` type (which we are 
discussing here). 

So maybe we could tweak the warning to only warn on the `dst` type instead?

https://github.com/llvm/llvm-project/pull/111434
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to