/* Test for multiple declarations and composite types.  As in bug
   13801.  Test no problems in debug information generation.  */
/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
/* rdar 10406573 */
/* { dg-do compile { xfail *-*-* } } */
/* { dg-options "" } */

typedef int IA[];
typedef int A10[10];

/* Test all combinations of: a variable declared at file scope (no
   type specifiers, or extern, or static), or just inside a function
   (with extern), redeclared in an inner scope (with extern), and
   redeclared in an inner scope when the previous declaration is
   hidden (with extern, and not if the original declaration was
   static).  Test three times: incomplete variable types; pointers to
   incomplete types; functions returning such pointers.

   This test only includes the valid code cases, to test debug info
   generation.  (Incomplete static at file scope is not permitted by
   ISO C, but is accepted by GCC as an extension without
   -pedantic.)  */

A10 a5;
void
f5 (void)
{
  sizeof(a5);
  {
    extern IA a5;
    sizeof(a5);
    {
      int a5;
      {
        extern A10 a5;
        sizeof(a5);
      }
    }
    sizeof(a5);
  }
  sizeof(a5);
}
extern A10 a5;

A10 a7;
void
f7 (void)
{
  sizeof(a7);
  {
    extern A10 a7;
    sizeof(a7);
    {
      int a7;
      {
        extern A10 a7;
        sizeof(a7);
      }
    }
    sizeof(a7);
  }
  sizeof(a7);
}
extern A10 a7;

extern A10 a13;
void
f13 (void)
{
  sizeof(a13);
  {
    extern IA a13;
    sizeof(a13);
    {
      int a13;
      {
        extern A10 a13;
        sizeof(a13);
      }
    }
    sizeof(a13);
  }
  sizeof(a13);
}
extern A10 a13;

extern A10 a15;
void
f15 (void)
{
  sizeof(a15);
  {
    extern A10 a15;
    sizeof(a15);
    {
      int a15;
      {
        extern A10 a15;
        sizeof(a15);
      }
    }
    sizeof(a15);
  }
  sizeof(a15);
}
extern A10 a15;


static A10 a18;
void
f18 (void)
{
  sizeof(a18);
  {
    extern IA a18;
    sizeof(a18);
  }
  sizeof(a18);
}
extern A10 a18;

static A10 a19;
void
f19 (void)
{
  sizeof(a19);
  {
    extern A10 a19;
    sizeof(a19);
  }
  sizeof(a19);
}
extern A10 a19;

A10 *b5;
void
g5 (void)
{
  sizeof(*b5);
  {
    extern IA *b5;
    sizeof(*b5);
    {
      int b5;
      {
        extern A10 *b5;
        sizeof(*b5);
      }
    }
    sizeof(*b5);
  }
  sizeof(*b5);
}
extern A10 *b5;

A10 *b7;
void
g7 (void)
{
  sizeof(*b7);
  {
    extern A10 *b7;
    sizeof(*b7);
    {
      int b7;
      {
        extern A10 *b7;
        sizeof(*b7);
      }
    }
    sizeof(*b7);
  }
  sizeof(*b7);
}
extern A10 *b7;

extern A10 *b13;
void
g13 (void)
{
  sizeof(*b13);
  {
    extern IA *b13;
    sizeof(*b13);
    {
      int b13;
      {
        extern A10 *b13;
        sizeof(*b13);
      }
    }
    sizeof(*b13);
  }
  sizeof(*b13);
}
extern A10 *b13;

extern A10 *b15;
void
g15 (void)
{
  sizeof(*b15);
  {
    extern A10 *b15;
    sizeof(*b15);
    {
      int b15;
      {
        extern A10 *b15;
        sizeof(*b15);
      }
    }
    sizeof(*b15);
  }
  sizeof(*b15);
}
extern A10 *b15;

static A10 *b18;
void
g18 (void)
{
  sizeof(*b18);
  {
    extern IA *b18;
    sizeof(*b18);
  }
  sizeof(*b18);
}
extern A10 *b18;

static A10 *b19;
void
g19 (void)
{
  sizeof(*b19);
  {
    extern A10 *b19;
    sizeof(*b19);
  }
  sizeof(*b19);
}
extern A10 *b19;

A10 *c5 (void);
void
h5 (void)
{
  sizeof(*c5());
  {
    extern IA *c5 (void);
    /* FIXME: This is valid: sizeof(*c5()); */
    {
      int c5;
      {
        extern A10 *c5 (void);
        sizeof(*c5());
      }
    }
    sizeof(*c5());
  }
  sizeof(*c5());
}
A10 *c5 (void) { return 0; }

A10 *c7 (void);
void
h7 (void)
{
  sizeof(*c7());
  {
    extern A10 *c7 (void);
    sizeof(*c7());
    {
      int c7;
      {
        extern A10 *c7 (void);
        sizeof(*c7());
      }
    }
    sizeof(*c7());
  }
  sizeof(*c7());
}
A10 *c7 (void) { return 0; }

extern A10 *c13 (void);
void
h13 (void)
{
  sizeof(*c13());
  {
    extern IA *c13 (void);
    /* FIXME: This is valid: sizeof(*c13()); */
    {
      int c13;
      {
        extern A10 *c13 (void);
        sizeof(*c13());
      }
    }
    sizeof(*c13());
  }
  sizeof(*c13());
}
extern A10 *c13 (void) { return 0; }

extern A10 *c15 (void);
void
h15 (void)
{
  sizeof(*c15());
  {
    extern A10 *c15 (void);
    sizeof(*c15());
    {
      int c15;
      {
        extern A10 *c15 (void);
        sizeof(*c15());
      }
    }
    sizeof(*c15());
  }
  sizeof(*c15());
}
extern A10 *c15 (void) { return 0; }

static A10 *c18 (void);
void
h18 (void)
{
  sizeof(*c18());
  {
    extern IA *c18 (void);
    /* FIXME: This is valid: sizeof(*c18()); */
  }
  sizeof(*c18());
}
static A10 *c18 (void) { return 0; }

static A10 *c19 (void);
void
h19 (void)
{
  sizeof(*c19());
  {
    extern A10 *c19 (void);
    sizeof(*c19());
  }
  sizeof(*c19());
}
static A10 *c19 (void) { return 0; }
