The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/*
 * Copyright (C) 2011 by Opera Software Australia Pty Ltd
 *
 * This library is free software; you can redistribute it and/or modify
 * it under the same terms as Perl itself.
 */

/* this matches up with Plumber's internal states */
enum block_state { FREE, LEAKED, MAYBE, REACHED };

extern void *expect_state(void *p, size_t sz, enum block_state state);

#define EXPECT(p, state) \
    ({ \
	typeof(p) _p = (p); \
	(typeof(p)) expect_state((void *)_p, sizeof(*_p), (state)); \
    })
#define EXPECT_FREE(p)	    EXPECT(p, FREE)
#define EXPECT_LEAKED(p)    EXPECT(p, LEAKED)
#define EXPECT_MAYBE(p)	    EXPECT(p, MAYBE)
#define EXPECT_REACHED(p)   EXPECT(p, REACHED)

    /* dump core */
#define FINISH_TEST \
    *((char *)0) = 0