On 2026-01-30 18:00, Richard Biener wrote:


Am 30.01.2026 um 18:00 schrieb Torbjörn SVENSSON 
<[email protected]>:

Changes since v1:

- Moved `#undef CONST_CAST2` to right after `#include <memory>`
- Renamed internal copy of CONST_CAST2 to GTHR_CONST_CAST in gthr-win32.h
  and gthr-dce.h. Also undef GTHR_CONST_CAST at the end of the header
  file to avoid pollution.

Ok for trunk and release/gcc-15?

Ok.  Please leave others time to comment.

I suppose enough time has passed now.
With https://gcc.gnu.org/pipermail/gcc-patches/2026-February/707812.html merged 
to trunk, this is only relevant for releases/gcc-15.

As I removed CONST_CAST2 in gthr-win32.h and gthr-dce.h on master, maybe I 
should drop the changes in those files in this patch and only leave the #undef 
change for releases/gcc-15?
After all, if CONST_CAST2 is undefined when the definition in system.h takes 
place, none of the other usages matters.

Let me know what you think.

Kind regards,
Torbjörn


Thanks,

Richard


--

When building GCC with host=mingw, the following warning can be seen
multiple times in the build log if the MinGW GCC version is older than
r13-4881-g9149a5b7e0a:

In file included from /build/gcc/c/c-typeck.cc:27:0:
/build/gcc/system.h:1172:0: warning: "CONST_CAST2" redefined
#define CONST_CAST2(TOTYPE,FROMTYPE,X) (const_cast<TOTYPE> (X))

In file included from 
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/include/c++/x86_64-w64-mingw32/bits/gthr.h:148:0,
                 from 
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/include/c++/ext/atomicity.h:35,
                 from 
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/include/c++/memory:73,
                 from /build/gcc/gcc/system.h:231,
                 from /build/gcc/gcc/c/c-typeck.cc:27:
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/include/c++/x86_64-w64-mingw32/bits/gthr-default.h:33:0:
 note: this is the location of the previous definition
#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; 
TOTYPE _nq;})(X))._nq)

To ensure that the recent definition is used, always undefine any
potential define before defining the new macro.

gcc/ChangeLog:

    * system.h: Avoid redefinition of CONST_CAST2 macro.

libgcc/ChangeLog:

    * config/i386/gthr-win32.h: Don't leak internal copy of
    CONST_CAST2 macro.
    * config/pa/gthr-dce.h: Likewise.

Signed-off-by: Torbjörn SVENSSON <[email protected]>
---
gcc/system.h                    |  6 ++++++
libgcc/config/i386/gthr-win32.h | 13 ++++++++-----
libgcc/config/pa/gthr-dce.h     | 13 ++++++++-----
3 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/gcc/system.h b/gcc/system.h
index 588e65453f5..a6233a353d6 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -229,6 +229,12 @@ extern int fprintf_unlocked (FILE *, const char *, ...);
# include <sstream>
#endif
# include <memory>
+
+/* Some older versions of GCC used to expose an internal copy of the
+   CONST_CAST2 macro that might be incompatible with the current version of the
+   GCC sources.  */
+#undef CONST_CAST2
+
# include <cstring>
# include <initializer_list>
# include <new>
diff --git a/libgcc/config/i386/gthr-win32.h b/libgcc/config/i386/gthr-win32.h
index 633dff7ed73..0846838e655 100644
--- a/libgcc/config/i386/gthr-win32.h
+++ b/libgcc/config/i386/gthr-win32.h
@@ -86,12 +86,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  
If not, see
# define __GTHREAD_INLINE static inline
#endif

-/* Make sure CONST_CAST2 (origin in system.h) is declared.  */
-#ifndef CONST_CAST2
+/* Make sure GTHR_CONST_CAST (origin in system.h) is declared.  */
+#ifndef GTHR_CONST_CAST
#ifdef __cplusplus
-#define CONST_CAST2(TOTYPE,FROMTYPE,X) (const_cast<TOTYPE> (X))
+#define GTHR_CONST_CAST(TOTYPE,FROMTYPE,X) (const_cast<TOTYPE> (X))
#else
-#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; 
TOTYPE _nq;})(X))._nq)
+#define GTHR_CONST_CAST(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; 
TOTYPE _nq;})(X))._nq)
#endif
#endif

@@ -720,7 +720,7 @@ __gthread_getspecific (__gthread_key_t __key)
__GTHREAD_WIN32_INLINE int
__gthread_setspecific (__gthread_key_t __key, const void *__ptr)
{
-  if (TlsSetValue (__key, CONST_CAST2(void *, const void *, __ptr)))
+  if (TlsSetValue (__key, GTHR_CONST_CAST(void *, const void *, __ptr)))
     return 0;
   else
     return (int) GetLastError ();
@@ -886,4 +886,7 @@ __gthread_cond_wait_recursive (__gthread_cond_t *__cond,

#endif /* _LIBOBJC */

+/* Don't leak internal macro.  */
+#undef GTHR_CONST_CAST
+
#endif /* ! GCC_GTHR_WIN32_H */
diff --git a/libgcc/config/pa/gthr-dce.h b/libgcc/config/pa/gthr-dce.h
index b21ea8336c7..e53894ac9c7 100644
--- a/libgcc/config/pa/gthr-dce.h
+++ b/libgcc/config/pa/gthr-dce.h
@@ -36,12 +36,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  
If not, see
    DCE threads are based on POSIX threads draft 4, and many things
    have changed since then.  */

-/* Make sure CONST_CAST2 (original in system.h) is defined.  */
-#ifndef CONST_CAST2
+/* Make sure GTHR_CONST_CAST (origin in system.h) is declared.  */
+#ifndef GTHR_CONST_CAST
#ifdef __cplusplus
-#define CONST_CAST2(TOTYPE,FROMTYPE,X) (const_cast<TOTYPE> (X))
+#define GTHR_CONST_CAST(TOTYPE,FROMTYPE,X) (const_cast<TOTYPE> (X))
#else
-#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; 
TOTYPE _nq;})(X))._nq)
+#define GTHR_CONST_CAST(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; 
TOTYPE _nq;})(X))._nq)
#endif
#endif

@@ -471,7 +471,7 @@ static inline int
__gthread_setspecific (__gthread_key_t __key, const void *__ptr)
{
   return __gthrw_(pthread_setspecific)
-    (__key, CONST_CAST2(void *, const void *, __ptr));
+    (__key, GTHR_CONST_CAST(void *, const void *, __ptr));
}

static inline void
@@ -564,5 +564,8 @@ __gthread_recursive_mutex_destroy 
(__gthread_recursive_mutex_t *__mutex)

#endif /* _LIBOBJC */

+/* Don't leak internal macro.  */
+#undef GTHR_CONST_CAST
+
#endif
#endif /* ! GCC_GTHR_DCE_H */
--
2.43.0


Reply via email to