On Tue, 21 Aug 2018, Martin Sebor wrote: > On 08/21/2018 09:44 AM, Joseph Myers wrote: > > On Tue, 21 Aug 2018, Martin Sebor wrote: > > > > > Sure, but the only valid argument to %ls is wchar_t*. Passing > > > it something else is undefined. > > > > Well, (wchar_t *)"something\0\0\0\0" would be OK given > > -fno-strict-aliasing and if you know the alignment is OK. Do we have that > > information about the type cast to, as opposed to the type of the string > > constant, at this point? > > In the simple cases like the one above the cast is gone. Only > in some more involved cases is the type of the argument preserved. > I responded to Jeff with one such example here: > > https://gcc.gnu.org/ml/gcc-patches/2018-08/msg01296.html > > If supporting (wchar_t *)"...\0\0\0\0" with %ls is viewed as > important (despite it being undefined) then the function does
There are different cases of support. It doesn't need to be highly optimized or get particularly good diagnostics. It does need to avoid being miscompiled or getting actively incorrect diagnostics. Given -fno-strict-aliasing and appropriate alignment, it's not undefined. (To ensure appropriate alignment one might use a target where BIGGEST_ALIGNMENT is 8, or one where it is 16 and a char16_t[] string constant is cast to pointer to 32-bit wchar_t.) -- Joseph S. Myers jos...@codesourcery.com