1. 21 May, 2017 2 commits
    • Minor operators.h style cleanups · 1ac51a02
      - realign \ at end of macro lines
      - use 'using A = B;' rather than 'typedef B A;'
      - use conditional_t
      Jason Rhinelander committed
    • Fix /= operator under Python 3 · acad05cb
      The Python method for /= was set as `__idiv__`, which should be
      `__itruediv__` under Python 3.
      
      This wasn't totally broken in that without it defined, Python constructs
      a new object by calling __truediv__.  The operator tests, however,
      didn't actually test the /= operator: when I added it, I saw an extra
      construction, leading to the problem.  This commit also includes tests
      for the previously untested *= operator, and adds some element-wise
      vector multiplication and division operators.
      Jason Rhinelander committed
  2. 20 May, 2017 1 commit
  3. 18 May, 2017 1 commit
  4. 16 May, 2017 1 commit
  5. 11 May, 2017 1 commit
  6. 10 May, 2017 5 commits
    • Improve constructor resolution in variant_caster · 94d0a9f7
      Currently, `py::int_(1).cast<variant<double, int>>()` fills the `double`
      slot of the variant. This commit switches the loader to a 2-pass scheme
      in order to correctly fill the `int` slot.
      Dean Moldovan committed
    • Defer None loading to second pass · 93e3eac6
      Many of our `is_none()` checks in type caster loading return true, but
      this should really be considered a deferral so that, for example, an
      overload with a `py::none` argument would win over one that takes
      `py::none` as a null option.
      
      This keeps None-accepting for the `!convert` pass only for std::optional
      and void casters.  (The `char` caster already deferred None; this just
      extends that behaviour to other casters).
      Jason Rhinelander committed
    • Fix gcc 7 warning · 7fb01ecd
      Under gcc 7 with -std=c++11, compilation results in several of the
      following warnings:
      
          In file included from /home/jagerman/src/pybind11/tests/test_sequences_and_iterators.cpp:13:0:
          /home/jagerman/src/pybind11/include/pybind11/operators.h: In function ‘pybind11::detail::op_<(pybind11::detail::op_id)0, (pybind11::detail::op_type)0, pybind11::detail::self_t, pybind11::detail::self_t> pybind11::detail::operator+(const pybind11::detail::self_t&, const pybind11::detail::self_t&)’:
          /home/jagerman/src/pybind11/include/pybind11/operators.h:78:76: warning: inline declaration of ‘pybind11::detail::op_<(pybind11::detail::op_id)0, (pybind11::detail::op_type)0, pybind11::detail::self_t, pybind11::detail::self_t> pybind11::detail::operator+(const pybind11::detail::self_t&, const pybind11::detail::self_t&)’ follows declaration with attribute noinline [-Wattributes]
           inline op_<op_##id, op_l, self_t, self_t> op(const self_t &, const self_t &) {         \
                                                                                      ^
          /home/jagerman/src/pybind11/include/pybind11/operators.h:109:1: note: in expansion of macro ‘PYBIND11_BINARY_OPERATOR’
           PYBIND11_BINARY_OPERATOR(add,       radd,         operator+,    l + r)
           ^~~~~~~~~~~~~~~~~~~~~~~~
          In file included from /home/jagerman/src/pybind11/include/pybind11/cast.h:15:0,
                           from /home/jagerman/src/pybind11/include/pybind11/attr.h:13,
                           from /home/jagerman/src/pybind11/include/pybind11/pybind11.h:36,
                           from /home/jagerman/src/pybind11/tests/pybind11_tests.h:2,
                           from /home/jagerman/src/pybind11/tests/test_sequences_and_iterators.cpp:11:
          /home/jagerman/src/pybind11/include/pybind11/descr.h:116:36: note: previous definition of ‘pybind11::detail::descr pybind11::detail::operator+(pybind11::detail::descr&&, pybind11::detail::descr&&)’ was here
               PYBIND11_NOINLINE descr friend operator+(descr &&d1, descr &&d2) {
                                              ^~~~~~~~
      
      This appears to be happening because gcc is considering implicit
      construction of `descr` in some places using addition of two
      `descr`-compatible arguments in the `descr.h` c++11 fallback code.
      There's no particular reason that this operator needs to be a friend
      function: this commit changes it to an rvalue-context member function
      operator, which avoids the warning.
      Jason Rhinelander committed
    • Allow std::complex field with PYBIND11_NUMPY_DTYPE (#831) · b82c0f0a
      This exposed a few underlying issues:
      
      1. is_pod_struct was too strict to allow this. I've relaxed it to
      require only trivially copyable and standard layout, rather than POD
      (which additionally requires a trivial constructor, which std::complex
      violates).
      
      2. format_descriptor<std::complex<T>>::format() returned numpy format
      strings instead of PEP3118 format strings, but register_dtype
      feeds format codes of its fields to _dtype_from_pep3118. I've changed it
      to return PEP3118 format codes. format_descriptor is a public type, so
      this may be considered an incompatible change.
      
      3. register_structured_dtype tried to be smart about whether to mark
      fields as unaligned (with ^). However, it's examining the C++ alignment,
      rather than what numpy (or possibly PEP3118) thinks the alignment should
      be. For complex values those are different. I've made it mark all fields
      as ^ unconditionally, which should always be safe even if they are
      aligned, because we explicitly mark the padding.
      Bruce Merry committed
    • Support arrays inside PYBIND11_NUMPY_DTYPE (#832) · 8e0d832c
      Resolves #800.
      
      Both C++ arrays and std::array are supported, including mixtures like
      std::array<int, 2>[4]. In a multi-dimensional array of char, the last
      dimension is used to construct a numpy string type.
      Bruce Merry committed
  7. 09 May, 2017 6 commits
    • Fix std::nullptr_t caster (#840) · 78f1dcf9
      * Fix compilation error with std::nullptr_t
      
      * Enable conversion from None to std::nullptr_t and std::nullopt_t
      
      Fixes #839.
      Dean Moldovan committed
    • Make PYBIND11_CPP_STANDARD work under MSVC · 77710ff0
      Under MSVC we were ignoring PYBIND11_CPP_STANDARD and simply not
      passing any standard (which makes MSVC default to its C++14 mode).
      
      MSVC 2015u3 added the `/std:c++14` and `/std:c++latest` flags; the
      latter, under MSVC 2017, enables some C++17 features (such as
      `std::optional` and `std::variant`), so it is something we need to
      start supporting under MSVC.
      
      This makes the PYBIND11_CPP_STANDARD cmake variable work under MSVC,
      defaulting it to /std:c++14 (matching the default -std=c++14 for
      non-MSVC).
      
      It also adds a new appveyor test running under MSVC 2017 with
      /std:c++latest, which runs (and passes) the
      `std::optional`/`std::variant` tests.
      
      Also updated the documentation to clarify the c++ flags and add show
      MSVC flag examples.
      Jason Rhinelander committed
    • Update PYBIND11_CPP1{4,7} macros for MSVC · ca0e82b7
      The PYBIND11_CPP14 macro started out as a guard for the compile-time
      path code in `descr.h`, but has since come to mean other things.  This
      means that while the `descr.h` check has just checked the
      `PYBIND11_CPP14` macro, various other places now check `PYBIND11_CPP14
      || _MSC_VER`.  This reverses that by now setting the CPP14 macro when
      MSVC is trying to support C++14, but disabling the `descr.h` C++14 code
      (which still fails under MSVC 2017).
      
      The CPP17 macro also gets enabled when MSVC 2017 is compiling with
      /std:c++latest (the default is /std:c++14), which enables
      `std::optional` and `std::variant` support under MSVC.
      Jason Rhinelander committed
    • gcc 7 disable warning · 88ebc49b
      GCC 7 generates (when compiling in C++11/14 mode) warnings such as:
      
          mangled name for ‘pybind11::class_<type_, options>&
          pybind11::class_<type_, options>::def(const char*, Func&&, const Extra&
          ...) [with Func = int (test_exc_sp::C::*)(int) noexcept; Extra = {};
          type_ = test_exc_sp::C; options = {}]’ will change in C++17 because the
          exception specification is part of a function type [-Wnoexcept-type]
      
      There's nothing we can actually do in the code to avoid this, so just
      disable the warning.
      Jason Rhinelander committed
  8. 08 May, 2017 1 commit
  9. 07 May, 2017 7 commits
  10. 02 May, 2017 1 commit
  11. 29 Apr, 2017 5 commits
  12. 28 Apr, 2017 5 commits
    • Fix ambiguous initialize_list arguments · 51d18aa2
      This removes the convert-from-arithemtic-scalar constructor of
      any_container as it can result in ambiguous calls, as in:
      
          py::array_t<float>({ 1, 2 })
      
      which could be intepreted as either of:
      
          py::array_t<float>(py::array_t<float>(1, 2))
          py::array_t<float>(py::detail::any_container({ 1, 2 }))
      
      Removing the convert-from-arithmetic constructor reduces the number of
      implicit conversions, avoiding the ambiguity for array and array_t.
      This also re-adds the array/array_t constructors taking a scalar
      argument for backwards compatibility.
      Jason Rhinelander committed
    • travis-ci: Remove clang 4/c++17 from allow_failures · 2761f78f
      The job is using the released clang and stable-branch libc++, which
      wasn't the case when it was added.  Leave the g++7/c++17 in
      allow_failures for now as it's still a pre-release compiler (and pulled
      from debian experimental).
      Jason Rhinelander committed
    • Don't let PyInstanceMethod hide itself · 0a90b2db
      Python 3's `PyInstanceMethod_Type` hides itself via its `tp_descr_get`,
      which prevents aliasing methods via `cls.attr("m2") = cls.attr("m1")`:
      instead the `tp_descr_get` returns a plain function, when called on a
      class, or a `PyMethod`, when called on an instance.  Override that
      behaviour for pybind11 types with a special bypass for
      `PyInstanceMethod_Types`.
      Jason Rhinelander committed
    • Fix Python 3 `bytes` conversion to std::string/char* · a7f704b3
      The Unicode support added in 2.1 (PR #624) inadvertently broke accepting
      `bytes` as std::string/char* arguments.  This restores it with a
      separate path that does a plain conversion (i.e. completely bypassing
      all the encoding/decoding code), but only for single-byte string types.
      Jason Rhinelander committed
    • Add numpy version check (#819) · ce494d65
      The numpy API constants can check past the end of the API array if the
      numpy version is too old thus causing a segfault.  The current list of
      functions requires numpy >= 1.7.0, so this adds a check and exception if
      numpy is too old.
      
      The added feature version API element was added in numpy 1.4.0, so this
      could still segfault if loaded in 1.3.0 or earlier, but given that
      1.4.0 was released at the end of 2009, it seems reasonable enough to
      not worry about that case.  (1.7.0 was released in early 2013).
      Jason Rhinelander committed
  13. 27 Apr, 2017 3 commits
    • Track base class pointers of instances · 1f8a100d
      This commits adds base class pointers of offset base classes (i.e. due
      to multiple inheritance) to `registered_instances` so that if such a
      pointer is returned we properly recognize it as an existing instance.
      
      Without this, returning a base class pointer will cast to the existing
      instance if the pointer happens to coincide with the instance pointer,
      but constructs a new instance (quite possibly with a segfault, if
      ownership is applied) for unequal base class pointers due to multiple
      inheritance.
      Jason Rhinelander committed
    • Fix downcasting of base class pointers · 14e70650
      When we are returned a base class pointer (either directly or via
      shared_from_this()) we detect its runtime type (using `typeid`), then
      end up essentially reinterpret_casting the pointer to the derived type.
      This is invalid when the base class pointer was a non-first base, and we
      end up with an invalid pointer.  We could dynamic_cast to the
      most-derived type, but if *that* type isn't pybind11-registered, the
      resulting pointer given to the base `cast` implementation isn't necessarily valid
      to be reinterpret_cast'ed back to the backup type.
      
      This commit removes the "backup" type argument from the many-argument
      `cast(...)` and instead does the derived-or-pointer type decision and
      type lookup in type_caster_base, where the dynamic_cast has to be to
      correctly get the derived pointer, but also has to do the type lookup to
      ensure that we don't pass the wrong (derived) pointer when the backup
      type (i.e. the type caster intrinsic type) pointer is needed.
      
      Since the lookup is needed before calling the base cast(), this also
      changes the input type to a detail::type_info rather than doing a
      (second) lookup in cast().
      Jason Rhinelander committed
    • Expose more instance management functions · 92900995
      This breaks up the instance management functions in class_support.h a
      little bit so that other pybind11 code can use it.  In particular:
      
      - added make_new_instance() which does what pybind11_object_new does,
        but also allows instance allocation without `value` allocation.  This
        lets `cast.h` use the same instance allocation rather than having its
        own separate implementation.
      - instance registration is now moved to a
        `register_instance()`/deregister_instance()` pair (rather than having
        individual code add or remove things from `registered_instances`
        directory).
      - clear_instance() does everything `pybind11_object_dealloc()` needs
        except for the deallocation; this is helpful for factory construction
        which needs to be able to replace the internals of an instance without
        deallocating it.
      - clear_instance() now also calls `dealloc` when `holder_constructed`
        is true, even if `value` is false.  This can happen in factory
        construction when the pointer is moved from one instance to another,
        but the holder itself is only copied (i.e. for a shared_ptr holder).
      Jason Rhinelander committed
  14. 22 Apr, 2017 1 commit