Thread (100 messages) 100 messages, 4 authors, 2022-01-13

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

From: Ævar Arnfjörð Bjarmason <hidden>
Date: 2022-01-13 16:25:52

On Thu, Jan 13 2022, Han-Wen Nienhuys wrote:
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.
    "reftable/merged_test.c", line 212.19: 1506-196 (S) Initialization between types "unsigned long long" and "struct reftable_ref_record" is not allowed.
    "reftable/merged_test.c", line 213.19: 1506-196 (S) Initialization between types "enum {...}" and "struct reftable_ref_record" is not allowed.
    "reftable/merged_test.c", line 214.19: 1506-196 (S) Initialization between types "unsigned char*" and "struct reftable_ref_record" is not allowed.
    "reftable/merged_test.c", line 349.19: 1506-196 (S) Initialization between types "char*" and "struct reftable_log_record" is not allowed.
    "reftable/merged_test.c", line 350.19: 1506-196 (S) Initialization between types "unsigned long long" and "struct reftable_log_record" is not allowed.
    "reftable/merged_test.c", line 351.19: 1506-196 (S) Initialization between types "enum {...}" and "struct reftable_log_record" is not allowed.
Weird. What C standard does xlc implement?
I don't know. Your guess (and searching through IBM's website) is as
good as mine.

AFAICT it mostly implements the C99 semantics, but doesn't grok the
interpolation of structs-within-structs
quoted
Perhaps there's a better way to do this, but just duplicating the
earlier struct values declared earlier in these functions works, and
is probably the least bad solution.
I'd rather not duplicate anything. Can't you do

  struct foobar *want = { &r[0], &r[2] .. }
Maybe I'm just not understanding what you mean, but this:

        struct reftable_ref_record *want = {
                &r2[0],
                &r1[1],
                &r3[0],
                &r3[1],
        };

Gives us the predictable compiler error on gcc/clang, nevermind
xlc. Turn that into:

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

And you can get gcc/clang to emulate what that xlc version (mis)parses
that as. I.e. it takes it as a reference to the nth element in that
struct.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help