arm: cleanup legacy ARM_PE code
[official-gcc.git] / gcc / testsuite / c-c++-common / analyzer / compound-assignment-1.c
blobb7389e2808371d042a997a24dbe0b0ebcd61d68d
1 #include <stdlib.h>
3 struct ptr_wrapper
5 int *ptr;
6 };
8 struct ptr_wrapper
9 test_1 (void)
11 struct ptr_wrapper r;
12 r.ptr = (int *) malloc (sizeof (int));
13 return r;
16 struct ptr_wrapper
17 test_2 (void)
19 struct ptr_wrapper r, s;
20 r.ptr = (int *) malloc (sizeof (int));
21 s = r;
22 return s;
25 struct nested
27 struct ptr_wrapper w;
30 struct nested
31 test_3 (void)
33 struct nested n;
34 n.w.ptr = (int *) malloc (sizeof (int));
35 return n;
38 void test_4 (void)
40 struct ptr_wrapper r;
41 r.ptr = (int *) malloc (sizeof (int)); /* { dg-message "allocated here" } */
42 } /* { dg-warning "leak of 'r.ptr'" "" { target c } } */
43 /* { dg-warning "leak of 'r.ptr_wrapper::ptr'" "" { target c++ } .-1 } */
44 /* { dg-bogus "leak of '<unknown>'" "unknown leak" { target *-*-* } .-1 } */
46 static struct ptr_wrapper __attribute__((noinline))
47 called_by_test_5a (void)
49 struct ptr_wrapper r;
50 r.ptr = (int *) malloc (sizeof (int)); /* { dg-message "allocated here" } */
51 return r;
54 void test_5a (void)
56 struct ptr_wrapper q = called_by_test_5a ();
57 } /* { dg-warning "leak of 'q.ptr'" "" { target c } } */
58 /* { dg-warning "leak of 'q.ptr_wrapper::ptr'" "" { target c++ } .-1 } */
60 static struct ptr_wrapper __attribute__((noinline))
61 called_by_test_5b (void)
63 struct ptr_wrapper r;
64 r.ptr = (int *) malloc (sizeof (int));
65 return r; /* { dg-warning "leak of '<return-value>.ptr'" "" { target c } } */
66 /* TODO: show the allocation point; improve above messages. C++ does show it. */
69 void test_5b (void)
71 called_by_test_5b (); }
72 /* { dg-warning "leak of '<anonymous>.ptr_wrapper::ptr'" "" { target c++ } .-1 } */
73 /* The closing } above is intentionally on the same line as the call, because
74 otherwise the exact line of the diagnostics depends on whether the
75 called_by_test_5b () call satisfies aggregate_value_p or not. */