CCodeExpression arg;
if (d.has_target) {
arg = new CCodeIdentifier ("self");
+ if (!m.closure && m.this_parameter != null) {
+ arg = convert_from_generic_pointer (arg, m.this_parameter.variable_type);
+ }
} else {
// use first delegate parameter as instance
if (d_params.size == 0 || m.closure) {
CCodeExpression arg;
arg = new CCodeIdentifier (get_variable_cname (d_params.get (i).name));
+ if (d_params.get (i).variable_type is GenericType) {
+ arg = convert_from_generic_pointer (arg, param.variable_type);
+ }
carg_map.set (get_param_pos (get_ccode_pos (param)), arg);
// handle array arguments
if (m.return_type is VoidType || m.return_type.is_real_non_null_struct_type ()) {
ccode.add_expression (ccall);
} else {
- ccode.add_declaration (return_type_cname, new CCodeVariableDeclarator ("result", ccall));
+ CCodeExpression result = ccall;
+ if (d.return_type is GenericType) {
+ result = convert_to_generic_pointer (result, m.return_type);
+ }
+ ccode.add_declaration (return_type_cname, new CCodeVariableDeclarator ("result", result));
}
if (d.has_target /* TODO: && dt.value_owned */ && dt.is_called_once) {
delegates/bug595639.vala \
delegates/bug638415.vala \
delegates/bug639751.vala \
+ delegates/bug659778.vala \
delegates/bug703804.vala \
objects/chainup.vala \
objects/classes.vala \
--- /dev/null
+delegate G DoSomething<G>(G g);
+
+void do_something<G> (DoSomething<G> f) {}
+
+enum TE {
+ T
+}
+
+class Test {
+ public void f() {
+ do_something<TE> (g);
+ do_something<int> (h);
+ }
+ [CCode (instance_pos = -1)]
+ private TE g(TE i) {
+ return i;
+ }
+ [CCode (instance_pos = -1)]
+ private int h(int i) {
+ return i;
+ }
+}
+
+int main() {
+ Test t2 = new Test ();
+ t2.f ();
+ return 0;
+}