Fix incorrect typemaps being used for a symbol within a templated type
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12747 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
4cf0f14cb9
commit
d38e6bdf43
5 changed files with 41 additions and 4 deletions
|
|
@ -5,6 +5,10 @@ See the RELEASENOTES file for a summary of changes in each release.
|
|||
Version 2.0.5 (in progress)
|
||||
===========================
|
||||
|
||||
2011-06-19: wsfulton
|
||||
Fix incorrect typemaps being used for a symbol within a templated type, eg:
|
||||
A<int>::value_type would incorrectly use a typemap for type A.
|
||||
|
||||
2011-06-18: olly
|
||||
[Tcl] Fix variable declarations in middle of blocks which isn't
|
||||
permitted in C90 (issue probably introduced in 2.0.3 by patch #3224663).
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
/* Test bug in 1.3.40 where the presence of a generic/unspecialized typemap caused the incorrect specialized typemap to be used */
|
||||
|
||||
%typemap(in) SWIGTYPE "/*_this_will_not_compile_SWIGTYPE_ \"$type\" */ "
|
||||
%typemap(in) const SWIGTYPE & "/*_this_will_not_compile_const_SWIGTYPE_REF_\"$type\" */ "
|
||||
%typemap(in) SWIGTYPE "_this_will_not_compile_SWIGTYPE_ \"$type\" "
|
||||
%typemap(in) const SWIGTYPE & "_this_will_not_compile_const_SWIGTYPE_REF_\"$type\" "
|
||||
|
||||
%typemap(in) const TemplateTest1 & {$1 = (TemplateTest1<YY> *)0; /* in typemap generic for $type */}
|
||||
%typemap(in) const TemplateTest1< ZZ > & {$1 = (TemplateTest1<ZZ> *)0; /* in typemap ZZ for $type */}
|
||||
|
|
@ -12,6 +12,7 @@
|
|||
%inline %{
|
||||
template<typename T> struct TemplateTest1 {
|
||||
void setT(const TemplateTest1& t) {}
|
||||
typedef double Double;
|
||||
};
|
||||
%}
|
||||
|
||||
|
|
@ -32,3 +33,8 @@ template<typename T> struct TemplateTest1 {
|
|||
{}
|
||||
%}
|
||||
|
||||
%typemap(in) TemplateTest1 "_this_will_not_compile_TemplateTest_ \"$type\" "
|
||||
|
||||
%inline %{
|
||||
void wasbug(TemplateTest1< int >::Double wbug) {}
|
||||
%}
|
||||
|
|
|
|||
|
|
@ -166,6 +166,7 @@ extern "C" {
|
|||
extern String *SwigType_templateprefix(const SwigType *t);
|
||||
extern String *SwigType_templatesuffix(const SwigType *t);
|
||||
extern String *SwigType_istemplate_templateprefix(const SwigType *t);
|
||||
extern String *SwigType_istemplate_only_templateprefix(const SwigType *t);
|
||||
extern String *SwigType_templateargs(const SwigType *t);
|
||||
extern String *SwigType_prefix(const SwigType *t);
|
||||
extern int SwigType_array_ndim(const SwigType *t);
|
||||
|
|
|
|||
|
|
@ -728,8 +728,8 @@ static Hash *typemap_search(const_String_or_char_ptr tmap_method, SwigType *type
|
|||
goto ret_result;
|
||||
|
||||
{
|
||||
/* Look for the type reduced to just the template prefix */
|
||||
SwigType *template_prefix = SwigType_istemplate_templateprefix(ctype);
|
||||
/* Look for the type reduced to just the template prefix - for templated types without the template parameter list being specified */
|
||||
SwigType *template_prefix = SwigType_istemplate_only_templateprefix(ctype);
|
||||
if (template_prefix) {
|
||||
tm = get_typemap(ts, template_prefix);
|
||||
result = typemap_search_helper(debug_display, tm, tm_method, template_prefix, cqualifiedname, cname, &backup);
|
||||
|
|
|
|||
|
|
@ -927,6 +927,32 @@ String *SwigType_istemplate_templateprefix(const SwigType *t) {
|
|||
return c ? NewStringWithSize(s, c - s) : 0;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* SwigType_istemplate_only_templateprefix()
|
||||
*
|
||||
* Similar to SwigType_istemplate_templateprefix() but only returns the template
|
||||
* prefix if the type is just the template and not a subtype/symbol within the template.
|
||||
* Returns NULL if not a template or is a template with a symbol within the template.
|
||||
* For example:
|
||||
*
|
||||
* Foo<(p.int)> => Foo
|
||||
* Foo<(p.int)>::bar => NULL
|
||||
* r.q(const).Foo<(p.int)> => r.q(const).Foo
|
||||
* r.q(const).Foo<(p.int)>::bar => NULL
|
||||
* Foo => NULL
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
||||
String *SwigType_istemplate_only_templateprefix(const SwigType *t) {
|
||||
int len = Len(t);
|
||||
const char *s = Char(t);
|
||||
if (len >= 4 && strcmp(s + len - 2, ")>") == 0) {
|
||||
const char *c = strstr(s, "<(");
|
||||
return c ? NewStringWithSize(s, c - s) : 0;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* SwigType_templateargs()
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue