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-23: olly
	    #2606 Improve error output when SWIG reaches EOF while looking for
	    a closing delimiter.  This is reported with an error like:

	    Error: Missing '}'. Reached end of input.

	    We now exit after reporting this and so no longer report a second
	    more generic error like:

	    Error: Syntax error in input(1).

2023-05-22: mmomtchev
	    [Javascript] #2600 Improve test coverage by adding _runme.js files
	    for 22 test cases.

2023-05-20: erezgeva
	    [C#, D, Java, Javascript, Guile, Scilab] #2552 Implement argcargv.i
            library multi-argument typemaps.

2023-05-20: erezgeva
	    [D] #56 #2538 #2570 The generated code now works with recent D releases:
            adds override keyword on overridden methods.

            Support is now working using DMD, gcc D and LLVM D compilers.

2023-05-20: olly
	    Support deducing the type for decltype(false) and
	    decltype(true).

2023-05-19: olly
	    #2446 Add support for auto without trailing return type, which is a
	    C++14 feature.

2023-05-19: olly
	    SWIG no longer defines preprocessor symbols corresponding to
	    command line options (e.g. `-module blah` was resulting in
	    `SWIGOPT_MODULE` being set to `blah`).  This feature was added in
	    2001 so that "[m]odules can look for these symbols to alter their
	    code generation if needed", but it's never been used for that
	    purpose in over 20 years, and has never been documented outside of
	    CHANGES.

2023-05-18: olly
	    SWIG now defines __STDC__ to 1 to match the behaviour of ISO C/C++
	    compilers, rather than to have an empty value.

	    *** POTENTIAL INCOMPATIBILITY ***

2023-05-18: olly
	    #2591 The value of __cplusplus SWIG defines can now be overridden
	    on the command line, e.g. using -D__cplusplus=201103L which is
	    useful if you're wrapping headers which have preprocessor checks
	    based on its value.  By default SWIG now defines __cplusplus to
	    199711L (the value for C++98) rather than setting its value to
	    be __cplusplus.

	    *** POTENTIAL INCOMPATIBILITY ***

2023-05-18: olly
	    #2591 Add new -U command line option to undefine a preprocessor
	    symbol.

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, Perl, PHP, Ruby 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.

	    *** POTENTIAL INCOMPATIBILITY ***

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<char>;
              }

            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<typename T> struct GlobalVector {};
              %template(GVI) test5::GlobalVector<int>;

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 <typename T> struct Conster {
                void cccc1(T const& t) {}
              };
              %template(ConsterInt) Conster<const int>;

            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<class Y, class T=int> struct X { void primary() {} };
              // Previously the specialization below resulted in:
              // Error: Inconsistent argument count in template partial specialization. 1 2
              template<class YY> struct X<YY*> { void special(YY*) {} };

              // Both of these correctly wrap the partially specialized template
              %template(StringPtr) X<const char *>;
              %template(ShortPtr) X<short *, int>;

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<typename V> struct Vect {};
              template<class T, typename TT> class Foo { ... };
              template<class TS, typename TTS> class Foo<Vect<TS>, TTS> { ... };
              %template(VectInt) Vect<int>;
              %template(FooVectIntDouble) Foo<Vect<int>, double>; // was previously attempting to use primary template

            Also fixes partial specialization where the same template parameter name is used twice,
            for example:

              template<typename X, typename Y> struct H { ... };
              template<typename T> struct H<T, T> { ... };
              %template(HInts) H<int, int>; // 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 <typename T> struct XX {};
              template <typename T> struct XX<T &> { void fn(T t) {} };
              %template(XXD) XX<DoubleRef>;

            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<int(std::vector<int>)>;

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 <typename... V> 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<A>;

            Also in various other places such as within noexcept specifiers:

              template<typename T, typename... Args>
              void emplace(Args &&... args) noexcept(
                  std::is_nothrow_constructible<T, Args &&...>::value);

2022-12-27: wsfulton
            Fix instantiation of variadic class templates containing parameter pack arguments that
            are function pointers.

              template <typename... V> struct VariadicParms {
                void ParmsFuncPtrVal(int (*)(V...)) {}
              };

              %template(VariadicParms0) VariadicParms<>;
              %template(VariadicParms1) VariadicParms<A>;

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 <template<template<class> class, class> class Op, template<class> 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<int>;
                %template(Aint2) A<int>; // 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<int>;
                %template(Bint) B<int>; // OK

                %template() C<int>;
                %template() C<int>; // Quietly ignored now
                %template(Cint) C<int>; // OK

            Note that default template parameters are considered when looking for duplicates such as:

                template <typename T, typename U = short> struct D {};
                %template(Dint) D<int>;
                %template(Dintshort) D<int, short>;

            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<int>;
                %template(Eint) E<int>; // 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 ***
