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-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.
