Subject: Re: [PATCH] reftable tests: use C syntax compatible with old xlc

From: Junio C Hamano <[email-masked]>
Date: Thu, 13 Jan 2022 11:09:13 -0800

Han-Wen Nienhuys <[email-masked]> writes:

> On Thu, Jan 13, 2022 at 12:38 PM Ævar Arnfjörð Bjarmason
> <[email-masked]> wrote:
>> Change code added in 1ae2b8cda84 (reftable: add merged table view,
>> 2021-10-07) to be compatible with older versions of AIX's IBM xlc
>> compiler. Version V12.1 of it (on gcc111.fsffrance.org) will hard
>> error with:
>>
>>     "reftable/merged_test.c", line 211.19: 1506-196 (S) Initialization between types "char*" and "struct reftable_ref_record" is not allowed.
> ...
> Weird. What C standard does xlc implement?

Interesting.  It is complaining about this thing:

	struct reftable_ref_record r2[] = { {
		.refname = "a",
		.update_index = 2,
		.value_type = REFTABLE_REF_DELETION,
	} };
	...
	struct reftable_ref_record want[] = {
		r2[0],
		r1[1],
		r3[0],
		r3[1],
	};

and somehow assuming that r2[0] corresponds to the first member of a
"struct reftable_ref_record" structure, which is "char *refname".
Of course, you cannot initialize a character pointer with a whole
struct, which is *not* what the code wants to do.  I would
understand if it were written incorrectly like so

BAD:	struct reftable_ref_record want[] = {
BAD:		{ r2[0] },
BAD:		{ r1[1] },
BAD:		{ r3[0] },
BAD:		{ r3[1] },
BAD:	};

but that is not what we fed the compiler.  But apparently the
compiler is confused.

I wonder if it helps to use designated initializer on the latter, i.e.

	struct reftable_ref_record want[] = {
		[0] = r2[0],
		[1] = r1[1],
		[2] = r3[0],
		[3] = r3[1],
	};