Replace pg_restrict by standard restrict
authorPeter Eisentraut <peter@eisentraut.org>
Wed, 29 Oct 2025 06:36:46 +0000 (07:36 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Wed, 29 Oct 2025 06:52:58 +0000 (07:52 +0100)
MSVC in C11 mode supports the standard restrict qualifier, so we don't
need the workaround naming pg_restrict anymore.

Even though restrict is in C99 and should be supported by all
supported compilers, we keep the configure test and the hardcoded
redirection to __restrict, because that will also work in C++ in all
supported compilers.  (restrict is not part of the C++ standard.)

For backward compatibility for extensions, we keep a #define of
pg_restrict around, but our own code doesn't use it anymore.

Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://www.postgresql.org/message-id/flat/0e3d8644-c01d-4374-86ea-9f0a987981f0%40eisentraut.org

12 files changed:
configure
configure.ac
meson.build
src/bin/pg_verifybackup/pg_verifybackup.c
src/bin/pg_verifybackup/pg_verifybackup.h
src/common/logging.c
src/common/string.c
src/include/c.h
src/include/common/logging.h
src/include/common/string.h
src/include/libpq/pqformat.h
src/include/pg_config.h.in

index 22cd866147b9642ec1adb7af5f5f104bfd77e348..7ce52173dd855abb2ca5397dc522d58c671ff052 100755 (executable)
--- a/configure
+++ b/configure
@@ -14999,10 +14999,10 @@ _ACEOF
 fi
 
 
-# MSVC doesn't cope well with defining restrict to __restrict, the
-# spelling it understands, because it conflicts with
-# __declspec(restrict). Therefore we define pg_restrict to the
-# appropriate definition, which presumably won't conflict.
+# Even though restrict is in C99 and should be supported by all
+# supported compilers, but this macro is useful because it will prefer
+# a spelling that also works in C++ (often __restrict).  (restrict is
+# not part of the C++ standard.)
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5
 $as_echo_n "checking for C/C++ restrict keyword... " >&6; }
 if ${ac_cv_c_restrict+:} false; then :
@@ -15049,16 +15049,6 @@ _ACEOF
  ;;
  esac
 
-if test "$ac_cv_c_restrict" = "no"; then
-  pg_restrict=""
-else
-  pg_restrict="$ac_cv_c_restrict"
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define pg_restrict $pg_restrict
-_ACEOF
-
 
 ac_fn_c_check_type "$LINENO" "struct option" "ac_cv_type_struct_option" "#ifdef HAVE_GETOPT_H
 #include <getopt.h>
index e44943aa6fe35dfa8dfaaec0703c155c933d2250..0842fd06259caf53f73217c7627a15a7cc93c627 100644 (file)
@@ -1685,19 +1685,11 @@ PGAC_UNION_SEMUN
 AC_CHECK_TYPES(socklen_t, [], [], [#include <sys/socket.h>])
 PGAC_STRUCT_SOCKADDR_SA_LEN
 
-# MSVC doesn't cope well with defining restrict to __restrict, the
-# spelling it understands, because it conflicts with
-# __declspec(restrict). Therefore we define pg_restrict to the
-# appropriate definition, which presumably won't conflict.
+# Even though restrict is in C99 and should be supported by all
+# supported compilers, this test is useful because it will prefer a
+# spelling that also works in C++ (often __restrict).  (restrict is
+# not part of the C++ standard.)
 AC_C_RESTRICT
-if test "$ac_cv_c_restrict" = "no"; then
-  pg_restrict=""
-else
-  pg_restrict="$ac_cv_c_restrict"
-fi
-AC_DEFINE_UNQUOTED([pg_restrict], [$pg_restrict],
-[Define to keyword to use for C99 restrict support, or to nothing if not
-supported])
 
 AC_CHECK_TYPES([struct option], [], [],
 [#ifdef HAVE_GETOPT_H
index 395416a6060bfe074ca4f346967990be05a700bc..1a123ce151a473018fee8102be5c2661a11ac02f 100644 (file)
@@ -2803,13 +2803,12 @@ int main(void)
 endforeach
 
 
-# MSVC doesn't cope well with defining restrict to __restrict, the spelling it
-# understands, because it conflicts with __declspec(restrict). Therefore we
-# define pg_restrict to the appropriate definition, which presumably won't
-# conflict.
-#
-# We assume C99 support, so we don't need to make this conditional.
-cdata.set('pg_restrict', '__restrict')
+# Even though restrict is in C99 and should be supported by all
+# supported compilers, this indirection is useful because __restrict
+# also works in C++ in all supported compilers.  (If not, then we
+# might have to write a real test.)  (restrict is not part of the C++
+# standard.)
+cdata.set('restrict', '__restrict')
 
 
 # Most libraries are included only if they demonstrably provide a function we
index 5e6c13bb9216839b40106274e6328ddba7e8a681..8d5befa947f5090acc12b192fcfb15de2ecc5a38 100644 (file)
@@ -1228,7 +1228,7 @@ parse_required_wal(verifier_context *context, char *pg_waldump_path,
  * context says we should.
  */
 void
-report_backup_error(verifier_context *context, const char *pg_restrict fmt,...)
+report_backup_error(verifier_context *context, const char *restrict fmt,...)
 {
    va_list     ap;
 
@@ -1245,7 +1245,7 @@ report_backup_error(verifier_context *context, const char *pg_restrict fmt,...)
  * Report a fatal error and exit
  */
 void
-report_fatal_error(const char *pg_restrict fmt,...)
+report_fatal_error(const char *restrict fmt,...)
 {
    va_list     ap;
 
index 8cb6f9c53ad854f394ba777632da3bb539784f1c..3bdae62b822aaa5222bf896ba194e8237b69fab8 100644 (file)
@@ -96,9 +96,9 @@ typedef struct verifier_context
 } verifier_context;
 
 extern void report_backup_error(verifier_context *context,
-                               const char *pg_restrict fmt,...)
+                               const char *restrict fmt,...)
            pg_attribute_printf(2, 3);
-pg_noreturn extern void report_fatal_error(const char *pg_restrict fmt,...)
+pg_noreturn extern void report_fatal_error(const char *restrict fmt,...)
            pg_attribute_printf(1, 2);
 extern bool should_ignore_relpath(verifier_context *context,
                                  const char *relpath);
index 125a172af80cf61d306943eaf3ca976bd6a80ee0..7319a5b4e20bf3874d851d62b7e53d75d36916ed 100644 (file)
@@ -206,7 +206,7 @@ pg_logging_set_locus_callback(void (*cb) (const char **filename, uint64 *lineno)
 
 void
 pg_log_generic(enum pg_log_level level, enum pg_log_part part,
-              const char *pg_restrict fmt,...)
+              const char *restrict fmt,...)
 {
    va_list     ap;
 
@@ -217,7 +217,7 @@ pg_log_generic(enum pg_log_level level, enum pg_log_part part,
 
 void
 pg_log_generic_v(enum pg_log_level level, enum pg_log_part part,
-                const char *pg_restrict fmt, va_list ap)
+                const char *restrict fmt, va_list ap)
 {
    int         save_errno = errno;
    const char *filename = NULL;
index d8a3129c3ba8d1338668e166c56b18848fa32a89..95c7c07d50241e64f3011c5e433de00200d611f2 100644 (file)
@@ -47,7 +47,7 @@ pg_str_endswith(const char *str, const char *end)
  * strtoint --- just like strtol, but returns int not long
  */
 int
-strtoint(const char *pg_restrict str, char **pg_restrict endptr, int base)
+strtoint(const char *restrict str, char **restrict endptr, int base)
 {
    long        val;
 
index 01854f99a3cee4a3e6913bbb4f1747428387d0b2..f4ec33e9b07df37a1a7473873fc1fdaa94d7b255 100644 (file)
 #define inline
 #endif
 
+/*
+ * Previously used PostgreSQL-specific spelling, for backward compatibility
+ * for extensions.
+ */
+#define pg_restrict restrict
+
 /*
  * Attribute macros
  *
index 81529ee8f2926ffbbcbd42ff557bb1719e792ca1..2e0333dc0090924cbb3d701db0d12b9a5f495571 100644 (file)
@@ -93,10 +93,10 @@ void        pg_logging_set_pre_callback(void (*cb) (void));
 void       pg_logging_set_locus_callback(void (*cb) (const char **filename, uint64 *lineno));
 
 void       pg_log_generic(enum pg_log_level level, enum pg_log_part part,
-                          const char *pg_restrict fmt,...)
+                          const char *restrict fmt,...)
            pg_attribute_printf(3, 4);
 void       pg_log_generic_v(enum pg_log_level level, enum pg_log_part part,
-                            const char *pg_restrict fmt, va_list ap)
+                            const char *restrict fmt, va_list ap)
            pg_attribute_printf(3, 0);
 
 /*
index 55ed8774364baa8223c760dca422d94f36837b2c..32a97c24b2296967ac4859adff670cd7f7a73095 100644 (file)
@@ -25,7 +25,7 @@ typedef struct PromptInterruptContext
 
 /* functions in src/common/string.c */
 extern bool pg_str_endswith(const char *str, const char *end);
-extern int strtoint(const char *pg_restrict str, char **pg_restrict endptr,
+extern int strtoint(const char *restrict str, char **restrict endptr,
                     int base);
 extern char *pg_clean_ascii(const char *str, int alloc_flags);
 extern int pg_strip_crlf(char *str);
index 55442caf0e4e8d14af9cb1f6ada351d70947fa3b..127a74e299a146a742f7bbefb784a7ebb2b54cdb 100644 (file)
@@ -34,7 +34,7 @@ extern void pq_sendfloat8(StringInfo buf, float8 f);
  * Append a [u]int8 to a StringInfo buffer, which already has enough space
  * preallocated.
  *
- * The use of pg_restrict allows the compiler to optimize the code based on
+ * The use of restrict allows the compiler to optimize the code based on
  * the assumption that buf, buf->len, buf->data and *buf->data don't
  * overlap. Without the annotation buf->len etc cannot be kept in a register
  * over subsequent pq_writeintN calls.
@@ -43,7 +43,7 @@ extern void pq_sendfloat8(StringInfo buf, float8 f);
  * overly picky and demanding a * before a restrict.
  */
 static inline void
-pq_writeint8(StringInfoData *pg_restrict buf, uint8 i)
+pq_writeint8(StringInfoData *restrict buf, uint8 i)
 {
    uint8       ni = i;
 
@@ -57,7 +57,7 @@ pq_writeint8(StringInfoData *pg_restrict buf, uint8 i)
  * preallocated.
  */
 static inline void
-pq_writeint16(StringInfoData *pg_restrict buf, uint16 i)
+pq_writeint16(StringInfoData *restrict buf, uint16 i)
 {
    uint16      ni = pg_hton16(i);
 
@@ -71,7 +71,7 @@ pq_writeint16(StringInfoData *pg_restrict buf, uint16 i)
  * preallocated.
  */
 static inline void
-pq_writeint32(StringInfoData *pg_restrict buf, uint32 i)
+pq_writeint32(StringInfoData *restrict buf, uint32 i)
 {
    uint32      ni = pg_hton32(i);
 
@@ -85,7 +85,7 @@ pq_writeint32(StringInfoData *pg_restrict buf, uint32 i)
  * preallocated.
  */
 static inline void
-pq_writeint64(StringInfoData *pg_restrict buf, uint64 i)
+pq_writeint64(StringInfoData *restrict buf, uint64 i)
 {
    uint64      ni = pg_hton64(i);
 
@@ -105,7 +105,7 @@ pq_writeint64(StringInfoData *pg_restrict buf, uint64 i)
  * sent to the frontend.
  */
 static inline void
-pq_writestring(StringInfoData *pg_restrict buf, const char *pg_restrict str)
+pq_writestring(StringInfoData *restrict buf, const char *restrict str)
 {
    int         slen = strlen(str);
    char       *p;
index c4dc5d72bdb78e987c2620d43168185f9e4ed4b0..08d7bfbee10634bc2249e6707b10539a22c4cd65 100644 (file)
 #undef inline
 #endif
 
-/* Define to keyword to use for C99 restrict support, or to nothing if not
-   supported */
-#undef pg_restrict
-
 /* Define to the equivalent of the C99 'restrict' keyword, or to
    nothing if this is not supported.  Do not define if restrict is
    supported directly.  */