On Wed, 22 Aug 2018, Bernd Edlinger wrote:
> On 08/21/18 10:59, Richard Biener wrote:
> > On Tue, 21 Aug 2018, Bernd Edlinger wrote:
> >
> >> gcc -S -O2 -Wall -Wformat-overflow -ftrack-macro-expansion=0 -fshort-wchar
> >> builtin-sprintf-warn-20.c
> >> builtin-sprintf-warn-20.c: In function 'test':
> >> builtin-sprintf-warn-20.c:19:39: warning: hex escape sequence out of range
> >> 19 | ? (char*)L"\x4142\x4344" : (char*)L"\x41424344\x45464748";
> >> | ^~~~~~~~~~~~~~~~~~~~~~~
> >>
> >> Hmm, this test might create some noise on short-wchar targets.
> >>
> >> I would prefer a warning here, about the wrong type of the parameter.
> >> The buffer overflow is only a secondary thing.
> >>
> >> For constant objects like those, the GIMPLE type is still guaranteed to be
> >> reliable,
> >> right?
> >
> > TREE_TYPE of tcc_declaration and tcc_constant trees should more-or-less
> > (minus qualifications not affecting semantics) be those set by
> > frontends.
> >
>
> and in this case:
>
> const union
> { struct {
> wchar_t x[4];
> };
> struct {
> char z[8];
> };
> } u = {{L"123"}};
>
> int test()
> {
> return __builtin_strlen(u.z);
> }
>
>
> string_constant works out the initializer for u.x
> which has a different type than u.z
Yes. That's because it uses ctor-for-folding and friends. It's
a question of the desired semantics of string_constant whether
it should better return NULL_TREE in this case or whether the
caller has to deal with type mismatches.
Richard.