| /* Test that sibling call is not used if there is an argument overlap. */ |
| |
| extern void abort (void); |
| |
| struct S |
| { |
| int a, b, c; |
| }; |
| |
| int |
| foo2 (struct S x, struct S y) |
| { |
| if (x.a != 3 || x.b != 4 || x.c != 5) |
| abort (); |
| if (y.a != 6 || y.b != 7 || y.c != 8) |
| abort (); |
| return 0; |
| } |
| |
| int |
| foo3 (struct S x, struct S y, struct S z) |
| { |
| foo2 (x, y); |
| if (z.a != 9 || z.b != 10 || z.c != 11) |
| abort (); |
| return 0; |
| } |
| |
| int |
| bar2 (struct S x, struct S y) |
| { |
| return foo2 (y, x); |
| } |
| |
| int |
| bar3 (struct S x, struct S y, struct S z) |
| { |
| return foo3 (y, x, z); |
| } |
| |
| int |
| baz3 (struct S x, struct S y, struct S z) |
| { |
| return foo3 (y, z, x); |
| } |
| |
| int |
| main (void) |
| { |
| struct S a = { 3, 4, 5 }, b = { 6, 7, 8 }, c = { 9, 10, 11 }; |
| |
| bar2 (b, a); |
| bar3 (b, a, c); |
| baz3 (c, a, b); |
| return 0; |
| } |