> The original problem is udata of intptr_t insted of void* (like in > FreeBSD) and with C++ compilers it's not possible to cast it cleanly to > intptr_t without alternative approaches. > > This keeps breaking C++ users and we need to patch 3rd party code from > the caller level. > > It used to break C ones too, but we have introduced a cast to workaround it. > > As we fix it for C ones, I think we should fix it for C++ ones as well. > > 3 solutions: > > - Keep patching it on caller level for C++ > - Keep inventing workarounds on callee level for C++ > - Change the type of udata to void* in our source code. > > Templates and c++ features are difficult as the language is reinventing > its each decade. > > Can we go for changing the udata type to void*? This will make all > compatibility problems to go away.
I am not sure what the best solution is. If we go adding pragma's then we can use regular casts and disable the -Wold-style-cast warning with a pragma. Otherwise you seem to have a working template-specialization based solution. But as you wrote perhaps the best solution is to go back to using void * for it, although this means breaking existing software workarounds. > Compilers probably apply different warning rules for system headers. Ah, this is the -Wsystem-headers which we enable in our .mk files. This $#$%#!$$# was what also disabled the array indexing warnings in the <ctype.h> macros. In our (NetBSD) opinion, -Wsystem-headers is a mis-feature designed to work around broken system headers that can cause poor application space implementations to not cause warnings. christos