| #include <stdlib.h> |
| |
| union tree_node; |
| |
| struct tree_common |
| { |
| int a; |
| long b; |
| long c; |
| void *p; |
| int d; |
| }; |
| |
| struct other_tree |
| { |
| struct tree_common common; |
| int arr[14]; |
| }; |
| |
| struct tree_vec |
| { |
| struct tree_common common; |
| int length; |
| union tree_node *a[1]; |
| }; |
| |
| union tree_node |
| { |
| struct other_tree othr; |
| struct tree_vec vec; |
| }; |
| |
| union tree_node global; |
| |
| union tree_node * __attribute__((noinline)) |
| foo (union tree_node *p, int i) |
| { |
| union tree_node **q; |
| p->vec.a[i] = (union tree_node *) 0; |
| q = &p->vec.a[1]; |
| *q = &global; |
| return p->vec.a[i]; |
| } |
| |
| extern void abort (void); |
| extern void *malloc (__SIZE_TYPE__); |
| |
| int |
| main() |
| { |
| union tree_node *p = malloc (sizeof (union tree_node)); |
| if (foo (p, 1) != &global) |
| abort (); |
| return 0; |
| } |
| |