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

Reply via email to