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