Hi,

I am seeing a strange behavior when a compound initializer is used in a structure initialization. A test case:

[[[
struct s {
    int y;
    unsigned long *x;
};

struct s foo = {
    .y = 25,
    .x = (unsigned long [SZ]){},
};
]]]

If SZ is defined to non-zero, the expected output is produced:

[[[
/tmp$ gcc -S -o- 1.c -Wall -DSZ=1
    .file    "1.c"
    .local    __compound_literal.0
    .comm    __compound_literal.0,8,8
    .globl    foo
    .data
    .align 16
    .type    foo, @object
    .size    foo, 16
foo:
    .long    25
    .zero    4
    .quad    __compound_literal.0
    .ident    "GCC: (Ubuntu 4.9.1-16ubuntu6) 4.9.1"
    .section    .note.GNU-stack,"",@progbits
]]]

If SZ is zero, the initializer for .y (".y = 25") member is dropped as well:

[[[
/tmp$ gcc -S -o- 1.c -Wall -DSZ=0
    .file    "1.c"
    .globl    foo
    .bss
    .align 16
    .type    foo, @object
    .size    foo, 16
foo:
    .zero    16
    .ident    "GCC: (Ubuntu 4.9.1-16ubuntu6) 4.9.1"
    .section    .note.GNU-stack,"",@progbits
]]]

Is it expected behavior? If so, why?

Tested with GCC 4.6.3 and 4.9.1, both exhibit the same behavior.

Thanks,
Alexey.

Reply via email to