Consider the following program, reduced from Lensfun:
#include <cstring>
extern char *f(const char *first_element, ...) __attribute__((__sentinel__));
static auto N = f("a", "b", NULL);
static auto n = f("a", "b", nullptr);
static auto z = f("a", "b", 0);
#define NULL 123
in C++11 and later, NULL=nullptr so N/n are valid, and z is wrong.
But this is not what we observe:
>g++ -c a.cpp -Wall -Wextra -std=c++14
a.cpp:6:9: warning: 'NULL' redefined
6 | #define NULL 123
| ^~~~
In file included from V:/msys2/mingw64/include/c++/15.1.0/cstring:48,
from a.cpp:1:
V:/msys2/mingw64/include/string.h:34:9: note: this is the location of the
previous definition
34 | #define NULL 0LL
| ^~~~
a.cpp:3:18: warning: missing sentinel in function call [-Wformat=]
3 | static auto N = f("a", "b", NULL);
| ~^~~~~~~~~~~~~~~~
a.cpp:5:18: warning: missing sentinel in function call [-Wformat=]
5 | static auto z = f("a", "b", 0);
| ~^~~~~~~~~~~~~
(Clang agrees here and in the other sample).
"Real" libstdc++/string.h/&c. as part of the GCC distribution uses
#define NULL __null
and so does our stddef.h. This is the correct implementation.
But other headers define NULL=0/0LL, which is not only wrong,
but also changes program behaviour based on inclusion order!
patch -p3ing this patch into my MSYS2 installation I observe
>g++ -c a.cpp -Wall -Wextra -std=c++14
a.cpp:6:9: warning: 'NULL' redefined
6 | #define NULL 123
| ^~~~
In file included from V:/msys2/mingw64/include/c++/15.1.0/cstring:48,
from a.cpp:1:
V:/msys2/mingw64/include/string.h:31:9: note: this is the location of the
previous definition
31 | #define NULL __null
| ^~~~
a.cpp:5:18: warning: missing sentinel in function call [-Wformat=]
5 | static auto z = f("a", "b", 0);
| ~^~~~~~~~~~~~~
which is correct.
---
Please keep me in CC, as I'm not subscribed.
mingw-w64-crt/include/oscalls.h | 4 +++-
mingw-w64-headers/crt/crtdbg.h | 4 +++-
mingw-w64-headers/crt/locale.h | 4 +++-
mingw-w64-headers/crt/setjmp.h | 4 +++-
mingw-w64-headers/crt/stdio.h | 4 +++-
mingw-w64-headers/crt/stdlib.h | 4 +++-
mingw-w64-headers/crt/string.h | 4 +++-
mingw-w64-headers/crt/tchar.h | 4 +++-
mingw-w64-headers/crt/time.h | 4 +++-
mingw-w64-headers/crt/wchar.h | 4 +++-
mingw-w64-headers/include/fci.h | 10 ++++++++++
mingw-w64-headers/include/fdi.h | 10 ++++++++++
mingw-w64-headers/include/lmcons.h | 4 +++-
mingw-w64-headers/include/minwindef.h | 4 +++-
mingw-w64-headers/include/ntdef.h | 10 ++++++----
mingw-w64-tools/widl/include/minwindef.h | 4 +++-
16 files changed, 65 insertions(+), 17 deletions(-)
diff --git a/mingw-w64-crt/include/oscalls.h b/mingw-w64-crt/include/oscalls.h
index 670a6f748..887aa4a1f 100644
--- a/mingw-w64-crt/include/oscalls.h
+++ b/mingw-w64-crt/include/oscalls.h
@@ -23,7 +23,9 @@
#include <windows.h>
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
diff --git a/mingw-w64-headers/crt/crtdbg.h b/mingw-w64-headers/crt/crtdbg.h
index 37014c4fb..d43691547 100644
--- a/mingw-w64-headers/crt/crtdbg.h
+++ b/mingw-w64-headers/crt/crtdbg.h
@@ -12,7 +12,9 @@
#pragma pack(push,_CRT_PACKING)
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
diff --git a/mingw-w64-headers/crt/locale.h b/mingw-w64-headers/crt/locale.h
index f69bd6ed7..4a9ac7ac4 100644
--- a/mingw-w64-headers/crt/locale.h
+++ b/mingw-w64-headers/crt/locale.h
@@ -19,7 +19,9 @@ extern "C" {
#endif
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
diff --git a/mingw-w64-headers/crt/setjmp.h b/mingw-w64-headers/crt/setjmp.h
index 74e7c7ea4..32083729b 100644
--- a/mingw-w64-headers/crt/setjmp.h
+++ b/mingw-w64-headers/crt/setjmp.h
@@ -11,7 +11,9 @@
#pragma pack(push,_CRT_PACKING)
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
diff --git a/mingw-w64-headers/crt/stdio.h b/mingw-w64-headers/crt/stdio.h
index 91d617fc0..2acf8ee61 100644
--- a/mingw-w64-headers/crt/stdio.h
+++ b/mingw-w64-headers/crt/stdio.h
@@ -85,7 +85,9 @@ extern "C" {
#endif
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
diff --git a/mingw-w64-headers/crt/stdlib.h b/mingw-w64-headers/crt/stdlib.h
index 482971357..6796e43a0 100644
--- a/mingw-w64-headers/crt/stdlib.h
+++ b/mingw-w64-headers/crt/stdlib.h
@@ -30,7 +30,9 @@ extern "C" {
#endif
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
diff --git a/mingw-w64-headers/crt/string.h b/mingw-w64-headers/crt/string.h
index 1832e38ed..67c1ea45a 100644
--- a/mingw-w64-headers/crt/string.h
+++ b/mingw-w64-headers/crt/string.h
@@ -27,7 +27,9 @@ extern "C" {
#endif
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
diff --git a/mingw-w64-headers/crt/tchar.h b/mingw-w64-headers/crt/tchar.h
index 356d8ee52..0bb7a33fe 100644
--- a/mingw-w64-headers/crt/tchar.h
+++ b/mingw-w64-headers/crt/tchar.h
@@ -1152,7 +1152,9 @@ extern "C" {
#define _istlegal(_c) (1)
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
diff --git a/mingw-w64-headers/crt/time.h b/mingw-w64-headers/crt/time.h
index 2a475eeff..296a4713f 100644
--- a/mingw-w64-headers/crt/time.h
+++ b/mingw-w64-headers/crt/time.h
@@ -84,7 +84,9 @@ extern "C" {
#endif
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
diff --git a/mingw-w64-headers/crt/wchar.h b/mingw-w64-headers/crt/wchar.h
index 0ce7593cf..d6cee70cc 100644
--- a/mingw-w64-headers/crt/wchar.h
+++ b/mingw-w64-headers/crt/wchar.h
@@ -132,7 +132,9 @@ _CRTIMP FILE *__cdecl __acrt_iob_func(unsigned index);
#endif
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
diff --git a/mingw-w64-headers/include/fci.h b/mingw-w64-headers/include/fci.h
index 42eef997e..4853cbe79 100644
--- a/mingw-w64-headers/include/fci.h
+++ b/mingw-w64-headers/include/fci.h
@@ -56,7 +56,17 @@ extern "C" {
#endif
#ifndef NULL
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
+#ifndef _WIN64
#define NULL 0
+#else
+#define NULL 0LL
+#endif /* W64 */
+#else
+#define NULL ((void *)0)
+#endif
#endif
typedef struct {
diff --git a/mingw-w64-headers/include/fdi.h b/mingw-w64-headers/include/fdi.h
index ec594658c..e3c4759ef 100644
--- a/mingw-w64-headers/include/fdi.h
+++ b/mingw-w64-headers/include/fdi.h
@@ -57,7 +57,17 @@ extern "C" {
#endif
#ifndef NULL
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
+#ifndef _WIN64
#define NULL 0
+#else
+#define NULL 0LL
+#endif /* W64 */
+#else
+#define NULL ((void *)0)
+#endif
#endif
typedef struct {
diff --git a/mingw-w64-headers/include/lmcons.h
b/mingw-w64-headers/include/lmcons.h
index 1be8b7221..3a6ebbfbd 100644
--- a/mingw-w64-headers/include/lmcons.h
+++ b/mingw-w64-headers/include/lmcons.h
@@ -99,7 +99,9 @@
#define BACKUP_MSG_FILENAME TEXT("BAK.MSG")
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
diff --git a/mingw-w64-headers/include/minwindef.h
b/mingw-w64-headers/include/minwindef.h
index bf0db9baa..01db5e5f5 100644
--- a/mingw-w64-headers/include/minwindef.h
+++ b/mingw-w64-headers/include/minwindef.h
@@ -33,7 +33,9 @@ extern "C" {
#define MAX_PATH 260
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
diff --git a/mingw-w64-headers/include/ntdef.h
b/mingw-w64-headers/include/ntdef.h
index e84702436..6a3cbeaa3 100644
--- a/mingw-w64-headers/include/ntdef.h
+++ b/mingw-w64-headers/include/ntdef.h
@@ -97,7 +97,9 @@
/* NULL/NULL64 */
#ifndef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
@@ -545,8 +547,8 @@ typedef struct _STRING32 {
USHORT Length;
USHORT MaximumLength;
ULONG Buffer;
-} STRING32, *PSTRING32,
- UNICODE_STRING32, *PUNICODE_STRING32,
+} STRING32, *PSTRING32,
+ UNICODE_STRING32, *PUNICODE_STRING32,
ANSI_STRING32, *PANSI_STRING32;
typedef struct _STRING64 {
@@ -554,7 +556,7 @@ typedef struct _STRING64 {
USHORT MaximumLength;
ULONGLONG Buffer;
} STRING64, *PSTRING64,
- UNICODE_STRING64, *PUNICODE_STRING64,
+ UNICODE_STRING64, *PUNICODE_STRING64,
ANSI_STRING64, *PANSI_STRING64;
/* LangID and NLS */
diff --git a/mingw-w64-tools/widl/include/minwindef.h
b/mingw-w64-tools/widl/include/minwindef.h
index 17da5d9be..ffa4be628 100644
--- a/mingw-w64-tools/widl/include/minwindef.h
+++ b/mingw-w64-tools/widl/include/minwindef.h
@@ -170,7 +170,9 @@ extern "C" {
/* Misc. constants. */
#undef NULL
-#ifdef __cplusplus
+#if defined(__GNUG__) && __GNUG__ >= 3
+#define NULL __null
+#elif defined(__cplusplus)
#ifndef _WIN64
#define NULL 0
#else
--
2.39.5
signature.asc
Description: PGP signature
_______________________________________________ Mingw-w64-public mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
