//main.c
//Why does y get set to 0 in the case of 'Breaks'?
//Compile with gcc -fms-extensions main.c
#include <stdio.h>
struct Base {
int x;
int y;
};
struct Extend {
union {
int X;
struct Base bb;
} uu;
};
struct AlsoExtend {
struct Base bb;
int z;
};
static struct Extend Works = {
.uu.bb.x = 5,
.uu.bb.y = 3,
//.X = 2
};
static struct Extend Breaks = {
.uu.bb.x = 5,
.uu.bb.y = 3,
.uu.X = 2
};
static struct AlsoExtend AlsoWorks = {
.bb.x = 5,
.bb.y = 3,
.z = 69
};
int main(int argc, char** argv) {
printf("Works: x:%d y:%d X:%d\n", Works.
uu.
bb.
x, Works.
uu.
bb.
y, Works.
uu.
X); printf("Breaks: x:%d y:%d X:%d\n", Breaks.
uu.
bb.
x, Breaks.
uu.
bb.
y, Breaks.
uu.
X); printf("AlsoWorks: x:%d y:%d z:%d\n", AlsoWorks.
bb.
x, AlsoWorks.
bb.
y, AlsoWorks.
z);
return 0;
}
Ly9tYWluLmMKLy9XaHkgZG9lcyB5IGdldCBzZXQgdG8gMCBpbiB0aGUgY2FzZSBvZiAnQnJlYWtzJz8KLy9Db21waWxlIHdpdGggZ2NjIC1mbXMtZXh0ZW5zaW9ucyBtYWluLmMKCiNpbmNsdWRlIDxzdGRpby5oPgoKc3RydWN0IEJhc2UgewogICAgaW50IHg7CiAgICBpbnQgeTsKfTsKCnN0cnVjdCBFeHRlbmQgewogICAgdW5pb24gewogICAgICAgIGludCBYOwogICAgICAgIHN0cnVjdCBCYXNlIGJiOwogICAgfSB1dTsKfTsKCnN0cnVjdCBBbHNvRXh0ZW5kIHsKICAgIHN0cnVjdCBCYXNlIGJiOwogICAgaW50IHo7Cn07CgpzdGF0aWMgc3RydWN0IEV4dGVuZCBXb3JrcyA9IHsKICAgIC51dS5iYi54ID0gNSwKICAgIC51dS5iYi55ID0gMywKICAgIC8vLlggPSAyCn07CgpzdGF0aWMgc3RydWN0IEV4dGVuZCBCcmVha3MgPSB7CiAgICAudXUuYmIueCA9IDUsCiAgICAudXUuYmIueSA9IDMsCiAgICAudXUuWCA9IDIKfTsKCnN0YXRpYyBzdHJ1Y3QgQWxzb0V4dGVuZCBBbHNvV29ya3MgPSB7CiAgICAuYmIueCA9IDUsCiAgICAuYmIueSA9IDMsCiAgICAueiA9IDY5Cn07CgppbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKCiAgICBwcmludGYoIldvcmtzOiB4OiVkIHk6JWQgWDolZFxuIiwgV29ya3MudXUuYmIueCwgV29ya3MudXUuYmIueSwgV29ya3MudXUuWCk7CiAgICBwcmludGYoIkJyZWFrczogeDolZCB5OiVkIFg6JWRcbiIsIEJyZWFrcy51dS5iYi54LCBCcmVha3MudXUuYmIueSwgQnJlYWtzLnV1LlgpOwogICAgcHJpbnRmKCJBbHNvV29ya3M6IHg6JWQgeTolZCB6OiVkXG4iLCBBbHNvV29ya3MuYmIueCwgQWxzb1dvcmtzLmJiLnksIEFsc29Xb3Jrcy56KTsKCiAgICByZXR1cm4gMDsKfQo=