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)
|
||||
===========================
|
||||
|
||||
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
|
||||
[C++11] Allow static_assert at the top level (and disallow it right
|
||||
after template<T>). Fixes https://github.com/swig/swig/issues/1031
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue