Ilya Leoshkevich <i...@linux.ibm.com> writes:
> v1: https://gcc.gnu.org/pipermail/gcc-patches/2020-June/548822.html
>
> This is the implementation of Richard's suggestion.  I've decided not
> to remove the initial #define NULL 0, since system.h mixes inclusion of
> system and helper headers (e.g. libiberty), which might use NULL - if
> not today, then in the future.  If system headers do not provide NULL,
> removing #define NULL 0 might lead to build errors.  Ideally the order
> should be:
>
>   system headers
>   #undef NULL
>   #define NULL nullptr
>   helper headers
>
> but I fear that rearranging includes might break some weird system.
>
> This patch helps with alpine bootstrap, I'm currently testing it on
> x86_64-redhat-linux.
>
> ---
>
> Bootstrap with musl libc fails with numerous "missing sentinel in
> function call" errors.  This is because musl defines NULL as 0L for C++,
> but gcc requires sentinel value to be a pointer or __null.
>
> Jonathan Wakely says:
>
>     To be really safe during stage 1, GCC should not use NULL as a
>     pointer sentinel in C++ code anyway.
>
>     The bootstrap compiler could define it to 0 or 0u, neither of which
>     is guaranteed to be OK to pass as a varargs sentinel where a null
>     pointer is expected.  Any of (void*)0 or (void*)NULL or nullptr
>     would be safe.
>
> While it is possible to fix this by replacing NULL sentinels with
> nullptrs, such approach would generate backporting conflicts, therefore
> simply redefine NULL to nullptr at the end of system.h, where it would
> not confuse system headers.
>
> gcc/ChangeLog:
>
> 2020-06-30  Ilya Leoshkevich  <i...@linux.ibm.com>
>
>       PR bootstrap/95700
>       * system.h (NULL): Redefine to nullptr.

LGTM, thanks.  OK if noone objects in the next 24hrs.

Richard

> ---
>  gcc/system.h | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/gcc/system.h b/gcc/system.h
> index 544f7ba427f..1eec77e730e 100644
> --- a/gcc/system.h
> +++ b/gcc/system.h
> @@ -1244,4 +1244,14 @@ void gcc_stablesort (void *, size_t, size_t,
>     of the number.  */
>  #define PRsa(n) "%" #n PRIu64 "%c"
>  
> +/* System headers may define NULL to be an integer (e.g. 0L), which cannot be
> +   used safely in certain contexts (e.g. as sentinels).  Redefine NULL to
> +   nullptr in order to make it safer.  Note that this might confuse system
> +   headers, however, by convention they must not be included after this 
> point.
> +*/
> +#ifdef __cplusplus
> +#undef NULL
> +#define NULL nullptr
> +#endif
> +
>  #endif /* ! GCC_SYSTEM_H */

Reply via email to