[cfe-dev] question about initializing multiple members of unions
Matthew Curtis
mcurtis at codeaurora.org
Tue Sep 17 06:36:51 PDT 2013
On 9/16/2013 1:05 PM, Richard Smith wrote:
> On Mon, Sep 16, 2013 at 7:11 AM, Matthew Curtis
<mcurtis at codeaurora.org> wrote:
>
> Richard, Doug,
>
> Do either of you have an recommendation here?
>
> Eli recommends GCC's behavior, while Philip Reames and Gao would
both prefer the alternate behavior below (same as a series of assignments).
>
> Can you explain how treating the designated initializers as a
sequence of assignments could give the object the value {0, 1, 2, 3}?
Given the following program :
#include <stdio.h>
typedef union {
struct {
int zero;
int one;
int two;
int three;
} a;
int b[4];
} my_agg_t;
// set value using initializer
my_agg_t X = {
.b[0] = 0,
.a.one = 1,
.b[2] = 2,
.a.three = 3,
};
int main(int argc, char *argv[])
{
// set value using series of assignments
my_agg_t Y;
Y.b[0] = 0;
Y.a.one = 1;
Y.b[2] = 2;
Y.a.three = 3;
printf("X:%d,%d,%d,%d\n", X.a.zero, X.a.one, X.a.two, X.a.three);
printf("Y:%d,%d,%d,%d\n", Y.a.zero, Y.a.one, Y.a.two, Y.a.three);
}
GCC Produces:
X:0,0,0,3
Y:0,1,2,3
I believe Goa and Philip Reames are arguing that it seems very
unintuitive that while the source code for setting X and setting Y look
very similar they produce very different results.
> I'm reasonably convinced that this is a hole in the C standard -- it
doesn't specify what to do in this case -- and Eli's approach seems
completely reasonable to me. Plus it has the benefit of > being
compatible with at least two other major compilers (g++ and EDG), and
doesn't require us to invent a new representation for initializer lists.
On 9/16/2013 5:28 PM, Richard Smith wrote:
> I still think Eli's approach is the right one here.
I agree.
Does this require further discussion or can I submit a patch that
implements this behavior?
Thanks,
Matthew
-- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
More information about the cfe-dev
mailing list