diff --git a/examples/parametric.cpp b/examples/parametric.cpp index d8a76e5..4e6cebd 100644 --- a/examples/parametric.cpp +++ b/examples/parametric.cpp @@ -40,6 +40,11 @@ struct TemplateType } }; +template +struct PartialTemplate : public TemplateType +{ +}; + // Template containing a non-type parameter template struct NonTypeParam @@ -82,6 +87,14 @@ struct WrapTemplateType } }; +struct WrapPartialTemplateType +{ + template + void operator()(TypeWrapperT&&) + { + } +}; + struct WrapTemplateDefaultType { template @@ -239,6 +252,9 @@ namespace jlcxx template struct IsMirroredType> : std::false_type { }; template struct IsMirroredType> : std::false_type { }; + template struct IsMirroredType> : std::false_type { }; + template struct SuperType> { typedef TemplateType type; }; + } // namespace jlcxx JLCXX_MODULE define_julia_module(jlcxx::Module& types) @@ -249,8 +265,11 @@ JLCXX_MODULE define_julia_module(jlcxx::Module& types) types.add_type("P1"); types.add_type("P2"); - types.add_type, TypeVar<2>>>("TemplateType") - .apply, TemplateType>(WrapTemplateType()); + auto template_type = types.add_type, TypeVar<2>>>("TemplateType"); + template_type.apply, TemplateType>(WrapTemplateType()); + + types.add_type>, ParameterList>>("PartialTemplate", template_type.dt()) + .apply>(WrapPartialTemplateType()); types.add_type>>("TemplateDefaultType") .apply, TemplateDefaultType>(WrapTemplateDefaultType()); diff --git a/include/jlcxx/module.hpp b/include/jlcxx/module.hpp index c50141f..0759d1c 100644 --- a/include/jlcxx/module.hpp +++ b/include/jlcxx/module.hpp @@ -1316,7 +1316,7 @@ TypeWrapper Module::add_type_internal(const std::string& name, JLSuperT* supe fnames = jl_svec1(jl_symbol("cpp_object")); ftypes = jl_svec1(jl_voidpointer_type); - if(jl_is_datatype(super_generic) && !jl_is_unionall(super_generic)) + if(jl_is_datatype(super_generic) && !jl_is_unionall(super_generic) && !(is_parametric && SuperParametersT::nb_parameters != 0)) { super = (jl_datatype_t*)super_generic; }