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

2019-04-09: wsfulton
            [C#] Fix FxCop warning CA2002 in SWIGPendingException - a lock on a reference of
            type 'Type'.

2019-03-30: wsfulton
            [Java, D] Add the parameters typemap attribute to the javadestruct,
            javadestruct_derived, ddispose, ddispose_derived typemaps to mirror enhanced
            flexibility in the csdisposing and csdisposing_derived (C#) typemaps. If provided
            the contents are generated as the delete/dispose method's parameters declaration.

2019-03-30: wsfulton
            [C#] #421 Fix FxCop warning CA1063 by implementing the recommended Dispose methods for
            the IDisposable interface. Previously just the Dispose() method was generated.
            Now the Dispose() and Dispose(bool disposing) methods are generated.
            Changes are required if custom "csfinalize", "csdestruct" or "csdestruct_derived"
            typemaps are being used. Details in #421 on Github. SWIG will error out if one of
            the "csfinalize, "csdestruct" or "csdestruct_derived" typemaps are found. Example
            error message:

              foo.h:60: Error: A deprecated csfinalize typemap was found for Foo, please remove
              it and replace all csdestruct, csdestruct_derived and csfinalize typemaps by the
              csdispose, csdispose_derived, csdisposing and csdisposing_derived typemaps.

            *** POTENTIAL INCOMPATIBILITY ***

2019-03-25: Liryna
            [C#] #1143 Add std_list.i for std::list support.
            The C# std::list<T> wrappers are made to look and feel like a C# 
            System.Collections.Generic.LinkedList<> collection.
            The IEnumerable<> interface is implemented in the proxy class.
            The ICollection<> interface can also be implemented to provide enhanced functionality
            whenever a C++ operator== is available. This is the case for when T is a
            primitive type or a pointer. If T does define an operator==, then use the
            SWIG_STD_LIST_ENHANCED macro to obtain this enhanced functionality, for example:

              SWIG_STD_LIST_ENHANCED(SomeNamespace::Klass)
              %template(ListKlass) std::list<SomeNamespace::Klass>;

2019-03-18: richardbeare
            [R] #1328 Non-trivial enums are working now. The enum values are now obtained from
            the C/C++ layer. const reference enums and C++11 enum classes are also now working.

2019-03-14: mochizk
            [Javascript] #1500 Fix compilation errors due to deprecating V8 API in Node.js.
            New V8 API is used if node.js >= v10.12, or if V8 >= v7.0.

2019-03-12: vadz
            [C#] #1495 Add std_set.i for std::set support.

2019-03-11: dirteat,opoplawski
            [Octave] Fix compilation errors in Octave 5.1.

              error: format not a string literal and no format arguments [-Werror=format-security]

2019-02-28: wsfulton
            [Java] std::vector improvements for types that do not have a default constructor.

            The std::vector wrappers have been changed to work by default for elements that are
            not default insertable, i.e. have no default constructor. This has been achieved by
            not wrapping:

              vector(size_type n);

            Previously the above had to be ignored via %ignore.

            If the above constructor is still required it can be added back in again via %extend:

              %extend std::vector {
                vector(size_type count) { return new std::vector< T >(count); }
              }

            Alternatively, the following wrapped constructor could be used as it provides near-enough
            equivalent functionality:

              vector(jint count, const value_type& value);

            *** POTENTIAL INCOMPATIBILITY ***

2019-02-25: wsfulton
            [Python] Fix compile errors wrapping overloaded functions/constructors where a vararg
            function is declared after a non-vararg function.

2019-02-23: zphensley42
            Use fully qualified name 'java.lang.Object' instead of 'Object' in generated code to
            avoid clashes with wrapped C++ classes called 'Object'.

2019-02-23: gtbX
            [Java] #1035 Add (const char *STRING, size_t LENGTH) typemaps in addition to the non-const
            typemaps (char *STRING, size_t LENGTH) which does not attempt to write back to the const
            string.

2019-02-22: tamuratak
            [Ruby] #984 Add support for RTypedData introduced in Ruby 1.9.3.

2019-02-22: ZackerySpytz
            #1483 Fix compilation failures when a director class has final methods.

2019-02-21: wsfulton
            [Java] #1240 Suppress Java 9 deprecation warnings on finalize method.

2019-02-21: ZackerySpytz
            #1480 Fix some rejections of valid floating-point literals.

2019-02-19: wsfulton
            #1475 Fix regression parsing gcc preprocessor linemarkers in the form:

            # linenum filename flags 

2019-02-18: jakecobb
            [Python] #945 #1234 Elements in std::vector memory access fix.

            Accessing an element in a std::vector obtains a reference to the element via an
            iterator pointing to the element in the container. If the vector is garbage collected,
            the SWIG wrapper containing the pointer to the element becomes invalid. The fix is
            to obtain a back-reference to the container by the wrapper to the element in the Python
            layer to prevent the garbage collector from destroying the underlying container.

2019-02-17: wsfulton
            Fix typemap matching to expand template parameters when the name contains
            template parameters. In the %typemap below the type is T and the name is X<T>::make
            and the name now expands correctly to X< int >::make

              template<typename T> struct X {
                %typemap(out) T X<T>::make "..."
                T make();
              };

              %template(Xint) X<int>;

2019-02-16: wsfulton
            Fix parser error containing multiple #define statements inside an enum.

            The second #define fails to parse:

              enum FooEnum {
                ENUM1 = 0,
                ENUM2 = 1,

              #define MACRO_DEF1 "Hello"
              #define MACRO_DEF2 "World!"

                ENUM3 = 2,
                ENUM4 = 3,
              };

            Bug mentioned at https://sourceforge.net/p/swig/patches/333/

2019-02-14: wsfulton
            Add some missing copy constructors into STL containers.

2019-02-14: bkotzz
            [Java] #1356 Add STL containers:
              std::unordered_map
              std::unordered_set
              std::set

2019-02-14: bkotzz
            [Java] #1356 std::map wrappers have been modified. Now the Java proxy class
            extends java.util.AbstractMap. The std::map container looks and feels much like
            a java.util.HashMap from Java.

            A few members have changed their names. If the old method signatures are needed,
            then copy std_map.i from swig-3.0.12 and use that instead. Alternatively,
            add the old missing methods to the new methods by using the following %proxycode:

              %extend std::map {
              %proxycode %{
                // Old API
                public boolean empty() {
                  return isEmpty();
                }
                public void set($typemap(jboxtype, K) key, $typemap(jboxtype, T) x) {
                  put(key, x);
                }
                public void del($typemap(jboxtype, K) key) {
                  remove(key);
                }
                public boolean has_key($typemap(jboxtype, K) key) {
                  return containsKey(key);
                }
              %}
              }

            *** POTENTIAL INCOMPATIBILITY ***

2019-02-13: ZackerySpytz
            #1469 Add support for C++17 hexadecimal floating literals.

2019-02-11: wsfulton
            [OCaml] #1437 OCaml has been give the 'Experimental' language status. The examples work
            and most of the test-suite is also working, so it is quite close to being a 'Supported' language.

2019-02-10: ZackerySpytz
	    #1464 Add support for C++14 binary integer literals.

2019-02-10: ZackerySpytz
	    #1450 Add support for C++11 UCS-2 and UCS-4 character literals. Also, add support for
            C++17 UTF-8 character literals.

2019-02-10: wsfulton
	    [MzScheme] #1437 MzScheme/Racket is now an 'Experimental' language. The examples work
            and a large portion of the test-suite is also working.

2019-02-10: wsfulton
	    [MzScheme] Destructor wrappers were not being generated.

2019-02-10: wsfulton
	    [MzScheme] Static variable wrappers fixed - $argnum was not expanded.

2019-02-10: sethrj
	    #1452 Fix %apply for anonymous template instantiations

2019-02-09: olly
	    [PHP] Fix access to already released memory during PHP module
	    shutdown, which often didn't cause visible problems, but could
	    result in segmentation faults, bus errors, etc.  Fixes #1170,
	    reported by Jitka Plesníková.

2019-02-09: olly
	    [PHP] A renamed constructor is now wrapped as a static method in
	    PHP.

2019-02-08: olly
	    [PHP] Don't generate code which references $r when $r hasn't been
	    defined.  This could happen in overloaded methods which returned
	    void and took at least one const std::string& parameter.

2019-02-08: olly
	    [PHP] The generated code is now compatible with PHP 7.3, and the
	    testsuite now runs cleanly with this version too.

2019-02-05: wsfulton
            #1437 SWIG now classifies the status of target languages into either 'Experimental' or
            'Supported'. This status is provided to indicate the level of maturity to expect when using
            a particular target language as not all target languages are fully developed. Details are
            in the Introduction.html chapter of the documentation.

2019-02-04: wsfulton
	    [CFFI] #1447 Common Lisp CFFI has been disabled as a target language in SWIG as part of a
            clean up to remove target languages that have been neglected/not functional.

2019-02-04: wsfulton
	    [Allegrocl] #1447 Allegro Common Lisp has been disabled as a target language in SWIG as part of a
            clean up to remove target languages that have been neglected/not functional.

2019-02-04: wsfulton
	    [Chicken] #1447 CHICKEN has been disabled as a target language in SWIG as part of a
            clean up to remove target languages that have been neglected/not functional.

2019-02-04: wsfulton
	    [CLISP] #1447 GNU Common Lisp has been disabled as a target language in SWIG as part of a
            clean up to remove target languages that have been neglected/not functional.

2019-02-04: wsfulton
	    [S-EXP] #1447 Common Lisp S-Exp has been disabled as a target language in SWIG as part of a
            clean up to remove target languages that have been neglected/not functional.

2019-02-04: wsfulton
	    [UFFI] #1447 Common Lisp UFFI has been disabled as a target language in SWIG as part of a
            clean up to remove target languages that have been neglected/not functional.

2019-02-04: wsfulton
	    [Pike] #1447 Pike has been disabled as a target language in SWIG as part of a
            clean up to remove target languages that have been neglected/not functional.

2019-02-04: wsfulton
	    [Modula3] #1447 Modula3 has been disabled as a target language in SWIG as part of a
            clean up to remove target languages that have been neglected/not functional.

2019-02-02: ahnolds
	    [Python] Documentation enhancements for Python:

            #728 Fixed the handling of autodoc when using -fastproxy.

            #1367 Added documentation to wrapped member variables using the
            property(... doc="...") construct.

            Only show a single documentation entry for functions with default arguments when
            using autodoc.

            Fixed a bug where a cached doxygen docstring could be deleted while still in use,
            causing swig to segfault.

2019-01-31: olly
	    SWIG now requires a target language to be specified instead of
	    defaulting to wrapping for Tcl.  Specifying swig --help without
	    a target language now just shows the generic help.  The -nolang
	    option has been removed.

2019-01-28: ZackerySpytz
            [OCaml] #1429 Remove support for OCaml versions < 3.12.0.

            *** POTENTIAL INCOMPATIBILITY ***

2019-01-22: vadz
            [Ruby, Octave] #1424 Improve autodoc parameter naming.

2019-01-22: vadz
            [Python] #1271 #1423 Always include default parameter values in autodoc strings.

2019-01-19: vadz
            #1272, #1421 When a function's parameter is a keyword, the name of the paramater is
            no longer simply changed to argN, where N is the argument number. Instead the
            parameter name is changed to the renaming rules for keywords that normally apply to
            symbols such as classes/functions etc. Note that unlike other symbol renaming,
            parameter renaming does not issue a warning when the parameter is renamed. This
            change only affects languages where the parameter names are actually used, for example,
            Java function parameter lists in the proxy class or Python documentation comments.

2019-01-18: wsfulton
            #1420 Fix gdb debugger functions 'swigprint' and 'locswigprint' from swig.gdb to
            work with newer versions of gdb-8. Fixes errors when debugging SWIG source with gdb:

              (gdb) swigprint n
              Undefined command: "Printf".  Try "help".

2019-01-16: wsfulton
            Python static method wrapper changes

            - Static method wrappers were using the 'fastproxy' approach by default.
              This is inconsistent with instance method wrappers. The fastproxy approach
              is now turned off by default to be consistent with instance methods.
              Static method wrappers can now also be controlled using the -fastproxy and
              -olddefs options.

              Example:

                struct Klass {
                  static int statmethod(int a = 2);
                };

              generates by default:

              class Klass(object):
                  ...
                  @staticmethod
                  def statmethod(a=2):
                      return _example.Klass_statmethod(a)

              instead of the following (which can be restored by using -fastproxy):

                class Klass(object):
                  ...
                  statmethod = staticmethod(_example.Klass_statmethod)

              - Modernise wrappers for static methods to use decorator syntax - @staticmethod.

              - Add missing runtime test for static class methods and using the actual class method.

2019-01-12: ZackerySpytz
            [OCaml] #1403 #1194 Fix compilation problems for OCaml >= 4.03.0 due to OCaml using
            int64_t instead of int64.

2019-01-11: ZackerySpytz
            [OCaml] #1400 Fix the getters and setters of non-static member variables.

2019-01-07: wsfulton
            #358 Add VOID to windows.i

2019-01-05: wsfulton
            #948 #1019 #1273 Fix for C++11 raw strings where the delimiters were mistakenly left
            in the string contents in situations where the string was copied into generated code.
            For example, %constant, the "docstring" feature and for C#/Java/D constants turned on
            with %javaconst/%csconst/%dmanifestconst.

2019-01-05: wsfulton
            [Ruby] #538. Fix Ruby support for %feature("docstring").

2019-01-03: wsfulton
            #1202 Fix overloading of non-pointer class types in scripting languages when overloaded
            with a pointer and a NULL scripting language equivalent is used, eg None in Python.

            The implementation changes the SWIGTYPE, SWIGTYPE& and SWIGTYPE&& typecheck typemaps to
            prevent accepting a conversion to a NULL pointer.

2019-01-03: ZackerySpytz
            [OCaml] #1386 Fix the OCaml examples and test suite for out-of-source builds.

2019-01-01: wsfulton
            [Python] #639 remove duplicate proxy method definitions for global function wrappers.

            Global functions previously generated two definitions, eg:

              def foo():
                  return _example.foo()
              foo = _example.foo

            The first definition is replaced by the second definition and so the second definition
            is the one used when the method is actually called. Now just the first definition is
            generated by default and if the -fastproxy command line option is used, just the second
            definition is generated. The second definition is faster as it avoids the proxy Python
            method as it calls the low-level C wrapper directly. Using both -fastproxy and -olddefs
            command line options will restore the previously generated code as it will generate both
            method definitions.

            With this change, the wrappers for global C/C++ functions and C++ class methods now work
            in the same way wrt to generating just a proxy method by default and control via
            -fastproxy/-olddefs options.

2018-12-20: hasinoff,wsfulton
            [Java] #1334 Set Java thread name to native thread name when using directors.

            Default is to use name "Thread-XXX" and is still works like this by default. However,
            adding the following will turn on the thread name setting (works for more recent
            versions of Linux and MacOS):

            %begin %{
            #define SWIG_JAVA_USE_THREAD_NAME
            %}

2018-12-20: chlandsi
            [Python] #1357. Fix overriding __new__ in Python 3.6.

            Fixes SystemError: Objects/tupleobject.c:81: bad argument to internal function"

2018-12-16: wsfulton
            [Python] #848 #1343 The module import logic has changed to stop obfuscating real ImportError
            problems. Only one import of the low-level C/C++ module from the pure Python module is
            attempted now. Previously a second import of the low-level C/C++ module was attempted
            after an ImportError occurred and was done to support 'split modules'. A 'split module' is
            a configuration where the pure Python module is a module within a Python package and the
            low-level C/C++ module is a global Python module. Now a 'split module' configuration is
            no longer supported by default. This configuration can be supported with a simple
            customization, such as:

              %module(package="mypackage", moduleimport="import $module") foo

            or if using -builtin:

              %module(package="mypackage", moduleimport="from $module import *") foo

            instead of

              %module(package="mypackage") foo

            See the updated Python chapter titled "Location of modules" in the documentation.

2018-12-11: tlby
            [Perl] #1374 repair EXTEND() handling in typemaps

2018-12-06: vadz
            #1359 #1364 Add missing nested class destructor wrapper when the nested class is
            inside a template. Removes associated bogus 'Illegal destructor name' warning. Only
            occurred when the nested class' destructor is explicitly specified.

2018-12-04: adr26
            [Python] #1368 #1369 Access Violation in tp_print caused by mismatched Python/extension
            CRT usage

            Remove all use of tp_print, as this API uses a FILE*, which can be
            mismatched when modules are built with different C libraries from
            the main python executable.

            This change also brings consistent output between Python 2 and 3 for the 'cvar' SWIG
            object (that contains the global variables) and SWIG packed objects (such as callback
            constants).

2018-12-04: wsfulton
            [Python] #1282 Fix running 'python -m'  when using 'swig -builtin'

            Similar to the earlier PEP 366 conforming fix for non-builtin.

2018-11-29: adr26
            [Python] #1360 Leak of SWIG var link object

            Fix reference counting on _SWIG_globals to allow var link to be freed on module unload.

2018-11-28: wsfulton
            [Python] When using -builtin, the two step C-extension module import is now
            one step and the wrapped API is only available once and not in an underlying
            module attribute like it is without -builtin. To understand this, consider a
            module named 'example' (using: %module example). The C-extension is compiled into
            a Python module called '_example' and a pure Python module provides the actual
            API from the module called 'example'. It was previously possible to additionally
            access the API from the module attribute 'example._example'. The latter was an
            implementation detail and is no longer available. It shouldn't have been used, but
            if necessary it can be resurrected using the moduleimport attribute described in the
            Python chapter of the documentation. If both modules are provided in a Python
            package, try:

              %module(moduleimport="from . import _example\nfrom ._example import *") example
            or more generically:
              %module(moduleimport="from . import $module\nfrom .$module import *") example

            and if both are provided as global modules, try:

              %module(moduleimport="import _example\nfrom _example import *") example
            or more generically:
              %module(moduleimport="import $module\nfrom $module import *") example

            The module import code shown will appear in the example.py file.

2018-11-24: vadz
            #1358 Fix handling of abstract base classes nested inside templates

            Correct detecting of whether a derived class method overrides a pure virtual
            base class method when both classes are nested inside a template class: this
            notably didn't work correctly for methods taking parameters of the base class
            type.

2018-11-22: rupertnash
            [Python] #1282 Make generated module runnable via python -m (PEP 366 conforming)

            Previously any SWIG generated modules in a package would fail with an ImportError
            when using 'python -m' for example 'python -m mypkg.mymodule'.

            This fix also allows the SWIG generated module to be placed into a directory and
            then renamed __init__.py to convert the module into a package again. This ability
            stopped working in swig-3.0.9. However, only Python 2.7 or 3.3 and later work. If
            Python 3.2 support is needed, use moduleimport in %module to customise the import
            code.

2018-11-13: wsfulton
            #1340 Remove -cppcast and -nocppcast command line options (this was an option
            available to the scripting language targets).

            The -cppcast option is still turned on by default. The -nocppcast option
            to turn off the use of c++ casts (const_cast, static_cast etc) has been
            removed. However, defining SWIG_NO_CPLUSPLUS_CAST will still generate C casts
            instead of C++ casts for C++ wrappers.

            *** POTENTIAL INCOMPATIBILITY ***

2018-11-13: wsfulton
            [Python] #1340 Remove -outputtuple and -nooutputtuple command line options.

            Both the command line and %module options of the same name have been
            removed. These were undocumented. The -outputtuple option returned a
            Python tuple instead of a list, mostly typically in the OUTPUT
            typemap implementations.

            It unclear why a tuple instead of a list return type is needed and
            hence this option has been removed as part of the simplification of
            the SWIG Python command line options for SWIG 4.

2018-11-13: wsfulton
            [Python] #1340 Remove -noproxyimport command line option.

            This option turned off the insertion of Python import statements
            derived from a %import directive. For example given:

              %module module_b
              %import "module_a.i"

            then module_b.py will contain:

              import module_a

            *** POTENTIAL INCOMPATIBILITY ***

2018-10-29: AlexanderGabriel
	    [PHP] The following PHP7 reserved keywords are now only renamed by
	    SWIG when used as function names in the API being wrapper:
	    __halt_compiler array die echo empty eval exit include include_once
	    isset list print require require_once return unset

2018-10-22: olly,wsfulton
            [Python] #1261 #1340 Turn on many optimisation options by default and rationalise the
            number of command line options.

            There were an unnecessary number of command line options and many of these have now
            been removed in a drive for simplification. Some were needed to support older versions
            of Python (2.6 and earlier).

            Many of the options could be turned on individually and when using -O. Previously -O
            resulted in turning on a set of options:

              -modern -fastdispatch -nosafecstrings -fvirtual -noproxydel
              -fastproxy -fastinit -fastunpack -fastquery -modernargs -nobuildnone

            Now -O results in turning on this reduced set:

              -fastdispatch -fastproxy -fvirtual

            The following options are now on by default, a deprecated warning is displayed if they
            are used:
              -fastinit     Class initialisation code done in C/C++ rather than in Python code.
              -fastquery    Python dictionary used for lookup of types.
              -fastunpack   Faster unpacking of function arguments in C/C++ wrappers.
              -modern       Use Python 2.3 features such as object and property.
              -modernargs   Use Python 2.3 C APIs for unpacking arguments in tuples.
              -noproxydel   Stop generating a proxy __del__ method for backwards compatiblity.
              -safecstrings No discernable difference

            The following options have been removed altogether:
              -aliasobj0
              -buildnone
              -classptr
              -new_repr
              -newrepr
              -noaliasobj0
              -nobuildnone
              -nocastmode
              -nodirvtable
              -noextranative
              -nofastinit
              -nofastproxy
              -nofastquery
              -nomodern
              -nomodernargs
              -nooutputtuple
              -nosafecstrings
              -old_repr
              -oldrepr
              -proxydel

            -new_vwm is no longer supported. Use the -newvwm alias instead.

            *** POTENTIAL INCOMPATIBILITY ***

2018-10-22: olly
            [Python] #1261 Remove command line option no longer needed as Python 2.3 and earlier
            are no longer supported:

              -classic

2018-10-09: wsfulton
            [D, Go, Guile, Lua, Mzscheme, Ocaml, Perl5, Php, Scilab, Tcl]
            Allow wrapping of std::map using non-default comparison function.

2018-10-09: vadz
            [Java] #1274 Allow wrapping of std::map using non-default comparison function.

2018-10-04: wsfulton
            [Python] #1126 Fix C default arguments with -builtin and -fastunpack and -modernargs.
            Problem occurred when there is just one (defaulted) parameter in the parameter list.

2018-09-24: wsfulton
            [Python] #1319 C++11 hash tables implementation is finished now (including for -builtin):
              std::unordered_map
              std::unordered_set
              std::unordered_multimap
              std::unordered_multiset

2018-09-21: wsfulton
            [Python] Fix when using -builtin and wrapping std::map, std::set, std::unordered_map or
            std::unordered_set to ensure __contains__ is called. This is a wrapper for the STL
            container's find method. Without it, Python will do its own slower sequence search.

2018-09-19: wsfulton
            [Python] Fix functors (wrapped as __call__) when using -builtin -modern -fastunpack.

2018-09-02: andreas.gaeer,tkrasnukha
            [Python] #1321 Fix assert in PyTuple_GET_SIZE in debug interpreter builds of python-3.7
            when calling tp_new.

2018-09-01: ChristopherHogan
            [Guile] #1288 Fix garbage collection for guile >= 2.0.12.

2018-08-31: wsfulton
            [Python] #1319 C++11 hash tables support:
              std::unordered_map
              std::unordered_set
              std::unordered_multimap
              std::unordered_multiset
            is now compiling and working (sorting using -builtin not fully functional yet though).

2018-08-20: wkalinin
            #1305 Fix nested structure symbol tables in C mode to fix member name conflicts
            in different structs with the same nested struct member name.

2018-08-18: wsfulton
            [Python] #688 Fix makefile recursion when running python test-suite.

2018-08-18: wsfulton
            [Python] #1310 Re-implement Python -fastproxy option.

            The previous implementation failed with Python 3 and abstract base clases.
            The new implementation replaces the Python 2 implementation using
            new.instancemethod with the C API PyMethod_New to match the equivalent Python 3
            implementation which uses PyInstanceMethod_New.

            The new approach runs slightly faster. See #1310.

2018-08-12: gmazzamuto
            [Python] #1283 Update pybuffer.i library to use new-style Python buffer C API.

2018-08-12: brianhatwood,wsfulton
            [Java] #1303 #1304 Fix crash in directors when using OUTPUT and INOUT typemaps in typemaps.i and
            passing NULL pointers in C++ to director method overloaded and implemented in Java.

2018-08-10: wsfulton
            [Python] #1293 Improve TypeError message inconsistencies between default and fastdispatch
            mode when handling overloaded C++ functions. Previously the error message did not always
            display the possible C/C++ prototypes in fastdispatch mode.

2018-08-02: furylynx,jacobwgillespie,p2k
            [Javascript] #1290, #968. Add support for NodeJS versions 2-10.

2018-07-31: wsfulton
            [Python] #1293 Overloaded C++ function wrappers now raise a TypeError instead
            of NotImplementedError when the types passed are incorrect. This change means
            there is now consistency with non-overloaded function wrappers which have always
            raised TypeError when the incorrect types are passed. The error message remains
            the same and is for example now:

              TypeError: Wrong number or type of arguments for overloaded function 'f'.
                Possible C/C++ prototypes are:
                  f(int)
                  f(char const *)

            instead of:

              NotImplementedError: Wrong number or type of arguments for overloaded function 'f'.
                Possible C/C++ prototypes are:
                  f(int)
                  f(char const *)

            *** POTENTIAL INCOMPATIBILITY ***

2018-06-23: wsfulton
            [Python] #718 Fix pythonnondynamic feature for modern classes

            Fixes nondynamic mode when an instance variable is set with the same
            name as a class variable in a class derived from a SWIG proxy class.
            This corner case set an instance variable instead of raising an AttributeError.

            Also fix %pythonnondynamic in Python 3 with -modern. The metaclass
            containing the implementation was previously not being applied in Python 3.

2018-07-17: petrmitrichev,wsfulton
            [Python] #1275 #1279 Initialize function-local statics (singletons) that call Python
            code during Python module initialization in order to avoid deadlocks with subsequent
            multi-threaded usage.

2018-06-15: wsfulton
            [Python] Fix seg fault using Python 2 when passing a Python string, containing
            invalid utf-8 content, to a wstring or wchar * parameter. A TypeError is thrown instead, eg:

              %include <std_wstring.i>
              void instring(const std::wstring& s);

              instring(b"h\xe9llooo") # Python

2018-06-15: wsfulton
            [Python] Python 3.7 support: Replace use of deprecated PyUnicode_GetSize with
            PyUnicode_GetLength to remove deprecated warnings compiling the C/C++ wrappers.

2018-06-12: wsfulton
            [Python] Python 3.7 support: The %pythonabc feature in pyabc.i now uses base classes
              collections.abc.MutableSequence
              collections.abc.MutableMapping
              collections.abc.MutableSet
            instead of
              collections.MutableSequence
              collections.MutableMapping
              collections.MutableSet
            as the latter are deprecated in Python 3.7 and are due to be removed in Python 3.8.
            The classes in collections.abc.* are available from Python 3.3 onwards. If you
            require support for Python 3.2, then copy the pyabc.i file and modify by removing
            the few instances of the .abc sub-module.

            *** POTENTIAL INCOMPATIBILITY ***

2018-06-12: olly,wsfulton
            [Python] #701 Remove support for Python versions < 2.7 and 3.0 and 3.1.

            *** POTENTIAL INCOMPATIBILITY ***

2018-06-11: olly
            [Python] Fix new GCC8 warnings in generated code by avoiding casts
            between incompatible function types where possible, and by
            suppressing the warning when it's due to the design of Python's C
            API.  Fixes #1259.

2018-06-08: philippkraft
	    [Python] Stop exposing <CLASS>_swigregister to Python.  It's not
	    useful for user Python code to call this, and it just clutters the
	    API unnecessarily.  Fixes #1225.

2018-06-07: cmfoil, kabbi, Jamie Kirkpatrick, markok314, vadz, wsfulton, Yann Diorcet
            #170 Doxygen documentation support added. This allows translation of Doxygen comments
            into JavaDoc and PyDoc documentation. It is enabled via the -doxygen command line
            option. See the Doxygen.html chapter in the documentation for further information.

2018-06-07: olly
	    [PHP] We've finally removed support for %pragma(php4) which was
	    deprecated back in 2008.  Use %pragma(php) instead, which has been
	    supported since at least 2005.

            *** POTENTIAL INCOMPATIBILITY ***

2018-06-07: olly
	    [PHP5] Support for PHP5 has been removed.  PHP5 is no longer
	    actively supported by the PHP developers and security support for
	    it ends completely at the end of 2018, so it doesn't make sense
	    to include support for it in the upcoming SWIG 4.0.0 release.

            *** POTENTIAL INCOMPATIBILITY ***

2018-06-06: olly
	    [Lua] Improve configure probes for Lua headers and libs used in testsuite.

2018-05-15: kwwette
            [Octave] add support for version 4.4
            - Should not introduce any user-visible incompatibilities

2018-05-15: wsfulton
            [C#, D, Java] Fix lookup of csconstruct, dconstruct and javaconstruct typemaps.
            The C++ namespace was previously ignored when looking up the typemap.

2018-05-15: wsfulton
            [Javascript] Fix generated C++ code when using %nspace on namespaces that are more
            than two levels deep.

2018-05-14: wsfulton
            Issue #1251 Add support for C++17 nested namespace definitions,
            for example:
              namespace A::B { ... }

2018-05-11: wsfulton
            [C#, D, Java] Add support so that the %csmethodmodifiers, %dmethodmodifiers,
            %javamethodmodifiers can modify the method modifiers for the destructor wrappers
            in the proxy class: dispose, Dispose, delete. With this feature, it is now possible
            to make a C# proxy class sealed, eg when wrapping a class X, the virtual method modifiers
            can be removed using:

              %typemap(csclassmodifiers) X "public sealed class"
              %csmethodmodifiers X::~X "public /*virtual*/";

2018-04-18: olly
	    [Python] Suppress new pycodestyle warning:
	    E252 missing whitespace around parameter equals

2018-04-07: goatshriek
            [Ruby] #1213 Fix ruby %alias directive for global C/C++ functions.

2018-04-03: olly
	    [Ruby] Fix to pass Qnil instead of NULL to rb_funcall(), which silences GCC
	    -Wconversion-null warning (on by default with recent GCC).

2018-03-09: wsfulton
            [Java] #1184 Fix swigReleaseOwnership() and swigTakeOwnership() regression
            for non-director classes. Restores a dynamic_cast which was previously removed.

2018-03-07: llongi
	    Github PR #1166 - Fix preprocessor handling of macros with commas
	    in a // comment.

2018-02-18: JPEWdev
            Patch #1164 - Add support for a command-line options file, also sometimes
            called a response file. This is useful if the command-line options exceed
            the system command-line length limit. To use, put the command-line options
            into a file, then provide the file name prefixed with @, for example using
            a file called args.txt:

              swig @args.txt

2018-02-11: wsfulton
            [Javascript] #1187 Fix compilation error wrapping std::complex via
            std_complex.i.

2018-01-30: smarchetto
            [Scilab] add type name argument in SWIG_ptr() function to cast from pointer address to typed pointers

2018-01-16: wsfulton
            Expressions following a preprocessor directive must now be separated by whitespace
            or non-numeric characters. This syntax change makes the SWIG preprocessor work like
            the C preprocessor in this area.

            For example, the following code used be accepted as valid syntax:
              #if1
              #define ABC 123
              #endif

            Now you get an error:
              example.h:1: Error: Unknown SWIG preprocessor directive: if1 (if this is a block of
              target language code, delimit it with %{ and %})
              example.h:3: Error: Extraneous #endif.

            The following is the correct syntax:
              #if 1
              #define ABC 123
              #endif

            The following of course also works:
              #if(1)
              #define ABC 123
              #endif

            *** POTENTIAL INCOMPATIBILITY ***

2018-01-15: wsfulton
            Fix issue #1183. Floating point exception evaluating preprocessor expressions
            resulting in division by zero.

2018-01-14: wsfulton
            Fix issue #1172. Seg fault parsing invalid exponents in the preprocessor.

2018-01-12: Liryna
            [C#] Patch #1128. Add ToArray function to std::vector wrappers.

2018-01-12: wsfulton
            [Java] Fix issue #1156. Add missing throws clause for interfaces when using the
            %interface family of macros.

2018-01-05: wsfulton
            Fix default arguments using expressions containing -> syntax error. Problem reported on
            swig-user mailing list.

2017-12-30: wsfulton
            [Python] Replace pep8 with pycodestyle for checking the Python code style when
            running Python tests.

2017-12-30: davedissian
            Fixed a symbol lookup issue when encountering a typedef of a symbol from the tag
            namespace to the global namespace when the names are identical, such as 'typedef
            struct Foo Foo;'.

2017-12-13: wsfulton
            [Perl] add missing support for directorfree typemaps.

2017-12-13: wsfulton
            Issue #1167 Fix directorout typemaps which were causing undefined behaviour when
            returning pointers by reference.

2017-12-08: olly
	    [PHP] Use ZEND_MODULE_GLOBALS_ACCESSOR to access globals - this
	    should make the generated code work with PHP 7.2.0.

2017-12-04: wsfulton
            [Python] Add missing checks for failures in calls to PyUnicode_AsUTF8String. Previously a
            seg fault could occur when passing invalid UTF8 strings (low surrogates), eg passing
            u"\udcff" to the C layer (Python 3).

2017-11-24: joequant
	    [R] Fix #1124 and return R_NilValue for null pointers

2017-11-29: wsfulton
            [Java] director exception handling improvements.

            When a director method throws an exception and it is caught by DirectorException
            and passed back to Java using Swig::DirectorException::throwException, the Java
            stack trace now contains the original source line that threw the exception.

            Deprecate Swig::DirectorException::raiseJavaException, please replace usage with
            Swig::DirectorException::throwException.

            *** POTENTIAL INCOMPATIBILITY ***

2017-10-26: wsfulton
            Add support for C++11 ref-qualifiers when using directors.

2017-10-26: wsfulton
            Fix generated code when using directors and methods returning const ref pointers.

2017-10-26: wsfulton
            [C#, D, Java, Octave, R, Scilab] Port director typemaps to these additional languages.
            Issue #700.

2017-10-26: radarsat1
            [Ruby Python] Patch #1029 - Correct handling of null using directors and shared_ptr.

2017-10-10: joequant
	    [R] pass enum expressions to R.  This will generate
	    incorrect files when there is an arithmetic expression
	    in the enum, but this is better than silently generating
	    incorrect code

2017-10-09: olly
	    [PHP] Fix incorrect wrapper code generated when there's a
	    combination of overloading, parameters with a default value
	    and %newobject.  Fixes https://sourceforge.net/p/swig/bugs/1350/

2017-10-09: olly
	    Remove GCJ support.  It isn't in a good state and doesn't seem to
	    be used, and GCC7 dropped GCJ.  Closes
	    https://sourceforge.net/p/swig/bugs/823/

2017-10-07: olly
	    Fix preprocessor handling of empty macro arguments to match that of
	    C/C++ compilers.  Fixes issue #1111 and
	    https://sourceforge.net/p/swig/bugs/826/

2017-10-06: wsfulton
            [Python] Issue #1108. Fix platform inconsistency in Python default argument handling.
            32 bit and 64 bit compiled versions of SWIG generated different Python files
            when default arguments were outside the range of 32 bit signed integers.
            The default arguments specified in Python are now only those that are in the
            range of a 32 bit signed integer, otherwise the default is obtained from C/C++ code.

2017-10-02: wsfulton
            [C#] Fix std::complex types passed by value.

2017-10-02: wsfulton
            [Javascript, Python, Ruby] Issue #732 - Missing type information for std::complex
            in std_complex.i meant that previously std::complex always had to be fully qualified
            in order to be wrapped with the appropriate typemaps.

2017-10-01: joequant
            allow R package names with docs
	    allowing multiple get accessors in R
	    fix smart-pointer and NAMESPACE support
	    constructors now returning smart pointers (if class
	    declared as such)
	    smart-pointer classes deriving from parent smart-pointers

2017-09-29: wsfulton
            Issue #1100 - Allow an instantiated template to have the same name in the target
            language as the C++ template name, for example, this is now possible:

              template<typename T> struct X { ... };
              %template(X) X<int>;

2017-09-23: wsfulton
            Issue #1098. Fix overloading of shared_ptr with underlying pointer types, eg:

              void m(std::shared_ptr<T> p);
              void m(T &p);
              void m(T *p);

            Only the first method is wrapped and the others are ignored/shadowed.
            The implementation is done via a new attribute in the 'typecheck' typemap called
            'equivalent'. If specified, it must contain the equivalent pointer type for overloading
            and can only be used for the special SWIG_TYPECHECK_POINTER precedence level.
            The shared_ptr 'typecheck' typemaps have been modified accordingly.
            Here is a simplified version:

              %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="T *")
                T,
                T CONST &,
                T CONST *,
                T *CONST&,
                std::shared_ptr< T >,
                std::shared_ptr< T > &,
                std::shared_ptr< T > *,
                std::shared_ptr< T > *&
                { ... }

            Overloading with any of these types will result in SWIG ignoring all but the first
            overloaded method by default. Without the 'equivalent' attribute, wrapping the overloaded
            methods resulted in types being shadowed (scripting languages) or code that did not
            compile (statically typed languages).

2017-09-19: futatuki
            [Python] #1003 Add --with-2to3=/path/to/2to3 option to configure.

2017-09-18: wsfulton
            Fix type promotion wrapping constant expressions of the form:
              # define EXPR_MIXED1    (0x80 + 11.1) - 1
            This was previously an integral type instead of a floating point type.

2017-09-17: wsfulton
            Fix generated code for constant expressions containing wchar_t L literals such as:
              # define __WCHAR_MAX    (0x7fffffff + L'\0')
              # define __WCHAR_MIN    (-__WCHAR_MAX - 1)

2017-09-10: mlamarre
            [Python] Patch #1083. Define_DEBUG to 1 to do exactly like Visual Studio
            /LDd, /MDd or /MTd compiler options.

2017-08-25: wsfulton
            Issue #1059. Add support for C++11 ref-qualifiers on non-static member functions.
            Members with lvalue ref-qualifiers such as:

              struct RQ {
                void m1(int x) &;
                void m2(int x) const &;
              };

            are wrapped like any other member function. Member functions with rvalue ref-qualifiers
            are ignored by default, such as:

              struct RQ {
                void m3(int x) &&;
                void m4(int x) const &&;
              };

              example.i:7: Warning 405: Method with rvalue ref-qualifier m3(int) && ignored.
              example.i:8: Warning 405: Method with rvalue ref-qualifier m4(int) const && ignored.

            These can be unignored and exposed to the target language, see further documentation in
            CPlusPlus11.html.

2017-08-16: wsfulton
            Fix #1063. Add using declarations to templates into typedef table.

            Using declarations to templates were missing in SWIG's internal typedef tables.
            This led to a few problems, such as, templates that did not instantiate and generated
            C++ code that did not compile as SWIG did not know what scope the template was
            in. This happened mostly when a using declaration was used on a template type in a
            completely unrelated namespace.

2017-08-16: wsfulton
            Fix type lookup in the presence of using directives and using declarations.

            Fix some cases of type lookup failure via a combination of both using directives and
            using declarations resulting in C++ code that did not compile as the generated type was
            not fully qualified for use in the global namespace. Example below:

              namespace Space5 {
                namespace SubSpace5 {
                  namespace SubSubSpace5 {
                    struct F {};
                  }
                }
                using namespace SubSpace5;
                using SubSubSpace5::F;
                void func(SubSubSpace5::F f);
              }

2017-08-16: wsfulton
            Issue #1051. %template scope enforcement and class definition fixes.

            The scoping rules around %template have been specified and enforced.
            The %template directive for a class template is the equivalent to an
            explicit instantiation of a C++ class template. The scope for a valid
            %template instantiation is now the same as the scope required for a
            valid explicit instantiation of a C++ template. A definition of the
            template for the explicit instantiation must be in scope where the
            instantiation is declared and must not be enclosed within a different
            namespace.

            For example, a few %template and C++ explicit instantiations of std::vector
            are shown below:

              // valid
              namespace std {
                %template(vin) vector<int>;
                template class vector<int>;
              }

              // valid
              using namespace std;
              %template(vin) vector<int>;
              template class vector<int>;

              // valid
              using std::vector;
              %template(vin) vector<int>;
              template class vector<int>;

              // ill-formed
              namespace unrelated {
                using std::vector;
                %template(vin) vector<int>;
                template class vector<int>;
              }

              // ill-formed
              namespace unrelated {
                using namespace std;
                %template(vin) vector<int>;
                template class vector<int>;
              }

              // ill-formed
              namespace unrelated {
                namespace std {
                  %template(vin) vector<int>;
                  template class vector<int>;
                }
              }

              // ill-formed
              namespace unrelated {
                %template(vin) std::vector<int>;
                template class std::vector<int>;
              }

            When the scope is incorrect, an error now occurs such as:

              cpp_template_scope.i:34: Error: 'vector' resolves to 'std::vector' and
              was incorrectly instantiated in scope 'unrelated' instead of within scope 'std'.

            Previously SWIG accepted the ill-formed examples above but this led to
            numerous subtle template scope problems especially in the presence of
            using declarations and using directives as well as with %feature and %typemap.

            Actually, a valid instantiation is one which conforms to the C++03
            standard as C++11 made a change to disallow using declarations and
            using directives to find a template.

              // valid C++03, ill-formed C++11
              using std::vector;
              template class vector<int>;

            Similar fixes for defining classes using forward class references have
            also been put in place. For example:

              namespace Space1 {
                struct A;
              }
              namespace Space2 {
                struct Space1::A {
                  void x();
                }
              }

            will now error out with:

              cpp_class_definition.i:5: Error: 'Space1::A' resolves to 'Space1::A' and
              was incorrectly instantiated in scope 'Space2' instead of within scope 'Space1'.

            Previously some symbols would have been instantiated in the wrong scope and led
            to lots of scope problems involving SWIG typemaps, features, renames etc.
            You will need to correct the scope used in other SWIG directives which do not
            support 'using declarations' and 'using directives'. For example, if you previously had:

              %rename(Zap) vector<int>::clear;
              using namespace std;
              %template(VectorInt) vector<int>;

            Prior versions of SWIG incorrectly instantiated vector<int> in the global namespace
            and so the %rename matched. Now the template is instantiated in the correct namespace,
            so is fully qualified as std::vector<int>. The other SWIG directives need correcting as
            they do not follow 'using declarations' and 'using directives'. Change it to:

              %rename(Zap) std::vector<int>::clear;
              using namespace std;
              %template(vin) vector<int>;


            *** POTENTIAL INCOMPATIBILITY ***

2017-08-16: wsfulton
            Fix scope lookup for template parameters containing unary scope operators.

            Fixes cases like:

            namespace Alloc {
              template<typename T> struct Rebind {
                typedef int Integer;
              };
            }
            %template(RebindBucket) Alloc::Rebind< Bucket >;
            OR
            %template(RebindBucket) Alloc::Rebind< ::Bucket >;

            Alloc::Rebind< Bucket >::Integer Bucket1();
            Alloc::Rebind< ::Bucket >::Integer Bucket2();
            Alloc::Rebind<::template TemplateBucket<double>>::Integer Bucket3();

2017-08-16: wsfulton
            For templates only, the template parameters are fully resolved when
            handling typemaps. Without this, it is too hard to have decent rules
            to apply typemaps when parameter types are typedef'd and template
            parameters have default values.

            Fixes %clear for typedefs in templates, eg:

              %typemap("in") XXX<int>::Long "..."
              template typename<T> struct XXX {
                typedef long Long;
              };
              %clear XXX<int>::Long;

            as the typemap was previously incorrectly stored as a typemap for long
            instead of XXX<int>::Long.

2017-08-05: olly
	    [C++11] Allow static_assert at the top level (and disallow it right
	    after template<T>).  Fixes issue 1031 reported by Artem V L.

2017-08-02: wsfulton
            Fix incorrectly shown warning when an empty template instantiation was used on a
            class used as a base class and that base class was explicitly ignored with %ignore.
            Example of the warning which will no longer appear:

              Warning 401: Base class 'Functor< int,int >' has no name as it is an empty
              template instantiated with '%template()'. Ignored.

2017-07-17: fflexo
            [Java] #674 Add std_list.i to add support for std::list containers. The Java proxy
            extends java.util.AbstractSequentialList and makes the C++ std::list container look
            and feel much like a java.util.LinkedList from Java.

2017-07-07: wsfulton
            [Python] Fix display of documented template types when using the autodoc
            feature. For example when wrapping:

              %feature("autodoc");
              template<typename X> struct T {};
              %template(TInteger) T<int>;

            the generated documentation contains:
              """Proxy of C++ T< int > class."""
            instead of:
              """Proxy of C++ T<(int)> class."""
            and
              """__init__(TInteger self) -> TInteger"""
            instead of
              """__init__(T<(int)> self) -> TInteger"""

2017-06-27: nihaln
	    [PHP] Update the OUTPUT Typemap to add return statement to the
	    PHP Wrapper.

2017-06-27: nihaln
	    [PHP] Update the enum and value examples to use the OO wrappers
	    rather than the flat functions produced with -noproxy.  There's
	    not been a good reason to use -noproxy for since PHP5 OO wrapping
	    was fixed back in 2005.

2017-06-23: m7thon
            [Python] fix and improve default argument handling:

            1. Fix negative octals. Currently not handled correctly by `-py3`
               (unusual case, but incorrect).
            2. Fix arguments of type "octal + something" (e.g. `0640 | 04`).
               Currently drops everything after the first octal. Nasty!
            3. Fix bool arguments "0 + something" (e.g. `0 | 1`) are always
               "False" (unusual case, but incorrect).
            4. Remove special handling of "TRUE" and "FALSE" from
               `convertValue` since there's no reason these have to match
               "true" and "false".
            5. Remove the Python 2 vs. Python 3 distinction based on the
               `-py3` flag. Now the same python code is produced for default
               arguments for Python 2 and Python 3. For this, octal default
               arguments, e.g. 0644, are now wrapped as `int('644', 8)`. This
               is required, as Python 2 and Python 3 have incompatible syntax
               for octal literals.

            Fixes #707

2017-06-21: futatuki
            #1004 - Fix ccache-swig executable name to respect configure's --program-prefix and
            --program-suffix values if used.

2017-06-21: tamuratak
            [Ruby] #911 - Add std::wstring support.

2017-06-19: wsfulton
            [Python] Fix handling of rich comparisons when wrapping overloaded operators:

              operator<  operator<=  operator>  operator>=  operator==  operator!=

            Previously a TypeError was always thrown if the type was not correct. NotImplemented
            is now returned from these wrapped functions if the type being compared with is
            not correct. The subsequent behaviour varies between different versions of Python
            and the comparison function being used, but is now consistent with normal Python
            behaviour. For example, for the first 4 operator overloads above, a TypeError
            'unorderable types' is thrown in Python 3, but Python 2 will return True or False.
            NotImplemented should be returned when the comparison cannot be done, see PEP 207 and
            https://docs.python.org/3/library/constants.html#NotImplemented

            Note that the bug was only present when overloaded operators did not also have a
            function overload.

            Fixes SF bug #1208 (3441262) and SF patch #303.

            *** POTENTIAL INCOMPATIBILITY ***

2017-06-17: fabrice102
            [Go] Fix Go callback example.  Fixes github #600, #955, #1000.

2017-06-16: wsfulton
            Make sure warning and error messages are not split up by other processes writing to
            stdout at the same time.

2017-06-16: wsfulton
            [R] Fix wrapping function pointers containing rvalue and lvalue reference parameters.

2017-06-13: olly
	    [Perl] Fix testsuite to work without . in @INC - it was removed in
	    Perl 5.26 for security reasons, and has also been removed from
	    older versions in some distros.  Fixes #997 reported by lfam.

2017-06-03: wsfulton
            Fix %import on a file containing a file scope %fragment forced inclusion to not
            generate the fragment contents as %import should not result in code being generated.
            The behaviour is now the same as importing code insertion blocks.
            Wrapping FileC.i in the following example will result in no generated code, whereas
            previously "#include <limits.h>" was generated:

              // FileA.i
              %fragment("<limits.h>", "header") %{
                #include <limits.h>
              %}

              %{
                #include <stdio.h>
              %}
              %fragment("<limits.h>");

              // FileC.i
              %import "FileA.i"

            *** POTENTIAL INCOMPATIBILITY ***

2017-05-26: Volker Diels-Grabsch, vadz
            [Java] #842 Extend from java.util.AbstractList<> and implement java.util.RandomAccess for
            std::vector wrappers. This notably allows to iterate over wrapped vectors in a natural way.

2017-05-30: davidcl
            [Scilab] #994 Undefined symbol error when loading in Scilab 6

2017-05-25: asibross
            [Java] #370 #417 Missing smart pointer handling in Java director extra methods
            swigReleaseOwnership() and swigTakeOwnership().

2017-05-23: wsfulton
            [Java] #230 #759 Fix Java shared_ptr and directors for derived classes java compilation
            error.

            For shared_ptr proxy proxy classes, add a protected method swigSetCMemOwn for modifying
            the swigCMemOwn and swigCMemOwnDerived member variables which are used by various other
            methods for controlling memory ownership.

2017-05-21: Sghirate
            [Java, C#, D] #449 Remove unnecessary use of dynamic_cast in directors to enable
            non-RTTI compilation.

2017-05-21: wsfulton
            [Python] #993 Fix handling of default -ve unsigned values, such as:
              void f(unsigned = -1U);

2017-05-20: jschueller
            [Python] #991 Fix E731 PEP8 warning: do not assign a lambda expression

2017-05-16: nihal95
            [PHP] Add %pragma version directive to allow the version of the
            extension to be set.  Patch #970, fixes #360.

2017-05-13: yag00
            Patch #975 - Add support for noexcept on director methods.

2017-04-27: redbrain
            Issue #974, Patch #976 - Fix preprocessor handling of macros with commas in a comment.

2017-04-25: jleveque
            [Lua] #959 - Fix Visual Studio C4244 conversion warnings in Lua wrappers.

2017-04-21: tamuratak
            [Ruby] #964 - Add shared_ptr director typemaps.

2017-04-20: wsfulton
            [Ruby] #586, #935 Add assert for invalid NULL type parameter when calling SWIG_Ruby_NewPointerObj.

2017-04-20: tamuratak
            [Ruby] #930, #937 - Fix containers of std::shared_ptr.
            Upcasting, const types (eg vector<shared_ptr<const T>>) and NULL/nullptr support added.

2017-04-12: smarchetto
            [Scilab] New parameter targetversion to specify the Scilab target version (5, 6, ..) for code generation
            With Scilab 6 target specified, identifier names truncation is disabled (no longer necessary)

2017-03-24: tamuratak
            [Ruby] Fix #939 - Wrapping std::vector<bool> fix due to incorrect null checks
            on VALUE obj.

2017-03-17: vadz
            [C#] #947 Add support for std::complex<T>

2017-03-17: wsfulton
            [Go] Fix handling of typedef'd function pointers and typedef'd member function pointers
            such as:

              typedef int (*FnPtr_td)(int, int);
              int do_op(int x, int y, FnPtr_td op);

2017-03-16: wsfulton
            Add support for member const function pointers such as:

              int fn(short (Funcs::* parm)(bool)) const;

            Also fix parsing of references/pointers and qualifiers to member
            pointers such as:

              int fn(short (Funcs::* const parm)(bool));
              int fn(short (Funcs::* & parm)(bool));

2017-03-10: wsfulton
            Extend C++11 alternate function syntax parsing to support const and noexcept, such as:

              auto sum1(int x, int y) const -> int { return x + y; }
              auto sum2(int x, int y) noexcept -> int { return x + y; }

2017-02-29: tamuratak
            [Ruby] #917 - Add Enumerable module to all container class wrappers. It was missing
            for std::list, std::multiset, std::unordered_multiset and std::unordered_map.

2017-02-27: assambar
            [C++11] Extend parser to support throw specifier in combination
            with override and/or final.

2017-02-10: tamuratak
            [Ruby] #883 - Add support for C++11 hash tables:
              std::unordered_map
              std::unordered_set
              std::unordered_multimap
              std::unordered_multiset

2017-02-08: jcsharp
            [C#] #887 Improve std::vector<T> wrapper constructors -
            Replace constructor taking ICollection with IEnumerable and also add IEnumerable<T>
            constructor to avoid the boxing and unboxing overhead of the original constructor,
            when the type parameter is a value type.
