master doesn't compile on xlc 21.01 anymore (old AIX compiler) (was: [PATCH v7 14/16] reftable: make reftable_record a tagged union)
On Mon, Jan 24 2022, Ævar Arnfjörð Bjarmason wrote:
Show 34 quoted lines
> On Mon, Jan 24 2022, Han-Wen Nienhuys wrote:
>
>> On Mon, Jan 24, 2022 at 8:44 PM Ævar Arnfjörð Bjarmason
>> <avarab@gmail.com> wrote:
>>
>>> 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.
>>>
>>
>>> I.e. you're dereferencing a struct type here to get at its first member,
>>
>> No, that's not what I'm doing.
>>
>>> > + 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.0000The 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?