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.1.0 (in progress)
===========================

2022-05-04: wsfulton
            [C#] Add C# wchar_t * director typemaps

2022-04-20: cminyard
	    Fix an issue where newlines were not properly generated
	    for godirectorin typemaps.  If you have a virtual function
	    not assigned to zero, in some cases it won't generate a
	    newline and you will see errors:
	      example.go:1508:3: expected ';', found swig_r
	    when compiling the go code.

	    Also add an example of using goin and godirectorin and add
	    a test for this situation.

2022-04-29: jason-daly, JerryJoyce, wsfulton
	    [C#] #1233 Add wchar_t * and std::wstring Unicode string support on Linux.

2022-04-11: robinst
	    #2257 Fix new Ruby 3.2 warning "undefining the allocator of T_DATA
	    class swig_runtime_data".

2022-04-07: olly
	    #1750 SWIG now recognises and ignores Doxygen group commands `@{` and `@}`.

2022-04-06: wsfulton
            ./configure now enables C++11 and later C++ standards testing by default (when
            running: 'make check').

            The options to control this testing are the same:

              ./configure --enable-cpp11-testing
              ./configure --disable-cpp11-testing

            But the former is now the default and the latter can be used to turn off C++11 and
            later C++ standards testing.

2022-04-06: wsfulton
            [Python] #1635 The "autodoc" feature no longer overrides Doxygen comments
            in the generated docstring.

            If a "docstring" feature is present it will still override a Doxygen comment.
            If the "autodoc" feature is also present, the combined "autodoc" and "docstring"
            will override the Doxygen comment. If no "docstring" is present then the
            "autodoc" feature will not be generated when there is a Doxygen comment.

            This way the "autodoc" feature can be specified and used to provide documentation
            for 'missing' Doxygen comments.

            *** POTENTIAL INCOMPATIBILITY ***

2022-04-01: olly
	    Remove undocumented and non-functional -browse command line option.

2022-03-26: eltoder
            [Python] #1684 Use different capsule names with and without -builtin

            Types generated with and without -builtin are not compatible. Mixing
            them in a common type list leads to crashes. Avoid this by using
            different capsule names: "type_pointer_capsule" without -builtin and
            "type_pointer_capsule_builtin" with.

2022-03-25: wsfulton
            The debug command line options that display parse tree nodes
            (-debug-module, -debug-top, -debug-symtabs) now display previously hidden
            linked list pointers which are useful for debugging parse trees.

            Added new command line option -debug-quiet. This suppresses the display
            of most linked list pointers and symbol table pointers in the parse tree nodes.

            The keys in the parse tree node are now shown in alphabetical order.

2022-03-24: wsfulton
            #2244 Fix using declaration in derived class bugs when all the base
            class's overloaded methods were overridden in the derived class -
            fixes "multiply defined" errors.

2022-03-23: wsfulton
            [Python] #1779 The -py3 option is deprecated and now has no effect on the
            code generated. Use of this option results in a deprecated warning.
            The related SWIGPYTHON_PY3 macro that this option defined is no longer generated.

            Note that %pythonnondynamic feature generates a metaclass that works on both
            Python 2 and Python 3.

2022-03-21: wsfulton
            [Python] #1779 pyabc.i for abstract base classes now supports versions of
            Python prior to 3.3 by using the collection module for these older versions.
            Python-3.3 and later continue to use the collections.abc module.
            The -py3 option no longer has any effect on the %pythonabc feature.

2022-03-21: jschueller, jim-easterbrook, wsfulton
            [Python] #2137 C++ static member functions no longer generate a "flattened"
            name in the Python module. For example:

              s = example.Spam()
              s.foo()               # Spam::foo() via an instance
              example.Spam.foo()    # Spam::foo() using class method
              example.Spam_foo()    # Spam::foo() "flattened" name

            The "flattened" name is no longer generated, but can be generated
            by using the new -flatstaticmethod option.

            *** POTENTIAL INCOMPATIBILITY ***

2022-03-18: ianlancetaylor
	    [Go] #337 Implement %extend base methods in child classes.

2022-03-17: olly
	    [Python] #1779 SWIG's Python test-suite and examples are now
	    run with Python 3 by default.  To run them with Python 2, set
	    PY2 to a non-empty value, e.g.:

	    make check-python-test-suite PY2=1

2022-03-16: olly
	    [Go] #683 -intgosize is now optional - if not specified the
	    generated C/C++ wrapper code will use ptrdiff_t for intgo and
	    size_t for uintgo.

2022-03-15: ianlancetaylor
	    [Go] Add typemaps for std::string*.

2022-03-15: ianlancetaylor
	    [Go] Don't convert arrays to pointers if there is a "gotype"
	    typemap entry.

2022-03-15: ianlancetaylor
	    [Go] Add documentation note about Go and C++ exceptions.

2022-03-12: wsfulton
            #1524 %interface family of macros no longer contain the getter/setter
            methods for wrapping variables. The interface only contains
            virtual and non-virtual instance methods, that is, no static methods.
            Enums are also no longer added to the interface (affects Java only where
            they were missing from the proxy class, C# never had them in the interface).

            *** POTENTIAL INCOMPATIBILITY ***

2022-03-12: wsfulton
            #1277 Fixes for the family of %interface macros, %interface,
            %interface_impl and %interface_custom fixes for overloaded methods
            in an inheritance chain.

            When C++ methods are not able to be overloaded in a derived class,
            such as when they differ by just const, or the target language
            parameters types are identical even when the C++ parameter types
            are different, SWIG will ignore one of the overloaded methods with
            a warning. A %ignore is required to explicitly ignore one of the
            overloaded methods to avoid the warning message. Methods added
            in the derived classes due to one of the %interface macros are now
            similarly ignored/not added to the derived class.

            The methods added to the derived classes can now also be modified
            via %feature and %rename.

2022-03-08: ianlancetaylor
	    [Go] Treat a nil argument as a NULL pointer.

2022-03-08: ianlancetaylor
	    [Go] Add documentation notes about thread local storage.

2022-03-08: olly
	    #1006 SWIG now copes with an interface filename specified on the
	    command line which contains a closing parenthesis `)`, and more
	    generally with attributes to `%include` and `%import` which
	    are quoted and contain parentheses.

2022-03-07: Omar Medina
	    [Tcl] https://sourceforge.net/p/swig/bugs/1290/
	    Fix SWIG_AsWCharPtrAndSize() to actually assign to result
	    variable.  It looks like SWIG/Tcl wide character handling is
	    currently fundamentally broken except on systems which use wide
	    characters as the system encoding, but this should fix wrapping
	    functions which take a wide string as a parameter on Microsoft
	    Windows.

2022-03-07: olly
	    [Javascript] #682 Fix handling of functions which take void*.

2022-03-06: olly
	    SWIG should now reliably exit with status 0 if the run was
	    successful and status 1 if there was an error (or a warning and
	    -Werror was in effect).

	    Previously in some situations SWIG would try to exit with the
	    status set to the number of errors encountered, but that's
	    problematic - for example if there were 256 errors this would
	    result in exit status 0 on most platforms.  Also some error
	    statuses have special meanings e.g. those defined by <sysexits.h>.
	    Also SWIG/Javascript tried to exit with status -1 in a few places
	    (which typically results in exit status 255).

2022-03-05: wsfulton
            #1441 Fix using declaration in derived class incorrectly introducing a method
            from a base class when the using declaration is declared before the method
            declaration. Problem occurred when within a namespace and the parameter types
            in the method signatures were not fully qualified.
2022-03-05: ianlancetaylor
	    [Go] Treat non-const references as pointers.

2022-03-05: ianlancetaylor
	    In SWIG Go testsuite, fail test if "go build" fails.

2022-03-03: olly
	    #1901 #2223 SWIG should now always exit cleanly if memory
	    allocation fails, including removing any output files created
	    during the current run.

	    Previously most places in the code didn't check for a NULL return
	    from malloc()/realloc()/calloc() at all, typically resulting in
	    undefined behaviour; some places used assert() to check for a NULL
	    return (which is a misuse of assert() and such checks disappear if
	    built with NDEBUG defined leaving us back with undefined
	    behaviour).

2022-03-03: olly
	    #891 Report errors for typemap attributes without a value
	    (previously SWIG segfaulted) and for typemap types with a value
	    (previously the value was quietly ignored).

	    The old way of specifying a language name in the typemap attributes
	    is no longer supported (it has been deprecated for 16 years).

2022-03-02: geographika, wsfulton
            [Python] #1951 Add Python variable annotations support.

            Both function annotations and variable annotations are turned on using the
            "python:annotations" feature. Example:

              %feature("python:annotations", "c");

              struct V {
                float val;
              };

            The generated code contains a variable annotation containing the C float type:

              class V(object):
                  val: "float" = property(_example.V_val_get, _example.V_val_set)
                  ...

            Python 3.5 and earlier do not support variable annotations, so variable
            annotations can be turned off with a "python:annotations:novar" feature flag.
            Example turning on function annotations but not variable annotations globally:

              %feature("python:annotations", "c");
              %feature("python:annotations:novar");

            or via the command line:

              -features python:annotations=c,python:annotations:novar

            *** POTENTIAL INCOMPATIBILITY ***

2022-02-27: wsfulton
            [Python] #735 #1561 Function annotations containing C/C++ types are no longer
            generated when using the -py3 option. Function annotations support has been
            moved to a feature to provide finer grained control. It can be turned on
            globally by adding:

              %feature("python:annotations", "c");

            or by using the command line argument:

              -features python:annotations=c

            Also see entry dated 2022-03-02, regarding variable annotations.

            *** POTENTIAL INCOMPATIBILITY ***

2022-02-26: wsfulton
            #655 #1840 Add new warning WARN_LANG_USING_NAME_DIFFERENT to warn when a
            method introduced by a using declaration in a derived class cannot
            be used due to a conflict in names.

2022-02-24: olly
	    #1465 An invalid preprocessor expression is reported as a pair of
	    warnings with the second giving a more detailed message from the
	    expression evaluator.  Previously SWIG prefixed the second message
	    with "Error:" - that was confusing as it's actually only a warning
	    by default so we've now dropped this prefix.

	    Before:

	    x.i:1: Warning 202: Could not evaluate expression '1.2'
	    x.i:1: Warning 202: Error: 'Floating point constant in preprocessor expression'

	    Now:

	    x.i:1: Warning 202: Could not evaluate expression '1.2'
	    x.i:1: Warning 202: Floating point constant in preprocessor expression

2022-02-23: olly
	    #1384 Fix a preprocessor expression evaluation bug.  A
	    subexpression in parentheses lost its string/int type flag and
	    instead used whatever type was left in the stack entry from
	    previous use.  In practice we mostly got away with this because
	    most preprocessor expressions are integer, but it could have
	    resulted in a preprocessor expression incorrectly evaluating as
	    zero.  If -Wextra was in use you got a warning:

	    Warning 202: Error: 'Can't mix strings and integers in expression'

2022-02-21: davidcl
	    [Scilab] Improve 5.5.2, 6.0.0 and 6.1.0 support.

	    For Scilab 5, long names are reduced to small names preserving the 
	    class prefix and accessor suffix (get or set).

	    For Scilab 6, long names with the class prefix and accessor suffix
	    should be used on the user code.

	    The `-targetversion` option has been removed as the generated code
	    now detects the Scilab version in loader.sce or builder.sce.

	    *** POTENTIAL INCOMPATIBILITY ***

2022-02-20: wsfulton
            Fix %warnfilter warning suppress for warning 315 SWIGWARN_PARSE_USING_UNDEF.

2022-02-17: olly
	    [PHP] https://sourceforge.net/p/swig/bugs/1211/
	    Fix to call cleanup code in exception situations and not to invoke
	    the freearg typemap twice in certain situations.

2022-02-15: olly
	    #300 #368 Improve parser handling of % followed immediately by
	    an identifier.  If it's not a recognised directive the scanner
	    now emits MODULO and then rescans what follows, and if the parser
	    then gives a syntax error we report it as an unknown directive.
	    This means that `a%b` is now allowed in an expression, and that
	    things like `%std::vector<std::string>` now give an error rather
	    than being quietly ignored.

2022-02-11: adr26
            [Python] #2154 Fix memory leak.

            SWIG python objects were being freed after the corresponding SWIG
            module information was destroyed in Python 3, causing leaks when as
            a result the object destructor could not be invoked. To prevent this
            misordering, SWIG python objects now obtain a reference to the
            Python capsule wrapping the module information, so that the module
            information is correctly destroyed after all SWIG python objects
            have been freed (and corresponding destructors invoked).

2022-02-10: olly
	    [Tcl] https://sourceforge.net/p/swig/bugs/1207/
	    https://sourceforge.net/p/swig/bugs/1213/

	    Fix Tcl generic input typemap for std::vector.

2022-02-07: sethrj
            #2196 Add alternative syntax for specifying fragments in typemaps.

            New syntax:
              %typemap("in", fragment="frag1", fragment="frag2", fragment="frag3") {...}
            which is equivalent to:
              %typemap(in, fragment="frag1,frag2,frag3") {...}


2022-02-07: olly
	    #1806 Remove support for the "command" encoder, which was mostly
	    intended for use in `%rename` - most uses can be achieved using
	    the "regex" encoder, so we recommend using that instead.

	    The "command" encoder suffers from a number of issues - as the
	    documentation for it admitted, "[it] is extremely slow compared to
	    all the other [encoders] as it involves spawning a separate process
	    and using it for many declarations is not recommended" and that it
	    "should generally be avoided because of performance
	    considerations".

	    But it's also not portable.  The design assumes that `/bin/sh`
	    supports `<<<` but that's a bash-specific feature so it doesn't
	    work on platforms where `/bin/sh` is not bash - it fails on
	    Debian, Ubuntu and probably some other Linux distros, plus most
	    non-Linux platforms.  Microsoft Windows doesn't even have a
	    /bin/sh as standard.

	    Finally, no escaping of the passed string is done, so it has
	    potential security issues (though at least with %rename the input
	    is limited to valid C/C++ symbol names).

2022-02-06: olly
	    #2193 -DFOO on the SWIG command line now sets FOO to 1 for
	    consistency with C/C++ compiler preprocessors.  Previously
	    SWIG set FOO to an empty value.

2022-02-06: sethrj
	    #2194 Classes that are non-assignable due to const data or const
	    reference members are now automatically detected.

2022-02-04: friedrichatgc
	    [Octave] #1672 Fix for isobject for Octave 4.4 - 6.0.

2022-02-03: olly
	    [C#] #283 #998 Fix memory leak in directorin typemap for
	    std::string.

2022-02-03: olly
	    [Python] #967 Make `self` parameter available to user typemaps.

2022-02-03: teythoon
	    [Python] #801 Fix -Wunused-parameter warnings with builtin,

2022-02-03: teythoon
	    #801 Fix -Wstrict-prototypes warnings in generated pointer
	    functions.

2022-02-03: olly
	    #660 https://sourceforge.net/p/swig/bugs/1081/
	    Default parameter values containing method calls are now parsed and
	    handled - e.g. `x->foo(3,4)` and `y.z()`.

2022-02-02: olly
	    [Ruby] https://sourceforge.net/p/swig/bugs/1136/ Fix remove of prefix
	    from method name to only remove it at the start.

2022-02-01: olly
	    #231 Handle returning an object by reference in a C++ trailing
	    return type.

2022-02-01: davidcl
            [Scilab] #745 use SWIG_<module>_Init() as a C module init function.

2022-02-01: olly
	    [OCaml] #2083 Fix to work when CAML_SAFE_STRING is on, which it is
	    by default in recent Ocaml releases.

2022-01-31: mreeez
	    https://sourceforge.net/p/swig/bugs/1147/
	    Fix copyToR() generated for a struct in a namespace.

2022-01-29: fschlimb
	    #655 Better handling of using declarations.

2022-01-29: dontpanic92
	    [Go] #676 Fix code generated for a C++ class with a non-capitalised
	    name.

2022-01-26: trex58
	    #1919 #1921 #1923 Various fixes for AIX portability.

2022-01-26: olly
	    #1935 Don't crash on an unclosed HTML tag in a doxygen comment
	    when -doxygen is specified.

2022-01-25: olly
	    Constant expressions now support member access with `.` such as
	    `foo.bar`.  Previous this only worked in a case like `x->foo.bar`.

2022-01-25: olly
	    #2091 Support most cases of `sizeof` applied to an expression
	    in constant expressions.  Previously there was only support for
	    `sizeof(<type>)` and expressions which syntactically look like a
	    type (such as `sizeof(foo)`).

2022-01-25: olly
	    #80 #635 https://sourceforge.net/p/swig/bugs/1139/
	    Add support for parsing common cases of `<` and `>` comparisons
	    in constant expressions.  Adding full support for these seems hard
	    to do without introducing conflicts into the parser grammar, but in
	    fact all reported cases have had parentheses around the comparison
	    and we can support that with a few restrictions on the left side of
	    `<`.

2022-01-25: wsfulton
            New warning 327 for extern templates, eg:

              extern template class std::vector<int>;
              extern template void Func<int>();

            results in warning

              example.i:3: Warning 327: Extern template ignored.
              example.i:4: Warning 327: Extern template ignored.

            Extern template classes previously resulted in warning 320.

2022-01-24: romintomasetti
            #2131 #2157 C++11 extern function template parsing error fix.

2022-01-21: wsfulton
            #2120 #2138 Replace legacy PCRE dependency with PCRE2.
            This requires changes for building SWIG from source. See updated
            html documentation in Preface.html and Windows.html. Updated
            instructions are also shown when running ./configure if PCRE2 is not
            found. Note that debian based systems can install PCRE2 using:

              apt install libpcre2-dev

            Note that https://github.com/swig/swig/wiki/Getting-Started also has
            updated information for building from source.

2022-01-19: olly
	    [PHP] #2027 Automatically generate PHP type declarations for PHP 8.
	    The generate code still compiles for PHP 7.x, but without type
	    declarations since PHP 7.x has much more limited type declaration
	    support.

2022-01-18: olly
	    [Perl] #1629 Perl 5.8.0 is now the oldest version we aim to support.

2022-01-14: wsfulton
            [Python] Fix %callback and specifying the callback function as a
            static member function using Python staticmethod syntax, such as
            Klass.memberfunction instead of Klass_memberfunction when using
            -builtin and -fastproxy.

2022-01-11: wsfulton
            [Python] Accept keyword arguments accessing static member functions when
            using -builtin and kwargs feature and Python class staticmethod syntax.
            The missing keyword argument support was only when using the
            class staticmethod syntax, such as Klass.memberfunction, and not when
            using the flat static method syntax, such as Klass_memberfunction.

2022-01-04: juierror
            [Go] #2045 Add support for std::array in std_array.i.

2021-12-18: olly
	    [PHP] Add PHP keyword 'readonly' (added in 8.1) to the list SWIG
	    knows to automatically rename.  This keyword is special in that PHP
	    allows it to be used as a function (or method) name.

2021-12-07: vstinner
            [Python] #2116 Python 3.11 support: use Py_SET_TYPE()

2021-12-05: rwf1
            [Octave] #2020 #1893 Add support for Octave 6 up to and including 6.4.
            Also add support for compiling with -Bsymbolic which is used by default
            by mkoctfile.

2021-12-02: jsenn
            [Python] #2102 Fixed crashes when using embedded Python interpreters. 

2021-11-12: wsfulton
            [Javascript] v8 and node only. Fix mismatched new char[] and free()
            when wrapping C code char arrays. Now calloc is now used instead of
            new char[] in SWIG_AsCharPtrAndSize.

2021-10-03: ajrh1
            [Perl] #2074: Avoid -Wmisleading-indentation in generated code
            when using gcc11.

2021-10-03: jschueller
            [CMake] #2065: Add option to enable or disable PCRE support.

2021-09-16: ianlancetaylor
            [Go] Improved _cgo_panic implementation.

2021-09-16: ianlancetaylor
            [Go] Don't use crosscall2 for panicking. Instead rely on documented
            and exported interfaces.

2021-09-14: ianlancetaylor
            [Go] Remove -no-cgo option (long unsupported in Go)

2021-05-04: olly
	    [PHP] #2014 Throw PHP exceptions instead of using PHP errors

	    PHP exceptions can be caught and handled if desired, but if they
	    aren't caught then PHP exits in much the same way as it does for a
	    PHP error.

	    In particular this means parameter type errors and some other cases
	    in SWIG-generated wrappers now throw a PHP exception, which matches
	    how PHP's native parameter handling deals with similar situations.

	    `SWIG_ErrorCode()`, `SWIG_ErrorMsg()`, `SWIG_FAIL()` and `goto thrown;`
	    are no longer supported (these are really all internal implementation
	    details and none are documented aside from brief mentions in CHANGES
	    for the first three).  I wasn't able to find any uses in user interface
	    files at least in FOSS code via code search tools.

	    If you are using these:

	    Use `SWIG_PHP_Error(code,msg);` instead of `SWIG_ErrorCode(code);
	    SWIG_ErrorMsg(msg);` (which will throw a PHP exception in SWIG >= 4.1
	    and do the same as the individual calls in older SWIG).

	    `SWIG_FAIL();` and `goto thrown;` can typically be replaced with
	    `SWIG_fail;`.  This will probably also work with older SWIG, but
	    please test with your wrappers if this is important to you.

	    *** POTENTIAL INCOMPATIBILITY ***

2021-05-17: adr26
            [Python] #1985 Fix memory leaks:

            1. Python object references were being incorrectly retained by
            SwigPyClientData, causing swig_varlink_dealloc() never to run / free
            memory. SwigPyClientData_New() / SwigPyClientData_Del() were updated
            to fix the object reference counting, causing swig_varlink_dealloc()
            to run and the memory swig_varlink owns to be freed.

            2. SwigPyClientData itself was not freed by SwigPyClientData_Del(),
            causing another heap leak. The required free() was added to
            SwigPyClientData_Del()

            3. Fix reference counting/leak of python cached type query

            4. Fix reference counting/leak of SwigPyObject dict (-builtin)

            5. Python object reference counting fixes for out-of-memory
            scenarios were added to: SWIG_Python_RaiseOrModifyTypeError(),
            SWIG_Python_AppendOutput(), SwigPyClientData_New(),
            SwigPyObject_get___dict__() and SwigPyObject_format()

            6. Add error handling for PyModule_AddObject() to
            SWIG_Python_SetModule() (failure could be caused by OOM or a name
            clash caused by malicious code)

2021-05-13: olly
	    [UFFI] #2009 Remove code for Common Lisp UFFI.  We dropped support
	    for it in SWIG 4.0.0 and nobody has stepped forward to revive it in
	    over 2 years.

2021-05-13: olly
	    [S-EXP] #2009 Remove code for Common Lisp S-Exp.  We dropped
	    support for it in SWIG 4.0.0 and nobody has stepped forward to
	    revive it in over 2 years.

2021-05-13: olly
	    [Pike] #2009 Remove code for Pike.  We dropped support for it in
	    SWIG 4.0.0 and nobody has stepped forward to revive it in over 2
	    years.

2021-05-13: olly
	    [Modula3] #2009 Remove code for Modula3.  We dropped support for it
	    in SWIG 4.0.0 and nobody has stepped forward to revive it in over 2
	    years.

2021-05-13: olly
	    [CLISP] #2009 Remove code for GNU Common Lisp.  We dropped support
	    for it in SWIG 4.0.0 and nobody has stepped forward to revive it in
	    over 2 years.

2021-05-13: olly
	    [Chicken] #2009 Remove code for Chicken.  We dropped support for it
	    in SWIG 4.0.0 and nobody has stepped forward to revive it in over 2
	    years.

2021-05-13: olly
	    [Allegrocl] #2009 Remove code for Allegro Common Lisp.  We dropped
	    support for it in SWIG 4.0.0 and nobody has stepped forward to
	    revive it in over 2 years.

2021-05-04: olly
	    [PHP] #1982 #1457 https://sourceforge.net/p/swig/bugs/1339/
	    SWIG now only use PHP's C API to implement its wrappers, and no
	    longer generates PHP code to define classes.  The wrappers should
	    be almost entirely compatible with those generated before, but
	    faster and without some previously hard-to-fix bugs.

	    The main notable difference is SWIG no longer generates a .php
	    wrapper at all by default (only if %pragma(php) code=... or
	    %pragma(php) include=... are specified in the interface file).
	    This also means you need to load the module via extension=...
	    in php.ini, rather than letting the dl() in the generated
	    .php wrapper load it (but dl() has only worked for command-line
	    PHP for some years now).

	    *** POTENTIAL INCOMPATIBILITY ***

2021-04-30: olly
	    #1984 Remove support for $source and $target.
	    These were officially deprecated in 2001, and attempts to use them have
	    resulted in a warning (including a pointer to what to update them to)
	    for most if not all of that time.

2021-04-27: wsfulton
            #1987 [Java] Fix %interface family of macros for returning by const
            pointer reference.

2021-04-19: olly
	    Fix use of uninitialised variable in the generated code for an
	    empty typecheck typemap, such as the dummy one we include for
	    std::initializer_list.

2021-04-12: olly
	    #1777 [Python] Specifying -py3 now generates a check for Python
	    version >= 3.0.

2021-03-26: olly
	    [PHP] Add PHP keywords 'fn' (added in 7.4) and 'match' (added in
	    8.0) to the list SWIG knows to automatically rename.

2021-03-23: wsfulton
            #1942 [Python] Fix compilation error in wrappers when using -builtin
            and wrapping varargs in constructors.

2021-03-22: goto40
            #1977 Fix handling of template template parameters.

2021-03-21: olly
	    #1929, #1978 [PHP] Add support for PHP 8.

2021-03-19: wsfulton
            #1610 Remove -ansi from default compilation flags.

2021-03-19: dot-asm
            #1934 [Java] Clean up typemaps for long long arrays.

2021-03-19: olly
	    #1527 [PHP] Improve PHP object creation in directorin case.
	    Reportedly the code we were using in this case gave segfaults in
	    PHP 7.2 and later - we've been unable to reproduce these, but the
	    new approach is also simpler and should be bit faster too.

2021-03-18: olly
	    #1655 [PHP] Fix char* typecheck typemap to accept PHP Null like the
	    corresponding in typemap does.

2021-03-18: olly
	    #1900, #1905 [PHP] Fix wrapping of overloaded directed methods with
	    non-void return.

2021-03-11: murillo128
            #1498 [Javascript] Support type conversion.

2021-03-06: nshmyrev
            #872 [Javascript] Various typemap issues in arrays_javascript.i fixed.

2021-03-03: vaughamhong
            #577 [Javascript] Implemented SetModule/GetModule for JSC to allow type sharing
            across modules.

2021-03-01: xantares, Oliver Buchtala, geographika
            #1040 Add support for building SWIG with CMake. See documentation in Windows.html.

2021-03-01: vadz
            #1952 Fix incorrect warning "Unknown Doxygen command: ."

2021-02-28: p2k
            #969 [Javascript] v8/node - prevent crash calling a constructor without new keyword.

2021-02-28: alecmev
            #405 #1121 [Javascript] Fix OUTPUT typemaps on methods that don't return void.
            The output value is appended to the return value.

2021-02-26: murillo128, wsfulton
            #1269 [Javascript] Fix handling of large positive unsigned long and
            unsigned long long values.

2021-02-24: tomleavy, yegorich, tungntpham
            #1746 [Javascript] Add support for Node v12, v14 and v16.
            SWIG support for Node is now for v6 and later only.

2020-02-09: ZackerySpytz
            #1872 Fix typos in attribute2ref macros.

2020-10-10: wsfulton
            [Javascript] Fix so that ccomplex.i interface to file can be used.

2020-10-10: wsfulton
            #252 complex can now be used as a C identifier and doesn't give a syntax error.

2020-10-10: lpsinger
            #1770 Correct C complex support.
            _Complex is now parsed as a keyword rather than complex as per the C99 standard.
            The complex macro is available in the ccomplex.i library file along with other
            complex number handling provided by the complex.h header.

2020-10-07: ZackerySpytz
            [Python] #1812 Fix the error handling for the PyObject_GetBuffer() calls in
            pybuffer.i.

2020-10-07: treitmayr
            #1824 Add missing space in director method declaration returning
            const pointer.

2020-10-07: adelva1984
            #1859 Remove all (two) exceptions from SWIG executable.

2020-09-25: wsfulton
            [C#, Java] #1874 Add ability to change the modifiers for the interface
            generated when using the %interface macros.

            For C# use the 'csinterfacemodifiers' typemap.
            For Java use the 'javainterfacemodifiers' typemap.

            For example:

              %typemap(csinterfacemodifiers) X "internal interface"

2020-09-24: geefr
            [C#] #1868 Fix wchar_t* csvarout typemap for member variable wrappers.

2020-08-28: wsfulton
            [Java] #1862 Fix crashes in swig_connect_director during director class construction
            when using the director class from multiple threads - a race condition initialising
            block scope static variables. The fix is guaranteed when using C++11, but most
            compilers also fix it when using C++03/C++98.

2020-08-16: wsfulton
            [Python] Add missing initializer for member ‘_heaptypeobject::ht_module’ when using
            -builtin to complete Python 3.9 support.

2020-08-16: wsfulton
            [Python] Remove PyEval_InitThreads() call for Python 3.7 and later as Python calls
            it automatically now. This removes a deprecation warning when using Python 3.9.

2020-08-15: wsfulton
            [Python] All Python examples and tests are written to be Python 2 and Python 3
            compatible, removing the need for 2to3 to run the examples or test-suite.

2020-08-13: wsfulton
            [C#] Add support for void *VOID_INT_PTR for member variables.

2020-07-29: chrisburr
            #1843 [Python] Compilation error fix in SwigPyBuiltin_SetMetaType when using PyPy.

2020-06-14: ZackerySpytz
            #1642 #1809 Fix virtual comparison operators in director classes - remove incorrect
            space in the function name, for example, operator= = is now operator==.
