| /* { dg-do run } */ |
| /* { dg-options "-fplan9-extensions" } */ |
| |
| /* When using -fplan9-extensions, we support automatic conversion of |
| pointer types, and we support referring to a typedef name |
| directly. */ |
| |
| extern void exit (int); |
| extern void abort (void); |
| |
| struct A { char a; }; |
| |
| struct B { |
| char b; |
| struct A; |
| char c; |
| }; |
| |
| void |
| f1 (struct A *p) |
| { |
| p->a = 1; |
| } |
| |
| void |
| test1 (void) |
| { |
| struct B b; |
| struct A *p; |
| |
| b.b = 2; |
| b.c = 3; |
| f1 (&b); |
| if (b.a != 1) |
| abort (); |
| if (b.b != 2 || b.c != 3) |
| abort (); |
| p = &b; |
| if (p->a != 1) |
| abort (); |
| } |
| |
| typedef struct { char d; } D; |
| |
| struct E { |
| char b; |
| struct F { char f; }; |
| char c; |
| union { |
| D; |
| }; |
| char e; |
| }; |
| |
| void |
| f2 (struct F *p) |
| { |
| p->f = 6; |
| } |
| |
| void |
| f3 (D *p) |
| { |
| p->d = 4; |
| } |
| |
| void |
| f4 (D d) |
| { |
| } |
| |
| void |
| test2 (void) |
| { |
| struct E e; |
| struct F *pf; |
| D *pd; |
| D d; |
| |
| e.b = 2; |
| e.c = 3; |
| e.e = 5; |
| f2 (&e); |
| f3 (&e); |
| if (e.d != 4) |
| abort (); |
| if (e.f != 6) |
| abort (); |
| if (e.b != 2 || e.c != 3 || e.e != 5) |
| abort (); |
| pf = &e; |
| if (pf->f != 6) |
| abort (); |
| pd = &e; |
| if (pd->d != 4) |
| abort (); |
| d = e.D; |
| f3 (&e.D); |
| f4 (e.D); |
| } |
| |
| int |
| main () |
| { |
| test1 (); |
| test2 (); |
| exit (0); |
| } |