Thread (145 messages) flat view 145 messages, 7 authors, 2022-03-29

Re: master doesn't compile on xlc 21.01 anymore (old AIX compiler) (was: [PATCH v7 14/16] reftable: make reftable_record a tagged union)

From: René Scharfe <hidden>
Date: 2022-02-19 15:11:43

Am 19.02.22 um 13:54 schrieb Ævar Arnfjörð Bjarmason:
On Mon, Jan 24 2022, Ævar Arnfjörð Bjarmason wrote:
quoted
On Mon, Jan 24 2022, Han-Wen Nienhuys wrote:
quoted
On Mon, Jan 24, 2022 at 8:44 PM Ævar Arnfjörð Bjarmason
[off-list ref] wrote:
quoted
I didn't test the v6 on xlc on AIX 7.1, but found that it refuses to
compile this code (but the one on AIX 7.2 is OK with it):

    "reftable/generic.c", line 135.26: 1506-196 (S) Initialization between types "char*" and "struct reftable_ref_record" is not allowed.
    "reftable/generic.c", line 147.26: 1506-196 (S) Initialization between types "char*" and "struct reftable_log_record" is not allowed.
    "reftable/writer.c", line 261.26: 1506-196 (S) Initialization between types "char*" and "struct reftable_ref_record" is not allowed.
    "reftable/writer.c", line 312.26: 1506-196 (S) Initialization between types "char*" and "struct reftable_log_record" is not allowed.
    "reftable/writer.c", line 406.45: 1506-196 (S) Initialization between types "unsigned long long" and "struct reftable_index_record" is not allowed.
quoted
I.e. you're dereferencing a struct type here to get at its first member,
No, that's not what I'm doing.
quoted
quoted
+   struct reftable_record rec = {
+             .type = BLOCK_TYPE_REF,
+             .u.ref = *ref,
+     };
reftable_record is tagged union, and u.ref is a reftable_ref_record. I
intend to shallow-copying the parameter (a reftable_record called
'ref') into 'rec.u.ref' , precisely as it is written.

Does this patch pass the unittests?
No, sorry about that. It fails. I didn't have time to run them earlier
(and it takes a while on that platform).

I don't know how to work around it then...
Just a reminder that now with this landed on master we've hard broken
compilation on that version of xlc:

    avar@gcc111:[/home/avar]xlc -qversion
    IBM XL C/C++ for AIX, V12.1 (5765-J02, 5725-C72)
    Version: 12.01.0000.0000

The error is:

    "reftable/generic.c", line 133.26: 1506-196 (S) Initialization between types "char*" and "struct reftable_ref_record" is not allowed.
    "reftable/generic.c", line 145.26: 1506-196 (S) Initialization between types "char*" and "struct reftable_log_record" is not allowed.

Is there really no workaround we can think of for this?
The code is hard to read for me in general due to its many types and
function dispatch tables, but this compiler seems to have an even harder
time.  Where does it even get that char pointer type from?

Can it compile this?

	struct reftable_record rec = {
		.type = BLOCK_TYPE_REF,
		.u = {
			.ref = *ref
		},
	};

If it can't, what about this?

	struct reftable_record rec = {
		.type = BLOCK_TYPE_REF,
	};
	rec.u.ref = *ref;

René
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help