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 (27 Jan 2017)
============================

2017-01-24: andrey-starodubtsev
            [Java] Apply #704 - director typemap improvements.
            Memory leak fixes, add support for "directorargout" typemap and
            add director support to typemaps.i.

2017-01-24: wsfulton
            Enhance %extend to extend a class with template constructors, eg:

              struct Foo {
                %extend {
                  template<typename T>
                  Foo(int a, T b) {
                    ...
                  }
                }
              };
              %template(Foo) Foo::Foo<double>;

2017-01-22: wsfulton
            Issue #876 Enhance %extend to extend a class with template methods, eg:

              struct Foo {
                %extend {
                  template<typename T>
                  void do_stuff(int a, T b) {
                    ...
                  }
                }
              };
              %template(do_stuff_inst) Foo::do_stuff<double>;

              Similarly for static template methods.

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.
