Add work-around for VA_ARGS_NARGS() on MSVC.
authorThomas Munro <[email protected]>
Thu, 22 Dec 2022 04:14:23 +0000 (17:14 +1300)
committerThomas Munro <[email protected]>
Thu, 22 Dec 2022 05:32:10 +0000 (18:32 +1300)
The previous coding of VA_ARGS_NARGS() always returned 1 on Visual
Studio, because it treats __VA_ARGS__ as a single token unless you jump
through extra hoops.  Newer compilers have an option to fix that.  Add a
comment about that so that we can remember to clean this up in the
future when our minimum MSVC version advances.

Author: Victor Spirin <[email protected]>
Reviewed-by: Thomas Munro <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/f450fc57-a147-19d0-e50c-33571c52cc13%40postgrespro.ru

src/include/c.h

index bd6d8e5bf53243593b4bf47443b70d14e4067ab5..7567ef7888b7561687d8c2199b7476153d9f40ed 100644 (file)
  * pretty trivial: VA_ARGS_NARGS_() returns its 64th argument, and we set up
  * the call so that that is the appropriate one of the list of constants.
  * This idea is due to Laurent Deniau.
+ *
+ * MSVC has an implementation of __VA_ARGS__ that doesn't conform to the
+ * standard unless you use the /Zc:preprocessor compiler flag, but that
+ * isn't available before Visual Studio 2019.  For now, use a different
+ * definition that also works on older compilers.
  */
+#ifdef _MSC_VER
+#define EXPAND(args) args
+#define VA_ARGS_NARGS(...) \
+       VA_ARGS_NARGS_ EXPAND((__VA_ARGS__, \
+                                  63,62,61,60,                   \
+                                  59,58,57,56,55,54,53,52,51,50, \
+                                  49,48,47,46,45,44,43,42,41,40, \
+                                  39,38,37,36,35,34,33,32,31,30, \
+                                  29,28,27,26,25,24,23,22,21,20, \
+                                  19,18,17,16,15,14,13,12,11,10, \
+                                  9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
+#else
+
 #define VA_ARGS_NARGS(...) \
        VA_ARGS_NARGS_(__VA_ARGS__, \
                                   63,62,61,60,                   \
                                   29,28,27,26,25,24,23,22,21,20, \
                                   19,18,17,16,15,14,13,12,11,10, \
                                   9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
+#endif
+
 #define VA_ARGS_NARGS_( \
        _01,_02,_03,_04,_05,_06,_07,_08,_09,_10, \
        _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \