Drop support for MSVCRT's %I64 format strings.
authorThomas Munro <tmunro@postgresql.org>
Wed, 19 Nov 2025 21:04:11 +0000 (10:04 +1300)
committerThomas Munro <tmunro@postgresql.org>
Wed, 19 Nov 2025 21:07:27 +0000 (10:07 +1300)
MSVCRT predated C99 and invented non-standard placeholders for 64-bit
numbers, and then later used them in standard macros when C99
<inttypes.h> arrived.  The macros just use %lld etc when building with
UCRT, so there should be no way for our interposed sprintf.c code to
receive the pre-standard kind these days.  Time to drop the code that
parses them.

That code was in fact already dead when commit 962da900 landed, as we'd
disclaimed MSVCRT support a couple of weeks earlier in commit 1758d424,
but patch development overlapped and the history of these macros hadn't
been investigated.

Reviewed-by: Peter Eisentraut <peter@eisentraut.org>
Discussion: https://postgr.es/m/4d8b1a67-aab2-4429-b44b-f03988095939%40eisentraut.org

src/port/snprintf.c

index d7f18b42d19ace2818f24b09ed9610b94c03fc91..dded6c3f65bac54910d7892f2e17fabae6a05e6f 100644 (file)
@@ -557,28 +557,6 @@ nextch2:
                    fmtpos = accum;
                accum = 0;
                goto nextch2;
-#ifdef WIN32
-           case 'I':
-               /* Windows PRI*{32,64,PTR} size */
-               if (format[0] == '3' && format[1] == '2')
-                   format += 2;
-               else if (format[0] == '6' && format[1] == '4')
-               {
-                   format += 2;
-                   longlongflag = 1;
-               }
-               else
-               {
-#if SIZEOF_VOID_P == SIZEOF_LONG
-                   longflag = 1;
-#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG
-                   longlongflag = 1;
-#else
-#error "cannot find integer type of the same size as intptr_t"
-#endif
-               }
-               goto nextch2;
-#endif
            case 'l':
                if (longflag)
                    longlongflag = 1;
@@ -842,28 +820,6 @@ nextch1:
                    fmtpos = accum;
                accum = 0;
                goto nextch1;
-#ifdef WIN32
-           case 'I':
-               /* Windows PRI*{32,64,PTR} size */
-               if (format[0] == '3' && format[1] == '2')
-                   format += 2;
-               else if (format[0] == '6' && format[1] == '4')
-               {
-                   format += 2;
-                   longlongflag = 1;
-               }
-               else
-               {
-#if SIZEOF_VOID_P == SIZEOF_LONG
-                   longflag = 1;
-#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG
-                   longlongflag = 1;
-#else
-#error "cannot find integer type of the same size as intptr_t"
-#endif
-               }
-               goto nextch1;
-#endif
            case 'l':
                if (longflag)
                    longlongflag = 1;