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