/* { dg-do compile } */

/* Also turn off the default -pedantic-errors option.  */
/* { dg-options "-fpermissive" } */

/* 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);
}
