mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-25 06:35:12 +00:00
Dropping MSVC 2015 (#3722)
* Changing `_MSC_VER` guard to `< 1910` (dropping MSVC 2015). * Removing MSVC 2015 from ci.yml, and .appveyor.yml entirely. * Bringing back .appveyor.yml from master. * appveyor Visual Studio 2017 * 1st manual pass, builds & tests with unix_clang, before pre-commit. * After clang-format (via pre-commit). * Manual pass looking for "2015", builds & tests with unix_clang, before pre-commit. * Backtracking for include/pybind11 changes in previous commit. git checkoutd07865846c
include/pybind11/attr.h include/pybind11/detail/common.h include/pybind11/functional.h -------------------- CI #4160 errors observed:2a26873727
https://github.com/pybind/pybind11/runs/5168332130?check_suite_focus=true $ grep ' error C' *.txt | sed 's/2022-02-12[^ ]*//' | sed 's/^[0-9][0-9]*//' | sed 's/^.*\.txt: //' | sort | uniqD:\a\pybind11\pybind11\include\pybind11\cast.h(1364,1): error C2752: 'pybind11::detail::type_caster<Eigen::Ref<Eigen::Vector3f,0,pybind11::EigenDStride>,void>': more than one partial specialization matches the template argument list [D:\a\pybind11\pybind11\build\tests\pybind11_tests.vcxproj] d:\a\pybind11\pybind11\include\pybind11\detail/common.h(1023): error C2737: 'pybind11::overload_cast': 'constexpr' object must be initialized [D:\a\pybind11\pybind11\build\tests\cross_module_gil_utils.vcxproj] d:\a\pybind11\pybind11\include\pybind11\detail/common.h(1023): error C2737: 'pybind11::overload_cast': 'constexpr' object must be initialized [D:\a\pybind11\pybind11\build\tests\pybind11_cross_module_tests.vcxproj] d:\a\pybind11\pybind11\include\pybind11\detail/common.h(1023): error C2737: 'pybind11::overload_cast': 'constexpr' object must be initialized [D:\a\pybind11\pybind11\build\tests\pybind11_tests.vcxproj] d:\a\pybind11\pybind11\include\pybind11\detail/common.h(1023): error C2737: 'pybind11::overload_cast': 'constexpr' object must be initialized [D:\a\pybind11\pybind11\build\tests\test_embed\external_module.vcxproj] D:\a\pybind11\pybind11\include\pybind11\detail/common.h(624): fatal error C1001: Internal compiler error. [D:\a\pybind11\pybind11\build\tests\pybind11_tests.vcxproj] D:\a\pybind11\pybind11\include\pybind11\detail/common.h(624): fatal error C1001: Internal compiler error. [D:\a\pybind11\pybind11\tests\pybind11_tests.vcxproj] $ grep ': error C2737' *.txt | sed 's/^.*MSVC//' | sed 's/___.*//' | sort | uniq _2017 $ grep ': error C2752' *.txt 3______3.8_____MSVC_2019_____x86_-DCMAKE_CXX_STANDARD=17.txt:2022-02-12T16:12:45.9921122Z D:\a\pybind11\pybind11\include\pybind11\cast.h(1364,1): error C2752: 'pybind11::detail::type_caster<Eigen::Ref<Eigen::Vector3f,0,pybind11::EigenDStride>,void>': more than one partial specialization matches the template argument list [D:\a\pybind11\pybind11\build\tests\pybind11_tests.vcxproj] $ grep ': fatal error C1001:' *.txt 10______pypy-3.8-v7.3.7_____windows-2022_____x64.txt:2022-02-12T16:12:56.3163683Z D:\a\pybind11\pybind11\include\pybind11\detail/common.h(624): fatal error C1001: Internal compiler error. [D:\a\pybind11\pybind11\tests\pybind11_tests.vcxproj] 1______3.6_____MSVC_2019_____x86.txt:2022-02-12T16:12:47.6774625Z D:\a\pybind11\pybind11\include\pybind11\detail/common.h(624): fatal error C1001: Internal compiler error. [D:\a\pybind11\pybind11\build\tests\pybind11_tests.vcxproj] 16______3.6_____windows-latest_____x64_-DPYBIND11_FINDPYTHON=ON.txt:2022-02-12T16:12:27.0556151Z D:\a\pybind11\pybind11\include\pybind11\detail/common.h(624): fatal error C1001: Internal compiler error. [D:\a\pybind11\pybind11\tests\pybind11_tests.vcxproj] 17______3.9_____windows-2019_____x64.txt:2022-02-12T16:12:30.3822566Z D:\a\pybind11\pybind11\include\pybind11\detail/common.h(624): fatal error C1001: Internal compiler error. [D:\a\pybind11\pybind11\tests\pybind11_tests.vcxproj] 2______3.7_____MSVC_2019_____x86.txt:2022-02-12T16:12:38.7018911Z D:\a\pybind11\pybind11\include\pybind11\detail/common.h(624): fatal error C1001: Internal compiler error. [D:\a\pybind11\pybind11\build\tests\pybind11_tests.vcxproj] 6______3.6_____windows-2022_____x64.txt:2022-02-12T16:12:00.4513642Z D:\a\pybind11\pybind11\include\pybind11\detail/common.h(624): fatal error C1001: Internal compiler error. [D:\a\pybind11\pybind11\tests\pybind11_tests.vcxproj] 7______3.9_____windows-2022_____x64.txt:2022-02-12T16:11:43.6306160Z D:\a\pybind11\pybind11\include\pybind11\detail/common.h(624): fatal error C1001: Internal compiler error. [D:\a\pybind11\pybind11\tests\pybind11_tests.vcxproj] 8______3.10_____windows-2022_____x64.txt:2022-02-12T16:11:49.9589644Z D:\a\pybind11\pybind11\include\pybind11\detail/common.h(624): fatal error C1001: Internal compiler error. [D:\a\pybind11\pybind11\tests\pybind11_tests.vcxproj] 9______pypy-3.7-v7.3.7_____windows-2022_____x64.txt:2022-02-12T16:11:53.7912112Z D:\a\pybind11\pybind11\include\pybind11\detail/common.h(624): fatal error C1001: Internal compiler error. [D:\a\pybind11\pybind11\tests\pybind11_tests.vcxproj] * common.h: is_template_base_of * Re-applying 4 changes from2a26873727
that work universally. * `overload_cast = {};` only for MSVC 2017 and Clang 5 * Refining condition for using is_template_base_of workaround. * Undoing MSVC 2015 workaround in test_constants_and_functions.cpp * CentOS7: silence_unused_warnings * Tweaks in response to reviews. * Adding windows-2022 C++20 * Trying another way of adding windows-2022 C++20
This commit is contained in:
parent
44156477a3
commit
a97e9d8cac
@ -1,6 +1,6 @@
|
|||||||
version: 1.0.{build}
|
version: 1.0.{build}
|
||||||
image:
|
image:
|
||||||
- Visual Studio 2015
|
- Visual Studio 2017
|
||||||
test: off
|
test: off
|
||||||
skip_branch_with_pr: true
|
skip_branch_with_pr: true
|
||||||
build:
|
build:
|
||||||
@ -13,7 +13,7 @@ environment:
|
|||||||
CONFIG: Debug
|
CONFIG: Debug
|
||||||
install:
|
install:
|
||||||
- ps: |
|
- ps: |
|
||||||
$env:CMAKE_GENERATOR = "Visual Studio 14 2015"
|
$env:CMAKE_GENERATOR = "Visual Studio 15 2017"
|
||||||
if ($env:PLATFORM -eq "x64") { $env:PYTHON = "$env:PYTHON-x64" }
|
if ($env:PLATFORM -eq "x64") { $env:PYTHON = "$env:PYTHON-x64" }
|
||||||
$env:PATH = "C:\Python$env:PYTHON\;C:\Python$env:PYTHON\Scripts\;$env:PATH"
|
$env:PATH = "C:\Python$env:PYTHON\;C:\Python$env:PYTHON\Scripts\;$env:PATH"
|
||||||
python -W ignore -m pip install --upgrade pip wheel
|
python -W ignore -m pip install --upgrade pip wheel
|
||||||
|
47
.github/workflows/ci.yml
vendored
47
.github/workflows/ci.yml
vendored
@ -755,53 +755,6 @@ jobs:
|
|||||||
- name: Python tests
|
- name: Python tests
|
||||||
run: cmake --build build -t pytest
|
run: cmake --build build -t pytest
|
||||||
|
|
||||||
win32-msvc2015:
|
|
||||||
name: "🐍 ${{ matrix.python }} • MSVC 2015 • x64"
|
|
||||||
runs-on: windows-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
python:
|
|
||||||
- 3.6
|
|
||||||
- 3.7
|
|
||||||
# todo: check/cpptest does not support 3.8+ yet
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Setup 🐍 ${{ matrix.python }}
|
|
||||||
uses: actions/setup-python@v2
|
|
||||||
with:
|
|
||||||
python-version: ${{ matrix.python }}
|
|
||||||
|
|
||||||
- name: Update CMake
|
|
||||||
uses: jwlawson/actions-setup-cmake@v1.12
|
|
||||||
|
|
||||||
- name: Prepare MSVC
|
|
||||||
uses: ilammy/msvc-dev-cmd@v1.10.0
|
|
||||||
with:
|
|
||||||
toolset: 14.0
|
|
||||||
|
|
||||||
- name: Prepare env
|
|
||||||
run: |
|
|
||||||
python -m pip install -r tests/requirements.txt
|
|
||||||
|
|
||||||
# First build - C++11 mode and inplace
|
|
||||||
- name: Configure
|
|
||||||
run: >
|
|
||||||
cmake -S . -B build
|
|
||||||
-G "Visual Studio 14 2015" -A x64
|
|
||||||
-DPYBIND11_WERROR=ON
|
|
||||||
-DDOWNLOAD_CATCH=ON
|
|
||||||
-DDOWNLOAD_EIGEN=ON
|
|
||||||
|
|
||||||
- name: Build C++14
|
|
||||||
run: cmake --build build -j 2
|
|
||||||
|
|
||||||
- name: Run all checks
|
|
||||||
run: cmake --build build -t check
|
|
||||||
|
|
||||||
|
|
||||||
win32-msvc2017:
|
win32-msvc2017:
|
||||||
name: "🐍 ${{ matrix.python }} • MSVC 2017 • x64"
|
name: "🐍 ${{ matrix.python }} • MSVC 2017 • x64"
|
||||||
runs-on: windows-2016
|
runs-on: windows-2016
|
||||||
|
@ -122,7 +122,7 @@ Supported compilers
|
|||||||
1. Clang/LLVM 3.3 or newer (for Apple Xcode's clang, this is 5.0.0 or
|
1. Clang/LLVM 3.3 or newer (for Apple Xcode's clang, this is 5.0.0 or
|
||||||
newer)
|
newer)
|
||||||
2. GCC 4.8 or newer
|
2. GCC 4.8 or newer
|
||||||
3. Microsoft Visual Studio 2015 Update 3 or newer
|
3. Microsoft Visual Studio 2017 or newer
|
||||||
4. Intel classic C++ compiler 18 or newer (ICC 20.2 tested in CI)
|
4. Intel classic C++ compiler 18 or newer (ICC 20.2 tested in CI)
|
||||||
5. Cygwin/GCC (previously tested on 2.5.1)
|
5. Cygwin/GCC (previously tested on 2.5.1)
|
||||||
6. NVCC (CUDA 11.0 tested in CI)
|
6. NVCC (CUDA 11.0 tested in CI)
|
||||||
|
@ -87,8 +87,6 @@ included to tell pybind11 how to visit the variant.
|
|||||||
|
|
||||||
pybind11 only supports the modern implementation of ``boost::variant``
|
pybind11 only supports the modern implementation of ``boost::variant``
|
||||||
which makes use of variadic templates. This requires Boost 1.56 or newer.
|
which makes use of variadic templates. This requires Boost 1.56 or newer.
|
||||||
Additionally, on Windows, MSVC 2017 is required because ``boost::variant``
|
|
||||||
falls back to the old non-variadic implementation on MSVC 2015.
|
|
||||||
|
|
||||||
.. _opaque:
|
.. _opaque:
|
||||||
|
|
||||||
|
@ -1118,13 +1118,6 @@ described trampoline:
|
|||||||
py::class_<A, Trampoline>(m, "A") // <-- `Trampoline` here
|
py::class_<A, Trampoline>(m, "A") // <-- `Trampoline` here
|
||||||
.def("foo", &Publicist::foo); // <-- `Publicist` here, not `Trampoline`!
|
.def("foo", &Publicist::foo); // <-- `Publicist` here, not `Trampoline`!
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
MSVC 2015 has a compiler bug (fixed in version 2017) which
|
|
||||||
requires a more explicit function binding in the form of
|
|
||||||
``.def("foo", static_cast<int (A::*)() const>(&Publicist::foo));``
|
|
||||||
where ``int (A::*)() const`` is the type of ``A::foo``.
|
|
||||||
|
|
||||||
Binding final classes
|
Binding final classes
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
|
@ -32,8 +32,7 @@ The last line will both compile and run the tests.
|
|||||||
Windows
|
Windows
|
||||||
-------
|
-------
|
||||||
|
|
||||||
On Windows, only **Visual Studio 2015** and newer are supported since pybind11 relies
|
On Windows, only **Visual Studio 2017** and newer are supported.
|
||||||
on various C++11 language features that break older versions of Visual Studio.
|
|
||||||
|
|
||||||
.. Note::
|
.. Note::
|
||||||
|
|
||||||
|
@ -434,8 +434,7 @@ you can use ``py::detail::overload_cast_impl`` with an additional set of parenth
|
|||||||
.def("set", overload_cast_<int>()(&Pet::set), "Set the pet's age")
|
.def("set", overload_cast_<int>()(&Pet::set), "Set the pet's age")
|
||||||
.def("set", overload_cast_<const std::string &>()(&Pet::set), "Set the pet's name");
|
.def("set", overload_cast_<const std::string &>()(&Pet::set), "Set the pet's name");
|
||||||
|
|
||||||
.. [#cpp14] A compiler which supports the ``-std=c++14`` flag
|
.. [#cpp14] A compiler which supports the ``-std=c++14`` flag.
|
||||||
or Visual Studio 2015 Update 2 and newer.
|
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
14
docs/faq.rst
14
docs/faq.rst
@ -220,20 +220,6 @@ In addition to decreasing binary size, ``-fvisibility=hidden`` also avoids
|
|||||||
potential serious issues when loading multiple modules and is required for
|
potential serious issues when loading multiple modules and is required for
|
||||||
proper pybind operation. See the previous FAQ entry for more details.
|
proper pybind operation. See the previous FAQ entry for more details.
|
||||||
|
|
||||||
Working with ancient Visual Studio 2008 builds on Windows
|
|
||||||
=========================================================
|
|
||||||
|
|
||||||
The official Windows distributions of Python are compiled using truly
|
|
||||||
ancient versions of Visual Studio that lack good C++11 support. Some users
|
|
||||||
implicitly assume that it would be impossible to load a plugin built with
|
|
||||||
Visual Studio 2015 into a Python distribution that was compiled using Visual
|
|
||||||
Studio 2008. However, no such issue exists: it's perfectly legitimate to
|
|
||||||
interface DLLs that are built with different compilers and/or C libraries.
|
|
||||||
Common gotchas to watch out for involve not ``free()``-ing memory region
|
|
||||||
that that were ``malloc()``-ed in another shared library, using data
|
|
||||||
structures with incompatible ABIs, and so on. pybind11 is very careful not
|
|
||||||
to make these types of mistakes.
|
|
||||||
|
|
||||||
How can I properly handle Ctrl-C in long-running functions?
|
How can I properly handle Ctrl-C in long-running functions?
|
||||||
===========================================================
|
===========================================================
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ struct base {
|
|||||||
|
|
||||||
PYBIND11_DEPRECATED(
|
PYBIND11_DEPRECATED(
|
||||||
"base<T>() was deprecated in favor of specifying 'T' as a template argument to class_")
|
"base<T>() was deprecated in favor of specifying 'T' as a template argument to class_")
|
||||||
base() {} // NOLINT(modernize-use-equals-default): breaks MSVC 2015 when adding an attribute
|
base() = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Keep patient alive while nurse lives
|
/// Keep patient alive while nurse lives
|
||||||
@ -82,8 +82,7 @@ struct metaclass {
|
|||||||
handle value;
|
handle value;
|
||||||
|
|
||||||
PYBIND11_DEPRECATED("py::metaclass() is no longer required. It's turned on by default now.")
|
PYBIND11_DEPRECATED("py::metaclass() is no longer required. It's turned on by default now.")
|
||||||
// NOLINTNEXTLINE(modernize-use-equals-default): breaks MSVC 2015 when adding an attribute
|
metaclass() = default;
|
||||||
metaclass() {}
|
|
||||||
|
|
||||||
/// Override pybind11's default metaclass
|
/// Override pybind11's default metaclass
|
||||||
explicit metaclass(handle value) : value(value) {}
|
explicit metaclass(handle value) : value(value) {}
|
||||||
|
@ -47,7 +47,7 @@
|
|||||||
// or newer.
|
// or newer.
|
||||||
# if _MSVC_LANG >= 201402L
|
# if _MSVC_LANG >= 201402L
|
||||||
# define PYBIND11_CPP14
|
# define PYBIND11_CPP14
|
||||||
# if _MSVC_LANG > 201402L && _MSC_VER >= 1910
|
# if _MSVC_LANG > 201402L
|
||||||
# define PYBIND11_CPP17
|
# define PYBIND11_CPP17
|
||||||
# if _MSVC_LANG >= 202002L
|
# if _MSVC_LANG >= 202002L
|
||||||
# define PYBIND11_CPP20
|
# define PYBIND11_CPP20
|
||||||
@ -81,10 +81,8 @@
|
|||||||
# error pybind11 requires gcc 4.8 or newer
|
# error pybind11 requires gcc 4.8 or newer
|
||||||
# endif
|
# endif
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
// Pybind hits various compiler bugs in 2015u2 and earlier, and also makes use of some stl features
|
# if _MSC_VER < 1910
|
||||||
// (e.g. std::negation) added in 2015u3:
|
# error pybind11 2.10+ requires MSVC 2017 or newer
|
||||||
# if _MSC_FULL_VER < 190024210
|
|
||||||
# error pybind11 requires MSVC 2015 update 3 or newer
|
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -149,7 +147,7 @@
|
|||||||
|
|
||||||
/* Don't let Python.h #define (v)snprintf as macro because they are implemented
|
/* Don't let Python.h #define (v)snprintf as macro because they are implemented
|
||||||
properly in Visual Studio since 2015. */
|
properly in Visual Studio since 2015. */
|
||||||
#if defined(_MSC_VER) && _MSC_VER >= 1900
|
#if defined(_MSC_VER)
|
||||||
# define HAVE_SNPRINTF 1
|
# define HAVE_SNPRINTF 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -561,7 +559,7 @@ static_assert(std::is_standard_layout<instance>::value,
|
|||||||
"Internal error: `pybind11::detail::instance` is not standard layout!");
|
"Internal error: `pybind11::detail::instance` is not standard layout!");
|
||||||
|
|
||||||
/// from __cpp_future__ import (convenient aliases from C++14/17)
|
/// from __cpp_future__ import (convenient aliases from C++14/17)
|
||||||
#if defined(PYBIND11_CPP14) && (!defined(_MSC_VER) || _MSC_VER >= 1910)
|
#if defined(PYBIND11_CPP14)
|
||||||
using std::conditional_t;
|
using std::conditional_t;
|
||||||
using std::enable_if_t;
|
using std::enable_if_t;
|
||||||
using std::remove_cv_t;
|
using std::remove_cv_t;
|
||||||
@ -824,10 +822,10 @@ struct is_template_base_of_impl {
|
|||||||
/// Check if a template is the base of a type. For example:
|
/// Check if a template is the base of a type. For example:
|
||||||
/// `is_template_base_of<Base, T>` is true if `struct T : Base<U> {}` where U can be anything
|
/// `is_template_base_of<Base, T>` is true if `struct T : Base<U> {}` where U can be anything
|
||||||
template <template <typename...> class Base, typename T>
|
template <template <typename...> class Base, typename T>
|
||||||
#if !defined(_MSC_VER)
|
#if defined(PYBIND11_CPP20) || !defined(_MSC_VER) // Sadly, all MSVC versions incl. 2022 need this.
|
||||||
using is_template_base_of
|
using is_template_base_of
|
||||||
= decltype(is_template_base_of_impl<Base>::check((intrinsic_t<T> *) nullptr));
|
= decltype(is_template_base_of_impl<Base>::check((intrinsic_t<T> *) nullptr));
|
||||||
#else // MSVC2015 has trouble with decltype in template aliases
|
#else
|
||||||
struct is_template_base_of
|
struct is_template_base_of
|
||||||
: decltype(is_template_base_of_impl<Base>::check((intrinsic_t<T> *) nullptr)) {
|
: decltype(is_template_base_of_impl<Base>::check((intrinsic_t<T> *) nullptr)) {
|
||||||
};
|
};
|
||||||
@ -1002,9 +1000,6 @@ struct nodelete {
|
|||||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
struct overload_cast_impl {
|
struct overload_cast_impl {
|
||||||
// NOLINTNEXTLINE(modernize-use-equals-default): MSVC 2015 needs this
|
|
||||||
constexpr overload_cast_impl() {}
|
|
||||||
|
|
||||||
template <typename Return>
|
template <typename Return>
|
||||||
constexpr auto operator()(Return (*pf)(Args...)) const noexcept -> decltype(pf) {
|
constexpr auto operator()(Return (*pf)(Args...)) const noexcept -> decltype(pf) {
|
||||||
return pf;
|
return pf;
|
||||||
@ -1031,8 +1026,12 @@ PYBIND11_NAMESPACE_END(detail)
|
|||||||
/// - regular: static_cast<Return (Class::*)(Arg0, Arg1, Arg2)>(&Class::func)
|
/// - regular: static_cast<Return (Class::*)(Arg0, Arg1, Arg2)>(&Class::func)
|
||||||
/// - sweet: overload_cast<Arg0, Arg1, Arg2>(&Class::func)
|
/// - sweet: overload_cast<Arg0, Arg1, Arg2>(&Class::func)
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
|
# if (defined(_MSC_VER) && _MSC_VER < 1920) /* MSVC 2017 */ \
|
||||||
|
|| (defined(__clang__) && __clang_major__ == 5)
|
||||||
static constexpr detail::overload_cast_impl<Args...> overload_cast = {};
|
static constexpr detail::overload_cast_impl<Args...> overload_cast = {};
|
||||||
// MSVC 2015 only accepts this particular initialization syntax for this variable template.
|
# else
|
||||||
|
static constexpr detail::overload_cast_impl<Args...> overload_cast;
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Const member function selector for overload_cast
|
/// Const member function selector for overload_cast
|
||||||
@ -1118,7 +1117,7 @@ try_get_shared_from_this(std::enable_shared_from_this<T> *holder_value_ptr) {
|
|||||||
|
|
||||||
// For silencing "unused" compiler warnings in special situations.
|
// For silencing "unused" compiler warnings in special situations.
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
#if defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER < 1920 // MSVC 2017
|
#if defined(_MSC_VER) && _MSC_VER < 1920 // MSVC 2017
|
||||||
constexpr
|
constexpr
|
||||||
#endif
|
#endif
|
||||||
inline void
|
inline void
|
||||||
|
@ -99,8 +99,7 @@ public:
|
|||||||
Return operator()(Args... args) const {
|
Return operator()(Args... args) const {
|
||||||
gil_scoped_acquire acq;
|
gil_scoped_acquire acq;
|
||||||
object retval(hfunc.f(std::forward<Args>(args)...));
|
object retval(hfunc.f(std::forward<Args>(args)...));
|
||||||
/* Visual studio 2015 parser issue: need parentheses around this expression */
|
return retval.template cast<Return>();
|
||||||
return (retval.template cast<Return>());
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3,12 +3,6 @@
|
|||||||
#include <pybind11/eval.h>
|
#include <pybind11/eval.h>
|
||||||
#include <pybind11/pybind11.h>
|
#include <pybind11/pybind11.h>
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1910
|
|
||||||
// We get some really long type names here which causes MSVC 2015 to emit warnings
|
|
||||||
# pragma warning( \
|
|
||||||
disable : 4503) // NOLINT: warning C4503: decorated name length exceeded, name was truncated
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace py = pybind11;
|
namespace py = pybind11;
|
||||||
using namespace pybind11::literals;
|
using namespace pybind11::literals;
|
||||||
|
|
||||||
|
@ -354,13 +354,7 @@ TEST_SUBMODULE(class_, m) {
|
|||||||
using ProtectedA::foo;
|
using ProtectedA::foo;
|
||||||
};
|
};
|
||||||
|
|
||||||
py::class_<ProtectedA>(m, "ProtectedA")
|
py::class_<ProtectedA>(m, "ProtectedA").def(py::init<>()).def("foo", &PublicistA::foo);
|
||||||
.def(py::init<>())
|
|
||||||
#if !defined(_MSC_VER) || _MSC_VER >= 1910
|
|
||||||
.def("foo", &PublicistA::foo);
|
|
||||||
#else
|
|
||||||
.def("foo", static_cast<int (ProtectedA::*)() const>(&PublicistA::foo));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class ProtectedB {
|
class ProtectedB {
|
||||||
public:
|
public:
|
||||||
@ -391,11 +385,7 @@ TEST_SUBMODULE(class_, m) {
|
|||||||
|
|
||||||
py::class_<ProtectedB, TrampolineB>(m, "ProtectedB")
|
py::class_<ProtectedB, TrampolineB>(m, "ProtectedB")
|
||||||
.def(py::init<>())
|
.def(py::init<>())
|
||||||
#if !defined(_MSC_VER) || _MSC_VER >= 1910
|
|
||||||
.def("foo", &PublicistB::foo);
|
.def("foo", &PublicistB::foo);
|
||||||
#else
|
|
||||||
.def("foo", static_cast<int (ProtectedB::*)() const>(&PublicistB::foo));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// test_brace_initialization
|
// test_brace_initialization
|
||||||
struct BraceInitialization {
|
struct BraceInitialization {
|
||||||
|
@ -4,65 +4,50 @@
|
|||||||
|
|
||||||
#include "pybind11_tests.h"
|
#include "pybind11_tests.h"
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1910
|
|
||||||
|
|
||||||
// MSVC 2015 fails in bizarre ways.
|
|
||||||
# define PYBIND11_SKIP_TEST_CONST_NAME
|
|
||||||
|
|
||||||
#else // Only test with MSVC 2017 or newer.
|
|
||||||
|
|
||||||
// IUT = Implementation Under Test
|
// IUT = Implementation Under Test
|
||||||
# define CONST_NAME_TESTS(TEST_FUNC, IUT) \
|
#define CONST_NAME_TESTS(TEST_FUNC, IUT) \
|
||||||
std::string TEST_FUNC(int selector) { \
|
std::string TEST_FUNC(int selector) { \
|
||||||
switch (selector) { \
|
switch (selector) { \
|
||||||
case 0: \
|
case 0: \
|
||||||
return IUT("").text; \
|
return IUT("").text; \
|
||||||
case 1: \
|
case 1: \
|
||||||
return IUT("A").text; \
|
return IUT("A").text; \
|
||||||
case 2: \
|
case 2: \
|
||||||
return IUT("Bd").text; \
|
return IUT("Bd").text; \
|
||||||
case 3: \
|
case 3: \
|
||||||
return IUT("Cef").text; \
|
return IUT("Cef").text; \
|
||||||
case 4: \
|
case 4: \
|
||||||
return IUT<int>().text; /*NOLINT(bugprone-macro-parentheses)*/ \
|
return IUT<int>().text; /*NOLINT(bugprone-macro-parentheses)*/ \
|
||||||
case 5: \
|
case 5: \
|
||||||
return IUT<std::string>().text; /*NOLINT(bugprone-macro-parentheses)*/ \
|
return IUT<std::string>().text; /*NOLINT(bugprone-macro-parentheses)*/ \
|
||||||
case 6: \
|
case 6: \
|
||||||
return IUT<true>("T1", "T2").text; /*NOLINT(bugprone-macro-parentheses)*/ \
|
return IUT<true>("T1", "T2").text; /*NOLINT(bugprone-macro-parentheses)*/ \
|
||||||
case 7: \
|
case 7: \
|
||||||
return IUT<false>("U1", "U2").text; /*NOLINT(bugprone-macro-parentheses)*/ \
|
return IUT<false>("U1", "U2").text; /*NOLINT(bugprone-macro-parentheses)*/ \
|
||||||
case 8: \
|
case 8: \
|
||||||
/*NOLINTNEXTLINE(bugprone-macro-parentheses)*/ \
|
/*NOLINTNEXTLINE(bugprone-macro-parentheses)*/ \
|
||||||
return IUT<true>(IUT("D1"), IUT("D2")).text; \
|
return IUT<true>(IUT("D1"), IUT("D2")).text; \
|
||||||
case 9: \
|
case 9: \
|
||||||
/*NOLINTNEXTLINE(bugprone-macro-parentheses)*/ \
|
/*NOLINTNEXTLINE(bugprone-macro-parentheses)*/ \
|
||||||
return IUT<false>(IUT("E1"), IUT("E2")).text; \
|
return IUT<false>(IUT("E1"), IUT("E2")).text; \
|
||||||
case 10: \
|
case 10: \
|
||||||
return IUT("KeepAtEnd").text; \
|
return IUT("KeepAtEnd").text; \
|
||||||
default: \
|
default: \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
throw std::runtime_error("Invalid selector value."); \
|
throw std::runtime_error("Invalid selector value."); \
|
||||||
}
|
}
|
||||||
|
|
||||||
CONST_NAME_TESTS(const_name_tests, py::detail::const_name)
|
CONST_NAME_TESTS(const_name_tests, py::detail::const_name)
|
||||||
|
|
||||||
# ifdef PYBIND11_DETAIL_UNDERSCORE_BACKWARD_COMPATIBILITY
|
#ifdef PYBIND11_DETAIL_UNDERSCORE_BACKWARD_COMPATIBILITY
|
||||||
CONST_NAME_TESTS(underscore_tests, py::detail::_)
|
CONST_NAME_TESTS(underscore_tests, py::detail::_)
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif // MSVC >= 2017
|
|
||||||
|
|
||||||
TEST_SUBMODULE(const_name, m) {
|
|
||||||
#ifdef PYBIND11_SKIP_TEST_CONST_NAME
|
|
||||||
m.attr("const_name_tests") = "PYBIND11_SKIP_TEST_CONST_NAME";
|
|
||||||
#else
|
|
||||||
m.def("const_name_tests", const_name_tests);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PYBIND11_SKIP_TEST_CONST_NAME
|
TEST_SUBMODULE(const_name, m) {
|
||||||
m.attr("underscore_tests") = "PYBIND11_SKIP_TEST_CONST_NAME";
|
m.def("const_name_tests", const_name_tests);
|
||||||
#elif defined(PYBIND11_DETAIL_UNDERSCORE_BACKWARD_COMPATIBILITY)
|
|
||||||
|
#if defined(PYBIND11_DETAIL_UNDERSCORE_BACKWARD_COMPATIBILITY)
|
||||||
m.def("underscore_tests", underscore_tests);
|
m.def("underscore_tests", underscore_tests);
|
||||||
#else
|
#else
|
||||||
m.attr("underscore_tests") = "PYBIND11_DETAIL_UNDERSCORE_BACKWARD_COMPATIBILITY not defined.";
|
m.attr("underscore_tests") = "PYBIND11_DETAIL_UNDERSCORE_BACKWARD_COMPATIBILITY not defined.";
|
||||||
|
@ -137,18 +137,15 @@ TEST_SUBMODULE(constants_and_functions, m) {
|
|||||||
m.def("f4", f4);
|
m.def("f4", f4);
|
||||||
|
|
||||||
// test_function_record_leaks
|
// test_function_record_leaks
|
||||||
struct LargeCapture {
|
m.def("register_large_capture_with_invalid_arguments", [](py::module_ m) {
|
||||||
// This should always be enough to trigger the alternative branch
|
// This should always be enough to trigger the alternative branch
|
||||||
// where `sizeof(capture) > sizeof(rec->data)`
|
// where `sizeof(capture) > sizeof(rec->data)`
|
||||||
uint64_t zeros[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
|
uint64_t capture[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
|
||||||
};
|
#if defined(__GNUC__) && __GNUC__ == 4 // CentOS7
|
||||||
m.def("register_large_capture_with_invalid_arguments", [](py::module_ m) {
|
py::detail::silence_unused_warnings(capture);
|
||||||
LargeCapture capture; // VS 2015's MSVC is acting up if we create the array here
|
#endif
|
||||||
m.def(
|
m.def(
|
||||||
"should_raise",
|
"should_raise", [capture](int) { return capture[9] + 33; }, py::kw_only(), py::arg());
|
||||||
[capture](int) { return capture.zeros[9] + 33; },
|
|
||||||
py::kw_only(),
|
|
||||||
py::arg());
|
|
||||||
});
|
});
|
||||||
m.def("register_with_raising_repr", [](py::module_ m, const py::object &default_value) {
|
m.def("register_with_raising_repr", [](py::module_ m, const py::object &default_value) {
|
||||||
m.def(
|
m.def(
|
||||||
|
@ -14,9 +14,6 @@
|
|||||||
#include "pybind11_tests.h"
|
#include "pybind11_tests.h"
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
# if _MSC_VER < 1910 // VS 2015's MSVC
|
|
||||||
# pragma warning(disable : 4127) // C4127: conditional expression is constant
|
|
||||||
# endif
|
|
||||||
# pragma warning(disable : 4996) // C4996: std::unary_negation is deprecated
|
# pragma warning(disable : 4996) // C4996: std::unary_negation is deprecated
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -381,13 +381,6 @@ TEST_SUBMODULE(factory_constructors, m) {
|
|||||||
::operator delete(p);
|
::operator delete(p);
|
||||||
}
|
}
|
||||||
static void operator delete(void *, void *) { py::print("noisy placement delete"); }
|
static void operator delete(void *, void *) { py::print("noisy placement delete"); }
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1910
|
|
||||||
// MSVC 2015 bug: the above "noisy delete" isn't invoked (fixed in MSVC 2017)
|
|
||||||
static void operator delete(void *p) {
|
|
||||||
py::print("noisy delete");
|
|
||||||
::operator delete(p);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
py::class_<NoisyAlloc> pyNoisyAlloc(m, "NoisyAlloc");
|
py::class_<NoisyAlloc> pyNoisyAlloc(m, "NoisyAlloc");
|
||||||
|
@ -7,10 +7,6 @@
|
|||||||
BSD-style license that can be found in the LICENSE file.
|
BSD-style license that can be found in the LICENSE file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1910 // VS 2015's MSVC
|
|
||||||
# pragma warning(disable : 4702) // unreachable code in system header (xatomic.h(382))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <pybind11/iostream.h>
|
#include <pybind11/iostream.h>
|
||||||
|
|
||||||
#include "pybind11_tests.h"
|
#include "pybind11_tests.h"
|
||||||
|
@ -8,10 +8,6 @@
|
|||||||
BSD-style license that can be found in the LICENSE file.
|
BSD-style license that can be found in the LICENSE file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1910 // VS 2015's MSVC
|
|
||||||
# pragma warning(disable : 4702) // unreachable code in system header (xatomic.h(382))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "object.h"
|
#include "object.h"
|
||||||
#include "pybind11_tests.h"
|
#include "pybind11_tests.h"
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ struct type_caster<boost::none_t> : void_caster<boost::none_t> {};
|
|||||||
// Test with `std::variant` in C++17 mode, or with `boost::variant` in C++11/14
|
// Test with `std::variant` in C++17 mode, or with `boost::variant` in C++11/14
|
||||||
#if defined(PYBIND11_HAS_VARIANT)
|
#if defined(PYBIND11_HAS_VARIANT)
|
||||||
using std::variant;
|
using std::variant;
|
||||||
#elif defined(PYBIND11_TEST_BOOST) && (!defined(_MSC_VER) || _MSC_VER >= 1910)
|
#elif defined(PYBIND11_TEST_BOOST)
|
||||||
# include <boost/variant.hpp>
|
# include <boost/variant.hpp>
|
||||||
# define PYBIND11_HAS_VARIANT 1
|
# define PYBIND11_HAS_VARIANT 1
|
||||||
using boost::variant;
|
using boost::variant;
|
||||||
|
@ -154,8 +154,7 @@ class NCVirtTrampoline : public NCVirt {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct Base {
|
struct Base {
|
||||||
/* for some reason MSVC2015 can't compile this if the function is pure virtual */
|
virtual std::string dispatch() const = 0;
|
||||||
virtual std::string dispatch() const { return {}; };
|
|
||||||
virtual ~Base() = default;
|
virtual ~Base() = default;
|
||||||
Base() = default;
|
Base() = default;
|
||||||
Base(const Base &) = delete;
|
Base(const Base &) = delete;
|
||||||
|
Loading…
Reference in New Issue
Block a user