1 // RUN: %clang_cc1 -Wfree-nonheap-object -fsyntax-only -verify %s
2
3 typedef __SIZE_TYPE__ size_t;
4 void *malloc(size_t);
5 void free(void *);
6
7 struct S {
8 int I;
9 char *P;
10 };
11
12 int GI;
test()13 void test() {
14 {
15 free(&GI); // expected-warning {{attempt to call free on non-heap object 'GI'}}
16 }
17 {
18 static int SI = 0;
19 free(&SI); // expected-warning {{attempt to call free on non-heap object 'SI'}}
20 }
21 {
22 int I = 0;
23 free(&I); // expected-warning {{attempt to call free on non-heap object 'I'}}
24 }
25 {
26 int I = 0;
27 int *P = &I;
28 free(P); // FIXME diagnosing this would require control flow analysis.
29 }
30 {
31 void *P = malloc(8);
32 free(P);
33 }
34 {
35 int A[] = {0, 1, 2, 3};
36 free(A); // expected-warning {{attempt to call free on non-heap object 'A'}}
37 free(&A); // expected-warning {{attempt to call free on non-heap object 'A'}}
38 }
39 {
40 struct S s;
41 free(&s.I); // expected-warning {{attempt to call free on non-heap object 'I'}}
42 free(s.P);
43 }
44 }
45