/* { dg-do compile } */ /* No special options--in particular, turn off the default -pedantic-errors option. */ /* { dg-options "" } */ /* When not using -fplan9-extensions, we don't support automatic conversion of pointer types, and we don't 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; /* { dg-warning "does not declare anything" } */ char c; }; void f1 (struct A *p) /* { dg-message "expected" } */ { p->a = 1; } void test1 (void) { struct B b; struct A *p; b.b = 2; b.c = 3; f1 (&b); /* { dg-warning "incompatible pointer type" } */ if (b.a != 1) /* { dg-error "no member" } */ abort (); if (b.b != 2 || b.c != 3) abort (); p = &b; /* { dg-warning "incompatible pointer type" } */ if (p->a != 1) abort (); } typedef struct { char d; } D; struct E { char b; struct F { char f; }; /* { dg-warning "does not declare anything" } */ char c; union { D; /* { dg-warning "does not declare anything" } */ }; char e; }; void f2 (struct F *p) /* { dg-message "expected" } */ { p->f = 6; } void f3 (D *p) /* { dg-message "expected" } */ { 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); /* { dg-warning "incompatible pointer type" } */ f3 (&e); /* { dg-warning "incompatible pointer type" } */ if (e.d != 4) /* { dg-error "no member" } */ abort (); if (e.f != 6) /* { dg-error "no member" } */ abort (); if (e.b != 2 || e.c != 3 || e.e != 5) abort (); pf = &e; /* { dg-warning "incompatible pointer type" } */ if (pf->f != 6) abort (); pd = &e; /* { dg-warning "incompatible pointer type" } */ if (pd->d != 4) abort (); d = e.D; /* { dg-error "no member" } */ f3 (&e.D); /* { dg-error "no member" } */ f4 (e.D); /* { dg-error "no member" } */ } int main () { test1 (); test2 (); exit (0); }