/* PR middle-end/101751 - attribute access none with void pointer expects
   nonzero size
   { dg-do compile }
   { dg-options "-Wall" } */

__attribute__ ((access (none, 1))) void
fvp_m1 (const void*);

void nowarn_m1 (void)
{
  /* Verify these don't trigger a warning for calls to a function
     declared with attribute access none.  */
  fvp_m1 ((void*)-1);         // { dg-bogus "-Wstringop-" }
  fvp_m1 ((void*)1);          // { dg-bogus "-Wstringop-" }
}


__attribute__ ((access (none, 1))) void
fvp_none (void*);

void nowarn_c_cp1 (void)
{
  char c;
  fvp_none (&c);
  fvp_none (&c + 1);          // { dg-bogus "-Wstringop-" }
}

void nowarn_f_fp1 (void)
{
  fvp_none ((char*)&nowarn_f_fp1);
  fvp_none ((char*)&nowarn_f_fp1 + 1);
}

void nowarn_sp1_sp_4 (void)
{
  fvp_none ("" + 1);          // { dg-bogus "-Wstringop-" }
  fvp_none ("123" + 4);       // { dg-bogus "-Wstringop-" }
}


__attribute__ ((access (none, 1))) void
wfvp_none (void*);            // { dg-message "in a call to function 'wfvp_none' declared with attribute 'access \\\(none, 1\\\)'" }

void warn_cm1_p1 (void)
{
  char c;
  /* With optimization both of the following are diagnosed by -Warray-bounds.
     The second also without optimization by -Wstringop-overread.  They
     should both be diagnosed by the same warning even without optimization. */
  wfvp_none (&c - 1);         // { dg-warning "" "pr??????" { xfail *-*-* } }
  wfvp_none (&c + 2);         // { dg-warning "" }
}

void warn_fp2 (void)
{
  void *p = (char*)&warn_fp2 + sizeof warn_fp2;
  fvp_none (p);               // { dg-warning "" "pr??????" { xfail *-*-* } }
}

void warn_sp2 (void)
{
  wfvp_none ("" + 2);         // { dg-warning "" }
}