/* { dg-do compile }
   { dg-options "-O2 -Wall" } */

typedef __SIZE_TYPE__ size_t;

extern size_t strlen (const char*);

void sink (size_t);

struct A0 { char i, a[0]; };

extern struct A0 ea0;

void fa0_extern (void)
{
  sink (strlen (ea0.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
  sink (strlen (ea0.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ea0.a));        // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ea0.a + 1));    // { dg-warning "\\\[-Warray-bounds" }
}

static struct A0 sa0 = { 0 };

void fa0_static (void)
{
  sink (strlen (sa0.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
  sink (strlen (sa0.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (sa0.a));        // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (sa0.a + 1));    // { dg-warning "\\\[-Warray-bounds" }
}


struct Ax { char i, a[]; };

extern struct Ax ax;

void fax_extern (void)
{
  sink (strlen (ax.a - 2));     // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ax.a - 1));     // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ax.a));
  sink (strlen (ax.a + 123));
}

static struct Ax ax0 = { 0, { 0 } };
static struct Ax ax1 = { 1, { 1, 0 } };
static struct Ax ax2 = { 2, { 2, 1, 0 } };
static struct Ax ax3 = { 3, { 3, 2, 1, 0 } };

void fax_static (void)
{
  sink (strlen (ax0.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
  sink (strlen (ax0.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ax0.a));
  sink (strlen (ax0.a + 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ax0.a + 2));    // { dg-warning "\\\[-Warray-bounds" }

  sink (strlen (ax1.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
  sink (strlen (ax1.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ax1.a));
  sink (strlen (ax1.a + 1));
  sink (strlen (ax1.a + 2));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ax1.a + 3));    // { dg-warning "\\\[-Warray-bounds" }

  sink (strlen (ax2.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
  sink (strlen (ax2.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ax2.a));
  sink (strlen (ax2.a + 1));
  sink (strlen (ax2.a + 2));
  sink (strlen (ax2.a + 3));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ax2.a + 4));    // { dg-warning "\\\[-Warray-bounds" }

  sink (strlen (ax3.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
  sink (strlen (ax3.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ax3.a));
  sink (strlen (ax3.a + 1));
  sink (strlen (ax3.a + 2));
  sink (strlen (ax3.a + 3));
  sink (strlen (ax3.a + 4));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
  sink (strlen (ax3.a + 5));    // { dg-warning "\\\[-Warray-bounds" }
}
