Confusing error for incorrect struct initialization

Sat Jun 18 21:58:00 GMT 2016

On 18/06/2016 23:14, Martin Sebor wrote:

> On 06/18/2016 10:25 AM, Mason wrote:
>> The bug is a request to improve an existing error message.
>> struct xxx { void *p; int a,b,c,d; double x,y; };
>> struct foo { struct xxx *p; int e,f,g; };
>> static struct xxx s = { 0 };
>> struct foo bar = { s }; /*** should be &s ***/
>> $ gcc-6 -c qoi.c
>> qoi.c:4:20: error: initializer element is not constant
>>   struct foo bar = { s }; /*** should be &s ***/
>>                      ^
>> qoi.c:4:20: note: (near initialization for 'bar.p')
>> Do you disagree that this is a confusing error message?
>> Isn't this one better:
>>    incompatible types when initializing type 'struct xxx *' using type 'struct xxx'
> I agree that in this case the error is misleading because even
> if s could somehow be made a constant expression (it can't be
> because its type isn't one of those required of constant
> expressions in initializers) it would not be a valid initializer
> for a pointer.  It seems straightforward to check that the
> initializer type is compatible first, before checking its
> constness, and issue the clearer error message instead. Let
> me finish the patch I prototyped for it and post it for review.

I'm glad to hear that.

> PS Note that this case is different from the one submitted in
> bug 71552 and my patch does not change the error GCC issues
> for it for the reasons explained there.  I.e., initializing
> a pointer with an integer is valid in C and cannot very well
> be rejected.

I think I now understand what you meant.

This code cannot be rejected:

struct foo { const int *p; };
struct foo bar = { 42 };

and the (functionally equivalent) code I originally posted

struct foo { const int *p; };
static const int i = 42;
struct foo bar = { i };

is rejected only because i is not constant per C's rules,
and not because it has an incompatible type.


More information about the Gcc-help mailing list