blob: efaaacdf9bcc7d565d24dd03143ca5f0e3498651 [file] [log] [blame]
/* PR middle-end/101734 - missing warning reading from a write-only object
Verify that reading objects pointed to by arguments
declared with attribute access none or write-only is diagnosed by
-Wmaybe-uninitialized.
{ dg-do compile }
{ dg-options "-Wall" } */
#define A(mode, ...) __attribute__ ((access (mode, __VA_ARGS__)))
void sink (void *, ...);
A (write_only, 1, 2)
int nowarn_wo_assign_r0 (int *p, int n)
{
*p = n;
return *p;
}
A (write_only, 1, 2)
int nowarn_wo_sink_r0 (int *p, int n)
{
sink (p, p + 1, p + n);
return *p;
}
A (write_only, 1, 2)
int warn_wo_r0 (int *p, int n)
{
return *p; // { dg-warning "'\\*p' may be used uninitialized \\\[-Wmaybe-uninitialized" }
}
A (write_only, 1, 2)
int nowarn_wo_w1_r1 (int *p, int n)
{
p[1] = n;
return p[1];
}
A (write_only, 1, 2)
int warn_wo_r1 (int *p, int n)
{
return p[1]; // { dg-warning "'p\\\[1]' may be used uninitialized" }
}
A (write_only, 1, 2)
int nowarn_wo_rwi_rj (int *p, int n, int i, int j)
{
p[i] = n;
return p[j];
}
A (write_only, 1, 2)
int warn_wo_ri (int *p, int n, int i)
{
return p[i]; // { dg-warning " may be used uninitialized" }
}
A (none, 1, 2)
int* nowarn_none_sink_return (int *p, int n)
{
sink (p, p + 1, p + n);
return p;
}
A (none, 1, 2)
int warn_none_r0 (int *p, int n)
{
(void)&n;
return *p; // { dg-warning "'\\*p' may be used uninitialized" }
}
A (none, 1, 2)
int warn_none_r1 (int *p, int n)
{
return p[1]; // { dg-warning "'p\\\[1]' may be used uninitialized" }
}
A (write_only, 1, 2)
int warn_none_ri (int *p, int n, int i)
{
return p[i]; // { dg-warning " may be used uninitialized" }
}