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 test_nowarm(void)21void 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 test_warn(void)37void 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 } 51