Skip to content

Add more integer conversions #6

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed

Add more integer conversions #6

wants to merge 2 commits into from

Conversation

mrzv
Copy link

@mrzv mrzv commented Oct 22, 2015

Without the changes in cast.h, on Linux, I'm unable to return unsigned long long from a function (works on Mac). Without the changes to int_ (at least the constructor from unsigned), I cannot do things like py::int_((uint32_t) 1).

@mrzv
Copy link
Author

mrzv commented Oct 22, 2015

Judging by the failed checks, different compilers behave very differently.

@wjakob
Copy link
Member

wjakob commented Oct 23, 2015

Yeah, it's tricky.. The behavior is also quite different on whether you compile for 32 bit or 64 bit platforms because size_t will change type and potentially collide with some overloads.

@wjakob wjakob force-pushed the master branch 3 times, most recently from f5e0300 to 42af9c2 Compare October 23, 2015 08:25
@wjakob
Copy link
Member

wjakob commented Oct 23, 2015

By the way: I didn't unterstand why you can't return unsigned long long on Linux. Isn't that the same as uint64_t (for which there is a converter)?

@mrzv
Copy link
Author

mrzv commented Oct 23, 2015

I don't understand why it happens, but if I define a function,

m.def("test", []() -> unsigned long long { return 1; });

compile it on Linux (without adding the lines to cast.h) and then call it from Python, I get:

In [4]: test()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-ea594c21b25d> in <module>()
----> 1 test()

TypeError: Unable to convert function return value to a Python type! The signature was
        () -> unsigned long long

@wjakob wjakob force-pushed the master branch 4 times, most recently from 8a34f70 to 6e213c9 Compare November 24, 2015 22:18
@wjakob
Copy link
Member

wjakob commented Nov 29, 2015

FYI: I committed a few more integer overloads for int_::int_(). I still don't get the issue with regards to returning long long from your code. Isn't that the same as int64_t? (so the existing overloads should be triggered)

@mrzv
Copy link
Author

mrzv commented Nov 29, 2015

Have you confirmed it? Do you have access to Linux? For me it happens only under Linux (not under OS X), but it does happen. I don't understand it either: as you say, the existing overloads should get triggered. It could be a compiler bug, but it happens both with GCC 5.2 and Clang 3.7.

@wjakob
Copy link
Member

wjakob commented Nov 30, 2015

I could not reproduce it yet. However, I have just committed another attempt to just make integer type handling completely generic using a template construction. Can you please retry with the latest version?

@wjakob
Copy link
Member

wjakob commented Nov 30, 2015

(see 60c36db)

@mrzv
Copy link
Author

mrzv commented Nov 30, 2015

Yes, it works! (And a nice solution, I might add. Comparing sizeof feels cleaner than explicitly spelling out all the types.) Thanks for fixing it.

@wjakob
Copy link
Member

wjakob commented Nov 30, 2015

Great -- closing this then.

@wjakob wjakob closed this Nov 30, 2015
nbigaouette pushed a commit to nbigaouette/pybind11 that referenced this pull request Jan 12, 2016
This should insure that both the PythonLibs and PythonInterp points to
the same python version.

Without this, the Python library and interpreter might not match version.
For example, if both Python 2.7 and 3.4 is installed, PythonLibs will
find /usr/lib/x86_64-linux-gnu/libpython3.4m.so while
PythonInterp will find /usr/bin/python2.7 (at least on Ubuntu 14.04).

When PythonLibs and PythonInterp don't point to the same Python version,
the examples will all fail:

$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Setting build type to 'MinSizeRel' as none was specified.
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.4m.so (found suitable version "3.4.3", minimum required is "2.7")
-- Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.6", minimum required is "2.7")
-- Performing Test HAS_LTO_FLAG
-- Performing Test HAS_LTO_FLAG - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /home/nbigaouette/pybind11/build
$ make test
Running tests...
Test project /home/nbigaouette/pybind11/build
      Start  1: example1
 1/12 Test  pybind#1: example1 .........................***Failed    0.02 sec
      Start  2: example2
 2/12 Test  pybind#2: example2 .........................***Failed    0.03 sec
      Start  3: example3
 3/12 Test  pybind#3: example3 .........................***Failed    0.02 sec
      Start  4: example4
 4/12 Test  pybind#4: example4 .........................***Failed    0.02 sec
      Start  5: example5
 5/12 Test  pybind#5: example5 .........................***Failed    0.02 sec
      Start  6: example6
 6/12 Test  pybind#6: example6 .........................***Failed    0.02 sec
      Start  7: example7
 7/12 Test  pybind#7: example7 .........................***Failed    0.02 sec
      Start  8: example8
 8/12 Test  pybind#8: example8 .........................***Failed    0.02 sec
      Start  9: example9
 9/12 Test  pybind#9: example9 .........................***Failed    0.02 sec
      Start 10: example10
10/12 Test pybind#10: example10 ........................***Failed    0.02 sec
      Start 11: example11
11/12 Test pybind#11: example11 ........................***Failed    0.03 sec
      Start 12: example12
12/12 Test pybind#12: example12 ........................***Failed    0.02 sec

0% tests passed, 12 tests failed out of 12

Total Test time (real) =   0.25 sec

The following tests FAILED:
          1 - example1 (Failed)
          2 - example2 (Failed)
          3 - example3 (Failed)
          4 - example4 (Failed)
          5 - example5 (Failed)
          6 - example6 (Failed)
          7 - example7 (Failed)
          8 - example8 (Failed)
          9 - example9 (Failed)
         10 - example10 (Failed)
         11 - example11 (Failed)
         12 - example12 (Failed)
Errors while running CTest
make: *** [test] Error 8


By adding the EXACT version to the find_package() calls, the version
discrepency is at least caught at the cmake call:

$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Setting build type to 'MinSizeRel' as none was specified.
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
  Could NOT find PythonLibs: Found unsuitable version "3.4.3", but required
  is exact version "2.7" (found /usr/lib/x86_64-linux-gnu/libpython3.4m.so)
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:313 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-2.8/Modules/FindPythonLibs.cmake:208 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:27 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/nbigaouette/pybind11/build/CMakeFiles/CMakeOutput.log".
nbigaouette pushed a commit to nbigaouette/pybind11 that referenced this pull request Jan 12, 2016
…ts to

the same python version.

Without this, the Python library and interpreter might not match version.
For example, if both Python 2.7 and 3.4 is installed, `PythonLibs` will
find /usr/lib/x86_64-linux-gnu/libpython3.4m.so while
`PythonInterp` will find /usr/bin/python2.7 (at least on Ubuntu 14.04).

When `PythonLibs` and `PythonInterp` don't point to the same Python version,
the examples will all fail:

```bash
$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Setting build type to 'MinSizeRel' as none was specified.
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.4m.so (found suitable version "3.4.3", minimum required is "2.7")
-- Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.6", minimum required is "2.7")
-- Performing Test HAS_LTO_FLAG
-- Performing Test HAS_LTO_FLAG - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /home/nbigaouette/pybind11/build
$ make test
Running tests...
Test project /home/nbigaouette/pybind11/build
      Start  1: example1
 1/12 Test  pybind#1: example1 .........................***Failed    0.02 sec
      Start  2: example2
 2/12 Test  pybind#2: example2 .........................***Failed    0.03 sec
      Start  3: example3
 3/12 Test  pybind#3: example3 .........................***Failed    0.02 sec
      Start  4: example4
 4/12 Test  pybind#4: example4 .........................***Failed    0.02 sec
      Start  5: example5
 5/12 Test  pybind#5: example5 .........................***Failed    0.02 sec
      Start  6: example6
 6/12 Test  pybind#6: example6 .........................***Failed    0.02 sec
      Start  7: example7
 7/12 Test  pybind#7: example7 .........................***Failed    0.02 sec
      Start  8: example8
 8/12 Test  pybind#8: example8 .........................***Failed    0.02 sec
      Start  9: example9
 9/12 Test  pybind#9: example9 .........................***Failed    0.02 sec
      Start 10: example10
10/12 Test pybind#10: example10 ........................***Failed    0.02 sec
      Start 11: example11
11/12 Test pybind#11: example11 ........................***Failed    0.03 sec
      Start 12: example12
12/12 Test pybind#12: example12 ........................***Failed    0.02 sec

0% tests passed, 12 tests failed out of 12

Total Test time (real) =   0.25 sec

The following tests FAILED:
          1 - example1 (Failed)
          2 - example2 (Failed)
          3 - example3 (Failed)
          4 - example4 (Failed)
          5 - example5 (Failed)
          6 - example6 (Failed)
          7 - example7 (Failed)
          8 - example8 (Failed)
          9 - example9 (Failed)
         10 - example10 (Failed)
         11 - example11 (Failed)
         12 - example12 (Failed)
Errors while running CTest
make: *** [test] Error 8
```

By adding the `EXACT` version to the `find_package()` calls, the version
discrepancy is at least caught at the cmake call:

```bash
$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Setting build type to 'MinSizeRel' as none was specified.
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
  Could NOT find PythonLibs: Found unsuitable version "3.4.3", but required
  is exact version "2.7" (found /usr/lib/x86_64-linux-gnu/libpython3.4m.so)
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:313 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-2.8/Modules/FindPythonLibs.cmake:208 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:27 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/nbigaouette/pybind11/build/CMakeFiles/CMakeOutput.log".
```
nbigaouette pushed a commit to nbigaouette/pybind11 that referenced this pull request Jan 12, 2016
This should insure that both the `PythonLibs` and `PythonInterp` points to
the same python version.

Without this, the Python library and interpreter might not match version.
For example, if both Python 2.7 and 3.4 is installed, `PythonLibs` will
find /usr/lib/x86_64-linux-gnu/libpython3.4m.so while
`PythonInterp` will find /usr/bin/python2.7 (at least on Ubuntu 14.04).

When `PythonLibs` and `PythonInterp` don't point to the same Python version,
the examples will all fail:

```bash
$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Setting build type to 'MinSizeRel' as none was specified.
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.4m.so (found suitable version "3.4.3", minimum required is "2.7")
-- Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.6", minimum required is "2.7")
-- Performing Test HAS_LTO_FLAG
-- Performing Test HAS_LTO_FLAG - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /home/nbigaouette/pybind11/build
$ make test
Running tests...
Test project /home/nbigaouette/pybind11/build
      Start  1: example1
 1/12 Test  pybind#1: example1 .........................***Failed    0.02 sec
      Start  2: example2
 2/12 Test  pybind#2: example2 .........................***Failed    0.03 sec
      Start  3: example3
 3/12 Test  pybind#3: example3 .........................***Failed    0.02 sec
      Start  4: example4
 4/12 Test  pybind#4: example4 .........................***Failed    0.02 sec
      Start  5: example5
 5/12 Test  pybind#5: example5 .........................***Failed    0.02 sec
      Start  6: example6
 6/12 Test  pybind#6: example6 .........................***Failed    0.02 sec
      Start  7: example7
 7/12 Test  pybind#7: example7 .........................***Failed    0.02 sec
      Start  8: example8
 8/12 Test  pybind#8: example8 .........................***Failed    0.02 sec
      Start  9: example9
 9/12 Test  pybind#9: example9 .........................***Failed    0.02 sec
      Start 10: example10
10/12 Test pybind#10: example10 ........................***Failed    0.02 sec
      Start 11: example11
11/12 Test pybind#11: example11 ........................***Failed    0.03 sec
      Start 12: example12
12/12 Test pybind#12: example12 ........................***Failed    0.02 sec

0% tests passed, 12 tests failed out of 12

Total Test time (real) =   0.25 sec

The following tests FAILED:
          1 - example1 (Failed)
          2 - example2 (Failed)
          3 - example3 (Failed)
          4 - example4 (Failed)
          5 - example5 (Failed)
          6 - example6 (Failed)
          7 - example7 (Failed)
          8 - example8 (Failed)
          9 - example9 (Failed)
         10 - example10 (Failed)
         11 - example11 (Failed)
         12 - example12 (Failed)
Errors while running CTest
make: *** [test] Error 8
```

By adding the `EXACT` version to the `find_package()` calls, the version
discrepancy is at least caught at the cmake call:

```bash
$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Setting build type to 'MinSizeRel' as none was specified.
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
  Could NOT find PythonLibs: Found unsuitable version "3.4.3", but required
  is exact version "2.7" (found /usr/lib/x86_64-linux-gnu/libpython3.4m.so)
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:313 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-2.8/Modules/FindPythonLibs.cmake:208 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:27 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/nbigaouette/pybind11/build/CMakeFiles/CMakeOutput.log".
```
EricCousineau-TRI referenced this pull request in EricCousineau-TRI/pybind11 Jan 9, 2018
EricCousineau-TRI referenced this pull request in EricCousineau-TRI/pybind11 Apr 10, 2018
EricCousineau-TRI referenced this pull request in EricCousineau-TRI/pybind11 Apr 11, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants