[PROPOSED] SUPPORT_C89 now defaults to 1, not 0

Although POSIX requires this, I didn’t notice it until today. * Makefile, NEWS, localtime.c: Mention this. * private.h (SUPPORT_C89): Default to 1, not 0. --- Makefile | 5 +++-- NEWS | 4 ++++ localtime.c | 5 +++-- private.h | 17 ++++++++++------- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 97a88535..c00eb317 100644 --- a/Makefile +++ b/Makefile @@ -263,8 +263,9 @@ LDLIBS= # -DRESERVE_STD_EXT_IDS if your platform reserves standard identifiers # with external linkage, e.g., applications cannot define 'localtime'. # -Dssize_t=long on hosts like MS-Windows that lack ssize_t -# -DSUPPORT_C89 if the tzcode library should support C89 callers+ -# However, this might trigger latent bugs in C99-or-later callers. +# -DSUPPORT_C89=0 if the tzcode library should not support C89 callers +# Although -DSUPPORT_C89=0 might work around latent bugs in callers, +# it does not conform to POSIX. # -DSUPPORT_POSIX2008 if the library should support older POSIX callers+ # However, this might cause problems in POSIX.1-2024-or-later callers. # -DSUPPRESS_TZDIR to not prepend TZDIR to file names; this has diff --git a/NEWS b/NEWS index 6b71212c..5238cb9e 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,7 @@ Unreleased, experimental changes The code now conforms to RFC 8536 for early timestamps. Support POSIX.1-2024, which removes asctime_r and ctime_r. Assume POSIX.2-1992 or later for shell scripts. + SUPPORT_C89 now defaults to 1. Improve historical data for Portugal and possessions. Changes to data @@ -60,6 +61,9 @@ Unreleased, experimental changes can overrun user buffers. If you still need them, add -DSUPPORT_POSIX2008 to CFLAGS. + The SUPPORT_C89 option now defaults to 1 instead of 0, fixing a + POSIX-conformance bug introduced in 2023a. + tzselect now assumes POSIX.2-1992 or later, as practical porting targets now all support this. Also, tzselect uses some features from POSIX.1-2024 if available. diff --git a/localtime.c b/localtime.c index c9f0d1a8..7e3fd149 100644 --- a/localtime.c +++ b/localtime.c @@ -182,8 +182,9 @@ static int lcl_is_set; ** objects: a broken-down time structure and an array of char. ** Thanks to Paul Eggert for noting this. ** -** This requirement was removed in C99, so support it only if requested, -** as support is more likely to lead to bugs in badly written programs. +** Although this requirement was removed in C99 it is still present in POSIX. +** Follow the requirement if SUPPORT_C89, even though this is more likely to +** trigger latent bugs in programs. */ #if SUPPORT_C89 diff --git a/private.h b/private.h index 0c91a252..19d7f7d6 100644 --- a/private.h +++ b/private.h @@ -19,19 +19,22 @@ /* PORT_TO_C89 means the code should work even if the underlying compiler and library support only C89 plus C99's 'long long' - and perhaps a few other extensions to C89. SUPPORT_C89 means the - tzcode library should support C89 callers in addition to the usual - support for C99-and-later callers; however, C89 support can trigger - latent bugs in C99-and-later callers. These macros are obsolescent, - and the plan is to remove them along with any code needed only when - they are nonzero. A good time to do that might be in the year 2029 + and perhaps a few other extensions to C89. + + This macro is obsolescent, and the plan is to remove it along with + associated code. A good time to do that might be in the year 2029 because RHEL 7 (whose GCC defaults to C89) extended life cycle support (ELS) is scheduled to end on 2028-06-30. */ #ifndef PORT_TO_C89 # define PORT_TO_C89 0 #endif + +/* SUPPORT_C89 means the tzcode library should support C89 callers + in addition to the usual support for C99-and-later callers. + This defaults to 1 as POSIX requires, even though that can trigger + latent bugs in callers. */ #ifndef SUPPORT_C89 -# define SUPPORT_C89 0 +# define SUPPORT_C89 1 #endif #ifndef __STDC_VERSION__ -- 2.43.0

Paul Eggert via tz wrote in <20240608191819.2722277-1-eggert@cs.ucla.edu>: |Although POSIX requires this, I didn’t notice it until today. |* private.h (SUPPORT_C89): Default to 1, not 0. Funnily my today's update of bogofilter introduced fixes for C89 compatibility, too. He can also compile C++. (My projects usually are all C89 and C++ compatible, except for the big MUA i inherited maintenance of, it will take some more years to get there. And the now deprecated enum1|enum2 bit mixes i use.) On the other hand FreeBSD's "number one" dropped C89 support five days ago, but who am i to complain? sys: Disable C standards prior to C99 from kernel build The kernel hasn't built with anything less than c99 for a long time. Retire support in the build for it. In addition, retire the translation of c99 to -std=iso9899:1999, since all latter day C compilers that we support have had this for maybe 15 years or so (gcc since 4.5, clang since the earliest version) and it simplifies the code. I once tried to make them avoid usage of ifuncs and such, in order to "simply" use the tcc compiler that i like "out of the box", but, well, maybe with a large donation it would have moved something. In general i think that people then work around issues in private. You cannot change the world, anyway. But it doesn't mean a thing. --steffen | |Der Kragenbaer, The moon bear, |der holt sich munter he cheerfully and one by one |einen nach dem anderen runter wa.ks himself off |(By Robert Gernhardt)
participants (2)
-
Paul Eggert
-
Steffen Nurpmeso