Thread (1 message) 1 message, 1 author, 2022-01-13

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

From: Junio C Hamano <hidden>
Date: 2022-01-13 19:09:17

Han-Wen Nienhuys [off-list ref] writes:
On Thu, Jan 13, 2022 at 12:38 PM Ævar Arnfjörð Bjarmason
[off-list ref] wrote:
quoted
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],
	};
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help