1. 09 Sep, 2021 1 commit
    • Ralf W. Grosse-Kunstleve's avatar
      CodeHealth: Enabling clang-tidy google-explicit-constructor (#3250) · 6abf2baa
      Ralf W. Grosse-Kunstleve authored
      * Adding google-explicit-constructor to .clang-tidy
      
      * clang-tidy explicit attr.h (all automatic)
      
      * clang-tidy explicit cast.h (all automatic)
      
      * clang-tidy detail/init.h (1 NOLINT)
      
      * clang-tidy detail/type_caster_base.h (2 NOLINT)
      
      * clang-tidy pybind11.h (7 NOLINT)
      
      * clang-tidy detail/common.h (3 NOLINT)
      
      * clang-tidy detail/descr.h (2 NOLINT)
      
      * clang-tidy pytypes.h (23 NOLINT, only 1 explicit)
      
      * clang-tidy eigen.h (7 NOLINT, 0 explicit)
      
      * Adding 2 explicit in functional.h
      
      * Adding 4 explicit in iostream.h
      
      * clang-tidy numpy.h (1 NOLINT, 1 explicit)
      
      * clang-tidy embed.h (0 NOLINT, 1 explicit)
      
      * clang-tidy tests/local_bindings.h (0 NOLINT, 4 explicit)
      
      * clang-tidy tests/pybind11_cross_module_tests.cpp (0 NOLINT, 1 explicit)
      
      * clang-tidy tests/pybind11_tests.h (0 NOLINT, 2 explicit)
      
      * clang-tidy tests/test_buffers.cpp (0 NOLINT, 2 explicit)
      
      * clang-tidy tests/test_builtin_casters.cpp (0 NOLINT, 4 explicit)
      
      * clang-tidy tests/test_class.cpp (0 NOLINT, 6 explicit)
      
      * clang-tidy tests/test_copy_move.cpp (0 NOLINT, 7 explicit)
      
      * clang-tidy tests/test_embed/external_module.cpp (0 NOLINT, 1 explicit)
      
      * clang-tidy tests/test_embed/test_interpreter.cpp (0 NOLINT, 1 explicit)
      
      * clang-tidy tests/object.h (0 NOLINT, 2 explicit)
      
      * clang-tidy batch of fully automatic fixes.
      
      * Workaround for MSVC 19.16.27045.0 C++17 Python 2 C++ syntax error.
      6abf2baa
  2. 19 Aug, 2021 1 commit
    • Ralf W. Grosse-Kunstleve's avatar
      Cleanup of file-scoped and globally-scoped warning suppression pragmas across... · 998d45e4
      Ralf W. Grosse-Kunstleve authored
      Cleanup of file-scoped and globally-scoped warning suppression pragmas across pybind11 header files. (#3201)
      
      * Removing all MSVC C4127 warning suppression pragmas.
      
      * Removing MSVC /WX (WERROR). To get a full list of all warnings.
      
      * Inserting PYBIND11_SILENCE_MSVC_C4127. Changing one runtime if to #if.
      
      * Changing PYBIND11_SILENCE_MSVC_C4127 macro to use absolute namespace (for use outside pybind11 include directory).
      
      * Restoring MSVC /WX (WERROR).
      
      * Removing globally-scoped suppression for clang -Wunsequenced. Based on an experiment under PR #3202 it is obsolete and can simply be removed.
      998d45e4
  3. 12 Jul, 2021 1 commit
    • Ralf W. Grosse-Kunstleve's avatar
      NOLINT reduction (#3096) · 2d468697
      Ralf W. Grosse-Kunstleve authored
      * Copying from prework_no_rst branch (PR #3087): test_numpy_array.cpp, test_stl.cpp
      
      * Manual changes reducing NOLINTs.
      
      * clang-format-diff.py
      
      * Minor adjustment to avoid MSVC warning C4702: unreachable code
      2d468697
  4. 09 Jul, 2021 1 commit
  5. 22 Jun, 2021 1 commit
    • Aaron Gokaslan's avatar
      fix(clang-tidy): performance fixes applied in tests and CI (#3051) · dac74ebd
      Aaron Gokaslan authored
      * Initial fixes
      
      * Whoops
      
      * Finish clang-tidy manual fixes
      
      * Add two missing fixes
      
      * Revert
      
      * Update clang-tidy
      
      * Try to fix unreachable code error
      
      * Move nolint comment
      
      * Apply missing fix
      
      * Don't override clang-tidy config
      
      * Does this fix clang-tidy?
      
      * Make all clang-tidy errors visible
      
      * Add comments about NOLINTs and remove a few
      
      * Fix typo
      dac74ebd
  6. 18 Jan, 2021 1 commit
    • Michael Kuron's avatar
      fix: Intel ICC C++17 compatibility (#2729) · 48534089
      Michael Kuron authored
      
      
      * CI: Intel icc/icpc via oneAPI
      
      Add testing for Intel icc/icpc via the oneAPI images.
      Intel oneAPI is in a late beta stage, currently shipping
      oneAPI beta09 with ICC 20.2.
      
      CI: Skip Interpreter Tests for Intel
      
      Cannot find how to add this, neiter the package `libc6-dev` nor
      `intel-oneapi-mkl-devel` help when installed to solve this:
      ```
      -- Looking for C++ include pthread.h
      -- Looking for C++ include pthread.h - not found
      CMake Error at /__t/cmake/3.18.4/x64/cmake-3.18.4-Linux-x86_64/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:165 (message):
        Could NOT find Threads (missing: Threads_FOUND)
      Call Stack (most recent call first):
        /__t/cmake/3.18.4/x64/cmake-3.18.4-Linux-x86_64/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:458 (_FPHSA_FAILURE_MESSAGE)
        /__t/cmake/3.18.4/x64/cmake-3.18.4-Linux-x86_64/share/cmake-3.18/Modules/FindThreads.cmake:234 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
        tests/test_embed/CMakeLists.txt:17 (find_package)
      ```
      
      CI: libc6-dev from GCC for ICC
      
      CI: Run bare metal for oneAPI
      
      CI: Ubuntu 18.04 for oneAPI
      
      CI: Intel +Catch -Eigen
      
      CI: CMake from Apt (ICC tests)
      
      CI: Replace Intel Py with GCC Py
      
      CI: Intel w/o GCC's Eigen
      
      CI: ICC with verbose make
      
      [Debug] Find core dump
      
      tests: use arg{} instead of arg() for Intel
      
      tests: adding a few more missing {}
      
      fix: sync with @tobiasleibner's branch
      
      fix: try ubuntu 20-04
      
      fix: drop exit 1
      
      docs: Apply suggestions from code review
      Co-authored-by: default avatarTobias Leibner <tobias.leibner@googlemail.com>
      
      Workaround for ICC enable_if issues
      
      Another workaround for ICC's enable_if issues
      
      fix error in previous commit
      
      Disable one test for the Intel compiler in C++17 mode
      
      Add back one instance of py::arg().noconvert()
      
      Add NOLINT to fix clang-tidy check
      
      Work around for ICC internal error in PYBIND11_EXPAND_SIDE_EFFECTS in C++17 mode
      
      CI: Intel ICC with C++17
      
      docs: pybind11/numpy.h does not require numpy at build time. (#2720)
      
      This is nice enough to be mentioned explicitly in the docs.
      
      docs: Update warning about Python 3.9.0 UB, now that 3.9.1 has been released (#2719)
      
      Adjusting `type_caster<std::reference_wrapper<T>>` to support const/non-const propagation in `cast_op`. (#2705)
      
      * Allow type_caster of std::reference_wrapper<T> to be the same as a native reference.
      
      Before, both std::reference_wrapper<T> and std::reference_wrapper<const T> would
      invoke cast_op<type>. This doesn't allow the type_caster<> specialization for T
      to distinguish reference_wrapper types from value types.
      
      After, the type_caster<> specialization invokes cast_op<type&>, which allows
      reference_wrapper to behave in the same way as a native reference type.
      
      * Add tests/examples for std::reference_wrapper<const T>
      
      * Add tests which use mutable/immutable variants
      
      This test is a chimera; it blends the pybind11 casters with a custom
      pytype implementation that supports immutable and mutable calls.
      
      In order to detect the immutable/mutable state, the cast_op needs
      to propagate it, even through e.g. std::reference<const T>
      
      Note: This is still a work in progress; some things are crashing,
      which likely means that I have a refcounting bug or something else
      missing.
      
      * Add/finish tests that distinguish const& from &
      
      Fixes the bugs in my custom python type implementation,
      demonstrate test that requires const& and reference_wrapper<const T>
      being treated differently from Non-const.
      
      * Add passing a const to non-const method.
      
      * Demonstrate non-const conversion of reference_wrapper in tests.
      
      Apply formatting presubmit check.
      
      * Fix build errors from presubmit checks.
      
      * Try and fix a few more CI errors
      
      * More CI fixes.
      
      * More CI fixups.
      
      * Try and get PyPy to work.
      
      * Additional minor fixups. Getting close to CI green.
      
      * More ci fixes?
      
      * fix clang-tidy warnings from presubmit
      
      * fix more clang-tidy warnings
      
      * minor comment and consistency cleanups
      
      * PyDECREF -> Py_DECREF
      
      * copy/move constructors
      
      * Resolve codereview comments
      
      * more review comment fixes
      
      * review comments: remove spurious &
      
      * Make the test fail even when the static_assert is commented out.
      
      This expands the test_freezable_type_caster a bit by:
      1/ adding accessors .is_immutable and .addr to compare identity
      from python.
      2/ Changing the default cast_op of the type_caster<> specialization
      to return a non-const value. In normal codepaths this is a reasonable
      default.
      3/ adding roundtrip variants to exercise the by reference, by pointer
      and by reference_wrapper in all call paths.  In conjunction with 2/, this
      demonstrates the failure case of the existing std::reference_wrpper conversion,
      which now loses const in a similar way that happens when using the default cast_op_type<>.
      
      * apply presubmit formatting
      
      * Revert inclusion of test_freezable_type_caster
      
      There's some concern that this test is a bit unwieldly because of the use
      of the raw <Python.h> functions. Removing for now.
      
      * Add a test that validates const references propagation.
      
      This test verifies that cast_op may be used to correctly detect
      const reference types when used with std::reference_wrapper.
      
      * mend
      
      * Review comments based changes.
      
      1. std::add_lvalue_reference<type> -> type&
      2. Simplify the test a little more; we're never returning the ConstRefCaster
      type so the class_ definition can be removed.
      
      * formatted files again.
      
      * Move const_ref_caster test to builtin_casters
      
      * Review comments: use cast_op and adjust some comments.
      
      * Simplify ConstRefCasted test
      
      I like this version better as it moves the assertion that matters
      back into python.
      
      ci: drop pypy2 linux, PGI 20.7, add Python 10 dev (#2724)
      
      * ci: drop pypy2 linux, add Python 10 dev
      
      * ci: fix mistake
      
      * ci: commented-out PGI 20.11, drop 20.7
      
      fix: regression with installed pybind11 overriding local one (#2716)
      
      * fix: regression with installed pybind11 overriding discovered one
      
      Closes #2709
      
      * docs: wording incorrect
      
      style: remove redundant instance->owned = true (#2723)
      
      which was just before set to True in instance->allocate_layout()
      
      fix: also throw in the move-constructor added by the PYBIND11_OBJECT macro, after the argument has been moved-out (if necessary) (#2701)
      
      Make args_are_all_* ICC workarounds unconditional
      
      Disable test_aligned on Intel ICC
      
      Fix test_aligned on Intel ICC
      
      Skip test_python_alreadyset_in_destructor on Intel ICC
      
      Fix test_aligned again
      
      ICC CI: Downgrade pytest
      
      pytest 6 does not capture the `discard_as_unraisable` stderr and
      just writes a warning with its content instead.
      
      * refactor: simpler Intel workaround, suggested by @laramiel
      
      * fix: try version with impl to see if it is easier to compile
      
      * docs: update README for ICC
      Co-authored-by: default avatarAxel Huebl <axel.huebl@plasma.ninja>
      Co-authored-by: default avatarHenry Schreiner <henryschreineriii@gmail.com>
      48534089
  7. 17 Jan, 2021 1 commit
    • Yannick Jadoul's avatar
      fix: only allow integer type_caster to call __int__ method when conversion is... · 8449a808
      Yannick Jadoul authored
      fix: only allow integer type_caster to call __int__ method when conversion is allowed; always call __index__ (#2698)
      
      * Only allow integer type_caster to call __int__ or __index__ method when conversion is allowed
      
      * Remove tests for __index__ as this seems to only be used to convert to int in 3.8+
      
      * Take both `int` and `long` types into account for Python 2
      
      * Add test_numpy_int_convert to assert tests currently fail, even though np.intc has an __index__ method
      
      * Also consider __index__ as noconvert to a C++ integer
      
      * New-style classes for Python 2.7; sigh
      
      * Add some tests on types with custom __index__ method
      
      * Ignore some tests in Python <3.8
      
      * Update comment about conversion from np.float32 to C++ int
      
      * Workaround difference between CPython and PyPy's different PyIndex_Check (unnoticed because we currently don't have PyPy >= 3.8)
      
      * Avoid ICC segfault with py::arg()
      8449a808
  8. 15 Jan, 2021 1 commit
    • Axel Huebl's avatar
      ci: Intel icc/icpc via oneAPI (#2573) · 0b3df7f9
      Axel Huebl authored
      
      
      * CI: Intel icc/icpc via oneAPI
      
      Add testing for Intel icc/icpc via the oneAPI images.
      Intel oneAPI is in a late beta stage, currently shipping
      oneAPI beta09 with ICC 20.2.
      
      * CI: Skip Interpreter Tests for Intel
      
      Cannot find how to add this, neiter the package `libc6-dev` nor
      `intel-oneapi-mkl-devel` help when installed to solve this:
      ```
      -- Looking for C++ include pthread.h
      -- Looking for C++ include pthread.h - not found
      CMake Error at /__t/cmake/3.18.4/x64/cmake-3.18.4-Linux-x86_64/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:165 (message):
        Could NOT find Threads (missing: Threads_FOUND)
      Call Stack (most recent call first):
        /__t/cmake/3.18.4/x64/cmake-3.18.4-Linux-x86_64/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:458 (_FPHSA_FAILURE_MESSAGE)
        /__t/cmake/3.18.4/x64/cmake-3.18.4-Linux-x86_64/share/cmake-3.18/Modules/FindThreads.cmake:234 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
        tests/test_embed/CMakeLists.txt:17 (find_package)
      ```
      
      * CI: libc6-dev from GCC for ICC
      
      * CI: Run bare metal for oneAPI
      
      * CI: Ubuntu 18.04 for oneAPI
      
      * CI: Intel +Catch -Eigen
      
      * CI: CMake from Apt (ICC tests)
      
      * CI: Replace Intel Py with GCC Py
      
      * CI: Intel w/o GCC's Eigen
      
      * CI: ICC with verbose make
      
      * [Debug] Find core dump
      
      * tests: use arg{} instead of arg() for Intel
      
      * tests: adding a few more missing {}
      
      * fix: sync with @tobiasleibner's branch
      
      * fix: try ubuntu 20-04
      
      * fix: drop exit 1
      
      * style: clang tidy fix
      
      * style: fix missing NOLINT
      
      * ICC: Update Compiler Name
      
      Changed upstream with the last oneAPI release.
      
      * ICC CI: Downgrade pytest
      
      pytest 6 does not capture the `discard_as_unraisable` stderr and
      just writes a warning with its content instead.
      
      * Use new test pinning requirements.txt
      
      * tests: add notes about intel, cleanup
      Co-authored-by: default avatarHenry Schreiner <henryschreineriii@gmail.com>
      0b3df7f9
  9. 16 Dec, 2020 1 commit
    • Laramie Leavitt's avatar
      Adjusting `type_caster<std::reference_wrapper<T>>` to support const/non-const... · 5469c238
      Laramie Leavitt authored
      Adjusting `type_caster<std::reference_wrapper<T>>` to support const/non-const propagation in `cast_op`. (#2705)
      
      
      * Allow type_caster of std::reference_wrapper<T> to be the same as a native reference.
      
      Before, both std::reference_wrapper<T> and std::reference_wrapper<const T> would
      invoke cast_op<type>. This doesn't allow the type_caster<> specialization for T
      to distinguish reference_wrapper types from value types.
      
      After, the type_caster<> specialization invokes cast_op<type&>, which allows
      reference_wrapper to behave in the same way as a native reference type.
      
      * Add tests/examples for std::reference_wrapper<const T>
      
      * Add tests which use mutable/immutable variants
      
      This test is a chimera; it blends the pybind11 casters with a custom
      pytype implementation that supports immutable and mutable calls.
      
      In order to detect the immutable/mutable state, the cast_op needs
      to propagate it, even through e.g. std::reference<const T>
      
      Note: This is still a work in progress; some things are crashing,
      which likely means that I have a refcounting bug or something else
      missing.
      
      * Add/finish tests that distinguish const& from &
      
      Fixes the bugs in my custom python type implementation,
      demonstrate test that requires const& and reference_wrapper<const T>
      being treated differently from Non-const.
      
      * Add passing a const to non-const method.
      
      * Demonstrate non-const conversion of reference_wrapper in tests.
      
      Apply formatting presubmit check.
      
      * Fix build errors from presubmit checks.
      
      * Try and fix a few more CI errors
      
      * More CI fixes.
      
      * More CI fixups.
      
      * Try and get PyPy to work.
      
      * Additional minor fixups. Getting close to CI green.
      
      * More ci fixes?
      
      * fix clang-tidy warnings from presubmit
      
      * fix more clang-tidy warnings
      
      * minor comment and consistency cleanups
      
      * PyDECREF -> Py_DECREF
      
      * copy/move constructors
      
      * Resolve codereview comments
      
      * more review comment fixes
      
      * review comments: remove spurious &
      
      * Make the test fail even when the static_assert is commented out.
      
      This expands the test_freezable_type_caster a bit by:
      1/ adding accessors .is_immutable and .addr to compare identity
      from python.
      2/ Changing the default cast_op of the type_caster<> specialization
      to return a non-const value. In normal codepaths this is a reasonable
      default.
      3/ adding roundtrip variants to exercise the by reference, by pointer
      and by reference_wrapper in all call paths.  In conjunction with 2/, this
      demonstrates the failure case of the existing std::reference_wrpper conversion,
      which now loses const in a similar way that happens when using the default cast_op_type<>.
      
      * apply presubmit formatting
      
      * Revert inclusion of test_freezable_type_caster
      
      There's some concern that this test is a bit unwieldly because of the use
      of the raw <Python.h> functions. Removing for now.
      
      * Add a test that validates const references propagation.
      
      This test verifies that cast_op may be used to correctly detect
      const reference types when used with std::reference_wrapper.
      
      * mend
      
      * Review comments based changes.
      
      1. std::add_lvalue_reference<type> -> type&
      2. Simplify the test a little more; we're never returning the ConstRefCaster
      type so the class_ definition can be removed.
      
      * formatted files again.
      
      * Move const_ref_caster test to builtin_casters
      
      * Review comments: use cast_op and adjust some comments.
      
      * Simplify ConstRefCasted test
      
      I like this version better as it moves the assertion that matters
      back into python.
      5469c238
  10. 28 Jul, 2020 1 commit
  11. 19 Dec, 2019 1 commit
  12. 11 Nov, 2018 1 commit
    • Wenzel Jakob's avatar
      fix py::cast<void *> (#1605) · cea42467
      Wenzel Jakob authored
      Pybind11 provides a cast operator between opaque void* pointers on the
      C++ side and capsules on the Python side. The py::cast<void *>
      expression was not aware of this possibility and incorrectly triggered a
      compile-time assertion ("Unable to cast type to reference: value is
      local to type caster") that is now fixed.
      cea42467
  13. 30 Nov, 2017 1 commit
    • Henry Schreiner's avatar
      Matching Python 2 int behavior on Python 2 (#1186) · cf0d0f9d
      Henry Schreiner authored
      Pybind11's default conversion to int always produces a long on Python 2 (`int`s and `long`s were unified in Python 3). This patch fixes `int` handling to match Python 2 on Python 2; for short types (`size_t` or smaller), the number will be returned as an `int` if possible, otherwise `long`. Requires Python 2.5+.
      
      This is needed for things like `sys.exit`, which refuse to accept a `long`.
      cf0d0f9d
  14. 12 Oct, 2017 1 commit
    • Jason Rhinelander's avatar
      Fix `char &` arguments being non-bindable · 1b08df58
      Jason Rhinelander authored
      This changes the caster to return a reference to a (new) local `CharT`
      type caster member so that binding lvalue-reference char arguments
      works (currently it results in a compilation failure).
      
      Fixes #1116
      1b08df58
  15. 23 Jul, 2017 1 commit
  16. 05 Jul, 2017 2 commits
    • Jason Rhinelander's avatar
      Use rvalue subcasting when casting an rvalue container · b57281bb
      Jason Rhinelander authored
      This updates the std::tuple, std::pair and `stl.h` type casters to
      forward their contained value according to whether the container being
      cast is an lvalue or rvalue reference.  This fixes an issue where
      subcaster casts were always called with a const lvalue which meant
      nested type casters didn't have the desired `cast()` overload invoked.
      For example, this caused Eigen values in a tuple to end up with a
      readonly flag (issue #935) and made it impossible to return a container
      of move-only types (issue #853).
      
      This fixes both issues by adding templated universal reference `cast()`
      methods to the various container types that forward container elements
      according to the container reference type.
      b57281bb
    • Jason Rhinelander's avatar
      Combine std::tuple/std::pair logic · 897d7168
      Jason Rhinelander authored
      The std::pair caster can be written as a special case of the std::tuple
      caster; this combines them via a base `tuple_caster` class (which is
      essentially identical to the previous std::tuple caster).
      
      This also removes the special empty tuple base case: returning an empty
      tuple is relatively rare, and the base case still works perfectly well
      even when the tuple types is an empty list.
      897d7168
  17. 02 Jul, 2017 1 commit
    • Jason Rhinelander's avatar
      Fix unsigned error value casting · 259b2faf
      Jason Rhinelander authored
      When casting to an unsigned type from a python 2 `int`, we currently
      cast using `(unsigned long long) PyLong_AsUnsignedLong(src.ptr())`.
      If the Python cast fails, it returns (unsigned long) -1, but then we
      cast this to `unsigned long long`, which means we get 4294967295, but
      because that isn't equal to `(unsigned long long) -1`, we don't detect
      the failure.
      
      This commit moves the unsigned casting into a `detail::as_unsigned`
      function which, upon error, casts -1 to the final type, and otherwise
      casts the return value to the final type to avoid the problematic double
      cast when an error occurs.
      
      The error most commonly shows up wherever `long` is 32-bits (e.g. under
      both 32- and 64-bit Windows, and under 32-bit linux) when passing a
      negative value to a bound function taking an `unsigned long`.
      
      Fixes #929.
      
      The added tests also trigger a latent segfault under PyPy: when casting
      to an integer smaller than `long` (e.g. casting to a `uint32_t` on a
      64-bit `long` architecture) we check both for a Python error and also
      that the resulting intermediate value will fit in the final type.  If
      there is no conversion error, but we get a value that would overflow, we
      end up calling `PyErr_ExceptionMatches()` illegally: that call is only
      allowed when there is a current exception.  Under PyPy, this segfaults
      the test suite.  It doesn't appear to segfault under CPython, but the
      documentation suggests that it *could* do so.  The fix is to only check
      for the exception match if we actually got an error.
      259b2faf
  18. 27 Jun, 2017 1 commit