From: William S F. <ws...@fu...> - 2012-09-21 19:20:59
|
On 04/05/12 21:51, William S Fulton wrote: > On 01/05/12 21:07, Nathan Ridge wrote: > > > > ---------------------------------------- > > > From: zer...@ho... > > > To: ws...@fu... > > > Subject: RE: [Swig-user] FW: FW: [c++0x branch] enum class forward > > declarations > > > Date: Tue, 1 May 2012 20:07:18 +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? > > >> My aim is to put the C++11 support into the next or next but one > > release > > >> and to fix most (if not all) the known C++11 problems for that > > release. > > > > > > Ok, thanks. Do you have an idea about the timing of these releases? > Mmm, it really depends on what eats up my free time. I'd hope to put it > out around July. This is now fixed in the gsoc2009-matevz branch if you want to try it out. William |