]> granicus.if.org Git - python/commitdiff
Issue #23644: Fix issues with C++ when compiling Python extensions
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 17 Mar 2015 21:53:27 +0000 (22:53 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 17 Mar 2015 21:53:27 +0000 (22:53 +0100)
Disable completly pyatomic.h on C++, because <stdatomic.h> is not compatible with C++.

<pyatomic.h> is only needed by the optimized PyThreadState_GET() macro in
pystate.h. Instead, declare PyThreadState_GET() as an alias to
PyThreadState_Get(), as done for limited API.

Include/pyatomic.h
Include/pystate.h

index aa55281a6477769c09103b823bad0ac5b5f1e822..99816a5b611058dc6013e608d9810a935a335430 100644 (file)
@@ -1,4 +1,6 @@
-#ifndef Py_LIMITED_API
+/* Issue #23644: <stdatomic.h> is incompatible with C++, see:
+   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60932 */
+#if !defined(Py_LIMITED_API) && !defined(__cplusplus)
 #ifndef Py_ATOMIC_H
 #define Py_ATOMIC_H
 
@@ -6,10 +8,6 @@
 
 #include "pyconfig.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #if defined(HAVE_STD_ATOMIC)
 #include <stdatomic.h>
 #endif
@@ -250,9 +248,5 @@ _Py_ANNOTATE_MEMORY_ORDER(const volatile void *address, _Py_memory_order order)
 #define _Py_atomic_load_relaxed(ATOMIC_VAL) \
     _Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_relaxed)
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif  /* Py_ATOMIC_H */
 #endif  /* Py_LIMITED_API */
index 4992c22684fe59652b473765d92ae4aae3b4f10d..8539b65013d4a8bf9d3e2e5ad829812f49461970 100644 (file)
@@ -174,12 +174,16 @@ PyAPI_FUNC(int) PyThreadState_SetAsyncExc(long, PyObject *);
 /* Variable and macro for in-line access to current thread state */
 
 /* Assuming the current thread holds the GIL, this is the
-   PyThreadState for the current thread. */
-#ifndef Py_LIMITED_API
+   PyThreadState for the current thread.
+
+   Issue #23644: pyatomic.h is incompatible with C++ (yet). Disable
+   PyThreadState_GET() optimization: declare it as an alias to
+   PyThreadState_Get(), as done for limited API. */
+#if !defined(Py_LIMITED_API) && !defined(__cplusplus)
 PyAPI_DATA(_Py_atomic_address) _PyThreadState_Current;
 #endif
 
-#if defined(Py_DEBUG) || defined(Py_LIMITED_API)
+#if defined(Py_DEBUG) || defined(Py_LIMITED_API) || defined(__cplusplus)
 #define PyThreadState_GET() PyThreadState_Get()
 #else
 #define PyThreadState_GET() \