From b9350614b5956ffb8664b79ffeba38986b3678ed Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Sun, 17 Feb 2019 21:35:28 +0000 Subject: [PATCH] Fix typemap matching to expand template parameters when the name contains template parameters. In the %typemap below the type is T and the name is X::make which now expands correctly to X< int >::make template struct X { %typemap(out) T X::make "..." T make(); }; %template(Xint) X; --- CHANGES.current | 12 ++++++++ Examples/test-suite/common.mk | 1 + .../java/typemap_template_parms_runme.java | 23 +++++++++++++++ Examples/test-suite/typemap_template_parms.i | 28 +++++++++++++++++++ Source/CParse/templ.c | 2 ++ 5 files changed, 66 insertions(+) create mode 100644 Examples/test-suite/java/typemap_template_parms_runme.java create mode 100644 Examples/test-suite/typemap_template_parms.i diff --git a/CHANGES.current b/CHANGES.current index d3e84c86d..e26366a74 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -7,6 +7,18 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.0.0 (in progress) =========================== +2019-02-17: wsfulton + Fix typemap matching to expand template parameters when the name contains + template parameters. In the %typemap below the type is T and the name is X::make + and the name now expands correctly to X< int >::make + + template struct X { + %typemap(out) T X::make "..." + T make(); + }; + + %template(Xint) X; + 2019-02-16: wsfulton Fix parser error containing multiple #define statements inside an enum. diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index 595ba4ae6..11c537cbb 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -522,6 +522,7 @@ CPP_TEST_CASES += \ typemap_numinputs \ typemap_template \ typemap_template_parm_typedef \ + typemap_template_parms \ typemap_template_typedef \ typemap_out_optimal \ typemap_qualifier_strip \ diff --git a/Examples/test-suite/java/typemap_template_parms_runme.java b/Examples/test-suite/java/typemap_template_parms_runme.java new file mode 100644 index 000000000..3957ed6d3 --- /dev/null +++ b/Examples/test-suite/java/typemap_template_parms_runme.java @@ -0,0 +1,23 @@ +import typemap_template_parms.*; + +public class typemap_template_parms_runme { + + static { + try { + System.loadLibrary("typemap_template_parms"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) { + Xint xint = new Xint(); + int i = 0; + i = xint.bake(); + i = xint.make(); + i = xint.lake(); + i = xint.rake(); + i = xint.take(); + } +} diff --git a/Examples/test-suite/typemap_template_parms.i b/Examples/test-suite/typemap_template_parms.i new file mode 100644 index 000000000..fd0f7f51a --- /dev/null +++ b/Examples/test-suite/typemap_template_parms.i @@ -0,0 +1,28 @@ +%module typemap_template_parms + +%typemap(ret) int "_this_will_not_compile_int_$symname" + +%extend X { +%typemap(ret) T lake "/* ret lake X */" +%typemap(ret) T X::rake "/* ret rake X */" + +// Overrides below: %typemap(ret) T take +%typemap(ret) T X::take "/* ret take X */" +} + +%inline %{ +template struct X { +#if defined(SWIG) +%typemap(ret) T bake "/* ret bake X */" +%typemap(ret) T X::make "/* ret make X */" +%typemap(ret) T take "_rake_T_this_will_not_compile_" +#endif + T bake() { return T(); } + T make() { return T(); } + T lake() { return T(); } + T rake() { return T(); } + T take() { return T(); } +}; +%} + +%template(Xint) X; diff --git a/Source/CParse/templ.c b/Source/CParse/templ.c index 93c5dec2c..6b1a27014 100644 --- a/Source/CParse/templ.c +++ b/Source/CParse/templ.c @@ -30,8 +30,10 @@ static void add_parms(ParmList *p, List *patchlist, List *typelist) { while (p) { SwigType *ty = Getattr(p, "type"); SwigType *val = Getattr(p, "value"); + SwigType *name = Getattr(p, "name"); Append(typelist, ty); Append(typelist, val); + Append(typelist, name); Append(patchlist, val); p = nextSibling(p); }