/* 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" } }