diff --git a/CHANGES.current b/CHANGES.current index 22ba30fa7..22b00955e 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -5,3 +5,6 @@ See the RELEASENOTES file for a summary of changes in each release. Version 3.0.10 (in progress) ============================ +2016-05-31: wsfulton + Fix #690 - Smart pointer to %ignored class doesn't expose inherited methods. + Regression introduced in swig-3.0.9. diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index efece0066..a6747a080 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -363,6 +363,7 @@ CPP_TEST_CASES += \ smart_pointer_const2 \ smart_pointer_const_overload \ smart_pointer_extend \ + smart_pointer_ignore \ smart_pointer_member \ smart_pointer_multi \ smart_pointer_multi_typedef \ diff --git a/Examples/test-suite/java/smart_pointer_ignore_runme.java b/Examples/test-suite/java/smart_pointer_ignore_runme.java new file mode 100644 index 000000000..f02bf536a --- /dev/null +++ b/Examples/test-suite/java/smart_pointer_ignore_runme.java @@ -0,0 +1,19 @@ +import smart_pointer_ignore.*; + +public class smart_pointer_ignore_runme { + + static { + try { + System.loadLibrary("smart_pointer_ignore"); + } 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[]) { + DerivedPtr d = smart_pointer_ignore.makeDerived(); + d.base(); + d.derived(); + } +} diff --git a/Examples/test-suite/smart_pointer_ignore.i b/Examples/test-suite/smart_pointer_ignore.i new file mode 100644 index 000000000..f369de782 --- /dev/null +++ b/Examples/test-suite/smart_pointer_ignore.i @@ -0,0 +1,33 @@ +%module smart_pointer_ignore + + +%ignore Derived; + +%inline %{ +class Base { + public: + void base() {} +}; + +class Derived : public Base { + public: + void derived() {} +}; + +template +class Ptr { +public: + Ptr(T *t) : ptr(t) {} + T * operator->() const { return ptr; } +private: + T *ptr; +}; +%} + +%template(DerivedPtr) Ptr; + +%inline %{ +Ptr makeDerived() { + return Ptr(new Derived()); +} +%} diff --git a/Source/Modules/typepass.cxx b/Source/Modules/typepass.cxx index 3b7083def..847f5b4f9 100644 --- a/Source/Modules/typepass.cxx +++ b/Source/Modules/typepass.cxx @@ -224,7 +224,7 @@ class TypePass:private Dispatcher { if (tname) Delete(tname); if (!bcls) { - if (!clsforward) { + if (!clsforward && !GetFlag(cls, "feature:ignore")) { if (ispublic && !Getmeta(bname, "already_warned")) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Nothing known about base class '%s'. Ignored.\n", SwigType_namestr(bname)); if (Strchr(bname, '<')) { @@ -503,8 +503,7 @@ class TypePass:private Dispatcher { /* Inherit type definitions into the class */ if (name && !(GetFlag(n, "nested") && !checkAttribute(n, "access", "public") && (GetFlag(n, "feature:flatnested") || Language::instance()->nestedClassesSupport() == Language::NCS_None))) { - if (!GetFlag(n, "feature:ignore")) - cplus_inherit_types(n, 0, nname ? nname : (fname ? fname : name)); + cplus_inherit_types(n, 0, nname ? nname : (fname ? fname : name)); } inclass = n;