Redefine NULL to nullptr
authorIlya Leoshkevich <iii@linux.ibm.com>
Mon, 29 Jun 2020 18:36:03 +0000 (20:36 +0200)
committerIlya Leoshkevich <iii@linux.ibm.com>
Thu, 2 Jul 2020 10:38:18 +0000 (12:38 +0200)
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  <iii@linux.ibm.com>

PR bootstrap/95700
* system.h (NULL): Redefine to nullptr.

gcc/system.h

index 5f740e3b82b5307c54cb797c73fae6fc0f6da4c5..a241e1355c40120478a0403f153c6e59561bf28c 100644 (file)
@@ -1263,4 +1263,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 */