Merge branch 'master' into sh_merge_master

This commit is contained in:
Ralf W. Grosse-Kunstleve 2022-05-17 16:37:59 -07:00
commit bdf22c8ee7
9 changed files with 38 additions and 16 deletions

View File

@ -316,8 +316,8 @@ jobs:
# Testing NVCC; forces sources to behave like .cu files # Testing NVCC; forces sources to behave like .cu files
cuda: cuda:
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: "🐍 3.8 • CUDA 11 • Ubuntu 20.04" name: "🐍 3.8 • CUDA 11.2 • Ubuntu 20.04"
container: nvidia/cuda:11.0-devel-ubuntu20.04 container: nvidia/cuda:11.2.2-devel-ubuntu20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3

View File

@ -33,7 +33,7 @@ repos:
# Upgrade old Python syntax # Upgrade old Python syntax
- repo: https://github.com/asottile/pyupgrade - repo: https://github.com/asottile/pyupgrade
rev: "v2.32.0" rev: "v2.32.1"
hooks: hooks:
- id: pyupgrade - id: pyupgrade
args: [--py36-plus] args: [--py36-plus]
@ -167,7 +167,7 @@ repos:
# Clang format the codebase automatically # Clang format the codebase automatically
- repo: https://github.com/pre-commit/mirrors-clang-format - repo: https://github.com/pre-commit/mirrors-clang-format
rev: "v14.0.1" rev: "v14.0.3"
hooks: hooks:
- id: clang-format - id: clang-format
types_or: [c++, c, cuda] types_or: [c++, c, cuda]

View File

@ -1037,6 +1037,8 @@ struct return_value_policy_override<
// Basic python -> C++ casting; throws if casting fails // Basic python -> C++ casting; throws if casting fails
template <typename T, typename SFINAE> template <typename T, typename SFINAE>
type_caster<T, SFINAE> &load_type(type_caster<T, SFINAE> &conv, const handle &handle) { type_caster<T, SFINAE> &load_type(type_caster<T, SFINAE> &conv, const handle &handle) {
static_assert(!detail::is_pyobject<T>::value,
"Internal error: type_caster should only be used for C++ types");
if (!conv.load(handle, true)) { if (!conv.load(handle, true)) {
#if !defined(PYBIND11_DETAILED_ERROR_MESSAGES) #if !defined(PYBIND11_DETAILED_ERROR_MESSAGES)
throw cast_error("Unable to cast Python instance to C++ type (#define " throw cast_error("Unable to cast Python instance to C++ type (#define "
@ -1127,21 +1129,30 @@ detail::enable_if_t<!detail::move_never<T>::value, T> move(object &&obj) {
// - If both movable and copyable, check ref count: if 1, move; otherwise copy // - If both movable and copyable, check ref count: if 1, move; otherwise copy
// - Otherwise (not movable), copy. // - Otherwise (not movable), copy.
template <typename T> template <typename T>
detail::enable_if_t<detail::move_always<T>::value, T> cast(object &&object) { detail::enable_if_t<!detail::is_pyobject<T>::value && detail::move_always<T>::value, T>
cast(object &&object) {
return move<T>(std::move(object)); return move<T>(std::move(object));
} }
template <typename T> template <typename T>
detail::enable_if_t<detail::move_if_unreferenced<T>::value, T> cast(object &&object) { detail::enable_if_t<!detail::is_pyobject<T>::value && detail::move_if_unreferenced<T>::value, T>
cast(object &&object) {
if (object.ref_count() > 1) { if (object.ref_count() > 1) {
return cast<T>(object); return cast<T>(object);
} }
return move<T>(std::move(object)); return move<T>(std::move(object));
} }
template <typename T> template <typename T>
detail::enable_if_t<detail::move_never<T>::value, T> cast(object &&object) { detail::enable_if_t<!detail::is_pyobject<T>::value && detail::move_never<T>::value, T>
cast(object &&object) {
return cast<T>(object); return cast<T>(object);
} }
// pytype rvalue -> pytype (calls converting constructor)
template <typename T>
detail::enable_if_t<detail::is_pyobject<T>::value, T> cast(object &&object) {
return T(std::move(object));
}
template <typename T> template <typename T>
T object::cast() const & { T object::cast() const & {
return pybind11::cast<T>(*this); return pybind11::cast<T>(*this);

View File

@ -2181,7 +2181,8 @@ struct enum_base {
[](const object &arg) -> str { [](const object &arg) -> str {
handle type = type::handle_of(arg); handle type = type::handle_of(arg);
object type_name = type.attr("__name__"); object type_name = type.attr("__name__");
return pybind11::str("<{}.{}: {}>").format(type_name, enum_name(arg), int_(arg)); return pybind11::str("<{}.{}: {}>")
.format(std::move(type_name), enum_name(arg), int_(arg));
}, },
name("__repr__"), name("__repr__"),
is_method(m_base)); is_method(m_base));
@ -2191,7 +2192,7 @@ struct enum_base {
m_base.attr("__str__") = cpp_function( m_base.attr("__str__") = cpp_function(
[](handle arg) -> str { [](handle arg) -> str {
object type_name = type::handle_of(arg).attr("__name__"); object type_name = type::handle_of(arg).attr("__name__");
return pybind11::str("{}.{}").format(type_name, enum_name(arg)); return pybind11::str("{}.{}").format(std::move(type_name), enum_name(arg));
}, },
name("name"), name("name"),
is_method(m_base)); is_method(m_base));
@ -2831,8 +2832,8 @@ PYBIND11_NOINLINE void print(const tuple &args, const dict &kwargs) {
for (size_t i = 0; i < args.size(); ++i) { for (size_t i = 0; i < args.size(); ++i) {
strings[i] = str(args[i]); strings[i] = str(args[i]);
} }
auto sep = kwargs.contains("sep") ? kwargs["sep"] : cast(" "); auto sep = kwargs.contains("sep") ? kwargs["sep"] : str(" ");
auto line = sep.attr("join")(strings); auto line = sep.attr("join")(std::move(strings));
object file; object file;
if (kwargs.contains("file")) { if (kwargs.contains("file")) {
@ -2851,7 +2852,7 @@ PYBIND11_NOINLINE void print(const tuple &args, const dict &kwargs) {
auto write = file.attr("write"); auto write = file.attr("write");
write(line); write(line);
write(kwargs.contains("end") ? kwargs["end"] : cast("\n")); write(kwargs.contains("end") ? kwargs["end"] : str("\n"));
if (kwargs.contains("flush") && kwargs["flush"].cast<bool>()) { if (kwargs.contains("flush") && kwargs["flush"].cast<bool>()) {
file.attr("flush")(); file.attr("flush")();
@ -2894,7 +2895,7 @@ get_type_override(const void *this_ptr, const type_info *this_type, const char *
function override = getattr(self, name, function()); function override = getattr(self, name, function());
if (override.is_cpp_function()) { if (override.is_cpp_function()) {
cache.insert(key); cache.insert(std::move(key));
return function(); return function();
} }

View File

@ -13,9 +13,9 @@
#include "detail/common.h" #include "detail/common.h"
#include <deque> #include <deque>
#include <iostream>
#include <list> #include <list>
#include <map> #include <map>
#include <ostream>
#include <set> #include <set>
#include <unordered_map> #include <unordered_map>
#include <unordered_set> #include <unordered_set>

View File

@ -370,7 +370,7 @@ endif()
# Compile with compiler warnings turned on # Compile with compiler warnings turned on
function(pybind11_enable_warnings target_name) function(pybind11_enable_warnings target_name)
if(MSVC) if(MSVC)
target_compile_options(${target_name} PRIVATE /W4) target_compile_options(${target_name} PRIVATE /W4 /wd4189)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Intel|Clang)" AND NOT PYBIND11_CUDA_TESTS) elseif(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Intel|Clang)" AND NOT PYBIND11_CUDA_TESTS)
target_compile_options( target_compile_options(
${target_name} ${target_name}

View File

@ -289,4 +289,7 @@ TEST_SUBMODULE(copy_move_policies, m) {
py::return_value_policy::move); py::return_value_policy::move);
m.def( m.def(
"get_moveissue2", [](int i) { return MoveIssue2(i); }, py::return_value_policy::move); "get_moveissue2", [](int i) { return MoveIssue2(i); }, py::return_value_policy::move);
// Make sure that cast from pytype rvalue to other pytype works
m.def("get_pytype_rvalue_castissue", [](double i) { return py::float_(i).cast<py::int_>(); });
} }

View File

@ -123,3 +123,10 @@ def test_move_fallback():
assert m1.value == 1 assert m1.value == 1
m2 = m.get_moveissue2(2) m2 = m.get_moveissue2(2)
assert m2.value == 2 assert m2.value == 2
def test_pytype_rvalue_cast():
"""Make sure that cast from pytype rvalue to other pytype works"""
value = m.get_pytype_rvalue_castissue(1.0)
assert value == 1

View File

@ -96,7 +96,7 @@ if(MSVC) # That's also clang-cl
set_property( set_property(
TARGET pybind11::windows_extras TARGET pybind11::windows_extras
APPEND APPEND
PROPERTY INTERFACE_COMPILE_OPTIONS /bigobj) PROPERTY INTERFACE_COMPILE_OPTIONS $<$<COMPILE_LANGUAGE:CXX>:/bigobj>)
# /MP enables multithreaded builds (relevant when there are many files) for MSVC # /MP enables multithreaded builds (relevant when there are many files) for MSVC
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # no Clang no Intel if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # no Clang no Intel