#include extern void foo (void); extern void bar (void); void test_1 (int flag, int n); void caller_1_of_test_1 (int n) { test_1 (1, n); /* { dg-bogus "test_1" } */ test_1 (0, n); /* { dg-bogus "test_1" } */ } void __attribute__((noinline)) test_1 (int flag, int n) { int *ptr = (int *)malloc (sizeof (int)); if (flag) { int i; for (i = 0; i < n; i++) foo (); } else bar (); free (ptr); free (ptr); /* { dg-warning "double-'free'" } */ /* FIXME: we get duplicates intraprocedurally, as there are two paths through the function. The calls in test_2 also generate additional duplicates. How to verify lack of duplicates? Putting a bogus on the interprocedual one detects that, at least. */ if (flag) foo (); else bar (); } void caller_2_of_test_1 (int n) { test_1 (1, n); /* { dg-bogus "test_1" } */ test_1 (0, n); /* { dg-bogus "test_1" } */ }