(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
Wfree-nonheap-object.c
       1  /* Verify that built-in forms of functions can be used interchangeably
       2     with their ordinary (library) forms in attribute malloc.
       3     { dg-do compile }
       4     { dg-options "-Wall" } */
       5  
       6  char* f (void) __attribute__ ((malloc (__builtin_free)));
       7  
       8  #if __cplusplus
       9  extern "C" {
      10  #endif
      11  
      12  void free (void*);
      13  
      14  #if __cplusplus
      15  }
      16  #endif
      17  
      18  char* g (void) __attribute__ ((malloc (free)));
      19  
      20  
      21  void test_nowarm (void)
      22  {
      23    char *p = f ();
      24    free (p);
      25  
      26    p = g ();
      27    free (p);
      28  
      29    p = f ();
      30    __builtin_free (p);
      31  
      32    p = g ();
      33    __builtin_free (p);
      34  }
      35  
      36  
      37  void test_warn (void)
      38  {
      39    char *p = f ();
      40    free (p + 1);               // { dg-warning "'free|void free\\(void\\*\\)' called on pointer 'p|<unknown>' with nonzero offset" }
      41  
      42    p = g ();
      43    free (p + 2);               // { dg-warning "'free|void free\\(void\\*\\)' called on pointer 'p|<unknown>' with nonzero offset" }
      44  
      45    p = f ();
      46    __builtin_free (p + 3);     // { dg-warning "'__builtin_free|void __builtin_free\\(void\\*\\)' called on pointer 'p|<unknown>' with nonzero offset" }
      47  
      48    p = g ();
      49    __builtin_free (p + 4);     // { dg-warning "'__builtin_free|void __builtin_free\\(void\\*\\)' called on pointer 'p|<unknown>' with nonzero offset" }
      50  }