| /* PR c/106465 |
| * { dg-do run } |
| * { dg-options "-std=gnu99" } |
| * */ |
| |
| int main() |
| { |
| int n = 3; |
| |
| void* p = __builtin_malloc(sizeof(struct { char p[16]; })); |
| |
| if (!p) |
| return 0; |
| |
| void g1(int m, struct foo { char p[++m]; }* b) /* { dg-warning "struct" } */ |
| { |
| if (3 != m) |
| __builtin_abort(); |
| |
| struct foo t; |
| *b = t; |
| |
| if (3 != sizeof(b->p)) |
| __builtin_abort(); |
| } |
| |
| void g2(struct { char p[++n]; }* b) /* { dg-warning "anonymous struct" } */ |
| { |
| if (4 != n) |
| __builtin_abort(); |
| |
| typeof(*b) t; |
| *b = t; |
| |
| if (4 != sizeof(b->p)) |
| __builtin_abort(); |
| } |
| |
| void g2b(struct { char (*p)[++n]; }* b) /* { dg-warning "anonymous struct" } */ |
| { |
| if (5 != n) |
| __builtin_abort(); |
| |
| char tmp[5]; |
| typeof(*b) t = { &tmp }; |
| *b = t; |
| |
| if (5 != sizeof(*b->p)) |
| __builtin_abort(); |
| } |
| |
| if (3 != n) |
| __builtin_abort(); |
| |
| g1(2, p); |
| g2(p); |
| g2b(p); |
| n--; |
| |
| __builtin_free(p); |
| |
| if (4 != n) |
| __builtin_abort(); |
| |
| struct foo { char (*p)[++n]; } x; |
| |
| if (5 != n) |
| __builtin_abort(); |
| |
| char tmp1[5]; |
| x.p = &tmp1; |
| |
| struct bar { char (*p)[++n]; }; |
| |
| if (6 != n) |
| __builtin_abort(); |
| |
| auto struct z { char (*p)[++n]; } g3(void); |
| |
| if (7 != n) |
| __builtin_abort(); |
| |
| struct z g3(void) { }; |
| |
| if (7 != n) |
| __builtin_abort(); |
| |
| struct { char (*p)[++n]; } g4(void) { }; |
| |
| if (8 != n) |
| __builtin_abort(); |
| |
| __auto_type u = g3(); |
| |
| if (8 != n) |
| __builtin_abort(); |
| |
| char tmp2[7]; |
| u.p = &tmp2; |
| |
| if (5 != sizeof *x.p) |
| __builtin_abort(); |
| |
| if (7 != sizeof *u.p) |
| __builtin_abort(); |
| |
| return 0; |
| } |
| |