From: Nathan R. <zer...@ho...> - 2012-04-27 05:21:50
|
---------------------------------------- > From: zer...@ho... > To: swi...@li... > Date: Tue, 24 Apr 2012 04:03:49 +0000 > Subject: [Swig-user] FW: FW: [c++0x branch] enum class forward declarations > > > ---------------------------------------- > > From: zer...@ho... > > To: ws...@fu... > > Subject: RE: [Swig-user] FW: [c++0x branch] enum class forward declarations > > Date: Tue, 24 Apr 2012 04:03:28 +0000 > > > > > > > >> Fixed now. Previously the base type was limited to a few standard > > > >> primitive types, now it also works with more complex types that resolve > > > >> to an acceptable underlying integral type, eg: > > > > > > > > Thanks! My interface file now passes SWIG without any syntax errors. > > > > > > > > However, there is still an issue with enum classes when tying to compile > > > > the wrapper code. If I have this header file: > > > > > > > > enum class MyEnum : int; > > > > struct S > > > > { > > > > MyEnum myenum; > > > > }; > > > > > > > > and I run SWIG and then try to compile the wrapper code as follows: > > > > > > > > swig -php -c++ test.i > > > > g++ `php-config5 --includes` -fpic -c -std=c++11 test_wrap.cpp > > > > > > > > I get the following errors: > > > > > > > > test_wrap.cpp: In function 'void _wrap_S_myenum_get(int, zval*, zval**, zval*, int)': > > > > test_wrap.cpp:1146:5: error: cannot convert 'MyEnum' to 'long int' in assignment > > > > > > > > The problem is with the following line in the function _wrap_S_myenum_get(): > > > > > > > > (*return_value).value.lval = result; > > > > > > > > The LHS is of type 'long', but the RHS is of type 'MyEnum', and C++11 does not allow > > > > an implicit conversion between them. Rather, a cast is needed: > > > > > > > > (*return_value).value.lval = (long)result; > > > > > > > > Would it be possible to fix this? > > > > > > Fixed this for php now. > > > > Thanks! One more error related to enum classes :) > > > > Header file: > > > > enum class MyEnum {A, B}; > > > > The wrapper code fails to compile, this time for both php and python (and maybe others > > I haven't tried). > > > > For php the error is: > > > > test_wrap.cpp: In function 'int zm_startup_test(int, int)': > > test_wrap.cpp:1397:1: error: 'A' was not declared in this scope > > test_wrap.cpp:1398:1: error: 'B' was not declared in this scope > > > > The problem is the following line: > > > > SWIG_LONG_CONSTANT(A, A); > > > > which expands to: > > > > zend_register_long_constant((char*)"A", sizeof("A"), A, (1<<0) | (1<<1), module_number ) > > > > That should instead be: > > > > zend_register_long_constant((char*)"A", sizeof("A"), MyEnum::A, (1<<0) | (1<<1), module_number ) > > > > (note the explicit qualification on MyEnum::A). > > > > Thanks, > > Nate > > Any chance this could be fixed? Thanks! Nate |