88 lines
1.6 KiB
C
88 lines
1.6 KiB
C
/* 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" }
|
|
}
|