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)
===========================

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 (when keyword
            args are in use, it is not possible to avoid such warnings as they
            are inherent in the design of Python's C API in that particular
            case).  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: fultonwi
            [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
	    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 https://github.com/swig/swig/pull/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 smrt-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 https://github.com/swig/swig/issues/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
	    https://github.com/swig/swig/issues/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.
