Paul Eggert wrote on 2025-05-07: > * lib/obstack.in.h (_OBSTACK_CPTR): New macro. > (obstack_free): Use it instead of comparing pointers directly, > when the pointers might not point into the same object.
Thanks. That is an important fix, now that compilers start to turn invalid pointer arithmetic into unexpected code modifications, e.g. <https://gitlab.com/gnu-clisp/clisp/-/merge_requests/12>. However, this patch produces a compilation error on MSVC, in every invocation of obstack_free(), such as D:\a\ci-testdir-check\ci-testdir-check\testdir-all\gllib\bitset\table.c(1167): error C2065: 'OBSTACK_CPTR': undeclared identifier D:\a\ci-testdir-check\ci-testdir-check\testdir-all\gllib\bitset\table.c(1167): error C2064: term does not evaluate to a function taking 0 arguments make[4]: *** [Makefile:12048: bitset/table.obj] Error 2 This patch fixes it. 2025-05-12 Bruno Haible <br...@clisp.org> obstack: Fix compilation error on MSVC (regression 2025-05-07). * lib/obstack.in.h (obstack_free): Fix typo. diff --git a/lib/obstack.in.h b/lib/obstack.in.h index 698b6b37a7..91a5e444c9 100644 --- a/lib/obstack.in.h +++ b/lib/obstack.in.h @@ -590,7 +590,7 @@ extern int obstack_exit_failure; # define obstack_free(h, obj) \ ((h)->temp.tempptr = (void *) (obj), \ - (((_OBSTACK_CPTR) (h)->chunk < (OBSTACK_CPTR) (h)->temp.tempptr \ + (((_OBSTACK_CPTR) (h)->chunk < (_OBSTACK_CPTR) (h)->temp.tempptr \ && (_OBSTACK_CPTR) (h)->temp.tempptr < (_OBSTACK_CPTR) (h)->chunk_limit) \ ? (void) ((h)->next_free = (h)->object_base = (char *) (h)->temp.tempptr) \ : __obstack_free (h, (h)->temp.tempptr)))