From: Jeff King Date: Fri, 05 Dec 2025 18:40:20 GMT Subject: Re: [PATCH 1/2] t/unit-tests: update clar to 39f11fe Message-ID: <20251205184020.GB33447@coredump.intra.peff.net> In-Reply-To: <20251205-b4-pks-clar-update-v1-1-fd70aac2ab90@pks.im> On Fri, Dec 05, 2025 at 01:57:52PM +0100, Patrick Steinhardt wrote: > -#define cl_assert_equal_i(i1,i2) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE,#i1 " != " #i2, 1, "%d", (int)(i1), (int)(i2)) > -#define cl_assert_equal_i_(i1,i2,note) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE,#i1 " != " #i2 " (" #note ")", 1, "%d", (i1), (i2)) > -#define cl_assert_equal_i_fmt(i1,i2,fmt) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE,#i1 " != " #i2, 1, (fmt), (int)(i1), (int)(i2)) > +#define cl_assert_compare_i_(i1, i2, cmp, error, ...) clar__assert_compare_i(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, cmp, \ > + (i1), (i2), "Expected comparison to hold: " error, __VA_ARGS__) OK, so "i" use to always mean "int", and now... > +#define cl_assert_compare_i(i1, i2, cmp, error, fmt) do { \ > + intmax_t v1 = (i1), v2 = (i2); \ > + clar__assert_compare_i(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, cmp, \ > + v1, v2, "Expected comparison to hold: " error, fmt, v1, v2); \ > +} while (0) we use intmax_t. That seems OK, and lets us handle any size integer; the caller just needs to distinguish signed from unsigned (having "i" meaning "signed" is a little funny, but I don't have a better suggestion). This one is a little odd, though: > +#define cl_assert_equal_i_fmt(i1, i2, fmt) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_EQ, #i1 " == " #i2, fmt " != " fmt, (int)(i1), (int)(i2)) Here we still cast to int. I guess we have to in order to keep custom "%o" and friends working. They probably ought to be using PRIoMAX, but that would require changes to the tests to do so (and I wonder if we might hit any portability issues). -Peff