Below are the changes for the current release. See the CHANGES file for changes in older releases. See the RELEASENOTES file for a summary of changes in each release. Issue # numbers mentioned below can be found on Github. For more details, add the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.2.0 (in progress) =========================== 2023-05-18: olly #1589 #2335 Support parsing arbitrary expression in decltype. Use parser error recovery to skip to the closing matching `)` and issue a warning that we can't deduce the decltype for the expression (like we already do for any expression which isn't a simple variable or similar). 2023-05-12: mmomtchev, erezgeva [Javascript] #2561 Support check typemaps for Javascript. 2023-05-12: olly [Java] #2556 Suppress Java removal warnings on finalize method. SWIG will need to stop relying on finalize methods, but we know that and meanwhile these warnings make the testsuite output very noisy. 2023-05-11: olly #302 #2079 #2474 Parse storage class more flexibly. Previously we had a hard-coded list of allowed combinations in the grammar, but this suffers from combinatorial explosion, and results in a vague `Syntax error in input` error for invalid (and missing) combinations. This means we now support a number of cases which are valid C++ but weren't supported, including `friend constexpr` and `virtual explicit`. 2023-05-08: olly #1567 Add support for std::string_view (new in C++17) for C#, Java, Lua, PHP and Tcl. 2023-05-08: olly [PHP] #2544 Wrap overloaded method with both static and non-static forms. We now wrap this as a non-static method in PHP, which means the static form only callable via an object. Previously this case could end up wrapped as static or non-static in PHP. If it was wrapped as static, attempting to call non-static overloaded forms would crash with a segmentation fault. 2023-05-06: mmomtchev, wsfulton #2550 Fix typedef/using declarations to a typedef struct/class. 2023-05-04: erezgeva [D] #2538 Drop support for D1/Tango, which was discontinued in 2012. Wrappers for D2/Phobos are now generated by default, though the -d2 command line option is still accepted (and now ignored) for backward compatibility. 2023-04-27: olly #2502 Allow using snprintf() instead of sprintf() in wrappers. We aim to produce code that works with C90 or C++98 so we can't assume snprintf() is available, but it almost always is (even on systems from before it was standardised) so having a way to use it is helpful. We enable this automatically if the compiler claims conformance with at least C99 or C++11. It can also be enabled manually by defining SWIG_HAVE_SNPRINTF. Define SWIG_NO_SNPRINTF to disable completely. The fallback is to call sprintf() without a buffer size check, which is what we've done until now. Adding a check after the call seems of limited benefit - if the buffer was overflowed then it's too late to block it, and most of our uses either have a fixed maximum possible size or dynamically allocate a buffer that's large enough. 2023-04-26: mmomtchev [Javascript] Take into account numinputs when counting arguments. 2023-04-24: olly [PHP] Add throws typemaps for std:string* and const std::string*. 2023-04-23: olly [Javascript] #2453 The testsuite and examples now select which Javascript engine to test based on what was detected by configure. Previously they'd always test with node you specified a different engine (e.g. with `ENGINE=jsc` on the make command line). Now you only need to specify ENGINE if you have more than one engine installed. 2023-04-23: olly [Javascript] Turn on C++ output when wrapping for node, like we already do when wrapping for V8-without-node. The testsuite was masking this bug by using SWIG options `-v8 -DBUILDING_NODE_EXTENSION=1` rather than `-node` when testing with nodejs, while the javascript examples were masking this by all getting processed with -c++. This shouldn't be an incompatible change for users, as if you're wrapping a C API you'd have to be working around the problem before this change (like our testsuite and examples were), and this change shouldn't break your workaround - it just makes it unnecessary. 2023-04-21: mmomtchev [Javascript] Fix naming of internal C++ helper for wrapping variables for node to use the "getter" naming scheme rather than the function wrapping one. In practice this didn't actually cause problems because Node wrappers are always compiled as C++ and the parameters are always different even if the names are the same. 2023-04-21: olly [PHP] Support INPUT,INOUT,OUTPUT for std::string&. By default SWIG/PHP wraps std::string& as a pass-by-reference PHP string parameter, but sometimes such a parameter is only for input or only for output, so add support for the named typemaps that other target languages support. 2023-04-21: degasus #2519 Fix CanCastAsInteger range check to clear errno first to fix bogus failures for valid inputs.if errno is set. 2023-04-21: ZackerySpytz [OCaml] #1439 Fix reference typemaps for std::string 2023-04-21: olly #2183 Fix #ifdef and #ifndef to work inside a %define. Previously they were silently ignored in this context (but #if defined already worked here if you need a workaround which works for older versions). 2023-04-20: erezgeva [Go] #2533 Implement argcargv.i library for Go. 2023-04-19: davidcl [Scilab] Add support for Scilab 2023.x. Introduce a `-gatewayxml6` options to generate an XML with full function names. 2023-04-19: mmomtchev https://sourceforge.net/p/swig/bugs/1163/ #1882 #2525 Fix preprocessor expansion when a macro expands to the name of another macro which takes parameters from the input following the original macro expansion. 2023-04-19: wildmaples [Ruby] #2527 Fix "undefining the allocator of T_DATA" warning seen with Ruby 3.2. 2023-04-18: davidcl [Scilab] #894 extract values with ":" for typemap (int* IN, int IN_SIZE) 2023-04-14: olly [PHP7] Support for PHP7 has been removed. PHP7 security support ended 2022-11-28 so it doesn't make sense to include support for it in the SWIG 4.2.x release series. *** POTENTIAL INCOMPATIBILITY *** 2023-04-05: wsfulton [Python] #2515 Add support for all STL containers to be constructible from a Python set. The previous implementation used the Python Sequence Protocol to convert from Python types to STL containers. The new implementation uses the Python Iterator Protocol instead and thereby can convert from a Python set too. 2023-03-25: alatina [Octave] #2512 Add support for Octave 8.1. 2023-03-22: wsfulton [C#] #2478 Minor enhancements to std::array wrappers in std_array.i. 2023-03-13: wsfulton Improved error checking when using %template to instantiate templates within the correct scope. 1. When a template is instantiated via %template and uses the unary scope operator ::, an error occurs if the instantiation is attempted within a namespace that does not enclose the instantiated template. For example, the following will now error as ::test::max is not enclosed within test1: Error: '::test::max' resolves to 'test::max' and was incorrectly instantiated in scope 'test1' instead of within scope 'test'. namespace test1 { %template(maxchar) ::test::max; } 2. SWIG previously failed to always detect a template did not exist when using %template. In particular when instantiating a global template incorrectly within namespace. The code below now correctly emits an error: Error: Template 'test5::GlobalVector' undefined. namespace test5 { } template struct GlobalVector {}; %template(GVI) test5::GlobalVector; 2023-03-13: wsfulton Error out if an attempt is made to define a class using the unary scope operator ::. The following is not legal C++ and now results in an error: Error: Using the unary scope operator :: in class definition '::Space2::B' is invalid. namespace Space2 { struct B; } struct ::Space2::B {}; 2023-03-08: wsfulton Fix duplicate const in generated code when template instantiation type is const and use of template parameter is also explicitly const, such as: template struct Conster { void cccc1(T const& t) {} }; %template(ConsterInt) Conster; Above previously led to generated code: (arg1)->cccc1((int const const &)*arg2); instead of (arg1)->cccc1((int const &)*arg2); 2023-03-01: wsfulton Partial template specialization fixes to support default arguments from the primary template's parameter list. template struct X { void primary() {} }; // Previously the specialization below resulted in: // Error: Inconsistent argument count in template partial specialization. 1 2 template struct X { void special(YY*) {} }; // Both of these correctly wrap the partially specialized template %template(StringPtr) X; %template(ShortPtr) X; 2023-02-15: wsfulton #1300 Further partial template specialization fixes. Fixes when templates are used as a template parameter in a partially specialized instantiation such as: template struct Vect {}; template class Foo { ... }; template class Foo, TTS> { ... }; %template(VectInt) Vect; %template(FooVectIntDouble) Foo, double>; // was previously attempting to use primary template Also fixes partial specialization where the same template parameter name is used twice, for example: template struct H { ... }; template struct H { ... }; %template(HInts) H; // was previously attempting to use primary template 2023-01-27: jschueller #2492 [python] Fix unused parameter warnings for self parameter in generated C/C++ wrapper code. 2023-01-14: wsfulton Fix deduction of partially specialized template parameters when the specialized parameter is non-trivial, used in a wrapped method and the type to %template uses typedefs. For example: typedef double & DoubleRef; template struct XX {}; template struct XX { void fn(T t) {} }; %template(XXD) XX; The type of the parameter in the instantiated template for fn is now correctly deduced as double. 2023-01-03: wsfulton #983 Fix seg fault when instantiating templates with parameters that are function parameters containing templates, such as: %template(MyC) C)>; 2023-01-03: wsfulton Complete support for C++11 variadic function templates. Support was previously limited to just one template parameter. Now zero or more template parameters are supported in the %template instantiation. 2022-12-29: wsfulton #1863 Syntax error fixes parsing more elaborate parameter pack arguments that are used in function pointers, member function pointers: template struct VariadicParms { void ParmsFuncPtrPtr(int (*)(V*...)) {} void ParmsFuncPtrPtrRef(int (*)(V*&...)) {} void ParmsFuncPtrPtrRValueRef(int (*)(V*&&...)) {} void ParmsFuncPtrRef(int (*)(V&...)) {} void ParmsFuncPtrRValueRef(int (*)(V&&...)) {} void ParmsMemFuncPtrPtr(int (KlassMemFuncs::*)(V*...)) {} void ParmsMemFuncPtrPtrRef(int (KlassMemFuncs::*)(V*&...)) {} void ParmsMemFuncPtrPtrRValueRef(int (KlassMemFuncs::*)(V*&&...)) {} void ParmsMemFuncPtrRef(int (KlassMemFuncs::*)(V&...)) {} void ParmsMemFuncPtrRValueRef(int (KlassMemFuncs::*)(V&&...)) {} }; %template(VariadicParms0) VariadicParms<>; %template(VariadicParms1) VariadicParms; Also in various other places such as within noexcept specifiers: template void emplace(Args &&... args) noexcept( std::is_nothrow_constructible::value); 2022-12-27: wsfulton Fix instantiation of variadic class templates containing parameter pack arguments that are function pointers. template struct VariadicParms { void ParmsFuncPtrVal(int (*)(V...)) {} }; %template(VariadicParms0) VariadicParms<>; %template(VariadicParms1) VariadicParms; 2022-12-23: wsfulton #1863 Fix syntax error parsing variadic templates containing parameter pack arguments that are function pointers. 2022-12-22: wsfulton Complete support for C++11 variadic class templates. Support was previously limited to just one template parameter. Now zero or more template parameters are supported. 2022-12-06: wsfulton #1636 Fix syntax error for misplaced Doxygen comment after struct/class member. Fix syntax error using Doxygen member groups syntax, "///*}", when used after final struct/class member. 2022-12-05: wsfulton #2023 Fix garbled Doxygen post comments in parameter lists. Fix syntax error parsing a trailing Doxygen comment in parameter lists. 2022-12-03: wsfulton #1609 Fix syntax error parsing of Doxygen comments after last enum item. 2022-12-03: wsfulton #1715 Fix syntax error parsing of unconventionally placed Doxygen post comments for enum items. 2022-12-02: wsfulton #624 #1021 Improved template template parameters support. Previously, specifying more than one simple template template parameter resulted in a parse error. Now multiple template template parameters are working including instantiation with %template. Example: template class, class> class Op, template class X, class Y> class C { ... }; 2022-11-26: wsfulton #1589 #1590 Slightly better decltype() support for expressions, such as: int i,j; ... decltype(i+j) ... ... decltype(&i) ... These result in a warning for non-trivial expressions which SWIG cannot evaluate: Warning 344: Unable to deduce decltype for 'i+j'. See 'Type Inference' in CPlusPlus.html for workarounds. 2022-11-22: wsfulton #366 #1037 Fix seg fault handling template parameter expressions containing '<=' or '>='. 2022-11-18: wsfulton Duplicate class template instantiations via %template now issue a warning and are ignored. %template(Aint) A; %template(Aint2) A; // Now ignored and issues a warning example.i:7: Warning 404: Duplicate template instantiation of 'A< int >' with name 'Aint2' ignored, example.i:6: Warning 404: previous instantiation of 'A< int >' with name 'Aint'. A single empty template instantiation before a named instantiation is the one exception for allowing duplicate template instantiations as the empty template instantation does not create a wrapper for the template, it merely adds the instantiation into SWIG's internal type system. Duplicate empty template instantiations are quietly ignored. %template() B; %template(Bint) B; // OK %template() C; %template() C; // Quietly ignored now %template(Cint) C; // OK Note that default template parameters are considered when looking for duplicates such as: template struct D {}; %template(Dint) D; %template(Dintshort) D; example.i:7: Warning 404: Duplicate template instantiation of 'D< int,short >' with name 'Dintshort' ignored, example.i:6: Warning 404: previous instantiation of 'D< int >' with name 'Dint'. Note that the following always was ignored, but that was because the chosen name was a duplicate rather than the template being a duplicate: %template(Eint) E; %template(Eint) E; // Always has been ignored as a redefined identifier The old warning was: example.i:7: Warning 302: Identifier 'Eint' redefined (ignored) (Renamed from 'E< int >'), example.i:6: Warning 302: previous definition of 'Eint' (Renamed from 'E< int >'). *** POTENTIAL INCOMPATIBILITY ***