Add recent template and scope fixes into changes file
This commit is contained in:
parent
32a454cfef
commit
1132bc334b
1 changed files with 155 additions and 0 deletions
155
CHANGES.current
155
CHANGES.current
|
|
@ -7,6 +7,161 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
|
||||||
Version 4.0.0 (in progress)
|
Version 4.0.0 (in progress)
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
2017-08-16: wsfulton
|
||||||
|
Fix #1051. 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
|
||||||
|
%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'.
|
||||||
|
|
||||||
|
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
|
2017-08-05: olly
|
||||||
[C++11] Allow static_assert at the top level (and disallow it right
|
[C++11] Allow static_assert at the top level (and disallow it right
|
||||||
after template<T>). Fixes https://github.com/swig/swig/issues/1031
|
after template<T>). Fixes https://github.com/swig/swig/issues/1031
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue