[PATCH] convert braced initializers to strings (PR 71625)

Bernd Edlinger bernd.edlinger@hotmail.de
Wed Aug 8 18:34:00 GMT 2018


On 08/08/18 19:33, Bernd Edlinger wrote:
> Hi Martin,
> 
> sorry, I hope you forgive me, when I add a few comments to your patch.
> 
>> +  unsigned HOST_WIDE_INT nelts = CONSTRUCTOR_NELTS (ctor);
>> +  tree eltype = TREE_TYPE (type);
> ...
>> +      /* Bail if the CTOR has a block of more than 256 embedded nuls
>> +        due to implicitly initialized elements.  */
>> +      unsigned nelts = (idx - str.length ()) + 1;
>> +      if (nelts > 256)
>> +       return NULL_TREE;
> 
> nelts shadows previous nelts.
> 
>> +  if (!nelts || str.length () < i)
> 
> I don't understand when is str.length () < i ?
> 
>> +    /* Append a nul for the empty initializer { } and for the last
>> +       explicit initializer in the loop above that is a nul.  */
>> +    str.safe_push (0);
>> +
>> +  /* Build a string literal but return the embedded STRING_CST.  */
>> +  tree res = build_string_literal (str.length (), str.begin ());
>> +  res = TREE_OPERAND (TREE_OPERAND (res, 0), 0);
>> +  return res;
>> +}
> 
> 
> res has a different type than the object you initialize.
> I think you should use:
> 
> tree res = build_string (str.length (), str.begin ());
> TREE_TYPE (res) = type;
> return res;
> 

Sorry, again, but could it be possible that this test case changed
with your patch?

$ cat w.c
const char  x[] = {  };
int main()
{
   __builtin_printf("%ld\n", sizeof(x));
   return 0;
}
$ gcc w.c
$ ./a.out
1

without your patch
$ ./a.out
0


Bernd.



More information about the Gcc-patches mailing list