From da648e22be8caeeb039d793828c230ba0239c68c Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 16 Sep 2023 13:10:52 +0000 Subject: [PATCH] xap_helper: test cleanup + throw support in C++ We need to ensure whatever C++ compiler gets used supports this GNU extension as we expect it to. clang 13 and 14 and g++ 10 all work as we expect it to. --- lib/PublicInbox/xap_helper.h | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/PublicInbox/xap_helper.h b/lib/PublicInbox/xap_helper.h index 2322d0624..377ff45ae 100644 --- a/lib/PublicInbox/xap_helper.h +++ b/lib/PublicInbox/xap_helper.h @@ -578,12 +578,27 @@ static bool cmd_dump_roots(struct req *req) return true; } -// internal usage only +// for test usage only, we need to ensure the compiler supports +// __cleanup__ when exceptions are thrown +struct inspect { struct req *req; }; + +static void inspect_ensure(struct inspect *x) +{ + fprintf(x->req->fp[0], "pid=%d has_threadid=%d", + (int)getpid(), has_threadid(x->req->srch) ? 1 : 0); +} + static bool cmd_test_inspect(struct req *req) { - fprintf(req->fp[0], "pid=%d has_threadid=%d", - (int)getpid(), has_threadid(req->srch) ? 1 : 0); - return true; + __attribute__((__cleanup__(inspect_ensure))) struct inspect x; + x.req = req; + try { + throw Xapian::InvalidArgumentError("test"); + } catch (Xapian::InvalidArgumentError) { + return true; + } + fputs("this should not be printed", req->fp[0]); + return false; } #define CMD(n) { .fn_len = sizeof(#n) - 1, .fn_name = #n, .fn = cmd_##n } -- 2.47.2