(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
uninit-42.c
       1  /* PR middle-end/101734 - missing warning reading from a write-only object
       2     Verify that reading objects pointed to by arguments
       3     declared with attribute access none or write-only is diagnosed by
       4     -Wmaybe-uninitialized.
       5     { dg-do compile }
       6     { dg-options "-Wall" } */
       7  
       8  #define A(mode, ...) __attribute__ ((access (mode, __VA_ARGS__)))
       9  
      10  void sink (void *, ...);
      11  
      12  
      13  A (write_only, 1, 2)
      14  int nowarn_wo_assign_r0 (int *p, int n)
      15  {
      16    *p = n;
      17    return *p;
      18  }
      19  
      20  A (write_only, 1, 2)
      21  int nowarn_wo_sink_r0 (int *p, int n)
      22  {
      23    sink (p, p + 1, p + n);
      24    return *p;
      25  }
      26  
      27  A (write_only, 1, 2)
      28  int warn_wo_r0 (int *p, int n)
      29  {
      30    return *p;        // { dg-warning "'\\*p' may be used uninitialized \\\[-Wmaybe-uninitialized" }
      31  }
      32  
      33  
      34  A (write_only, 1, 2)
      35  int nowarn_wo_w1_r1 (int *p, int n)
      36  {
      37    p[1] = n;
      38    return p[1];
      39  }
      40  
      41  A (write_only, 1, 2)
      42  int warn_wo_r1 (int *p, int n)
      43  {
      44    return p[1];      // { dg-warning "'p\\\[1]' may be used uninitialized" }
      45  }
      46  
      47  
      48  A (write_only, 1, 2)
      49  int nowarn_wo_rwi_rj (int *p, int n, int i, int j)
      50  {
      51    p[i] = n;
      52    return p[j];
      53  }
      54  
      55  A (write_only, 1, 2)
      56    int warn_wo_ri (int *p, int n, int i)
      57  {
      58    return p[i];      // { dg-warning " may be used uninitialized" }
      59  }
      60  
      61  
      62  
      63  A (none, 1, 2)
      64  int* nowarn_none_sink_return (int *p, int n)
      65  {
      66    sink (p, p + 1, p + n);
      67    return p;
      68  }
      69  
      70  A (none, 1, 2)
      71  int warn_none_r0 (int *p, int n)
      72  {
      73    (void)&n;
      74    return *p;        // { dg-warning "'\\*p' may be used uninitialized" }
      75  }
      76  
      77  A (none, 1, 2)
      78  int warn_none_r1 (int *p, int n)
      79  {
      80    return p[1];      // { dg-warning "'p\\\[1]' may be used uninitialized" }
      81  }
      82  
      83  A (write_only, 1, 2)
      84  int warn_none_ri (int *p, int n, int i)
      85  {
      86    return p[i];      // { dg-warning " may be used uninitialized" }
      87  }