mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-29 08:32:02 +00:00
don't implicitly convert doubles to ints
This commit is contained in:
parent
a439ccaa0e
commit
3f200fab22
@ -5,6 +5,8 @@ Changelog
|
|||||||
|
|
||||||
1.8 (Not yet released)
|
1.8 (Not yet released)
|
||||||
----------------------
|
----------------------
|
||||||
|
* Prevent implicit conversion of floating point values to integral types in
|
||||||
|
function arguments
|
||||||
* Transparent conversion of sparse and dense Eigen data types
|
* Transparent conversion of sparse and dense Eigen data types
|
||||||
* Fixed incorrect default return value policy for functions returning a shared
|
* Fixed incorrect default return value policy for functions returning a shared
|
||||||
pointer
|
pointer
|
||||||
|
@ -104,4 +104,8 @@ void init_issues(py::module &m) {
|
|||||||
|
|
||||||
// (no id): should not be able to pass 'None' to a reference argument
|
// (no id): should not be able to pass 'None' to a reference argument
|
||||||
m2.def("print_element", [](ElementA &el) { std::cout << el.value() << std::endl; });
|
m2.def("print_element", [](ElementA &el) { std::cout << el.value() << std::endl; });
|
||||||
|
|
||||||
|
// (no id): don't cast doubles to ints
|
||||||
|
m2.def("expect_float", [](float f) { return f; });
|
||||||
|
m2.def("expect_int", [](int i) { return i; });
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ from example.issues import DispatchIssue, dispatch_issue_go
|
|||||||
from example.issues import Placeholder, return_vec_of_reference_wrapper
|
from example.issues import Placeholder, return_vec_of_reference_wrapper
|
||||||
from example.issues import iterator_passthrough
|
from example.issues import iterator_passthrough
|
||||||
from example.issues import ElementList, ElementA, print_element
|
from example.issues import ElementList, ElementA, print_element
|
||||||
|
from example.issues import expect_float, expect_int
|
||||||
import gc
|
import gc
|
||||||
|
|
||||||
print_cchar("const char *")
|
print_cchar("const char *")
|
||||||
@ -47,3 +48,10 @@ try:
|
|||||||
print_element(None)
|
print_element(None)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("Failed as expected: " + str(e))
|
print("Failed as expected: " + str(e))
|
||||||
|
|
||||||
|
try:
|
||||||
|
print(expect_int(5.2))
|
||||||
|
except Exception as e:
|
||||||
|
print("Failed as expected: " + str(e))
|
||||||
|
|
||||||
|
print(expect_float(12))
|
||||||
|
@ -8,3 +8,7 @@ Yay..
|
|||||||
Failed as expected: Incompatible function arguments. The following argument types are supported:
|
Failed as expected: Incompatible function arguments. The following argument types are supported:
|
||||||
1. (example.issues.ElementA) -> NoneType
|
1. (example.issues.ElementA) -> NoneType
|
||||||
|
|
||||||
|
Failed as expected: Incompatible function arguments. The following argument types are supported:
|
||||||
|
1. (int) -> int
|
||||||
|
|
||||||
|
12.0
|
||||||
|
@ -326,11 +326,15 @@ public:
|
|||||||
} if (std::is_floating_point<T>::value) {
|
} if (std::is_floating_point<T>::value) {
|
||||||
py_value = (py_type) PyFloat_AsDouble(src.ptr());
|
py_value = (py_type) PyFloat_AsDouble(src.ptr());
|
||||||
} else if (sizeof(T) <= sizeof(long)) {
|
} else if (sizeof(T) <= sizeof(long)) {
|
||||||
|
if (PyFloat_Check(src.ptr()))
|
||||||
|
return false;
|
||||||
if (std::is_signed<T>::value)
|
if (std::is_signed<T>::value)
|
||||||
py_value = (py_type) PyLong_AsLong(src.ptr());
|
py_value = (py_type) PyLong_AsLong(src.ptr());
|
||||||
else
|
else
|
||||||
py_value = (py_type) PyLong_AsUnsignedLong(src.ptr());
|
py_value = (py_type) PyLong_AsUnsignedLong(src.ptr());
|
||||||
} else {
|
} else {
|
||||||
|
if (PyFloat_Check(src.ptr()))
|
||||||
|
return false;
|
||||||
if (std::is_signed<T>::value)
|
if (std::is_signed<T>::value)
|
||||||
py_value = (py_type) PYBIND11_LONG_AS_LONGLONG(src.ptr());
|
py_value = (py_type) PYBIND11_LONG_AS_LONGLONG(src.ptr());
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user