summaryrefslogtreecommitdiff
path: root/CHANGES.current
blob: 2c9c853307d2947bfd1fc112b94134d01299665f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
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.2.0 (in progress)
===========================

2023-02-15: wsfulton
            #1300 Further partial template specialization fixes.
            Fixes when templates are used as a template parameter in a partially specialized
            instantiation such as:

              template<typename V> struct Vect {};
              template<class T, typename TT> class Foo { ... };
              template<class TS, typename TTS> class Foo<Vect<TS>, TTS> { ... };
              %template(VectInt) Vect<int>;
              %template(FooVectIntDouble) Foo<Vect<int>, double>; // was previously attempting to use primary template

            Also fixes partial specialization where the same template parameter name is used twice,
            for example:

              template<typename X, typename Y> struct H { ... };
              template<typename T> struct H<T, T> { ... };
              %template(HInts) H<int, int>; // was previously attempting to use primary template

2023-01-27: jschueller
	    #2492 [python] Fix unused parameter warnings for self parameter in
	    generated C/C++ wrapper code.

2023-01-14: wsfulton
            Fix deduction of partially specialized template parameters when the specialized
            parameter is non-trivial, used in a wrapped method and the type to %template uses
            typedefs. For example:

              typedef double & DoubleRef;
              template <typename T> struct XX {};
              template <typename T> struct XX<T &> { void fn(T t) {} };
              %template(XXD) XX<DoubleRef>;

            The type of the parameter in the instantiated template for fn is now correctly deduced
            as double.

2023-01-03: wsfulton
            #983 Fix seg fault when instantiating templates with parameters that are function
            parameters containing templates, such as:

              %template(MyC) C<int(std::vector<int>)>;

2023-01-03: wsfulton
            Complete support for C++11 variadic function templates. Support was previously limited
            to just one template parameter. Now zero or more template parameters are supported
            in the %template instantiation.

2022-12-29: wsfulton
            #1863 Syntax error fixes parsing more elaborate parameter pack arguments that are
            used in function pointers, member function pointers:

              template <typename... V> struct VariadicParms {
                void ParmsFuncPtrPtr(int (*)(V*...)) {}
                void ParmsFuncPtrPtrRef(int (*)(V*&...)) {}
                void ParmsFuncPtrPtrRValueRef(int (*)(V*&&...)) {}
                void ParmsFuncPtrRef(int (*)(V&...)) {}
                void ParmsFuncPtrRValueRef(int (*)(V&&...)) {}

                void ParmsMemFuncPtrPtr(int (KlassMemFuncs::*)(V*...)) {}
                void ParmsMemFuncPtrPtrRef(int (KlassMemFuncs::*)(V*&...)) {}
                void ParmsMemFuncPtrPtrRValueRef(int (KlassMemFuncs::*)(V*&&...)) {}
                void ParmsMemFuncPtrRef(int (KlassMemFuncs::*)(V&...)) {}
                void ParmsMemFuncPtrRValueRef(int (KlassMemFuncs::*)(V&&...)) {}
              };

              %template(VariadicParms0) VariadicParms<>;
              %template(VariadicParms1) VariadicParms<A>;

            Also in various other places such as within noexcept specifiers:

              template<typename T, typename... Args>
              void emplace(Args &&... args) noexcept(
                  std::is_nothrow_constructible<T, Args &&...>::value);

2022-12-27: wsfulton
            Fix instantiation of variadic class templates containing parameter pack arguments that
            are function pointers.

              template <typename... V> struct VariadicParms {
                void ParmsFuncPtrVal(int (*)(V...)) {}
              };

              %template(VariadicParms0) VariadicParms<>;
              %template(VariadicParms1) VariadicParms<A>;

2022-12-23: wsfulton
            #1863 Fix syntax error parsing variadic templates containing parameter pack arguments that
            are function pointers.

2022-12-22: wsfulton
            Complete support for C++11 variadic class templates. Support was previously limited
            to just one template parameter. Now zero or more template parameters are supported.

2022-12-06: wsfulton
            #1636 Fix syntax error for misplaced Doxygen comment after struct/class member.
            Fix syntax error using Doxygen member groups syntax, "///*}", when used after
            final struct/class member.

2022-12-05: wsfulton
            #2023 Fix garbled Doxygen post comments in parameter lists.
            Fix syntax error parsing a trailing Doxygen comment in parameter lists.

2022-12-03: wsfulton
            #1609 Fix syntax error parsing of Doxygen comments after last enum item.

2022-12-03: wsfulton
            #1715 Fix syntax error parsing of unconventionally placed Doxygen post
            comments for enum items.

2022-12-02: wsfulton
            #624 #1021 Improved template template parameters support. Previously, specifying more
            than one simple template template parameter resulted in a parse error. Now
            multiple template template parameters are working including instantiation with
            %template. Example:

              template <template<template<class> class, class> class Op, template<class> class X, class Y>
              class C { ... };

2022-11-26: wsfulton
            #1589 #1590 Slightly better decltype() support for expressions, such as:

              int i,j;
              ...  decltype(i+j) ...
              ...  decltype(&i) ...

            These result in a warning for non-trivial expressions which SWIG cannot evaluate:

              Warning 344: Unable to deduce decltype for 'i+j'.

            See 'Type Inference' in CPlusPlus.html for workarounds.

2022-11-22: wsfulton
            #1037 Fix seg fault handling template parameter expressions containing '<='
            or '>='.

2022-11-18: wsfulton
            Duplicate class template instantiations via %template now issue a warning and are ignored.

                %template(Aint) A<int>;
                %template(Aint2) A<int>; // Now ignored and issues a warning

            example.i:7: Warning 404: Duplicate template instantiation of 'A< int >' with name 'Aint2' ignored,
            example.i:6: Warning 404: previous instantiation of 'A< int >' with name 'Aint'.

            A single empty template instantiation before a named instantiation is the one exception
            for allowing duplicate template instantiations as the empty template instantation does not
            create a wrapper for the template, it merely adds the instantiation into SWIG's internal
            type system.
            Duplicate empty template instantiations are quietly ignored.

                %template() B<int>;
                %template(Bint) B<int>; // OK

                %template() C<int>;
                %template() C<int>; // Quietly ignored now
                %template(Cint) C<int>; // OK

            Note that default template parameters are considered when looking for duplicates such as:

                template <typename T, typename U = short> struct D {};
                %template(Dint) D<int>;
                %template(Dintshort) D<int, short>;

            example.i:7: Warning 404: Duplicate template instantiation of 'D< int,short >' with name 'Dintshort' ignored,
            example.i:6: Warning 404: previous instantiation of 'D< int >' with name 'Dint'.

            Note that the following always was ignored, but that was because the chosen name was a
            duplicate rather than the template being a duplicate:

                %template(Eint) E<int>;
                %template(Eint) E<int>; // Always has been ignored as a redefined identifier

            The old warning was:

            example.i:7: Warning 302: Identifier 'Eint' redefined (ignored) (Renamed from 'E< int >'),
            example.i:6: Warning 302: previous definition of 'Eint' (Renamed from 'E< int >').

	    *** POTENTIAL INCOMPATIBILITY ***