%module derived_byvalue #ifdef SWIGOCAML %warnfilter(SWIGWARN_PARSE_KEYWORD) method; #endif %inline %{ struct Foo { int x; // this works int rmethod(const Foo& f) { return f.x; } // this doesn't when DerFoo (below) is introduced int method(Foo f) { return f.x; } }; struct Bar { Foo a; struct Foo b; }; /* When the next derived class is declared, the following bad method is generated static void *_DerFooTo_Foo(void *x) { // **** bad **** return (void *)((Foo) ((DerFoo) x)); } static void *_p_DerFooTo_p_Foo(void *x) { // *** good *** return (void *)((Foo *) ((DerFoo *) x)); } if the derived class is deleted, it works again if the previous Foo::method is deleted, it works again */ struct DerFoo : Foo { }; /* The problem is caused by accidentally remembering a object value type instead of an object pointer type. During the course of SWIGing a file, several calls to SwigType_remember() or SwigType_remember_clientdata() will be made. When the SwigType_emit_type_table() function is called it emits all the type conversion functions. If a object type exists in the SwigType table, you get this error. You can view the SwigType table, with a #define DEBUG at the top of Source/Swig/typesys.c When run you get an output like this: ---r_mangled--- Hash { '_p_Bar' : Hash { 'p.Bar' : _p_Bar, } , '_p_DerFoo' : Hash { 'p.DerFoo' : _p_DerFoo, } , '_p_Foo' : Hash { 'r.Foo' : _p_Foo, 'p.Foo' : _p_Foo, } , '_Foo' : Hash { 'Foo' : _Foo, } , } .... The last field ('_Foo') is an object type and caused the error. It can be fixed either by checking all the calls to SwigType_remember() and by checking the typemaps. The typemap code also calls SwigType_remember(), if your typemaps defined an object type, it will be added into the SwigType table. its normally a SWIG_ConvertPtr(....$descriptor...) when it should have been a $&descriptor or $*descriptor Commenting out all your object typemaps (and typecheck fns) may help isolate it. */ # %}