/* * BIRD Library -- Auto storage attribute cleanup test * * (c) 2023 Maria Matejka * (c) 2023 CZ.NIC z.s.p.o. * * Can be freely distributed and used under the terms of the GNU GPL. */ #include "test/birdtest.h" static int order_pos; //#define PUSH(n) bt_assert(order_pos++ == (n)) #define CHECK(n) ASSERT_DIE(order_pos++ == (n)) static void tacd_cleanup(int *val) { CHECK(*val); } static void tacd_aux(int pos) { CHECK(pos + 0); __attribute__((cleanup(tacd_cleanup))) int upmost = pos + 18; if (order_pos > 0) { CHECK(pos + 1); __attribute__((cleanup(tacd_cleanup))) int inner_if = pos + 3; CHECK(pos + 2); } for (int i=0; i<3; i++) { CHECK(pos + 4 + 3*i); __attribute__((cleanup(tacd_cleanup))) int inner_for = pos + 6 + 3*i; CHECK(pos + 5 + 3*i); } for ( __attribute__((cleanup(tacd_cleanup))) int i = pos + 15; i < pos + 16; i++) { CHECK(pos + 13); __attribute__((cleanup(tacd_cleanup))) int inner_for = pos + 15; CHECK(pos + 14); } CHECK(pos + 17); } #define CHECKCNT 19 static int t_attribute_cleanup_direct(void) { order_pos = 0; CHECK(0); for (int i=0; i<3; i++) { CHECK(i*(CHECKCNT+3) + 1); __attribute__((cleanup(tacd_cleanup))) int inner_for = (i+1) * (CHECKCNT+3); tacd_aux(i*(CHECKCNT+3) + 2); CHECK((i+1) * (CHECKCNT+3) - 1); } CHECK(3 * (CHECKCNT+3) + 1); return 1; } int main(int argc, char **argv) { bt_init(argc, argv); bt_test_suite(t_attribute_cleanup_direct, "Directly using __attribute__((cleanup))"); return bt_exit_value(); }