[committed v2] libstdc++: Fix mingw-w64 build due to __max macro

Jonathan Wakely jwakely@redhat.com
Thu Mar 12 09:26:56 GMT 2026


The stdlib.h header on mingw defines a function-like macro called __max,
which causes an error here:

include/format:3785:55: error: macro '__max' requires 2 arguments, but only 1 given
 3785 |               iter_difference_t<_OutIter> __max(_M_max);

We have lots of existing variables called __max, but this is the only
case that uses direct-initialization and so interferes with the
function-like macro in stdlib.h

The fix applied here is just to rename the variable. We can't use
direct-list-initialization because the conversion from size_t to the
difference type would be narrowing. We prefer not to use
copy-initialization so that conversion to the difference type is
explicit not implicit.

libstdc++-v3/ChangeLog:

	* include/std/format (__format::_Ptr_sink::_M_finish): Rename
	__max variable to __m.
	* testsuite/17_intro/names.cc (__max): Define function-like
	macro.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
---

Pushed to trunk.

 libstdc++-v3/include/std/format          | 4 ++--
 libstdc++-v3/testsuite/17_intro/names.cc | 4 ++++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index 4297bcc1007a..555781bbd274 100644
--- a/libstdc++-v3/include/std/format
+++ b/libstdc++-v3/include/std/format
@@ -3782,9 +3782,9 @@ namespace __format
 	  if (__s.data() == _M_buf)
 	    {
 	      // Switched to internal buffer, so must have written _M_max.
-	      iter_difference_t<_OutIter> __max(_M_max);
+	      iter_difference_t<_OutIter> __m(_M_max);
 	      iter_difference_t<_OutIter> __count(_M_count + __s.size());
-	      return { __first + __max, __count };
+	      return { __first + __m, __count };
 	    }
 	  else // Not using internal buffer yet
 	    {
diff --git a/libstdc++-v3/testsuite/17_intro/names.cc b/libstdc++-v3/testsuite/17_intro/names.cc
index 404cc93e9630..f56c045fedf7 100644
--- a/libstdc++-v3/testsuite/17_intro/names.cc
+++ b/libstdc++-v3/testsuite/17_intro/names.cc
@@ -153,6 +153,10 @@
 # define __unused		cannot be used as an identifier
 # define __used			cannot be used as an identifier
 
+// These are function-like macros in mingw stdlib.h
+#define __min(A,B)              cannot use __min with parentheses
+#define __max(A,B)              cannot use __max with parentheses
+
 #ifndef __APPLE__
 #define __weak   predefined qualifier on darwin
 #define __strong predefined qualifier on darwin
-- 
2.53.0



More information about the Libstdc++ mailing list