based on n3589[1], this feature mostly makes use of already-established logic, namely push_cleanup used by the cleanup attribute, and the constraints put in place for checking local jumps against statement expressions
1: https://open-std.org/JTC1/SC22/WG14/www/docs/n3589.pdf Anna (navi) Figueiredo Gomes (4): c: add D_C2Y disable mask c: handle expression nodes in push_cleanup c: introduce jump barriers for statement expressions c: implement the defer keyword gcc/c-family/c-common.cc | 1 + gcc/c-family/c-common.h | 39 +++--- gcc/c-family/c-cppbuiltin.cc | 3 + gcc/c/c-decl.cc | 143 +++++++++++++++------ gcc/c/c-parser.cc | 41 ++++++ gcc/c/c-tree.h | 8 +- gcc/c/c-typeck.cc | 56 +++++++-- gcc/testsuite/gcc.dg/defer-1.c | 224 +++++++++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/defer-2.c | 83 ++++++++++++ gcc/testsuite/gcc.dg/defer-3.c | 15 +++ 10 files changed, 544 insertions(+), 69 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/defer-1.c create mode 100644 gcc/testsuite/gcc.dg/defer-2.c create mode 100644 gcc/testsuite/gcc.dg/defer-3.c -- 2.49.1