meson.build has a list of warnings to disable on MSVC:

  cflags_warn += [
    '/wd4018', # signed/unsigned mismatch
    '/wd4244', # conversion from 'type1' to 'type2', possible loss of data
    '/wd4273', # inconsistent DLL linkage
    '/wd4101', # unreferenced local variable
    '/wd4102', # unreferenced label
    '/wd4090', # different 'modifier' qualifiers
    '/wd4267', # conversion from 'size_t' to 'type', possible loss of data
  ]

First, these appear to be in some random order, so I wanted to sort them. But then it also appeared that for some of these, if you remove the disablement, nothing changes, so it seemed some of these entries are not needed.

Some of these warnings are assigned to higher warning levels, so if someone wanted to compile PostgreSQL with a higher warning level on MSVC (similar to -Wextra), then disabling some from the higher levels is useful. But I figured this could be explained better.

So what I did is sort these and group them by the warning level assigned by MSVC.

Actually, one of them (the "unreferenced label" one) was not enabled by default on any level, and conversely I think we do actually want that one enabled, since we use -Wunused-label on other compilers, so I changed the disablement to an enablement.

Then I also found a few more warnings that would be useful to enable. So I'm proposing to add warnings that are similar to -Wformat and -Wswitch.

Here are some documentation links:

https://learn.microsoft.com/en-us/cpp/build/reference/compiler-option-warning-level?view=msvc-170
https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warnings-c4000-c5999?view=msvc-170
https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warnings-by-compiler-version?view=msvc-170


With that done, I also looked at the disabled warnings to see what could be done to fix the underlying issues. In particular, I looked at

    '/wd4273', # inconsistent DLL linkage

If you enable that one, you get this:

../src/backend/utils/misc/ps_status.c(27): warning C4273: '__p__environ': inconsistent dll linkage C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt\stdlib.h(1158): note: see previous definition of '__p__environ'

The declaration in ps_status.c was:

    #if !defined(WIN32) || defined(_MSC_VER)
    extern char **environ;
    #endif

The declaration in the OS header file is:

    _DCRTIMP char***    __cdecl __p__environ (void);
    #define _environ  (*__p__environ())

So it is clear why a linker might be upset about this.

To fix this, we can just remove the || defined(_MSC_VER).

Note that these conditionals around the environ declarations were added only somewhat recently in commit 7bc9a8bdd2d ("Fix warnings about declaration of environ on MinGW.").

Maybe there are older versions of Windows where the declaration is needed, maybe this is a ucrt vs. msvcrt thing, don't know, testing is welcome.


The business in ps_status.c is kind of weird anyway, because we only need the environ variable in the PS_USE_CLOBBER_ARGV case, which is not Windows, so maybe we should move some things around to avoid the problem in this file. But there are also a few other files where environ is declared for use by Windows as well.
From bb67ddee244d74e77b3de9d1418e44d4152adbef Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Tue, 28 Oct 2025 22:11:26 +0100
Subject: [PATCH 1/2] MSVC: Improve warning options set

The previous code had a set of warnings to disable on MSVC.  But some
of these weren't actually enabled by default anyway, only in higher
MSVC warning levels (/W, maps to meson warning_level).  I rearranged
this so that it is clearer in what MSVC warning level a warning would
have been enabled.  Furthermore, sort them numerically within the
levels.

Moreover, we can add a few warning types to the default set, to get a
similar set of warnings that we get by default with gcc or clang (the
equivalents of -Wswitch and -Wformat).

ci-os-only: windows
---
 meson.build | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/meson.build b/meson.build
index 395416a6060..5ba7f2c8a24 100644
--- a/meson.build
+++ b/meson.build
@@ -2147,13 +2147,21 @@ endforeach
 
 if cc.get_id() == 'msvc'
   cflags_warn += [
-    '/wd4018', # signed/unsigned mismatch
-    '/wd4244', # conversion from 'type1' to 'type2', possible loss of data
-    '/wd4273', # inconsistent DLL linkage
-    '/wd4101', # unreferenced local variable
-    '/wd4102', # unreferenced label
+    # Warnings to disable:
+    # from /W1:
     '/wd4090', # different 'modifier' qualifiers
+    '/wd4273', # inconsistent DLL linkage
+    # from /W2:
+    '/wd4244', # conversion from 'type1' to 'type2', possible loss of data
+    # from /W3:
+    '/wd4018', # signed/unsigned mismatch
+    '/wd4101', # unreferenced local variable [like -Wunused-variable, but 
there is no "unused" attribute, so too noisy]
     '/wd4267', # conversion from 'size_t' to 'type', possible loss of data
+
+    # Additional warnings to enable:
+    '/w24062', # enumerator 'identifier' in switch of enum 'enumeration' is 
not handled [like -Wswitch]
+    '/w24102', # unreferenced label [like -Wunused-label]
+    '/w24777', # 'function' : format string 'string' requires an argument of 
type 'type1', but variadic argument number has type 'type2' [like -Wformat]
   ]
 
   cppflags += [
-- 
2.51.0

From 623b8090c34d387e6ddfe4c61fd561e666b194a5 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Tue, 28 Oct 2025 23:22:08 +0100
Subject: [PATCH 2/2] Fix "inconsistent DLL linkage" warning on Windows MSVC

This warning was disabled in meson.build (warning 4273).  If you
enable it, it looks like this:

../src/backend/utils/misc/ps_status.c(27): warning C4273: '__p__environ': 
inconsistent dll linkage
C:\Program Files (x86)\Windows 
Kits\10\include\10.0.22621.0\ucrt\stdlib.h(1158): note: see previous definition 
of '__p__environ'

The declaration in ps_status.c was:

    #if !defined(WIN32) || defined(_MSC_VER)
    extern char **environ;
    #endif

The declaration in the OS header file is:

    _DCRTIMP char***    __cdecl __p__environ (void);
    #define _environ  (*__p__environ())

So it is evident that this could be problematic.

To fix, disable the re-declaration in ps_status.c, and also in some
other places that use the same code pattern but didn't trigger the
warning.

XXX Obviously, the old code indicates that someone once thought this
declaration was necessary under _MSC_VER.  Maybe that is obsolete, or
maybe we need some further conditionals.

Then we can also re-enable the warning (delete the disablement in
meson.build).

ci-os-only: windows
---
 meson.build                         | 1 -
 src/backend/postmaster/postmaster.c | 2 +-
 src/backend/utils/misc/ps_status.c  | 2 +-
 src/test/regress/regress.c          | 2 +-
 4 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/meson.build b/meson.build
index 5ba7f2c8a24..520872a6550 100644
--- a/meson.build
+++ b/meson.build
@@ -2150,7 +2150,6 @@ if cc.get_id() == 'msvc'
     # Warnings to disable:
     # from /W1:
     '/wd4090', # different 'modifier' qualifiers
-    '/wd4273', # inconsistent DLL linkage
     # from /W2:
     '/wd4244', # conversion from 'type1' to 'type2', possible loss of data
     # from /W3:
diff --git a/src/backend/postmaster/postmaster.c 
b/src/backend/postmaster/postmaster.c
index 00de559ba8f..7c064cf9fbb 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -880,7 +880,7 @@ PostmasterMain(int argc, char *argv[])
        /* For debugging: display postmaster environment */
        if (message_level_is_interesting(DEBUG3))
        {
-#if !defined(WIN32) || defined(_MSC_VER)
+#if !defined(WIN32)
                extern char **environ;
 #endif
                char      **p;
diff --git a/src/backend/utils/misc/ps_status.c 
b/src/backend/utils/misc/ps_status.c
index 4df25944deb..8709c4f5125 100644
--- a/src/backend/utils/misc/ps_status.c
+++ b/src/backend/utils/misc/ps_status.c
@@ -23,7 +23,7 @@
 #include "utils/guc.h"
 #include "utils/ps_status.h"
 
-#if !defined(WIN32) || defined(_MSC_VER)
+#if !defined(WIN32)
 extern char **environ;
 #endif
 
diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c
index 465ac148ac9..a2db6080876 100644
--- a/src/test/regress/regress.c
+++ b/src/test/regress/regress.c
@@ -432,7 +432,7 @@ PG_FUNCTION_INFO_V1(get_environ);
 Datum
 get_environ(PG_FUNCTION_ARGS)
 {
-#if !defined(WIN32) || defined(_MSC_VER)
+#if !defined(WIN32)
        extern char **environ;
 #endif
        int                     nvals = 0;
-- 
2.51.0

Reply via email to