1. 12 Aug, 2024 1 commit
    • fix(cmake): add required emscripten flags (#5298) · fc59f4e6
      * fix(cmake): add required emscripten flags
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * Update emscripten.yaml
      
      * fix(cmake): add required emscripten flags to headers target
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * fix(cmake): incorrect detection of Emscripten
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * fix(cmake): allow pybind11::headers to be modified
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * fix(cmake): hide a warning when building the tests standalone
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * fix(cmake): use explicit variable for is config
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * fix(cmake): go back to ALIAS target
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * chore: reduce overall diff
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * chore: reduce overall diff
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * chore: shorten code a bit
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      ---------
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      Henry Schreiner committed
  2. 09 Aug, 2024 1 commit
    • Add `type_caster_std_function_specializations` feature. (#4597) · 89879448
      * Allow specializations based on callback function return values.
      
      * clang-tidy auto fix
      
      * Add a test case for function specialization.
      
      * Add test for callback function that raises Python exception.
      
      * Fix test failures.
      
      * style: pre-commit fixes
      
      * Add `#define PYBIND11_HAS_TYPE_CASTER_STD_FUNCTION_SPECIALIZATIONS`
      
      ---------
      
      Co-authored-by: Ralf W. Grosse-Kunstleve <rwgk@google.com>
      Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
      Xiaofei Wang committed
  3. 06 Aug, 2024 1 commit
  4. 05 Aug, 2024 1 commit
  5. 02 Aug, 2024 1 commit
  6. 30 Jul, 2024 1 commit
    • feat: remove Python 3.7 support (#5191) · 72330728
      * First pass updating misc files, informed by https://github.com/pybind/pybind11/pull/5177/commits
      
      * Remove jobs using silkeh/clang and gcc docker containers that come with Python 3.7
      
      * Add silkeh/clang:17-bookworm
      
      * Add job using GCC 7
      
      * Revert "Add job using GCC 7"
      
      This reverts commit 518515a761ac37dc2cf5d0980da82d0de39edc28.
      
      * Try running in ubuntu-18.04 container under ubuntu-latest (to get GCC 7)
      
      * Fix `-` vs `:` mixup.
      
      * This reverts commit b1c4304475b8ad129c12330c7ed7eb85d15ba14a.
      
      Revert "Try running in ubuntu:18.04 container under ubuntu-latest (to get GCC 7)"
      
      This reverts commit b203a294bb444fc6ae57a0100fa91dc91b8d3264.
      
      * `git grep 0x03080000` cleanup.
      
      * `git grep -I -E '3\.7'` cleanup.
      
      Removes two changes made under pybind/pybind11#3702
      
      * Revert "`git grep -I -E '3\.7'` cleanup."
      
      This reverts commit bb5b9d187bffbfb61e2977d7eee46b766fa1cce9.
      
      * Remove comments that are evidently incorrect:
      
      ```
      ...
      -- The CXX compiler identification is Clang 15.0.7
      ...
      - Found Python: /usr/bin/python3.9 (found suitable version "3.9.2", minimum required is "3.7") found components: Interpreter Development.Module Development.Embed
      ...
      /__w/pybind11/pybind11/include/pybind11/gil.h:150:13: error: 'auto key' can be declared as 'auto *key' [readability-qualified-auto,-warnings-as-errors]
                  auto key = internals.tstate;
                  ^~~~~
                  auto *
      /__w/pybind11/pybind11/include/pybind11/gil.h:174:13: error: 'auto key' can be declared as 'auto *key' [readability-qualified-auto,-warnings-as-errors]
                  auto key = detail::get_internals().tstate;
                  ^~~~~
                  auto *
      ```
      
      * .github/workflows/configure.yml: Change from Python 3.7 to 3.8
      
      * Misc cleanup pass
      
      * Miscellaneous changes based on manual review of the `git grep` matches below:
      
      ```
      git_grep_37_38.sh |& sort | uniq -c
      ```
      
      With git_grep_37_38.sh:
      
      ```
      set -x
      git grep 0x0307
      git grep 0x0308
      git grep PY_MINOR_VERSION
      git grep PYPY_VERSION
      git grep -I -E '3\.7'
      git grep -I -E '3\.8'
      git grep -I -E '\(3, 7'
      git grep -I -E '\(3, 8'
      git grep -I -E '3[^A-Za-z0-9.]+7'
      git grep -I -E '3[^A-Za-z0-9.]+8'
      ```
      
      Output:
      
      ```
            1 .appveyor.yml:    $env:CMAKE_INCLUDE_PATH = "eigen-3.3.7;$env:CMAKE_INCLUDE_PATH"
            1 .appveyor.yml:    7z x eigen-3.3.7.zip -y > $null
            1 .appveyor.yml:    Start-FileDownload 'https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.zip'
            1 CMakeLists.txt:    # Bug in macOS CMake < 3.7 is unable to download catch
            1 CMakeLists.txt:  elseif(WINDOWS AND CMAKE_VERSION VERSION_LESS 3.8)
            1 CMakeLists.txt:  if(OSX AND CMAKE_VERSION VERSION_LESS 3.7)
            1 CMakeLists.txt:    message(WARNING "CMAKE 3.7+ needed on macOS to download catch, and newer HIGHLY recommended")
            1 CMakeLists.txt:    message(WARNING "CMAKE 3.8+ tested on Windows, previous versions untested")
            1 CMakeLists.txt:    # Only tested with 3.8+ in CI.
            1 docs/advanced/functions.rst:Python 3.8 introduced a new positional-only argument syntax, using ``/`` in the
            1 docs/changelog.rst:* Adapt pybind11 to a C API convention change in Python 3.8. `#1950
            1 docs/changelog.rst:* Allow thread termination to be avoided during shutdown for CPython 3.7+ via
            1 docs/changelog.rst:  considered as conversion, consistent with Python 3.8+.
            1 docs/changelog.rst:  CPython 3.8 and 3.9 debug builds.
            1 docs/changelog.rst:* Enum now has an ``__index__`` method on Python <3.8 too.
            1 docs/changelog.rst:  on Python 3.8. `#1780 <https://github.com/pybind/pybind11/pull/1780>`_.
            1 docs/changelog.rst:* PyPy 3.10 support was added, PyPy 3.7 support was dropped.
            2 docs/changelog.rst:* Support PyPy 7.3.7 and the PyPy3.8 beta. Test python-3.11 on PRs with the
            1 docs/changelog.rst:* Use ``macos-13`` (Intel) for CI jobs for now (will drop Python 3.7 soon).
            1 docs/changelog.rst:* Use new Python 3.7 Thread Specific Storage (TSS) implementation if available.
            1 docs/compiling.rst:    cmake -DPYBIND11_PYTHON_VERSION=3.8 ..
            1 docs/compiling.rst:    find_package(Python 3.8 COMPONENTS Interpreter Development REQUIRED)
            1 docs/limitations.rst:- PyPy3 7.3.1 and 7.3.2 have issues with several tests on 32-bit Windows.
            1 docs/requirements.txt:idna==3.7 \
            1 + git grep 0x0307
            1 + git grep 0x0308
            1 + git grep -I -E '\(3, 7'
            1 + git grep -I -E '3\.7'
            1 + git grep -I -E '\(3, 8'
            1 + git grep -I -E '3\.8'
            1 + git grep -I -E '3[^A-Za-z0-9.]+7'
            1 + git grep -I -E '3[^A-Za-z0-9.]+8'
            1 + git grep PY_MINOR_VERSION
            1 + git grep PYPY_VERSION
            2 .github/workflows/ci.yml:        - '3.8'
            1 .github/workflows/ci.yml:        - 3.8
            1 .github/workflows/ci.yml:    - name: Add Python 3.8
            1 .github/workflows/ci.yml:        - 'pypy-3.8'
            2 .github/workflows/ci.yml:            python: '3.8'
            1 .github/workflows/ci.yml:          - python: '3.8'
            1 .github/workflows/ci.yml:          - python: 3.8
            1 .github/workflows/ci.yml:            python: 'pypy-3.8'
            1 .github/workflows/configure.yml:          cmake: "3.8"
            1 .github/workflows/configure.yml:    name: 🐍 3.8 • CMake ${{ matrix.cmake }} • ${{ matrix.runs-on }}
            1 .github/workflows/configure.yml:    - name: Setup Python 3.8
            1 .github/workflows/configure.yml:        python-version: 3.8
            1 .github/workflows/pip.yml:    name: 🐍 3.8 • 📦 & 📦 tests • ubuntu-latest
            1 .github/workflows/pip.yml:    name: 🐍 3.8 • 📦 tests • windows-latest
            2 .github/workflows/pip.yml:    - name: Setup 🐍 3.8
            2 .github/workflows/pip.yml:        python-version: 3.8
            2 include/pybind11/cast.h:#if !defined(PYPY_VERSION)
            2 include/pybind11/cast.h:#if defined(PYPY_VERSION)
            2 include/pybind11/cast.h:            // PyPy: 7.3.7's 3.8 does not implement PyLong_*'s __index__ calls.
            5 include/pybind11/detail/class.h:#if !defined(PYPY_VERSION)
            1 include/pybind11/detail/class.h:#if defined(PYPY_VERSION)
            1 include/pybind11/detail/class.h:    // This was not needed before Python 3.8 (Python issue 35810)
            1 include/pybind11/detail/common.h:    && !defined(PYPY_VERSION) && !defined(PYBIND11_ASSERT_GIL_HELD_INCREF_DECREF)
            2 include/pybind11/detail/common.h:#    error "PYTHON < 3.8 IS UNSUPPORTED. pybind11 v2.13 was the last to support Python 3.7."
            1 include/pybind11/detail/common.h:#if defined(PYPY_VERSION) && !defined(PYBIND11_SIMPLE_GIL_MANAGEMENT)
            1 include/pybind11/detail/common.h:#if PY_VERSION_HEX < 0x03080000
            1 include/pybind11/detail/common.h:            = PYBIND11_TOSTRING(PY_MAJOR_VERSION) "." PYBIND11_TOSTRING(PY_MINOR_VERSION);        \
            1 include/pybind11/detail/internals.h:        // called. PYBIND11_TLS_FREE is PyThread_tss_free on python 3.7+. On older python, it does
            1 include/pybind11/detail/internals.h:#if PYBIND11_INTERNALS_VERSION <= 4 || defined(PYPY_VERSION)
            1 include/pybind11/detail/internals.h:// The old Python Thread Local Storage (TLS) API is deprecated in Python 3.7 in favor of the new
            1 include/pybind11/detail/type_caster_base.h:#if defined(PYPY_VERSION)
            1 include/pybind11/embed.h:#    define PYBIND11_PYCONFIG_SUPPORT_PY_VERSION_HEX (0x03080000)
            1 include/pybind11/embed.h:#if defined(PYPY_VERSION)
            1 include/pybind11/eval.h:    // globals if not yet present.  Python 3.8 made PyRun_String behave
            2 include/pybind11/eval.h:#if defined(PYPY_VERSION)
            2 include/pybind11/eval.h:    // was missing from PyPy3.8 7.3.7.
            2 include/pybind11/gil.h:    /// allowed during shutdown. Check _Py_IsFinalizing() on Python 3.7+, and
            1 include/pybind11/pybind11.h:#if !defined(PYPY_VERSION)
            4 include/pybind11/pybind11.h:#if !defined(PYPY_VERSION) && PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 9
            1 include/pybind11/pytypes.h:#endif //! defined(PYPY_VERSION)
            2 include/pybind11/pytypes.h:#if !defined(PYPY_VERSION)
            1 include/pybind11/pytypes.h:#    if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x07030a00
            1 include/pybind11/pytypes.h:#ifdef PYPY_VERSION
            1 include/pybind11/stl/filesystem.h:#    if !defined(PYPY_VERSION)
            2 pybind11/__init__.py:if sys.version_info < (3, 8):
            2 pybind11/__init__.py:    msg = "pybind11 does not support Python < 3.8. v2.13 was the last release supporting Python 3.7."
            1 pyproject.toml:master.py-version = "3.8"
            1 pyproject.toml:python_version = "3.8"
            1 README.rst:lines of code and depend on Python (3.8+, or PyPy) and the C++
            2 README.rst:- Python 3.8+, and PyPy3 7.3 are supported with an implementation-agnostic
            1 setup.cfg:    Programming Language :: Python :: 3.8
            1 setup.cfg:python_requires = >=3.8
            1 setup.py:# TODO: use literals & overload (typing extensions or Python 3.8)
            1 tests/CMakeLists.txt:if(NOT CMAKE_VERSION VERSION_LESS 3.8)
            2 tests/constructor_stats.h:#if defined(PYPY_VERSION)
            1 tests/env.py:    doesn't work on CPython 3.8.0 with pytest==3.3.2 on Ubuntu 18.04 (#2922).
            1 tests/requirements.txt:build~=1.0; python_version>="3.8"
            1 tests/requirements.txt:numpy~=1.21.5; platform_python_implementation!="PyPy" and python_version>="3.8" and python_version<"3.10"
            1 tests/requirements.txt:numpy~=1.23.0; python_version=="3.8" and platform_python_implementation=="PyPy"
            1 tests/test_buffers.py:    env.PYPY, reason="PyPy 7.3.7 doesn't clear this anymore", strict=False
            1 tests/test_builtin_casters.py:    # Before Python 3.8, `PyLong_AsLong` does not pick up on `obj.__index__`,
            2 tests/test_builtin_casters.py:    if (3, 8) <= sys.version_info < (3, 10) and env.CPYTHON:
            4 tests/test_builtin_casters.py:    # TODO: PyPy 3.8 does not behave like CPython 3.8 here yet (7.3.7)
            1 tests/test_callbacks.py:    assert m.test_callback3(z.double) == "func(43) = 86"
            2 tests/test_call_policies.cpp:#if !defined(PYPY_VERSION)
            1 tests/test_chrono.py:    diff = m.test_chrono_float_diff(43.789012, 1.123456)
            1 tests/test_constants_and_functions.py:    assert m.f3(86) == 89
            1 tests/test_eigen_matrix.py:    a_copy3[8, 1] = 11
            1 tests/test_eigen_matrix.py:    assert np.all(cornersc == np.array([[1.0, 3], [7, 9]]))
            1 tests/test_eigen_matrix.py:    assert np.all(cornersr == np.array([[1.0, 3], [7, 9]]))
            1 tests/test_eigen_matrix.py:        mymat = chol(np.array([[1.0, 2, 4], [2, 13, 23], [4, 23, 77]]))
            1 tests/test_exceptions.py:    if hasattr(pytest, unraisable):  # Python >= 3.8 and pytest >= 6
            2 tests/test_exceptions.py:@pytest.mark.xfail(env.PYPY, reason="Failure on PyPy 3.8 (7.3.7)", strict=False)
            1 tests/test_factory_constructors.py:    assert [i.alive() for i in cstats] == [13, 7]
            1 tests/test_kwargs_and_defaults.cpp:#ifdef PYPY_VERSION
            1 tests/test_local_bindings.py:    assert i1.get3() == 8
            1 tests/test_methods_and_attributes.cpp:#if !defined(PYPY_VERSION)
            1 tests/test_numpy_array.py:    a = np.arange(3 * 7 * 2) + 1
            1 tests/test_numpy_array.py:    assert str(excinfo.value) == "cannot reshape array of size 42 into shape (3,7,1)"
            2 tests/test_numpy_array.py:    assert x.shape == (3, 7, 2)
            2 tests/test_numpy_array.py:        m.reshape_tuple(a, (3, 7, 1))
            2 tests/test_numpy_array.py:    x = m.reshape_tuple(a, (3, 7, 2))
            1 tests/test_numpy_vectorize.py:    assert np.isclose(m.vectorized_func3(np.array(3 + 7j)), [6 + 14j])
            1 tests/test_pickling.cpp:#if !defined(PYPY_VERSION)
            1 tests/test_pytypes.cpp:#if (defined(__APPLE__) && defined(__clang__)) || defined(PYPY_VERSION)
            1 tests/test_smart_ptr.cpp:    m.def("make_myobject3_1", []() { return new MyObject3(8); });
            1 tests/test_smart_ptr.py:    assert cstats.values() == ["MyObject3[9]", "MyObject3[8]", "MyObject3[9]"]
            1 tests/test_stl_binders.py:    assert v_int2 == m.VectorInt([0, 99, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 88])
            1 tests/test_stl_binders.py:    assert v_int2 == m.VectorInt([0, 99, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 88, 4])
            1 tests/test_type_caster_pyobject_ptr.cpp:#if !defined(PYPY_VERSION) // It is not worth the trouble doing something special for PyPy.
            1 tools/FindPythonLibsNew.cmake:  set(PythonLibsNew_FIND_VERSION "3.8")
            1 tools/JoinPaths.cmake:# https://docs.python.org/3.7/library/os.path.html#os.path.join
            1 tools/pybind11NewTools.cmake:    Python 3.8 REQUIRED COMPONENTS ${_pybind11_interp_component} ${_pybind11_dev_component}
            1 tools/pybind11NewTools.cmake:# Python debug libraries expose slightly different objects before 3.8
            1 tools/pybind11Tools.cmake:    "3.12;3.11;3.10;3.9;3.8"
            1 tools/pybind11Tools.cmake:    if(NOT DEFINED PYPY_VERSION)
            1 tools/pybind11Tools.cmake:    message(STATUS "PYPY ${PYPY_VERSION} (Py ${PYTHON_VERSION})")
            1 tools/pybind11Tools.cmake:# Python debug libraries expose slightly different objects before 3.8
            1 tools/pybind11Tools.cmake:      set(PYPY_VERSION
      ```
      
      * Change `[tool.ruff]` `target-version` to `"py38"`, as suggested by @Skylion007
      Ralf W. Grosse-Kunstleve committed
  7. 29 Jul, 2024 1 commit
    • clang-tidy upgrade (to version 18) (#5272) · 2e260b06
      * `container: silkeh/clang:18-bookworm` in .github/workflows/format.yml
      
      * clang-tidy auto-fix (trivial, in test only)
      
      * Disable `performance-enum-size` (noisy, low value)
      
      * Temporarily turn off 3 diagnostics (to be tackled one-by-one).
      
      * Add explicit `switch` `default` to resolve clang-tidy `bugprone-switch-missing-default-case`
      
      Debian clang version 18.1.8 (++20240718080534+3b5b5c1ec4a3-1~exp1~20240718200641.143)
      Target: x86_64-pc-linux-gnu
      
      tests/test_numpy_dtypes.cpp:212:5: warning: switching on non-enum value without default case may not cover all cases [bugprone-switch-missing-default-case]
      
      * Add clang-17 and clang-18 testing.
      
      * Add `NOLINTNEXTLINE(clang-analyzer-optin.core.EnumCastOutOfRange)` in test_tagbased_polymorphic.cpp
      
      Debian clang version 18.1.8 (++20240718080534+3b5b5c1ec4a3-1~exp1~20240718200641.143)
      Target: x86_64-pc-linux-gnu
      
      tests/test_tagbased_polymorphic.cpp:77:40: warning: The value '150' provided to the cast expression is not in the valid range of values for 'Kind' [clang-analyzer-optin.core.EnumCastOutOfRange]
      
      * Fix inconsistent pybind11/eigen/tensor.h behavior:
      
      This existing comment in pybind11/eigen/tensor.h
      
      ```
                      // move, take_ownership don't make any sense for a ref/map:
      ```
      
      is at odds with the `delete src;` three lines up.
      
      In real-world client code `take_ownership` will not exist (unless the client code is untested and unused). I.e. the `delete` is essentially only useful to avoid leaks in the pybind11 unit tests.
      
      While upgrading to clang-tidy 18, the warning below appeared. Apparently it is produced during LTO, and it appears difficult to suppress. Regardless, the best way to resolve this is to remove the `delete` and to simply make the test objects `static` in the unit test code.
      
      ________
      
      Debian clang version 18.1.8 (++20240718080534+3b5b5c1ec4a3-1~exp1~20240718200641.143)
      Target: x86_64-pc-linux-gnu
      ________
      
      ```
      lto-wrapper: warning: using serial compilation of 3 LTRANS jobs
      lto-wrapper: note: see the ‘-flto’ option documentation for more information
      In function ‘cast_impl’,
          inlined from ‘cast’ at /mounted_pybind11/include/pybind11/eigen/tensor.h:414:25,
          inlined from ‘operator()’ at /mounted_pybind11/include/pybind11/eigen/../pybind11.h:296:40,
          inlined from ‘_FUN’ at /mounted_pybind11/include/pybind11/eigen/../pybind11.h:267:21:
      /mounted_pybind11/include/pybind11/eigen/tensor.h:475:17: warning: ‘operator delete’ called on unallocated object ‘<anonymous>’ [-Wfree-nonheap-object]
        475 |                 delete src;
            |                 ^
      /mounted_pybind11/include/pybind11/eigen/../pybind11.h: In function ‘_FUN’:
      /mounted_pybind11/include/pybind11/eigen/../pybind11.h:297:75: note: declared here
        297 |                     std::move(args_converter).template call<Return, Guard>(cap->f),
            |                                                                           ^
      ```
      
      * Disable `bugprone-chained-comparison`: this clang-tidy check is incompatible with the Catch2 `REQUIRE` macro (26 warnings like the one below).
      ________
      
      Debian clang version 18.1.8 (++20240718080534+3b5b5c1ec4a3-1~exp1~20240718200641.143)
      Target: x86_64-pc-linux-gnu
      ________
      
      ```
      /mounted_pybind11/tests/test_embed/test_interpreter.cpp:127:9: warning: chained comparison 'v0 <= v1 == v2' may generate unintended results, use parentheses to specify order of evaluation or a logical operator to separate comparison expressions [bugprone-chained-comparison]
        127 |         REQUIRE(ret == 42);
            |         ^
      /build/tests/catch/catch.hpp:17670:24: note: expanded from macro 'REQUIRE'
       17670 | #define REQUIRE( ... ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__  )
             |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      /build/tests/catch/catch.hpp:2710:47: note: expanded from macro 'INTERNAL_CATCH_TEST'
       2710 |             catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \
            |                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      /mounted_pybind11/tests/test_embed/test_interpreter.cpp:127:9: note: operand 'v0' is here
        127 |         REQUIRE(ret == 42);
            |         ^
      /build/tests/catch/catch.hpp:17670:24: note: expanded from macro 'REQUIRE'
       17670 | #define REQUIRE( ... ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__  )
             |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      /build/tests/catch/catch.hpp:2710:47: note: expanded from macro 'INTERNAL_CATCH_TEST'
       2710 |             catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \
            |                                               ^~~~~~~~~~~~~~~~~~~
      /mounted_pybind11/tests/test_embed/test_interpreter.cpp:127:17: note: operand 'v1' is here
        127 |         REQUIRE(ret == 42);
            |                 ^
      /build/tests/catch/catch.hpp:17670:90: note: expanded from macro 'REQUIRE'
       17670 | #define REQUIRE( ... ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__  )
             |                                                                                          ^~~~~~~~~~~
      /build/tests/catch/catch.hpp:2710:70: note: expanded from macro 'INTERNAL_CATCH_TEST'
       2710 |             catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \
            |                                                                      ^~~~~~~~~~~
      /mounted_pybind11/tests/test_embed/test_interpreter.cpp:127:24: note: operand 'v2' is here
        127 |         REQUIRE(ret == 42);
            |                        ^
      /build/tests/catch/catch.hpp:17670:90: note: expanded from macro 'REQUIRE'
       17670 | #define REQUIRE( ... ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__  )
             |                                                                                          ^~~~~~~~~~~
      /build/tests/catch/catch.hpp:2710:70: note: expanded from macro 'INTERNAL_CATCH_TEST'
       2710 |             catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \
            |                                                                      ^~~~~~~~~~~
      ```
      
      * Add 8 `// NOLINT(bugprone-empty-catch)`
      
      * Resolve clang-tidy `bugprone-multi-level-implicit-pointer-conversion` warnings.
      ________
      Debian clang version 18.1.8 (++20240718080534+3b5b5c1ec4a3-1~exp1~20240718200641.143)
      Target: x86_64-pc-linux-gnu
      ________
      ```
      pybind11/detail/internals.h:556:53: warning: multilevel pointer conversion from 'internals **' to 'const void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
      
      pybind11/detail/type_caster_base.h:431:20: warning: multilevel pointer conversion from 'void **' to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
      
      pybind11/numpy.h:904:81: warning: multilevel pointer conversion from '_object *const *' to 'const void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
      pybind11/numpy.h:1989:39: warning: multilevel pointer conversion from 'typename vectorize_arg<const double *>::type *' (aka 'const double **') to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
      pybind11/numpy.h:1989:39: warning: multilevel pointer conversion from 'typename vectorize_arg<const VectorizeTestClass *>::type *' (aka 'const VectorizeTestClass **') to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
      
      pybind11/stl/filesystem.h:75:44: warning: multilevel pointer conversion from 'PyObject **' (aka '_object **') to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
      pybind11/stl/filesystem.h:83:42: warning: multilevel pointer conversion from 'PyObject **' (aka '_object **') to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
      ```
      
      * Introduce `PYBIND11_REINTERPRET_CAST_VOID_PTR_IF_NOT_PYPY` to resolve PyPy build errors:
      
      ```
      In file included from /Users/runner/work/pybind11/pybind11/tests/test_stl.cpp:18:
      /Users/runner/work/pybind11/pybind11/include/pybind11/stl/filesystem.h:75:17: error: no matching function for call to 'PyPyUnicode_FSConverter'
                  if (PyUnicode_FSConverter(buf, reinterpret_cast<void *>(&native)) != 0) {
                      ^~~~~~~~~~~~~~~~~~~~~
      /Users/runner/hostedtoolcache/PyPy/3.10.14/x64/include/pypy3.10/pypy_decl.h:969:31: note: expanded from macro 'PyUnicode_FSConverter'
                                    ^~~~~~~~~~~~~~~~~~~~~~~
      /Users/runner/hostedtoolcache/PyPy/3.10.14/x64/include/pypy3.10/pypy_decl.h:970:17: note: candidate function not viable: cannot convert argument of incomplete type 'void *' to 'struct _object **' for 2nd argument
      PyAPI_FUNC(int) PyUnicode_FSConverter(struct _object *arg0, struct _object **arg1);
                      ^
      /Users/runner/hostedtoolcache/PyPy/3.10.14/x64/include/pypy3.10/pypy_decl.h:969:31: note: expanded from macro 'PyUnicode_FSConverter'
                                    ^
      In file included from /Users/runner/work/pybind11/pybind11/tests/test_stl.cpp:18:
      /Users/runner/work/pybind11/pybind11/include/pybind11/stl/filesystem.h:83:17: error: no matching function for call to 'PyPyUnicode_FSDecoder'
                  if (PyUnicode_FSDecoder(buf, reinterpret_cast<void *>(&native)) != 0) {
                      ^~~~~~~~~~~~~~~~~~~
      /Users/runner/hostedtoolcache/PyPy/3.10.14/x64/include/pypy3.10/pypy_decl.h:971:29: note: expanded from macro 'PyUnicode_FSDecoder'
                                  ^~~~~~~~~~~~~~~~~~~~~
      /Users/runner/hostedtoolcache/PyPy/3.10.14/x64/include/pypy3.10/pypy_decl.h:972:17: note: candidate function not viable: cannot convert argument of incomplete type 'void *' to 'struct _object **' for 2nd argument
      PyAPI_FUNC(int) PyUnicode_FSDecoder(struct _object *arg0, struct _object **arg1);
                      ^
      /Users/runner/hostedtoolcache/PyPy/3.10.14/x64/include/pypy3.10/pypy_decl.h:971:29: note: expanded from macro 'PyUnicode_FSDecoder'
                                  ^
      ```
      
      * clang-tidy auto-fix
      
      * Fix silly oversight.
      Ralf W. Grosse-Kunstleve committed
  8. 24 Jul, 2024 1 commit
  9. 19 Jul, 2024 1 commit
  10. 18 Jul, 2024 2 commits
  11. 16 Jul, 2024 1 commit
  12. 15 Jul, 2024 1 commit
  13. 06 Jul, 2024 1 commit
  14. 02 Jul, 2024 2 commits
  15. 01 Jul, 2024 1 commit
  16. 30 Jun, 2024 1 commit
  17. 28 Jun, 2024 3 commits
  18. 26 Jun, 2024 8 commits
  19. 25 Jun, 2024 3 commits
    • feat(types): add support for typing.Literal type (#5192) · 183059f9
      * typevar prototype
      
      * style: pre-commit fixes
      
      * change to NameT
      
      * style: pre-commit fixes
      
      * make string const
      
      * add missing closing bracket
      
      * style: pre-commit fixes
      
      * clean up handle_type_name
      
      * style: pre-commit fixes
      
      * add back missing <
      
      * style: pre-commit fixes
      
      * add back NameT
      
      * try fixed_string
      
      * style: pre-commit fixes
      
      * std::basic_fixed_string
      
      * test c++20
      
      * style: pre-commit fixes
      
      * cleanup
      
      * fix object to typevar conversion
      
      * style: pre-commit fixes
      
      * And CPP20 checks
      
      * style: pre-commit fixes
      
      * add missing cpp20++ check
      
      * style: pre-commit fixes
      
      * Add C++20 check to python
      
      * Fix python if {
      
      * style: pre-commit fixes
      
      * update test name
      
      * style: pre-commit fixes
      
      * remove call on cpp_std
      
      * make field const
      
      * test nontype_template
      
      * update feature check
      
      * update name of guard
      
      * fix try except in test
      
      * fix pre commit
      
      * remove extra semi colon
      
      * except AttributeError
      
      * fix try except in test
      
      * remove const
      
      * Clean up tests
      
      * style: pre-commit fixes
      
      * start string literal
      
      * start int literal
      
      * func declare
      
      * commit clean
      
      * use contextlib.suppres
      
      * resolve stash
      
      * more literal type
      
      * fix annotation name
      
      * stash
      
      * request changes
      
      * lint
      
      * Add comments
      
      * style: pre-commit fixes
      
      * Add support for unions and optionals to be compatible with object
      
      * lint
      
      * remove comment
      
      * Create Literal Type implementation
      
      * clean up
      
      * Update comment
      
      * remove incorrect comment
      
      * rerun CI
      
      * rerun CI
      
      * fix extra line
      
      * lint
      
      * move if defined block
      
      * style: pre-commit fixes
      
      ---------
      
      Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
      Michael Carlstrom committed
    • Add TypeVars / method generics typing (#5167) · aebcd704
      * typevar prototype
      
      * style: pre-commit fixes
      
      * change to NameT
      
      * style: pre-commit fixes
      
      * make string const
      
      * add missing closing bracket
      
      * style: pre-commit fixes
      
      * clean up handle_type_name
      
      * style: pre-commit fixes
      
      * add back missing <
      
      * style: pre-commit fixes
      
      * add back NameT
      
      * try fixed_string
      
      * style: pre-commit fixes
      
      * std::basic_fixed_string
      
      * test c++20
      
      * style: pre-commit fixes
      
      * cleanup
      
      * fix object to typevar conversion
      
      * style: pre-commit fixes
      
      * And CPP20 checks
      
      * style: pre-commit fixes
      
      * add missing cpp20++ check
      
      * style: pre-commit fixes
      
      * Add C++20 check to python
      
      * Fix python if {
      
      * style: pre-commit fixes
      
      * update test name
      
      * style: pre-commit fixes
      
      * remove call on cpp_std
      
      * make field const
      
      * test nontype_template
      
      * update feature check
      
      * update name of guard
      
      * fix try except in test
      
      * fix pre commit
      
      * remove extra semi colon
      
      * except AttributeError
      
      * fix try except in test
      
      * remove const
      
      * Clean up tests
      
      * style: pre-commit fixes
      
      * use contextlib.suppres
      
      * request changes
      
      * lint
      
      * Add comments
      
      * style: pre-commit fixes
      
      * Add support for unions and optionals to be compatible with object
      
      * lint
      
      * remove comment
      
      ---------
      
      Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
      Michael Carlstrom committed
    • docs: prepare for 2.13.0 (#5187) · 9ec64e37
      * docs: prepare for 2.13.0
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * docs: reword cross-compiling entry
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * Update changelog.rst
      
      ---------
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      Henry Schreiner committed
  20. 24 Jun, 2024 1 commit
    • fix: use `std::addressof` in type_caster_base.h (#5189) · a406a62e
      * Add tests only. Fails to build with this error message:
      
      ```
      g++ -o pybind11/tests/test_copy_move.os -c -std=c++17 -fPIC -fvisibility=hidden -O0 -g -Wall -Wextra -Wconversion -Wcast-qual -Wdeprecated -Wundef -Wnon-virtual-dtor -Wunused-result -Werror -isystem /usr/include/python3.11 -isystem /usr/include/eigen3 -DPYBIND11_STRICT_ASSERTS_CLASS_HOLDER_VS_TYPE_CASTER_MIX -DPYBIND11_ENABLE_TYPE_CASTER_ODR_GUARD_IF_AVAILABLE -DPYBIND11_TEST_BOOST -DPYBIND11_INTERNALS_VERSION=10000000 -Ipybind11/include -I/usr/local/google/home/rwgk/forked/pybind11/include -I/usr/local/google/home/rwgk/clone/pybind11/include /usr/local/google/home/rwgk/forked/pybind11/tests/test_copy_move.cpp
      In file included from /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../cast.h:15,
                       from /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../attr.h:14,
                       from /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/class.h:12,
                       from /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/pybind11.h:13,
                       from /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/stl.h:12,
                       from /usr/local/google/home/rwgk/forked/pybind11/tests/test_copy_move.cpp:11:
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h: In instantiation of ‘static pybind11::handle pybind11::detail::type_caster_base<type>::cast(const itype&, pybind11::return_value_policy, pybind11::handle) [with type = UnusualOpRef; itype = UnusualOpRef]’:
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../cast.h:1230:37:   required from ‘pybind11::object pybind11::cast(T&&, return_value_policy, handle) [with T = const UnusualOpRef&; typename std::enable_if<(! std::is_base_of<detail::pyobject_tag, typename std::remove_reference<_Tp>::type>::value), int>::type <anonymous> = 0]’
      /usr/local/google/home/rwgk/forked/pybind11/tests/test_copy_move.cpp:162:80:   required from here
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1110:20: error: no matching function for call to ‘pybind11::detail::type_caster_base<UnusualOpRef>::cast(const UnusualOpRef::NonTrivialType, pybind11::return_value_policy&, pybind11::handle&)’
       1110 |         return cast(&src, policy, parent);
            |                ~~~~^~~~~~~~~~~~~~~~~~~~~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1105:19: note: candidate: ‘static pybind11::handle pybind11::detail::type_caster_base<type>::cast(const itype&, pybind11::return_value_policy, pybind11::handle) [with type = UnusualOpRef; itype = UnusualOpRef]’
       1105 |     static handle cast(const itype &src, return_value_policy policy, handle parent) {
            |                   ^~~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1105:37: note:   no known conversion for argument 1 from ‘const UnusualOpRef::NonTrivialType’ {aka ‘const std::shared_ptr<int>’} to ‘const pybind11::detail::type_caster_base<UnusualOpRef>::itype&’ {aka ‘const UnusualOpRef&’}
       1105 |     static handle cast(const itype &src, return_value_policy policy, handle parent) {
            |                        ~~~~~~~~~~~~~^~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1113:19: note: candidate: ‘static pybind11::handle pybind11::detail::type_caster_base<type>::cast(itype&&, pybind11::return_value_policy, pybind11::handle) [with type = UnusualOpRef; itype = UnusualOpRef]’
       1113 |     static handle cast(itype &&src, return_value_policy, handle parent) {
            |                   ^~~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1113:32: note:   no known conversion for argument 1 from ‘const UnusualOpRef::NonTrivialType’ {aka ‘const std::shared_ptr<int>’} to ‘pybind11::detail::type_caster_base<UnusualOpRef>::itype&&’ {aka ‘UnusualOpRef&&’}
       1113 |     static handle cast(itype &&src, return_value_policy, handle parent) {
            |                        ~~~~~~~~^~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1142:19: note: candidate: ‘static pybind11::handle pybind11::detail::type_caster_base<type>::cast(const itype*, pybind11::return_value_policy, pybind11::handle) [with type = UnusualOpRef; itype = UnusualOpRef]’
       1142 |     static handle cast(const itype *src, return_value_policy policy, handle parent) {
            |                   ^~~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1142:37: note:   no known conversion for argument 1 from ‘const UnusualOpRef::NonTrivialType’ {aka ‘const std::shared_ptr<int>’} to ‘const pybind11::detail::type_caster_base<UnusualOpRef>::itype*’ {aka ‘const UnusualOpRef*’}
       1142 |     static handle cast(const itype *src, return_value_policy policy, handle parent) {
            |                        ~~~~~~~~~~~~~^~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h: In instantiation of ‘static pybind11::handle pybind11::detail::type_caster_base<type>::cast(itype&&, pybind11::return_value_policy, pybind11::handle) [with type = UnusualOpRef; itype = UnusualOpRef]’:
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../cast.h:1230:37:   required from ‘pybind11::object pybind11::cast(T&&, return_value_policy, handle) [with T = UnusualOpRef; typename std::enable_if<(! std::is_base_of<detail::pyobject_tag, typename std::remove_reference<_Tp>::type>::value), int>::type <anonymous> = 0]’
      /usr/local/google/home/rwgk/forked/pybind11/tests/test_copy_move.cpp:163:74:   required from here
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1114:20: error: no matching function for call to ‘pybind11::detail::type_caster_base<UnusualOpRef>::cast(UnusualOpRef::NonTrivialType, pybind11::return_value_policy, pybind11::handle&)’
       1114 |         return cast(&src, return_value_policy::move, parent);
            |                ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1105:19: note: candidate: ‘static pybind11::handle pybind11::detail::type_caster_base<type>::cast(const itype&, pybind11::return_value_policy, pybind11::handle) [with type = UnusualOpRef; itype = UnusualOpRef]’
       1105 |     static handle cast(const itype &src, return_value_policy policy, handle parent) {
            |                   ^~~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1105:37: note:   no known conversion for argument 1 from ‘UnusualOpRef::NonTrivialType’ {aka ‘std::shared_ptr<int>’} to ‘const pybind11::detail::type_caster_base<UnusualOpRef>::itype&’ {aka ‘const UnusualOpRef&’}
       1105 |     static handle cast(const itype &src, return_value_policy policy, handle parent) {
            |                        ~~~~~~~~~~~~~^~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1113:19: note: candidate: ‘static pybind11::handle pybind11::detail::type_caster_base<type>::cast(itype&&, pybind11::return_value_policy, pybind11::handle) [with type = UnusualOpRef; itype = UnusualOpRef]’
       1113 |     static handle cast(itype &&src, return_value_policy, handle parent) {
            |                   ^~~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1113:32: note:   no known conversion for argument 1 from ‘UnusualOpRef::NonTrivialType’ {aka ‘std::shared_ptr<int>’} to ‘pybind11::detail::type_caster_base<UnusualOpRef>::itype&&’ {aka ‘UnusualOpRef&&’}
       1113 |     static handle cast(itype &&src, return_value_policy, handle parent) {
            |                        ~~~~~~~~^~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1142:19: note: candidate: ‘static pybind11::handle pybind11::detail::type_caster_base<type>::cast(const itype*, pybind11::return_value_policy, pybind11::handle) [with type = UnusualOpRef; itype = UnusualOpRef]’
       1142 |     static handle cast(const itype *src, return_value_policy policy, handle parent) {
            |                   ^~~~
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../detail/type_caster_base.h:1142:37: note:   no known conversion for argument 1 from ‘UnusualOpRef::NonTrivialType’ {aka ‘std::shared_ptr<int>’} to ‘const pybind11::detail::type_caster_base<UnusualOpRef>::itype*’ {aka ‘const UnusualOpRef*’}
       1142 |     static handle cast(const itype *src, return_value_policy policy, handle parent) {
            |                        ~~~~~~~~~~~~~^~~
      ```
      
      * Replace `&src` with `std::addressof(src)` to fix the error building the added tests.
      
      * Fix accident (not sure how the `const` slipped in here when transferring the diff from pybind11k).
      Ralf W. Grosse-Kunstleve committed
  21. 22 Jun, 2024 1 commit
    • feat: remove Python 3.6 support (#5177) · f1a2e03d
      * Change Python version guard: PYTHON < 3.7 IS UNSUPPORTED.
      
      * Replace or remove Python 3.6 jobs.
      
      * Move appveyor to Python 3.8
      
      * Change `[tool.pylint]` `master.py-version` from `3.6` to `3.8`
      
      * Change `[tool.pylint]` `master.py-version` to `3.7`
      
      * Remove `centos:7` job; Change almalinux:8 job to use Python 3.8
      
      * Try 🐍 3.8 • ubuntu-20.04 • x64 without `-DCMAKE_CXX_FLAGS="-D_=1"`
      
      * Update setup.cfg as suggested by @henryiii
      
      * Try running `cmake --build . --target cpptest` on all platforms (`standard` job).
      
      * Disable deadsnakes jobs entirely.
      
      * Apply PR #5179: Add Python 3.10, 3.11, 3.12 to win32 job matrix.
      
      * Add back `-DCMAKE_CXX_FLAGS="-D_=1"` but do not install boost in that case.
      
      * PY_VERSION_HEX < 3.7 cleanup pass: include/pybind11
      
      * WITH_THREAD cleanup pass: include/pybind11
      
      * Undo incorrect change.
      
      * Revert "Disable deadsnakes jobs entirely."
      
      This reverts commit bbcd0087b2d52e0130f96792dd5dd03704280a57.
      
      * WITH_THREAD cleanup pass: tests/
      
      * Change Python version guard in pybind11/__init__.py: pybind11 does not support Python < 3.7.
      
      * Misc cleanup pass
      
      * chore: use future imports
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      
      * Update tests/test_numpy_array.py
      
      * Update test_numpy_array.py
      
      ---------
      
      Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
      Co-authored-by: Henry Schreiner <henryschreineriii@gmail.com>
      Ralf W. Grosse-Kunstleve committed
  22. 21 Jun, 2024 1 commit
  23. 18 Jun, 2024 3 commits
  24. 17 Jun, 2024 1 commit
  25. 15 Jun, 2024 1 commit