(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
Wreturn-local-addr.c
       1  /* PR c/90737 - inconsistent address of a local converted to intptr_t
       2     between callee and caller
       3     { dg-do compile }
       4     { dg-options "-O1 -Wall -Wreturn-local-addr -fdump-tree-optimized" } */
       5  
       6  typedef __INTPTR_TYPE__ intptr_t;
       7  
       8  static inline intptr_t
       9  return_addr_local_as_int (void)
      10  {
      11    int i;
      12    if ((intptr_t)&i == 0)
      13      __builtin_abort ();
      14  
      15    return (intptr_t)&i;
      16  }
      17  
      18  void get_addr_local_as_int (void)
      19  {
      20    intptr_t i = return_addr_local_as_int ();
      21    if (i == 0)
      22      __builtin_abort ();
      23  }
      24  
      25  
      26  static inline intptr_t
      27  return_addr_label_as_int (void)
      28  {
      29   label:
      30    if ((intptr_t)&&label == 0)
      31      __builtin_abort ();
      32  
      33    return (intptr_t)&&label;
      34  }
      35  
      36  void get_addr_label_as_int (void)
      37  {
      38    intptr_t i = return_addr_label_as_int ();
      39    if (i == 0)
      40      __builtin_abort ();
      41  }
      42  
      43  /* Verify that the functions that return the address of the label
      44     or local variable have been optimized away and so have the calls
      45     to abort.
      46    { dg-final { scan-tree-dump-not "return_addr_" "optimized" } }
      47    { dg-final { scan-tree-dump-not "abort" "optimized" } } */