Daniel Berlin wrote: > Even if you "fixed" init_ctor_eval (modify_expr gimplifies the lhs and rhs > and throws away the assignment), you're going to run into problems in > the subvar machinery if you really have 0 sized field accesses with side > effects. > > I'm not sure what the heck a "0 sized field access with side effects" > does. > > After all, a 0 sized field has no space, etc (in fact, it is nothing), so > how could you side-effect by accessing one, since any such access must do > nothing?
You may have side effect from an initializer when setting a zero sized field. For instance (variant of gcc.c-torture/compile/zero-strct-4.c), compiled with GCC 3.4, the code below prints "returning raw_lock" as I would expect. It doesn't print anything when compiled with mainline because one_raw_spinlock is not called. #include <stdio.h> typedef struct {} raw_spinlock_t; typedef struct { raw_spinlock_t raw_lock; } spinlock_t; raw_spinlock_t one_raw_spinlock (void) { raw_spinlock_t raw_lock; printf ("returning raw_lock\n"); return raw_lock; } int main(void) { spinlock_t lock = (spinlock_t) { .raw_lock = one_raw_spinlock() }; return 0; }