#include extern int foo (void); int successes; int failures; #define ONE_DIAMOND \ do { \ void *ptr = malloc (128); \ if (foo ()) \ successes++; \ else \ failures++; \ free (ptr); \ } while (0) #define TEN_DIAMONDS \ do { \ ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; \ ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; \ } while (0) void test_3 (void *ptr) { free (ptr); #if 1 ONE_DIAMOND; #else /* TODO: enabling this leads to numerous duplicated reports, all of them detailing all the extraneous info about the malloc/free within the diamonds. */ TEN_DIAMONDS; #endif free (ptr); /* { dg-warning "double-'free' of 'ptr'" } */ }