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

2017-01-22: kwwette
            [Octave] add support for version 4.2
            - The Octave API now uses some C++11 features. It is recommended to use
              the mkoctfile program supplied by Octave to compile the SWIG-generated
              wrapper code, as mkoctfile will ensure the correct C++ compiler/options
              are used. Otherwise, the value of `mkoctfile -p CXX` should be parsed
              for any -std=* flags which might be present.
            - Octave has dropped support for << and >> operators, so SWIG now
              ignores them.
            - The Octave error() function now raises C++ exceptions to propagate
              Octave errors, so %exception directives may need to be modified.
              For convenience the SWIG_RETHROW_OCTAVE_EXCEPTIONS macro can be used
              to rethrow any Octave exceptions for Octave itself to handle, e.g.:

                try {
                  $action                        // may call error()
                }
                SWIG_RETHROW_OCTAVE_EXCEPTIONS   // error() exceptions are rethrown
                catch(...) {
                  ...                            // all other exceptions
                }

            *** POTENTIAL INCOMPATIBILITY ***

2017-01-16: wkalinin
            [C#] Fix #733 regression introduced in swig-3.0.9.
            Missing virtual function override in C# layer when using %import.

2017-01-16: fschlimb
            Fix #813 template symbol name lookup bug when typedef names are the same but in different
            namespaces.

2017-01-15: wsfulton
            [C# D Java]
            The SWIG library no longer uses the javatype, dtype or cstype typemaps, thereby
            completely freeing them up for users to use without having to replicate the library
            code that they previously added. The code previously generated by these typemaps
            has been replaced by the new %proxycode directive. Their use in the library code
            was fairly minimal:

              C#   cstype:   std_array.i std_map.i std_vector.i
              D    dtype:    std_vector.i
              Java javatype: arrays_java.i

2017-01-14: wsfulton
            The %extend directive can now optionally support one of the 'class', 'struct' or 'union'
            keywords before the identifier name, for example:

              struct X { ... };
              %extend struct X { ... }

            Previously this had to specified as:

              struct X { ... };
              %extend X { ... }

2017-01-13: wsfulton
	    [C# D Java] Add new %proxycode directive which is a macro for %insert("proxycode").
            This is a way of adding pure C#/D/Java code into the appropriate proxy class, eg:

              %extend Proxy2 {
              %proxycode %{
                public int proxycode2(int i) {
                  return i+2;
                }
              %}
              }

              %inline %{
              struct Proxy2 {};
              %}

            There will then be a pure Java/C#/D method called proxycode2 in the Proxy2 class.

2016-12-31: ajrheading1
	    Issue #860 - Remove use of std::unary_function and std::binary_function
            which is deprecated in C++11.

2016-12-30: olly
	    [PHP7] Register internal 'swig_runtime_data_type_pointer' constant
	    as "CONST_PERSISTENT" to avoid segmentation fault on module unload.
	    Fixes https://github.com/swig/swig/issues/859 reported by Timotheus
	    Pokorra - thanks also to Javier Torres for a minimal reproducer.
