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.11 (29 Dec 2016)
============================

2016-12-24: wsfulton
            [C#] Add %feature("csdirectordelegatemodifiers") to enable customization
            of the delegate access modifiers generated in director classes.
            Fixes issue #748.

2016-12-23: wsfulton
            [Python] Fix builtin "python:slot" feature failing for tp_hash when using
            hashfunc closure with a "Wrong type for hash function" for Python 2.
            Issue #843.

2016-12-21: joequamt
            Changed generation of functions so that only functions
            that end in _set generate accessor functions rather than
	    looking for "set".
	    Change generation of operators to not have underscores
	    to start in R. Users need to provide custom names for these operator overloads.

2016-12-21: olly
	    Fix isfinite() checks to work with all C++11 compilers.
	    Fixes issues #615, #788 and #849.

2016-12-20: wsfulton
            %namewarn unnecessarily caused keyword warnings for non-instantiated template classes
            and duplicate warnings for instantiated template classes when keywords were used.
            Issue #845.

2016-12-18: ezralanglois 
            [Python, Ruby, Octave] Memory leak fix on error in std::pair wrappers.
            Issue #851.

2016-12-18: wsfulton
            Zero initialize arrays when using %array_class and %array_functions.

2016-12-18: t-ikegami
            [Python] Fix #446
            Python %array_class of carrays.i failed with -builtin option.

2016-12-16: bcaine
            [Guile] Patch #744 Added support for Guile's native pointer functionality

2016-12-01: wsfulton
            [Python] Issue #769.
            Add optional moduleimport attribute to %module so that the
            default module import code can be overridden. See the "Searching for the wrapper module"
            documentation in Python.html. Example:

              %module(moduleimport="import _foo") foo

            $module also expands to the low-level C/C++ module name, so the following is the
            same as above

              %module(moduleimport="import $module") foo

2016-11-30: olly
	    [PHP] Add support for PHP7.  PHP5's C extension API has changed
	    substantially so you need to use -php7 to specify you want PHP7
	    compatible wrappers.  The default extension for generated wrappers
	    is now .cxx (to match SWIG's default for every other language - to
	    generate foo_wrap.cpp you can run SWIG with -cppext cpp).  Fixes
	    issue #571.

	    As part of this change, the language subdirectory for PHP5 has
	    changed from "php" to "php5" - if you are making use of the search
	    path feature where the language subdirectory of each directory
	    is also searched, you'll need to update your bindings.  A simple
	    fix which works for older and newer SWIG is to add a symlink:
	    ln -s php php5

	    *** POTENTIAL INCOMPATIBILITY ***

2016-11-30: olly
	    [PHP] Only emit one copy of each distinct arginfo.  Previously we
	    emitted a separate one for every wrapped function, but typically
	    many functions have the same number of parameters and combinations
	    of parameters passed by reference or not.

	    This change significantly reduces both the size of the generated
	    wrapper, and of the compiled PHP extension module (e.g. by ~6% for
	    the stripped extension module for Xapian's PHP7 bindings).

2016-11-28: wsfulton
            Fix %rename override of wildcard %rename for templates. For example:

              %rename(GlobalIntOperator) *::operator bool; // wildcard %rename

              %rename(XIntOperator) X::operator bool; // fix now overrides first %rename above
              OR
              %rename(XIntOperator) X<int>::operator bool; // fix now overrides first %rename above

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

            This also fixes %rename override of global %rename for templates. For example:

              // Global rename to make all functions start with a lower case letter
              %rename("%(firstlowercase)s", %$isfunction ) "";
              %rename(woohoo) W::Woo; // fix now overrides above %rename

              template<typename T> struct W {
                W Woo();
                ...
              };
              %template(Wint) W<int>;

            The above also introduces a possibly unexpected change. Many of the STL containers
            provided by SWIG use %rename to rename some methods, eg in std::vector, push_back
            is renamed to add in Java. Previously this intended rename did not happen when using
            using global %rename rules and the method would remain as push_back, but is now
            renamed to add. Some more info in issue #856.

	    *** POTENTIAL INCOMPATIBILITY ***

2016-11-26: m7thon
            [Python] Issue #709 - improved wrapping of division operators
            'from __future__ import division' now works in Python 2 whether or not the
            -py3 flag is used.

2016-11-12: joequant
            [R] Issue #697 - fix comma issue with overload methods

2016-11-12: joequant
	    [R] Issue #555 - R runtime needs stdio.h

2016-11-02: wsfulton
            [Python] Issue #816 - fix compilation error when using -extranative and -builtin.

2016-11-02: liorgold
            Patch #741 - Add support for C++11 alias templates, see updated CPlusPlus11.html
            documentation.

2016-10-30: myd7349
            [C#] Patch #740 Add std_array.i for C# for wrapping std::array.

            Patch also enhances std::vector<std::wstring> C# wrappers with additional functions
            (Contains, IndexOf, LastIndexOf and Remove).

2016-10-30: tobilau
            [Java] Fix wrappers for wstring parameters in director methods to cleanup local
            ref after director callback has finished.

2016-10-23: wsfulton
            [C#] Add missing csdirectorin VOID_INT_PTR and csdirectorout VOID_INT_PTR typemaps.

2016-10-23: jiulongw
            Patch #781 - Fix wrapping of C compound expressions containing char constants
            in quotes such as:

              #define H_SUPPRESS_SCALING_MAGIC (('s'<<24) | ('u'<<16) | ('p'<<8) | 'p')

              enum DifferentTypes {
                typecharcompound='A'+1,
                typecharcompound2='B' << 2
              };

2016-10-13: wsfulton
            [Python] Issue #808 - fix Python pickling and metaclass for builtin wrappers.

            The metaclass (SwigPyObjectType) for SWIG objects was not defined in
            a way that let importlib successfully import the Python wrappers.
            The pickle module previously failed to pickle objects because it couldn't
            determine what module the SWIG wrapped objects were in.

2016-09-29: wsfulton
            [Allegrocl, CFFI, GO, Javascript, Ocaml, R, Scilab]
            Add missing support for the "ret" typemap in a few target languages.
            The documentation also now has info on the "ret" typemap.

2016-09-27: ahmed-usman
            [xml] Handle template parameters correctly.

2016-09-27: dontpanic92
            [Go] Fix argument names in inherited functions taking more than 8
            parameters.  Fixes #795.

2016-09-26: smarchetto
            [Scilab] mlists that map pointers can be given a custom type name.

2016-09-25: wsfulton
            Patch #793 from q-p to expand exception handling to include std::bad_cast
            in std_except.i.

2016-09-24: olly
            [PHP] Fix code generated for feature("director:except") -
            previously the return value of call_user_function() was ignored and
            we checked an uninitialised value instead.  Fixes #627.  Based on
            patch from Sergey Seroshtan.

2016-09-22: wsfulton
            [Python] More flexible python builtin slots for overloaded C++ function.

            The closure names used for builtin slots are mangled with their functype so
            that overloaded C++ method names can be used for multiple slots.
            For example:

              %feature("python:slot", "mp_subscript", functype="binaryfunc") SimpleArray::__getitem__;
              %feature("python:slot", "sq_item", functype="ssizeargfunc") SimpleArray::__getitem__(Py_ssize_t n);

            will generate closures:

              SWIGPY_SSIZEARGFUNC_CLOSURE(_wrap_SimpleArray___getitem__) /* defines _wrap_SimpleArray___getitem___ssizeargfunc_closure */
              SWIGPY_BINARYFUNC_CLOSURE(_wrap_SimpleArray___getitem__) /* defines _wrap_SimpleArray___getitem___binaryfunc_closure */

            Previously only one name was defined: _wrap_SimpleArray___getitem___closure.
            Hence the overloaded __getitem__ method can be used to support both mp_subscript and sq_item slots.

2016-09-17: wsfulton
            [Python] Fix iterators for containers of NULL pointers (or Python None) when using
            -builtin. Previously iteration would stop at the first element that was NULL.

2016-09-16: olly
            [Javascript] Fix SWIG_exception() macro to return from the current
            function.  Fixes #789, reported by Julien Dutriaux.

2016-09-16: olly
            [PHP] Fix SWIG_exception() macro to return from the current function.
            Fixes #240, reported by Sergey Seroshtan.

2016-09-12: xypron
            [C#] Patch #786 Keyword rename to be CLS compliant by adding an underscore
            suffix instead of an underscore prefix to the C symbol name. Please use an explicit
            %rename to rename the symbol with a _ prefix if you want the old symbol name.

            *** POTENTIAL INCOMPATIBILITY ***

2016-09-09: olly
            [Python] Fix import handling for Python 2.6 to work in a frozen
            application.  Fixes #145, reported by Thomas Kluyver.

2016-09-02: smarchetto
            [Scilab] Pointers are mapped to mlist instead of tlist
            (mlist better for scilab overloading)

2016-09-02: olly
            [PHP] Fix "out" typemap for member function pointers and "in"
            typemap for char INPUT[ANY].

2016-09-01: wsfulton
            [Python] More efficient Python slicing.
            Call reserve for container types that support it to avoid repeated
            memory reallocations for new slices or slices that grow in size.

2016-09-01: wsfulton
            [Python] #771 - Make builtin types hashable by default.
            Default hash is the underlying C/C++ pointer. This matches up with testing for
            equivalence (Py_EQ in SwigPyObject_richcompare) which compares the pointers.

2016-08-22: wsfulton
            [Python] The following builtin slots can be customized like other slots via the
            "python:<x>" and "python:slot" features where <x> is the appropriate slot name:
              tp_allocs
              tp_bases
              tp_basicsize
              tp_cache
              tp_del
              tp_dealloc
              tp_flags
              tp_frees
              tp_getset
              tp_is_gc
              tp_maxalloc
              tp_methods
              tp_mro
              tp_new
              tp_next
              tp_prev
              tp_richcompare
              tp_subclasses
              tp_weaklist
              was_sq_ass_slice
              was_sq_slice

            A few documentation improvements for slot customization.

2016-08-09: joequant
            [R] Patch #765 Fix extern "C" header includes for C++ code.

2016-08-05: olly
            [xml] Fix how the output filename is built to avoid problems when
            it contains the embedded strings ".c", ".cpp" or ".cxx".
            Fixes #540 reported by djack42.

2016-07-01: wsfulton
            Fix corner case of wrapping std::vector of T pointers where a pointer to a pointer of T
            also exists in the wrapped code. SF Bug 2359417 (967).

2016-06-26: wkalinin
            [Java, C#] Patch #681 Fix seg fault when ignoring nested classes.

2016-06-25: mromberg
            [Python] #711 Fix -castmode and conversion of signed and unsigned integer types.
            See 2015-12-23 CHANGES entry for details of these improvements when they were
            implemented for the default options (ie not using -castmode).

2016-06-25: ahnolds
            Patch #730 - Fix %implicitconv for overloaded functions when using
            -castmode or -fastdispatch options.

            The result is that in all overload cases where there are multiple possibilities
            with the same number of arguments, the dispatch function will first check for
            exact (aka non implicit) matches, and then subsequently check for implicit
            casting matches. This was already happening in the normal dispatch situation,
            and in the -fastdispatch case two passes through the candidates were happening,
            just with SWIG_POINTER_IMPLICIT_CONV always set. After this patch, it is not set
            on the first pass, and then set on the second pass.

2016-06-25: liorgold
            Patch #727 - Add support for C++11 type aliasing.
