(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wreturn-local-addr-8.c
       1  /* Test to verify that a MAX_EXPR and MIN_EXPR in a return statement
       2     is handled correctly and that all local variables whose address
       3     is or may be returned are identified.
       4     { dg-do compile }
       5     { dg-options "-O2 -Wall" } */
       6  
       7  char* sink (char*, ...);
       8  
       9  void* test_max_2 (void)
      10  {
      11    char c;                     /* { dg-message "declared here" } */
      12  
      13    char *p = sink (&c);
      14  
      15    void *q = p > &c ? p : &c;  /* MAX_EXPR */
      16    return q;                   /* { dg-warning "\\\[-Wreturn-local-addr" } */
      17  }
      18  
      19  void* test_max_3 (void)
      20  {
      21    char c;                     /* { dg-message "declared here" } */
      22    char d;                     /* { dg-message "declared here" } */
      23  
      24    char *p = sink (&c, &d);
      25  
      26    void *q = p < &c ? &c < &d ? &d : &c : p;
      27    return q;                   /* { dg-warning "\\\[-Wreturn-local-addr" } */
      28  }
      29  
      30  void* test_min_2 (void)
      31  {
      32    char c;                     /* { dg-message "declared here" } */
      33  
      34    char *p = sink (&c);
      35  
      36    void *q = p < &c ? p : &c;  /* MIN_EXPR" */
      37    return q;                   /* { dg-warning "\\\[-Wreturn-local-addr" } */
      38  }
      39  
      40  void* test_min_3 (void)
      41  {
      42    char c;                     /* { dg-message "declared here" } */
      43    char d;                     /* { dg-message "declared here" } */
      44  
      45    char *p = sink (&c, &d);
      46  
      47    void *q = p > &c ? &c > &d ? &d : &c : p;
      48    return q;                   /* { dg-warning "\\\[-Wreturn-local-addr" } */
      49  }
      50  
      51  void* test_min_2_phi (int i)
      52  {
      53    char a;                     /* { dg-message "declared here" } */
      54  
      55    char *p = &a;
      56    char *q = sink (&a);
      57    p = p < q ? p : q;
      58    if (i == 1)
      59      return p;
      60    /* { dg-warning "may return address of local variable" "missing location" { xfail *-*-* } } */
      61    else
      62      return q;
      63  }
      64  
      65  void* test_min_3_phi (int i)
      66  {
      67    char a;                     /* { dg-message "declared here" } */
      68    char b;                     /* { dg-message "declared here" } */
      69  
      70    char *p0 = &a;
      71    char *p1 = &b;
      72    char *p2 = sink (&a, &b);
      73    char *p3 = sink (&a, &b);
      74  
      75    char *p4 = p2 < p0 ? p2 : p0;
      76    char *p5 = p3 < p1 ? p3 : p1;
      77  
      78    if (i == 1)
      79      /* { dg-warning "may return address of local variable" "missing location" { xfail *-*-* } } */
      80      return p4;
      81    else
      82      /* { dg-warning "may return address of local variable" "missing location" { xfail *-*-* } } */
      83      return p5;
      84  }
      85  
      86  /* The directive below "swallows" warnings for both test_min_2_phi
      87     and test_min_3_phi.
      88    { dg-warning "may return address of local variable" "pr90735" { target *-*-* } 0 } */