Re: [PATCH] Correct function prototype for REAL_EXIT and REAL__EXIT
Jacob Bachmeyer <[email protected]> Tue, 28 Jan 2025 21:25:37 -0600
| Newsgroups | gmane.comp.sysutils.dejagnu.general |
|---|---|
| Message-ID | <[email protected]> |
On 1/28/25 02:30, Torbjorn SVENSSON wrote: > > > On 2025-01-28 06:27, Jacob Bachmeyer wrote: >> On 1/26/25 10:59, Torbjorn SVENSSON wrote: >> [...] >>> >>> On 2025-01-26 02:51, Jacob Bachmeyer wrote: >>>> On 1/25/25 02:55, Torbjörn SVENSSON wrote: >>>>> [...] >>>> >>>> As I understand, this is a shift in C dialect over the years if it >>>> is a real issue. Originally, an empty argument list did not mean >>>> "no arguments" but "unspecified arguments". To declare "no >>>> arguments" you must explicitly write "func(void)" in C. >>> >>> It was like this, but with C23, it's no longer the case. >> >> Do I correctly understand that C23 also removed the K&R function >> definition syntax? If so, testglue.c needs a lot more work than just >> a few prototypes... > > I'm not an expert on the specifications, but from what I can > understand of the Wikipedia article and the foot notes, I would say > that the K&R style cannot be used in C23. The rest of testglue.c currently uses K&R style function definitions. > [...] >>>> While I seem to recall that the C standard has always specified >>>> exit(3) to take an "int" argument, it was also implicitly intended >>>> for programs hosted on Unix and a freestanding board might not use >>>> an exit code and simply halt or shut down when "exit()" is called. >>> >>> I don't know if you are allowed to define "exit()" (without >>> arguments) and still be complaint with the C standard. If you are >>> not complaint with the C standard, then all bets are off. :) >> >> For a function like exit() or _exit() that does not return, calling a >> "func(void)" implementation as if it were "func(int)" should do no >> harm. For most calling conventions, even doing that with a function >> that *does* return should work; the exceptions are conventions where >> the callee cleans up arguments passed on the stack. > > I can add it to those functions, but in C23, there is no requirement > on that. Having nothing within the parenthesis is equal to writing > "void" in them. The tentative plan at this point is to convert the file to "clean" K&R if __STDC__ is not defined and "clean" ANSI (including C23) if __STDC__ is defined. The goal is to make the file work with *any* revision of C and, ideally, *any* C compiler. >>> If you want the code to work more or less in the same grey zone as >>> before, I guess it could change to this: >>> >>> #if __STDC_VERSION__ >= 202311L >>> extern void REAL_EXIT (int); >>> #else >>> extern void REAL_EXIT (); >>> #endif >>> >>> I can send a V2 with this if you think that is better. >> >> I will want a V2 in any case, but we may only need "#ifdef __STDC__" >> instead of testing __STDC_VERSION__. Also, if adding explicit >> prototypes, REAL_ABORT should explicitly take "(void)". > > I don't think that checking __STDC__ is going to work: > > $ diff -u0 <(echo | arm-none-eabi-gcc -dM -x c -E -o - -std=c17 - ) > <(echo | arm-none-eabi-gcc -dM -x c -E -o - -std=c23 - ) > --- /dev/fd/63 2025-01-28 09:04:36.687223645 +0000 > +++ /dev/fd/62 2025-01-28 09:04:36.687223645 +0000 > @@ -94,0 +95 @@ > +#define __CHAR8_TYPE__ unsigned char > @@ -267 +268 @@ > -#define __STDC_VERSION__ 201710L > +#define __STDC_VERSION__ 202311L > @@ -301,0 +303 @@ > +#define __GCC_ATOMIC_CHAR8_T_LOCK_FREE 1 Both of those modes define __STDC__ because ANSI-style prototypes and function definitions are *accepted* in both of those modes. In other words, the changes *required* for C23 will be *accepted* all the way back to C89, but will cause pre-ANSI compilers (if anyone is still using one of those) to reject the module. If they are guarded with "#ifdef __STDC__", then ANSI compilers will see the prototypes while museum pieces will get the existing K&R style. -- Jacob