Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: ric...@ubuntu.com

Please unblock package vala

Vala 0.48.17
============
 * Regression and bug fixes:
  - codegen:
    + Don't free temp-var for element-access to array with boxed structs
[#1174]
    + Don't free unowned heap allocated struct

 * Bindings:
  - glib-2.0: Add simple_generics attribute to GenericArray.find_custom()

Vala 0.48.16
============
 * Various improvements and bug fixes:
  - codegen:
    + Improve handling of ellipsis parameter in get_ccode_name()
    + Fix default value of get_ccode_destroy_notify_pos()
    + Don't override valid target/destroy of previous lambda argument [#59]
    + Don't call *_instance_init() in compact class chainup
  - vala: Mark tranformed static member-access as qualified [#270]
  - girwriter: namespace expects "c:symbol-prefixes" attribute [#1038]
  - girwriter: Don't use instance-parameter inside callback [#1167]
  - girparser,libvaladoc/girimporter: Don't guess length of xml header, iterate
    forward to <repository>
  - libvaladoc/girimporter: parse_constant() use "c:identifier" attribute first

 * Bindings:
  - rest-0.7: Fix OAuthProxyAuthCallback binding
  - gtk+-3.0: Fix ModuleInitFunc binding
  - gio-2.0: Fix TlsPassword.get_value() binding
  - Fix several bindings which lead to invalid code by using them in:
    javascriptcoregtk-4.0, libusb, libusb-1.0, pixman-1,
    webkit2gtk-web-extension-4.0, x11, zlib,

[ Reason ]
Vala 0.48.x series is a Long-Term support version and receives important bug
fixes and binding fixes.

[ Impact ]
The packages fixes two upstream regressions introduced with 0.48.14 and 0.48.15

pygobject regression by new instance-parameter gir output
https://gitlab.gnome.org/GNOME/vala/-/issues/1167

using (!) when dereferencing item in array of nullable structs frees item,
leading to double free
https://gitlab.gnome.org/GNOME/vala/-/issues/1174

[ Tests ]
The vala 0.48.x series is constantly used by current package set of Debian
testing.
The upstream test suite is extended with every release.
http://ci.vala-project.org:8010/builders/vala-0.48/builds/43
http://ci.vala-project.org:8010/builders/vala-0.48/builds/45

[ Risks ]
Vala is a compiler and affects every reverse-dependency.

[ Checklist ]
  [X] all changes are documented in the d/changelog
  [X] I reviewed all changes and I approve them
  [X] There are no packaging changes other than the changelog itself
  [X] A debdiff is not applicable due to generated C files

[ Other info ]
Upstream between 0.48.15 and 0.48.17
https://gitlab.gnome.org/GNOME/vala/-/compare/10166000cbf8963cfebae5e15fa0f13b15791308...7a59191b7fc5d4c7b77f42ab0e7806011a5c71dd

unblock vala/0.48.17-1
diff --git a/NEWS b/NEWS
index e78d744d0..4bf72f071 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,26 @@
+Vala 0.48.16
+============
+ * Various improvements and bug fixes:
+  - codegen:
+    + Improve handling of ellipsis parameter in get_ccode_name()
+    + Fix default value of get_ccode_destroy_notify_pos()
+    + Don't override valid target/destroy of previous lambda argument [#59]
+    + Don't call *_instance_init() in compact class chainup
+  - vala: Mark tranformed static member-access as qualified [#270]
+  - girwriter: namespace expects "c:symbol-prefixes" attribute [#1038]
+  - girwriter: Don't use instance-parameter inside callback [#1167]
+  - girparser,libvaladoc/girimporter: Don't guess length of xml header, iterate
+    forward to <repository>
+  - libvaladoc/girimporter: parse_constant() use "c:identifier" attribute first
+
+ * Bindings:
+  - rest-0.7: Fix OAuthProxyAuthCallback binding
+  - gtk+-3.0: Fix ModuleInitFunc binding
+  - gio-2.0: Fix TlsPassword.get_value() binding
+  - Fix several bindings which lead to invalid code by using them in:
+    javascriptcoregtk-4.0, libusb, libusb-1.0, pixman-1,
+    webkit2gtk-web-extension-4.0, x11, zlib,
+
 Vala 0.48.15
 ============
  * Various improvements and bug fixes:
diff --git a/codegen/valaccode.vala b/codegen/valaccode.vala
index 7671b2c50..9b1da33f7 100644
--- a/codegen/valaccode.vala
+++ b/codegen/valaccode.vala
@@ -365,12 +365,7 @@ namespace Vala {
                if (a != null && a.has_argument ("destroy_notify_pos")) {
                        return a.get_double ("destroy_notify_pos");
                }
-               if (node is Parameter) {
-                       unowned Parameter param = (Parameter) node;
-                       return get_ccode_pos (param) + 0.1;
-               } else {
-                       return -3;
-               }
+               return get_ccode_delegate_target_pos (node) + 0.01;
        }
 
        public static bool get_ccode_delegate_target (CodeNode node) {
diff --git a/codegen/valaccodearraymodule.vala 
b/codegen/valaccodearraymodule.vala
index 851778171..9bfe9db59 100644
--- a/codegen/valaccodearraymodule.vala
+++ b/codegen/valaccodearraymodule.vala
@@ -606,7 +606,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        ccode.add_return (new CCodeIdentifier ("result"));
 
                        ccode.close ();
-                       ccode.add_return (new CCodeIdentifier ("NULL"));
+                       ccode.add_return (new CCodeConstant ("NULL"));
                } else {
                        // only dup if length > 0, this deals with negative 
lengths and returns NULL
                        var length_check = new CCodeBinaryExpression 
(CCodeBinaryOperator.GREATER_THAN, new CCodeIdentifier ("length"), new 
CCodeConstant ("0"));
@@ -644,7 +644,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        }
 
                        ccode.close ();
-                       ccode.add_return (new CCodeIdentifier ("NULL"));
+                       ccode.add_return (new CCodeConstant ("NULL"));
                }
 
                // append to file
diff --git a/codegen/valaccodeattribute.vala b/codegen/valaccodeattribute.vala
index e647b4152..b1e84583e 100644
--- a/codegen/valaccodeattribute.vala
+++ b/codegen/valaccodeattribute.vala
@@ -771,7 +771,18 @@ public class Vala.CCodeAttribute : AttributeCache {
                                }
                        } else if (sym is Signal) {
                                return Symbol.camel_case_to_lower_case 
(sym.name).replace ("_", "-");;
-                       } else if (sym is LocalVariable || sym is Parameter) {
+                       } else if (sym is LocalVariable) {
+                               unowned string name = sym.name;
+                               if 
(CCodeBaseModule.reserved_identifiers.contains (name)) {
+                                       return "_%s_".printf (name);
+                               } else {
+                                       return name;
+                               }
+                       } else if (sym is Parameter) {
+                               unowned Parameter param = (Parameter) sym;
+                               if (param.ellipsis) {
+                                       return "...";
+                               }
                                unowned string name = sym.name;
                                if 
(CCodeBaseModule.reserved_identifiers.contains (name)) {
                                        return "_%s_".printf (name);
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 412ec82d4..282e6aafd 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -1233,7 +1233,7 @@ public abstract class Vala.CCodeBaseModule : 
CodeGenerator {
 
                                                        ccode.add_assignment 
(get_delegate_target_cvalue (field_value), new CCodeIdentifier ("self"));
                                                        if 
(delegate_type.is_disposable ()) {
-                                                               
ccode.add_assignment (get_delegate_target_destroy_notify_cvalue (field_value), 
new CCodeIdentifier ("NULL"));
+                                                               
ccode.add_assignment (get_delegate_target_destroy_notify_cvalue (field_value), 
new CCodeConstant ("NULL"));
                                                        }
                                                }
                                        }
@@ -4952,7 +4952,7 @@ public abstract class Vala.CCodeBaseModule : 
CodeGenerator {
                                                                var 
delegate_target = get_delegate_target_cexpression (arg, out 
delegate_target_destroy_notify);
                                                                carg_map.set 
(get_param_pos (get_ccode_delegate_target_pos (param)), delegate_target);
                                                                if 
(deleg_type.is_disposable ()) {
-                                                                       
carg_map.set (get_param_pos (get_ccode_delegate_target_pos (param) + 0.01), 
delegate_target_destroy_notify);
+                                                                       
carg_map.set (get_param_pos (get_ccode_destroy_notify_pos (param)), 
delegate_target_destroy_notify);
                                                                }
                                                        }
                                                }
@@ -5984,7 +5984,7 @@ public abstract class Vala.CCodeBaseModule : 
CodeGenerator {
 
                        if (sink_func != "") {
                                if (type.nullable) {
-                                       var is_not_null = new 
CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, result.cvalue, new 
CCodeIdentifier ("NULL"));
+                                       var is_not_null = new 
CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, result.cvalue, new 
CCodeConstant ("NULL"));
                                        ccode.open_if (is_not_null);
                                }
 
diff --git a/codegen/valaccodedelegatemodule.vala 
b/codegen/valaccodedelegatemodule.vala
index b0770a5a0..dc54d636c 100644
--- a/codegen/valaccodedelegatemodule.vala
+++ b/codegen/valaccodedelegatemodule.vala
@@ -77,7 +77,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                if (deleg_type.is_disposable ()) {
                                        generate_type_declaration 
(delegate_target_destroy_type, decl_space);
                                        cparam = new CCodeParameter 
(get_delegate_target_destroy_notify_cname ("result"), get_ccode_name 
(delegate_target_destroy_type) + "*");
-                                       cparam_map.set (get_param_pos 
(get_ccode_delegate_target_pos (d) + 0.01), cparam);
+                                       cparam_map.set (get_param_pos 
(get_ccode_destroy_notify_pos (d)), cparam);
                                }
                        }
                }
@@ -244,7 +244,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                cparam_map.set (get_param_pos 
(get_ccode_delegate_target_pos (d)), cparam);
                                if (deleg_type.is_disposable ()) {
                                        cparam = new CCodeParameter 
(get_delegate_target_destroy_notify_cname ("result"), get_ccode_name 
(delegate_target_destroy_type) + "*");
-                                       cparam_map.set (get_param_pos 
(get_ccode_delegate_target_pos (d) + 0.01), cparam);
+                                       cparam_map.set (get_param_pos 
(get_ccode_destroy_notify_pos (d)), cparam);
                                }
                        }
                } else if (d.return_type.is_real_non_null_struct_type ()) {
@@ -343,7 +343,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                        carg_map.set (get_param_pos 
(get_ccode_delegate_target_pos (param)), ctarget);
                                        if (deleg_type.is_disposable ()) {
                                                var ctarget_destroy_notify = 
new CCodeIdentifier (get_ccode_delegate_target_destroy_notify_name 
(d_params.get (i)));
-                                               carg_map.set (get_param_pos 
(get_ccode_delegate_target_pos (m) + 0.01), ctarget_destroy_notify);
+                                               carg_map.set (get_param_pos 
(get_ccode_destroy_notify_pos (m)), ctarget_destroy_notify);
                                        }
                                }
                        }
@@ -369,7 +369,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                carg_map.set (get_param_pos 
(get_ccode_delegate_target_pos (m)), ctarget);
                                if (deleg_type.is_disposable ()) {
                                        var ctarget_destroy_notify = new 
CCodeIdentifier (get_delegate_target_destroy_notify_cname ("result"));
-                                       carg_map.set (get_param_pos 
(get_ccode_delegate_target_pos (m) + 0.01), ctarget_destroy_notify);
+                                       carg_map.set (get_param_pos 
(get_ccode_destroy_notify_pos (m)), ctarget_destroy_notify);
                                }
                        }
                } else if (m.return_type.is_real_non_null_struct_type ()) {
@@ -488,9 +488,9 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                }
                                if (deleg_type.is_disposable ()) {
                                        cparam = new CCodeParameter 
(get_ccode_delegate_target_destroy_notify_name (param), 
target_destroy_notify_ctypename);
-                                       cparam_map.set (get_param_pos 
(get_ccode_delegate_target_pos (param) + 0.01), cparam);
+                                       cparam_map.set (get_param_pos 
(get_ccode_destroy_notify_pos (param)), cparam);
                                        if (carg_map != null) {
-                                               carg_map.set (get_param_pos 
(get_ccode_delegate_target_pos (param) + 0.01), get_cexpression (cparam.name));
+                                               carg_map.set (get_param_pos 
(get_ccode_destroy_notify_pos (param)), get_cexpression (cparam.name));
                                        }
                                }
                        }
diff --git a/codegen/valaccodemethodcallmodule.vala 
b/codegen/valaccodemethodcallmodule.vala
index 461e89735..42a7fcaa0 100644
--- a/codegen/valaccodemethodcallmodule.vala
+++ b/codegen/valaccodemethodcallmodule.vala
@@ -432,12 +432,17 @@ public class Vala.CCodeMethodCallModule : 
CCodeAssignmentModule {
                                                                        
closure_new.add_argument (new CCodeCastExpression (cexpr, "GCallback"));
                                                                        
closure_new.add_argument (delegate_target);
                                                                        
closure_new.add_argument (new CCodeCastExpression 
(delegate_target_destroy_notify, "GClosureNotify"));
-                                                                       cexpr = 
new CCodeConditionalExpression (new CCodeBinaryExpression 
(CCodeBinaryOperator.EQUALITY, cexpr, new CCodeIdentifier ("NULL")), new 
CCodeIdentifier ("NULL"), closure_new);
+                                                                       cexpr = 
new CCodeConditionalExpression (new CCodeBinaryExpression 
(CCodeBinaryOperator.EQUALITY, cexpr, new CCodeConstant ("NULL")), new 
CCodeConstant ("NULL"), closure_new);
                                                                } else {
-                                                                       
carg_map.set (get_param_pos (get_ccode_delegate_target_pos (param)), 
delegate_target);
-                                                                       if 
(deleg_type.is_disposable ()) {
-                                                                               
assert (delegate_target_destroy_notify != null);
-                                                                               
carg_map.set (get_param_pos (get_ccode_delegate_target_pos (param) + 0.01), 
delegate_target_destroy_notify);
+                                                                       // 
Override previously given target/destroy only if it was NULL
+                                                                       // TODO 
https://gitlab.gnome.org/GNOME/vala/issues/59
+                                                                       var 
node = carg_map.get (get_param_pos (get_ccode_delegate_target_pos (param)));
+                                                                       if 
(node == null || (node is CCodeConstant && ((CCodeConstant) node).name == 
"NULL")) {
+                                                                               
carg_map.set (get_param_pos (get_ccode_delegate_target_pos (param)), 
delegate_target);
+                                                                               
if (deleg_type.is_disposable ()) {
+                                                                               
        assert (delegate_target_destroy_notify != null);
+                                                                               
        carg_map.set (get_param_pos (get_ccode_destroy_notify_pos (param)), 
delegate_target_destroy_notify);
+                                                                               
}
                                                                        }
                                                                }
                                                        }
@@ -491,7 +496,7 @@ public class Vala.CCodeMethodCallModule : 
CCodeAssignmentModule {
                                                                        
temp_var = get_temp_variable (delegate_target_destroy_type, true, null, true);
                                                                        
emit_temp_var (temp_var);
                                                                        
set_delegate_target_destroy_notify (arg, get_variable_cexpression 
(temp_var.name));
-                                                                       
carg_map.set (get_param_pos (get_ccode_delegate_target_pos (param) + 0.01), new 
CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, 
get_delegate_target_destroy_notify (arg)));
+                                                                       
carg_map.set (get_param_pos (get_ccode_destroy_notify_pos (param)), new 
CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, 
get_delegate_target_destroy_notify (arg)));
                                                                }
                                                        }
                                                }
@@ -612,7 +617,7 @@ public class Vala.CCodeMethodCallModule : 
CCodeAssignmentModule {
 
                                        emit_temp_var (temp_var);
 
-                                       out_arg_map.set (get_param_pos 
(get_ccode_delegate_target_pos (m) + 0.01), new CCodeUnaryExpression 
(CCodeUnaryOperator.ADDRESS_OF, temp_ref));
+                                       out_arg_map.set (get_param_pos 
(get_ccode_destroy_notify_pos (m)), new CCodeUnaryExpression 
(CCodeUnaryOperator.ADDRESS_OF, temp_ref));
 
                                        set_delegate_target_destroy_notify 
(expr, temp_ref);
                                } else {
@@ -677,7 +682,7 @@ public class Vala.CCodeMethodCallModule : 
CCodeAssignmentModule {
 
                                        emit_temp_var (temp_var);
 
-                                       out_arg_map.set (get_param_pos 
(get_ccode_delegate_target_pos (deleg) + 0.01), new CCodeUnaryExpression 
(CCodeUnaryOperator.ADDRESS_OF, temp_ref));
+                                       out_arg_map.set (get_param_pos 
(get_ccode_destroy_notify_pos (deleg)), new CCodeUnaryExpression 
(CCodeUnaryOperator.ADDRESS_OF, temp_ref));
 
                                        set_delegate_target_destroy_notify 
(expr, temp_ref);
                                }
diff --git a/codegen/valaccodemethodmodule.vala 
b/codegen/valaccodemethodmodule.vala
index f15c660ee..f29463ea4 100644
--- a/codegen/valaccodemethodmodule.vala
+++ b/codegen/valaccodemethodmodule.vala
@@ -89,9 +89,9 @@ public abstract class Vala.CCodeMethodModule : 
CCodeStructModule {
                                }
                                if (deleg_type.is_disposable ()) {
                                        cparam = new CCodeParameter 
(get_delegate_target_destroy_notify_cname ("result"), get_ccode_name 
(delegate_target_destroy_type) + "*");
-                                       cparam_map.set (get_param_pos 
(get_ccode_delegate_target_pos (m) + 0.01), cparam);
+                                       cparam_map.set (get_param_pos 
(get_ccode_destroy_notify_pos (m)), cparam);
                                        if (carg_map != null) {
-                                               carg_map.set (get_param_pos 
(get_ccode_delegate_target_pos (m) + 0.01), get_cexpression (cparam.name));
+                                               carg_map.set (get_param_pos 
(get_ccode_destroy_notify_pos (m)), get_cexpression (cparam.name));
                                        }
                                }
                        }
@@ -645,7 +645,7 @@ public abstract class Vala.CCodeMethodModule : 
CCodeStructModule {
                                                        ccode.add_assignment 
(get_this_cexpression (), ccall);
                                                }
 
-                                               if (cl.base_class == null) {
+                                               if (cl.base_class == null && 
!(((CreationMethod) m).chain_up && cl.is_compact)) {
                                                        var cinitcall = new 
CCodeFunctionCall (new CCodeIdentifier ("%s_instance_init".printf 
(get_ccode_lower_case_name (cl, null))));
                                                        cinitcall.add_argument 
(get_this_cexpression ());
                                                        if (!cl.is_compact) {
diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala
index 4cc54ff13..96e9a307e 100644
--- a/codegen/valagirwriter.vala
+++ b/codegen/valagirwriter.vala
@@ -351,7 +351,7 @@ public class Vala.GIRWriter : CodeVisitor {
                }
                string? csymbol_prefix = get_ccode_lower_case_suffix (ns);
                if (csymbol_prefix != null) {
-                       buffer.append_printf (" c:symbol-prefix=\"%s\"", 
csymbol_prefix);
+                       buffer.append_printf (" c:symbol-prefixes=\"%s\"", 
csymbol_prefix);
                }
                buffer.append_printf (">\n");
                indent++;
@@ -1125,7 +1125,7 @@ public class Vala.GIRWriter : CodeVisitor {
                buffer.append_printf ("</%s>\n", tag_type);
        }
 
-       private void write_params_and_return (List<Parameter> params, 
List<TypeParameter>? type_params, DataType? return_type, bool 
return_array_length, string? return_comment = null, bool constructor = false, 
Parameter? instance_param = null, bool user_data = false) {
+       private void write_params_and_return (string tag_name, List<Parameter> 
params, List<TypeParameter>? type_params, DataType? return_type, bool 
return_array_length, string? return_comment = null, bool constructor = false, 
Parameter? instance_param = null, bool user_data = false) {
                int last_index = 0;
                bool ret_is_struct = return_type != null && 
return_type.is_real_non_null_struct_type ();
 
@@ -1169,7 +1169,12 @@ public class Vala.GIRWriter : CodeVisitor {
                                        type.nullable = true;
                                }
                                int skip = 0;
-                               write_param_or_return (type, 
"instance-parameter", ref skip, false, "self");
+                               if (tag_name == "callback") {
+                                       write_param_or_return (type, 
"parameter", ref skip, false, "self");
+                                       index++;
+                               } else {
+                                       write_param_or_return (type, 
"instance-parameter", ref skip, false, "self");
+                               }
                        }
 
                        if (type_params != null) {
@@ -1180,9 +1185,9 @@ public class Vala.GIRWriter : CodeVisitor {
                        }
 
                        foreach (Parameter param in params) {
-                               write_param_or_return (param.variable_type, 
"parameter", ref index, get_ccode_array_length (param), param.name, 
get_parameter_comment (param), param.direction, false, false, param.ellipsis || 
param.params_array);
+                               write_param_or_return (param.variable_type, 
"parameter", ref index, get_ccode_array_length (param), get_ccode_name (param), 
get_parameter_comment (param), param.direction, false, false, param.ellipsis || 
param.params_array);
 
-                               write_implicit_params (param.variable_type, ref 
index, get_ccode_array_length (param), param.name, param.direction);
+                               write_implicit_params (param.variable_type, ref 
index, get_ccode_array_length (param), get_ccode_name (param), param.direction);
                        }
 
                        if (ret_is_struct) {
@@ -1234,7 +1239,7 @@ public class Vala.GIRWriter : CodeVisitor {
 
                write_doc (get_delegate_comment (cb));
 
-               write_params_and_return (cb.get_parameters (), 
cb.get_type_parameters (), cb.return_type, get_ccode_array_length (cb), 
get_delegate_return_comment (cb), false, null, cb.has_target);
+               write_params_and_return ("callback", cb.get_parameters (), 
cb.get_type_parameters (), cb.return_type, get_ccode_array_length (cb), 
get_delegate_return_comment (cb), false, null, cb.has_target);
 
                indent--;
                write_indent ();
@@ -1359,7 +1364,7 @@ public class Vala.GIRWriter : CodeVisitor {
                        write_doc (get_method_comment (m));
                }
 
-               write_params_and_return (params, m.get_type_parameters (), 
return_type, get_ccode_array_length (m), return_comment, false, 
m.this_parameter);
+               write_params_and_return (tag_name, params, 
m.get_type_parameters (), return_type, get_ccode_array_length (m), 
return_comment, false, m.this_parameter);
 
                indent--;
                write_indent ();
@@ -1407,7 +1412,7 @@ public class Vala.GIRWriter : CodeVisitor {
                if (m.parent_symbol is Class) {
                        type_params = ((Class) 
m.parent_symbol).get_type_parameters ();
                }
-               write_params_and_return (m.get_parameters (), type_params, 
datatype, false, get_method_return_comment (m), true);
+               write_params_and_return (tag_name, m.get_parameters (), 
type_params, datatype, false, get_method_return_comment (m), true);
 
                indent--;
                write_indent ();
@@ -1484,7 +1489,7 @@ public class Vala.GIRWriter : CodeVisitor {
 
                write_doc (get_signal_comment (sig));
 
-               write_params_and_return (sig.get_parameters (), null, 
sig.return_type, false, get_signal_return_comment (sig));
+               write_params_and_return ("glib:signal", sig.get_parameters (), 
null, sig.return_type, false, get_signal_return_comment (sig));
 
                indent--;
                write_indent ();
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index 5d3960ba7..5c79f1ef4 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -997,7 +997,7 @@ public class Vala.GTypeModule : GErrorModule {
 
                var ccall = new CCodeFunctionCall (new CCodeIdentifier 
("g_return_val_if_fail"));
                ccall.add_argument (subccall);
-               ccall.add_argument (new CCodeIdentifier ("NULL"));
+               ccall.add_argument (new CCodeConstant ("NULL"));
                ccode.add_expression (ccall);
 
                ccall = new CCodeFunctionCall (new CCodeIdentifier 
("g_param_spec_internal"));
@@ -1176,7 +1176,7 @@ public class Vala.GTypeModule : GErrorModule {
 
                var ccall = new CCodeFunctionCall (new CCodeIdentifier 
("g_return_val_if_fail"));
                ccall.add_argument (ccall_typecheck);
-               ccall.add_argument (new CCodeIdentifier ("NULL"));
+               ccall.add_argument (new CCodeConstant ("NULL"));
                ccode.add_expression (ccall);
 
                ccode.add_return (vpointer);
@@ -2329,8 +2329,8 @@ public class Vala.GTypeModule : GErrorModule {
                        get_value.add_argument ((CCodeExpression) get_ccodenode 
(((MemberAccess) expr.call).inner));
 
                        ccode.add_assignment (get_variable_cexpression 
(temp_var.name), get_value);
-                       var is_null_value = new CCodeBinaryExpression 
(CCodeBinaryOperator.INEQUALITY, get_variable_cexpression (temp_var.name), new 
CCodeIdentifier ("NULL"));
-                       set_cvalue (expr, new CCodeConditionalExpression 
(is_null_value, new CCodeMemberAccess.pointer (get_variable_cexpression 
(temp_var.name), "value_name"), new CCodeIdentifier ("NULL")));
+                       var is_null_value = new CCodeBinaryExpression 
(CCodeBinaryOperator.INEQUALITY, get_variable_cexpression (temp_var.name), new 
CCodeConstant ("NULL"));
+                       set_cvalue (expr, new CCodeConditionalExpression 
(is_null_value, new CCodeMemberAccess.pointer (get_variable_cexpression 
(temp_var.name), "value_name"), new CCodeConstant ("NULL")));
                }
                pop_line ();
        }
diff --git a/codegen/valagvariantmodule.vala b/codegen/valagvariantmodule.vala
index d4719b906..fb28aa762 100644
--- a/codegen/valagvariantmodule.vala
+++ b/codegen/valagvariantmodule.vala
@@ -345,7 +345,7 @@ public class Vala.GVariantModule : GValueModule {
                        // NULL terminate array
                        var length = new CCodeIdentifier (temp_name + 
"_length");
                        var element_access = new CCodeElementAccess (new 
CCodeIdentifier (temp_name), length);
-                       ccode.add_assignment (element_access, new 
CCodeIdentifier ("NULL"));
+                       ccode.add_assignment (element_access, new CCodeConstant 
("NULL"));
                }
 
                return new CCodeIdentifier (temp_name);
@@ -499,7 +499,7 @@ public class Vala.GVariantModule : GValueModule {
                } else if (key_type.type_symbol.get_full_name () == 
"GLib.HashTable") {
                        hash_table_new.add_argument (new CCodeCastExpression 
(new CCodeIdentifier ("g_hash_table_unref"), "GDestroyNotify"));
                } else {
-                       hash_table_new.add_argument (new CCodeIdentifier 
("NULL"));
+                       hash_table_new.add_argument (new CCodeConstant 
("NULL"));
                }
 
                if (value_type.type_symbol.is_subtype_of 
(string_type.type_symbol)) {
@@ -509,7 +509,7 @@ public class Vala.GVariantModule : GValueModule {
                } else if (value_type.type_symbol.get_full_name () == 
"GLib.HashTable") {
                        hash_table_new.add_argument (new CCodeCastExpression 
(new CCodeIdentifier ("g_hash_table_unref"), "GDestroyNotify"));
                } else {
-                       hash_table_new.add_argument (new CCodeIdentifier 
("NULL"));
+                       hash_table_new.add_argument (new CCodeConstant 
("NULL"));
                }
                ccode.add_assignment (new CCodeIdentifier (temp_name), 
hash_table_new);
 
diff --git a/doc/vala-gen-introspect.1 b/doc/vala-gen-introspect.1
index 48edff8a3..5491b4200 100644
--- a/doc/vala-gen-introspect.1
+++ b/doc/vala-gen-introspect.1
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.48.1.
-.TH VALA-GEN-INTROSPECT "1" "March 2021" "gen-introspect 0.48.15" "User 
Commands"
+.TH VALA-GEN-INTROSPECT "1" "April 2021" "gen-introspect 0.48.16" "User 
Commands"
 .SH NAME
 vala-gen-introspect \- generate a GI file for GObject and glib based packages
 .SH SYNOPSIS
diff --git a/doc/valac.1 b/doc/valac.1
index 0a09d4469..5b8b4d1ce 100644
--- a/doc/valac.1
+++ b/doc/valac.1
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.48.1.
-.TH VALAC "1" "March 2021" "Vala 0.48.15" "User Commands"
+.TH VALAC "1" "April 2021" "Vala 0.48.16" "User Commands"
 .SH NAME
 valac \- compiler that translates Vala source code into C source and header 
files
 .SH SYNOPSIS
diff --git a/doc/valadoc.1 b/doc/valadoc.1
index fe893c3ea..add271d00 100644
--- a/doc/valadoc.1
+++ b/doc/valadoc.1
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.48.1.
-.TH VALADOC "1" "March 2021" "Valadoc 0.48.15" "User Commands"
+.TH VALADOC "1" "April 2021" "Valadoc 0.48.16" "User Commands"
 .SH NAME
 valadoc \- Vala Documentation Tool
 .SH SYNOPSIS
diff --git a/doc/vapigen.1 b/doc/vapigen.1
index 54daa1bf4..65ddb44d2 100644
--- a/doc/vapigen.1
+++ b/doc/vapigen.1
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.48.1.
-.TH VAPIGEN "1" "March 2021" "Vala API Generator 0.48.15" "User Commands"
+.TH VAPIGEN "1" "April 2021" "Vala API Generator 0.48.16" "User Commands"
 .SH NAME
 vapigen \- generate a Vala API
 .SH SYNOPSIS
diff --git a/libvaladoc/importer/girdocumentationimporter.vala 
b/libvaladoc/importer/girdocumentationimporter.vala
index b7d475043..057ab499b 100644
--- a/libvaladoc/importer/girdocumentationimporter.vala
+++ b/libvaladoc/importer/girdocumentationimporter.vala
@@ -69,10 +69,14 @@ public class Valadoc.Importer.GirDocumentationImporter : 
DocumentationImporter {
                this.reader = new Vala.MarkupReader (source_file);
 
                // xml prolog
-               next ();
-               next ();
+               do {
+                       next ();
+                       if (current_token == Vala.MarkupTokenType.EOF) {
+                               error ("unexpected end of file");
+                               return;
+                       }
+               } while (current_token != Vala.MarkupTokenType.START_ELEMENT && 
reader.name != "repository");
 
-               next ();
                parse_repository ();
 
                reader = null;
@@ -845,7 +849,15 @@ public class Valadoc.Importer.GirDocumentationImporter : 
DocumentationImporter {
 
        private void parse_constant () {
                start_element ("constant");
-               string c_identifier = reader.get_attribute ("c:type");
+               string c_identifier = reader.get_attribute ("c:identifier");
+               if (c_identifier == null) {
+                       //TODO G-I seems to do this wrong
+                       c_identifier = reader.get_attribute ("c:type");
+               }
+               if (c_identifier == null) {
+                       skip_element ();
+                       return ;
+               }
                next ();
 
                Api.GirSourceComment? comment = parse_symbol_doc ();
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2979f644f..8f5ff2360 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -142,6 +142,7 @@ TESTS = \
        chainup/class-base.vala \
        chainup/class-base-foo.vala \
        chainup/class-compact-base.vala \
+       chainup/class-compact-this.vala \
        chainup/class-object.vala \
        chainup/class-this.vala \
        chainup/class-this-foo.vala \
@@ -975,6 +976,7 @@ TESTS = \
        semantic/member-access-protected-invalid.test \
        semantic/member-access-undefined.test \
        semantic/member-access-static-with-instance.vala \
+       semantic/member-access-static-transformed-qualified.vala \
        semantic/member-access-transformed-qualified.vala \
        semantic/method-abstract.test \
        semantic/method-abstract-body.test \
diff --git a/tests/chainup/class-compact-this.vala 
b/tests/chainup/class-compact-this.vala
new file mode 100644
index 000000000..3ace7a7eb
--- /dev/null
+++ b/tests/chainup/class-compact-this.vala
@@ -0,0 +1,34 @@
+[Compact]
+class Foo {
+       public string s = "foo";
+       public int i = 42;
+       public int j;
+
+       public Foo () {
+               assert (s == "foo");
+               assert (i == 42);
+               j = 23;
+       }
+
+       public Foo.bar () {
+               this ();
+               assert (s == "foo");
+               assert (i == 42);
+               assert (j == 23);
+       }
+}
+
+void main () {
+       {
+               var foo = new Foo ();
+               assert (foo.s == "foo");
+               assert (foo.i == 42);
+               assert (foo.j == 23);
+       }
+       {
+               var foo = new Foo.bar ();
+               assert (foo.s == "foo");
+               assert (foo.i == 42);
+               assert (foo.j == 23);
+       }
+}
diff --git a/tests/delegates/lambda-shared-closure.vala 
b/tests/delegates/lambda-shared-closure.vala
index 028eca31a..08f694e6d 100644
--- a/tests/delegates/lambda-shared-closure.vala
+++ b/tests/delegates/lambda-shared-closure.vala
@@ -94,6 +94,80 @@ public class Foo : Object {
        }
 }
 
+void call_shared ([CCode (delegate_target_cname = "user_data", 
delegate_target_pos = 2.9)] FooFunc a, [CCode (delegate_target_cname = 
"user_data", delegate_target_pos = 2.9)] FooFunc b) {
+       a ();
+       b ();
+}
+
+void call_shared_owned ([CCode (delegate_target_cname = "user_data", 
delegate_target_pos = 2.9)] owned FooFunc a, [CCode (delegate_target_cname = 
"user_data", delegate_target_pos = 2.9)] owned FooFunc b) {
+       a ();
+       b ();
+}
+
+void run_static_1 () {
+       var foo = new Foo ();
+
+       assert (foo.ref_count == 1);
+
+       call_shared (
+               () => {
+                       assert (foo != null);
+               },
+               () => {
+               }
+       );
+
+       assert (foo.ref_count == 1);
+}
+
+void run_static_2 () {
+       var foo = new Foo ();
+
+       assert (foo.ref_count == 1);
+
+       call_shared (
+               () => {
+               },
+               () => {
+                       assert (foo != null);
+               }
+       );
+
+       assert (foo.ref_count == 1);
+}
+
+void run_static_3 () {
+       var foo = new Foo ();
+
+       assert (foo.ref_count == 1);
+
+       call_shared_owned (
+               () => {
+                       assert (foo != null);
+               },
+               () => {
+               }
+       );
+
+       assert (foo.ref_count == 1);
+}
+
+void run_static_4 () {
+       var foo = new Foo ();
+
+       assert (foo.ref_count == 1);
+
+       call_shared_owned (
+               () => {
+               },
+               () => {
+                       assert (foo != null);
+               }
+       );
+
+       assert (foo.ref_count == 1);
+}
+
 void main () {
        var foo = new Foo ();
        assert (foo.ref_count == 1);
@@ -105,4 +179,9 @@ void main () {
        assert (foo.ref_count == 1);
        foo.run_4 ();
        assert (foo.ref_count == 1);
+
+       run_static_1 ();
+       run_static_2 ();
+       run_static_3 ();
+       run_static_4 ();
 }
diff --git a/tests/girwriter/GirTest-1.0.gir-expected 
b/tests/girwriter/GirTest-1.0.gir-expected
index 26d11df7e..d64753ac1 100644
--- a/tests/girwriter/GirTest-1.0.gir-expected
+++ b/tests/girwriter/GirTest-1.0.gir-expected
@@ -4,7 +4,7 @@
 <include name="Gio" version="2.0"/>
 <package name="girtest"/>
 <c:include name="girtest.h"/>
-<namespace name="GirTest" version="1.0" shared-library="girtest" 
c:prefix="GirTest" c:identifier-prefixes="GirTest" c:symbol-prefix="gir_test">
+<namespace name="GirTest" version="1.0" shared-library="girtest" 
c:prefix="GirTest" c:identifier-prefixes="GirTest" c:symbol-prefixes="gir_test">
        <function name="nested_function" 
c:identifier="gir_test_nested_function">
                <return-value transfer-ownership="full">
                        <type name="none" c:type="void"/>
@@ -848,6 +848,60 @@
                                </parameter>
                        </parameters>
                </virtual-method>
+               <method name="method_implicit_params" 
c:identifier="gir_test_object_test_method_implicit_params">
+                       <return-value transfer-ownership="full">
+                               <type name="none" c:type="void"/>
+                       </return-value>
+                       <parameters>
+                               <instance-parameter name="self" 
transfer-ownership="none">
+                                       <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
+                               </instance-parameter>
+                               <parameter name="param1" 
transfer-ownership="none">
+                                       <array length="1" c:type="gint*">
+                                               <type name="gint" 
c:type="gint"/>
+                                       </array>
+                               </parameter>
+                               <parameter name="param1_length1" 
transfer-ownership="none">
+                                       <type name="gint" c:type="gint"/>
+                               </parameter>
+                               <parameter name="param2" 
transfer-ownership="none" closure="3" scope="notified" destroy="4">
+                                       <type name="GirTest.DelegateTest" 
c:type="GirTestDelegateTest"/>
+                               </parameter>
+                               <parameter name="param2_target" 
transfer-ownership="none" allow-none="1">
+                                       <type name="gpointer" c:type="void*"/>
+                               </parameter>
+                               <parameter name="param2_target_destroy_notify" 
transfer-ownership="none" scope="call">
+                                       <type name="GLib.DestroyNotify" 
c:type="GDestroyNotify"/>
+                               </parameter>
+                       </parameters>
+               </method>
+               <virtual-method name="method_implicit_params" 
invoker="method_implicit_params">
+                       <return-value transfer-ownership="full">
+                               <type name="none" c:type="void"/>
+                       </return-value>
+                       <parameters>
+                               <instance-parameter name="self" 
transfer-ownership="none">
+                                       <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
+                               </instance-parameter>
+                               <parameter name="param1" 
transfer-ownership="none">
+                                       <array length="1" c:type="gint*">
+                                               <type name="gint" 
c:type="gint"/>
+                                       </array>
+                               </parameter>
+                               <parameter name="param1_length1" 
transfer-ownership="none">
+                                       <type name="gint" c:type="gint"/>
+                               </parameter>
+                               <parameter name="param2" 
transfer-ownership="none" closure="3" scope="notified" destroy="4">
+                                       <type name="GirTest.DelegateTest" 
c:type="GirTestDelegateTest"/>
+                               </parameter>
+                               <parameter name="param2_target" 
transfer-ownership="none" allow-none="1">
+                                       <type name="gpointer" c:type="void*"/>
+                               </parameter>
+                               <parameter name="param2_target_destroy_notify" 
transfer-ownership="none" scope="call">
+                                       <type name="GLib.DestroyNotify" 
c:type="GDestroyNotify"/>
+                               </parameter>
+                       </parameters>
+               </virtual-method>
                <property name="some-property" writable="1" construct="1">
                        <type name="utf8" c:type="gchar*"/>
                </property>
@@ -973,9 +1027,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="param" 
transfer-ownership="none">
                                                <type name="gint8" 
c:type="gint8"/>
                                        </parameter>
@@ -988,10 +1042,10 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
-                                       </instance-parameter>
-                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="1" scope="async">
+                                       </parameter>
+                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="2" scope="async">
                                                <type 
name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
                                        </parameter>
                                        <parameter name="_callback__target" 
transfer-ownership="none" allow-none="1">
@@ -1006,9 +1060,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="_res_" 
transfer-ownership="none">
                                                <type name="Gio.AsyncResult" 
c:type="GAsyncResult*"/>
                                        </parameter>
@@ -1021,13 +1075,13 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="i1" 
transfer-ownership="none">
                                                <type name="gint" 
c:type="gint"/>
                                        </parameter>
-                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="2" scope="async">
+                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="3" scope="async">
                                                <type 
name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
                                        </parameter>
                                        <parameter name="_callback__target" 
transfer-ownership="none" allow-none="1">
@@ -1042,9 +1096,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="_res_" 
transfer-ownership="none">
                                                <type name="Gio.AsyncResult" 
c:type="GAsyncResult*"/>
                                        </parameter>
@@ -1060,9 +1114,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                </parameters>
                        </callback>
                </field>
@@ -1072,9 +1126,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                </parameters>
                        </callback>
                </field>
@@ -1084,10 +1138,10 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
-                                       </instance-parameter>
-                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="1" scope="async">
+                                       </parameter>
+                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="2" scope="async">
                                                <type 
name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
                                        </parameter>
                                        <parameter name="_callback__target" 
transfer-ownership="none" allow-none="1">
@@ -1102,24 +1156,53 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="_res_" 
transfer-ownership="none">
                                                <type name="Gio.AsyncResult" 
c:type="GAsyncResult*"/>
                                        </parameter>
                                </parameters>
                        </callback>
                </field>
+               <field name="method_implicit_params">
+                       <callback name="method_implicit_params" 
c:type="method_implicit_params">
+                               <return-value transfer-ownership="full">
+                                       <type name="none" c:type="void"/>
+                               </return-value>
+                               <parameters>
+                                       <parameter name="self" 
transfer-ownership="none">
+                                               <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
+                                       </parameter>
+                                       <parameter name="param1" 
transfer-ownership="none">
+                                               <array length="2" 
c:type="gint*">
+                                                       <type name="gint" 
c:type="gint"/>
+                                               </array>
+                                       </parameter>
+                                       <parameter name="param1_length1" 
transfer-ownership="none">
+                                               <type name="gint" 
c:type="gint"/>
+                                       </parameter>
+                                       <parameter name="param2" 
transfer-ownership="none" closure="4" scope="notified" destroy="5">
+                                               <type 
name="GirTest.DelegateTest" c:type="GirTestDelegateTest"/>
+                                       </parameter>
+                                       <parameter name="param2_target" 
transfer-ownership="none" allow-none="1">
+                                               <type name="gpointer" 
c:type="void*"/>
+                                       </parameter>
+                                       <parameter 
name="param2_target_destroy_notify" transfer-ownership="none" scope="call">
+                                               <type name="GLib.DestroyNotify" 
c:type="GDestroyNotify"/>
+                                       </parameter>
+                               </parameters>
+                       </callback>
+               </field>
                <field name="signal_with_default_handlder">
                        <callback 
name="object_test_signal_with_default_handlder" 
c:type="object_test_signal_with_default_handlder">
                                <return-value transfer-ownership="full">
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type name="GirTest.ObjectTest" 
c:type="GirTestObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="i1" 
transfer-ownership="none">
                                                <type name="gint" 
c:type="gint"/>
                                        </parameter>
@@ -1368,6 +1451,60 @@
                                </parameter>
                        </parameters>
                </virtual-method>
+               <method name="method_implicit_params" 
c:identifier="gir_test_abstract_object_test_method_implicit_params">
+                       <return-value transfer-ownership="full">
+                               <type name="none" c:type="void"/>
+                       </return-value>
+                       <parameters>
+                               <instance-parameter name="self" 
transfer-ownership="none">
+                                       <type name="GirTest.AbstractObjectTest" 
c:type="GirTestAbstractObjectTest*"/>
+                               </instance-parameter>
+                               <parameter name="param1" 
transfer-ownership="none">
+                                       <array length="1" c:type="gint*">
+                                               <type name="gint" 
c:type="gint"/>
+                                       </array>
+                               </parameter>
+                               <parameter name="param1_length1" 
transfer-ownership="none">
+                                       <type name="gint" c:type="gint"/>
+                               </parameter>
+                               <parameter name="param2" 
transfer-ownership="none" closure="3" scope="notified" destroy="4">
+                                       <type name="GirTest.DelegateTest" 
c:type="GirTestDelegateTest"/>
+                               </parameter>
+                               <parameter name="param2_target" 
transfer-ownership="none" allow-none="1">
+                                       <type name="gpointer" c:type="void*"/>
+                               </parameter>
+                               <parameter name="param2_target_destroy_notify" 
transfer-ownership="none" scope="call">
+                                       <type name="GLib.DestroyNotify" 
c:type="GDestroyNotify"/>
+                               </parameter>
+                       </parameters>
+               </method>
+               <virtual-method name="method_implicit_params" 
invoker="method_implicit_params">
+                       <return-value transfer-ownership="full">
+                               <type name="none" c:type="void"/>
+                       </return-value>
+                       <parameters>
+                               <instance-parameter name="self" 
transfer-ownership="none">
+                                       <type name="GirTest.AbstractObjectTest" 
c:type="GirTestAbstractObjectTest*"/>
+                               </instance-parameter>
+                               <parameter name="param1" 
transfer-ownership="none">
+                                       <array length="1" c:type="gint*">
+                                               <type name="gint" 
c:type="gint"/>
+                                       </array>
+                               </parameter>
+                               <parameter name="param1_length1" 
transfer-ownership="none">
+                                       <type name="gint" c:type="gint"/>
+                               </parameter>
+                               <parameter name="param2" 
transfer-ownership="none" closure="3" scope="notified" destroy="4">
+                                       <type name="GirTest.DelegateTest" 
c:type="GirTestDelegateTest"/>
+                               </parameter>
+                               <parameter name="param2_target" 
transfer-ownership="none" allow-none="1">
+                                       <type name="gpointer" c:type="void*"/>
+                               </parameter>
+                               <parameter name="param2_target_destroy_notify" 
transfer-ownership="none" scope="call">
+                                       <type name="GLib.DestroyNotify" 
c:type="GDestroyNotify"/>
+                               </parameter>
+                       </parameters>
+               </virtual-method>
        </class>
        <record name="AbstractObjectTestClass" 
c:type="GirTestAbstractObjectTestClass" 
glib:is-gtype-struct-for="AbstractObjectTest">
                <field name="parent_class" readable="0" private="1">
@@ -1379,9 +1516,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.AbstractObjectTest" c:type="GirTestAbstractObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="param" 
transfer-ownership="none">
                                                <type name="gint8" 
c:type="gint8"/>
                                        </parameter>
@@ -1394,9 +1531,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.AbstractObjectTest" c:type="GirTestAbstractObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="param" 
direction="inout" transfer-ownership="full">
                                                <type name="gint8" 
c:type="gint8*"/>
                                        </parameter>
@@ -1409,9 +1546,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.AbstractObjectTest" c:type="GirTestAbstractObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="param" direction="out" 
transfer-ownership="full">
                                                <type name="gint8" 
c:type="gint8*"/>
                                        </parameter>
@@ -1424,9 +1561,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.AbstractObjectTest" c:type="GirTestAbstractObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                </parameters>
                        </callback>
                </field>
@@ -1436,9 +1573,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.AbstractObjectTest" c:type="GirTestAbstractObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="param" 
transfer-ownership="none">
                                                <type name="gint" 
c:type="gint"/>
                                        </parameter>
@@ -1454,13 +1591,13 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.AbstractObjectTest" c:type="GirTestAbstractObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="param" 
transfer-ownership="none">
                                                <type name="gint" 
c:type="gint"/>
                                        </parameter>
-                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="2" scope="async">
+                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="3" scope="async">
                                                <type 
name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
                                        </parameter>
                                        <parameter name="_callback__target" 
transfer-ownership="none" allow-none="1">
@@ -1475,9 +1612,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.AbstractObjectTest" c:type="GirTestAbstractObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="_res_" 
transfer-ownership="none">
                                                <type name="Gio.AsyncResult" 
c:type="GAsyncResult*"/>
                                        </parameter>
@@ -1490,9 +1627,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.AbstractObjectTest" c:type="GirTestAbstractObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                </parameters>
                        </callback>
                </field>
@@ -1502,10 +1639,10 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.AbstractObjectTest" c:type="GirTestAbstractObjectTest*"/>
-                                       </instance-parameter>
-                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="1" scope="async">
+                                       </parameter>
+                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="2" scope="async">
                                                <type 
name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
                                        </parameter>
                                        <parameter name="_callback__target" 
transfer-ownership="none" allow-none="1">
@@ -1520,15 +1657,44 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.AbstractObjectTest" c:type="GirTestAbstractObjectTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="_res_" 
transfer-ownership="none">
                                                <type name="Gio.AsyncResult" 
c:type="GAsyncResult*"/>
                                        </parameter>
                                </parameters>
                        </callback>
                </field>
+               <field name="method_implicit_params">
+                       <callback name="method_implicit_params" 
c:type="method_implicit_params">
+                               <return-value transfer-ownership="full">
+                                       <type name="none" c:type="void"/>
+                               </return-value>
+                               <parameters>
+                                       <parameter name="self" 
transfer-ownership="none">
+                                               <type 
name="GirTest.AbstractObjectTest" c:type="GirTestAbstractObjectTest*"/>
+                                       </parameter>
+                                       <parameter name="param1" 
transfer-ownership="none">
+                                               <array length="2" 
c:type="gint*">
+                                                       <type name="gint" 
c:type="gint"/>
+                                               </array>
+                                       </parameter>
+                                       <parameter name="param1_length1" 
transfer-ownership="none">
+                                               <type name="gint" 
c:type="gint"/>
+                                       </parameter>
+                                       <parameter name="param2" 
transfer-ownership="none" closure="4" scope="notified" destroy="5">
+                                               <type 
name="GirTest.DelegateTest" c:type="GirTestDelegateTest"/>
+                                       </parameter>
+                                       <parameter name="param2_target" 
transfer-ownership="none" allow-none="1">
+                                               <type name="gpointer" 
c:type="void*"/>
+                                       </parameter>
+                                       <parameter 
name="param2_target_destroy_notify" transfer-ownership="none" scope="call">
+                                               <type name="GLib.DestroyNotify" 
c:type="GDestroyNotify"/>
+                                       </parameter>
+                               </parameters>
+                       </callback>
+               </field>
        </record>
        <record name="AbstractObjectTestPrivate" 
c:type="GirTestAbstractObjectTestPrivate" disguised="1"/>
        <class name="ImplementionTest" c:type="GirTestImplementionTest" 
c:symbol-prefix="implemention_test" glib:type-name="GirTestImplementionTest" 
glib:get-type="gir_test_implemention_test_get_type" 
glib:type-struct="ImplementionTestClass" parent="GObject.Object">
@@ -2026,6 +2192,60 @@
                                </parameter>
                        </parameters>
                </virtual-method>
+               <method name="method_implicit_params" 
c:identifier="gir_test_interface_test_method_implicit_params">
+                       <return-value transfer-ownership="full">
+                               <type name="none" c:type="void"/>
+                       </return-value>
+                       <parameters>
+                               <instance-parameter name="self" 
transfer-ownership="none">
+                                       <type name="GirTest.InterfaceTest" 
c:type="GirTestInterfaceTest*"/>
+                               </instance-parameter>
+                               <parameter name="param1" 
transfer-ownership="none">
+                                       <array length="1" c:type="gint*">
+                                               <type name="gint" 
c:type="gint"/>
+                                       </array>
+                               </parameter>
+                               <parameter name="param1_length1" 
transfer-ownership="none">
+                                       <type name="gint" c:type="gint"/>
+                               </parameter>
+                               <parameter name="param2" 
transfer-ownership="none" closure="3" scope="notified" destroy="4">
+                                       <type name="GirTest.DelegateTest" 
c:type="GirTestDelegateTest"/>
+                               </parameter>
+                               <parameter name="param2_target" 
transfer-ownership="none" allow-none="1">
+                                       <type name="gpointer" c:type="void*"/>
+                               </parameter>
+                               <parameter name="param2_target_destroy_notify" 
transfer-ownership="none" scope="call">
+                                       <type name="GLib.DestroyNotify" 
c:type="GDestroyNotify"/>
+                               </parameter>
+                       </parameters>
+               </method>
+               <virtual-method name="method_implicit_params" 
invoker="method_implicit_params">
+                       <return-value transfer-ownership="full">
+                               <type name="none" c:type="void"/>
+                       </return-value>
+                       <parameters>
+                               <instance-parameter name="self" 
transfer-ownership="none">
+                                       <type name="GirTest.InterfaceTest" 
c:type="GirTestInterfaceTest*"/>
+                               </instance-parameter>
+                               <parameter name="param1" 
transfer-ownership="none">
+                                       <array length="1" c:type="gint*">
+                                               <type name="gint" 
c:type="gint"/>
+                                       </array>
+                               </parameter>
+                               <parameter name="param1_length1" 
transfer-ownership="none">
+                                       <type name="gint" c:type="gint"/>
+                               </parameter>
+                               <parameter name="param2" 
transfer-ownership="none" closure="3" scope="notified" destroy="4">
+                                       <type name="GirTest.DelegateTest" 
c:type="GirTestDelegateTest"/>
+                               </parameter>
+                               <parameter name="param2_target" 
transfer-ownership="none" allow-none="1">
+                                       <type name="gpointer" c:type="void*"/>
+                               </parameter>
+                               <parameter name="param2_target_destroy_notify" 
transfer-ownership="none" scope="call">
+                                       <type name="GLib.DestroyNotify" 
c:type="GDestroyNotify"/>
+                               </parameter>
+                       </parameters>
+               </virtual-method>
                <function name="static_method" 
c:identifier="gir_test_interface_test_static_method">
                        <return-value transfer-ownership="full">
                                <type name="none" c:type="void"/>
@@ -2114,9 +2334,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="param" 
transfer-ownership="none">
                                                <type name="gint8" 
c:type="gint8"/>
                                        </parameter>
@@ -2129,10 +2349,10 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
-                                       </instance-parameter>
-                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="1" scope="async">
+                                       </parameter>
+                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="2" scope="async">
                                                <type 
name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
                                        </parameter>
                                        <parameter name="_callback__target" 
transfer-ownership="none" allow-none="1">
@@ -2147,9 +2367,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="_res_" 
transfer-ownership="none">
                                                <type name="Gio.AsyncResult" 
c:type="GAsyncResult*"/>
                                        </parameter>
@@ -2162,9 +2382,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="param" 
transfer-ownership="none">
                                                <type name="gint" 
c:type="gint"/>
                                        </parameter>
@@ -2180,13 +2400,13 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="param" 
transfer-ownership="none">
                                                <type name="gint" 
c:type="gint"/>
                                        </parameter>
-                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="2" scope="async">
+                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="3" scope="async">
                                                <type 
name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
                                        </parameter>
                                        <parameter name="_callback__target" 
transfer-ownership="none" allow-none="1">
@@ -2201,9 +2421,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="_res_" 
transfer-ownership="none">
                                                <type name="Gio.AsyncResult" 
c:type="GAsyncResult*"/>
                                        </parameter>
@@ -2216,9 +2436,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                </parameters>
                        </callback>
                </field>
@@ -2228,10 +2448,10 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
-                                       </instance-parameter>
-                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="1" scope="async">
+                                       </parameter>
+                                       <parameter name="_callback_" 
transfer-ownership="none" allow-none="1" closure="2" scope="async">
                                                <type 
name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
                                        </parameter>
                                        <parameter name="_callback__target" 
transfer-ownership="none" allow-none="1">
@@ -2246,24 +2466,53 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="_res_" 
transfer-ownership="none">
                                                <type name="Gio.AsyncResult" 
c:type="GAsyncResult*"/>
                                        </parameter>
                                </parameters>
                        </callback>
                </field>
+               <field name="method_implicit_params">
+                       <callback name="method_implicit_params" 
c:type="method_implicit_params">
+                               <return-value transfer-ownership="full">
+                                       <type name="none" c:type="void"/>
+                               </return-value>
+                               <parameters>
+                                       <parameter name="self" 
transfer-ownership="none">
+                                               <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
+                                       </parameter>
+                                       <parameter name="param1" 
transfer-ownership="none">
+                                               <array length="2" 
c:type="gint*">
+                                                       <type name="gint" 
c:type="gint"/>
+                                               </array>
+                                       </parameter>
+                                       <parameter name="param1_length1" 
transfer-ownership="none">
+                                               <type name="gint" 
c:type="gint"/>
+                                       </parameter>
+                                       <parameter name="param2" 
transfer-ownership="none" closure="4" scope="notified" destroy="5">
+                                               <type 
name="GirTest.DelegateTest" c:type="GirTestDelegateTest"/>
+                                       </parameter>
+                                       <parameter name="param2_target" 
transfer-ownership="none" allow-none="1">
+                                               <type name="gpointer" 
c:type="void*"/>
+                                       </parameter>
+                                       <parameter 
name="param2_target_destroy_notify" transfer-ownership="none" scope="call">
+                                               <type name="GLib.DestroyNotify" 
c:type="GDestroyNotify"/>
+                                       </parameter>
+                               </parameters>
+                       </callback>
+               </field>
                <field name="get_property">
                        <callback name="get_property" c:type="get_property">
                                <return-value transfer-ownership="none">
                                        <type name="gint" c:type="gint"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                </parameters>
                        </callback>
                </field>
@@ -2273,9 +2522,9 @@
                                        <type name="none" c:type="void"/>
                                </return-value>
                                <parameters>
-                                       <instance-parameter name="self" 
transfer-ownership="none">
+                                       <parameter name="self" 
transfer-ownership="none">
                                                <type 
name="GirTest.InterfaceTest" c:type="GirTestInterfaceTest*"/>
-                                       </instance-parameter>
+                                       </parameter>
                                        <parameter name="value" 
transfer-ownership="none">
                                                <type name="gint" 
c:type="gint"/>
                                        </parameter>
diff --git a/tests/girwriter/girtest.vala b/tests/girwriter/girtest.vala
index e39dabc59..a08020bd0 100644
--- a/tests/girwriter/girtest.vala
+++ b/tests/girwriter/girtest.vala
@@ -82,6 +82,8 @@ namespace GirTest {
                [NoWrapper]
                public virtual async void no_wrapper_method_async () {
                }
+               public virtual void method_implicit_params (int[] param1, owned 
DelegateTest param2) {
+               }
                [HasEmitter]
                public signal void some_signal (int param);
                public static void static_method () {
@@ -284,6 +286,9 @@ namespace GirTest {
                [NoWrapper]
                public virtual async void no_wrapper_method_async () {
                }
+
+               public virtual void method_implicit_params (int[] param1, owned 
DelegateTest param2) {
+               }
        }
 
        public abstract class AbstractObjectTest : Object {
@@ -305,6 +310,8 @@ namespace GirTest {
 
                [NoWrapper]
                public abstract async void no_wrapper_method_async ();
+
+               public abstract void method_implicit_params (int[] param1, 
owned DelegateTest param2);
        }
 
        public interface PrerequisiteTest : InterfaceTest {
diff --git a/tests/girwriter/girtest.vapi-expected 
b/tests/girwriter/girtest.vapi-expected
index aa02fb5cb..807080a33 100644
--- a/tests/girwriter/girtest.vapi-expected
+++ b/tests/girwriter/girtest.vapi-expected
@@ -7,6 +7,7 @@ namespace GirTest {
        [CCode (cheader_filename = "girtest.h")]
        public abstract class AbstractObjectTest : GLib.Object {
                protected AbstractObjectTest ();
+               public abstract void method_implicit_params (int[] param1, 
owned GirTest.DelegateTest param2);
                public abstract void method_int8_in (int8 param);
                public abstract void method_int8_inout (ref int8 param);
                public abstract void method_int8_out (out int8 param);
@@ -73,6 +74,7 @@ namespace GirTest {
                public int[] int_in_int_in_array_return (int param1, int 
param2);
                public ObjectTest.may_fail (int param) throws GirTest.ErrorTest;
                public void method ();
+               public virtual void method_implicit_params (int[] param1, owned 
GirTest.DelegateTest param2);
                public virtual void method_throw () throws GirTest.ErrorTest;
                public void method_valist (int param, va_list vargs);
                public void method_varargs (int param, ...);
@@ -126,6 +128,7 @@ namespace GirTest {
        public interface InterfaceTest : GLib.Object {
                public virtual async void coroutine_async ();
                public virtual void int8_in (int8 param);
+               public virtual void method_implicit_params (int[] param1, owned 
GirTest.DelegateTest param2);
                public virtual void method_valist (int param, va_list vargs);
                [NoWrapper]
                public virtual void no_wrapper_method ();
diff --git a/tests/girwriter/girtest.vapigen-expected 
b/tests/girwriter/girtest.vapigen-expected
index b03b374e7..35a839f72 100644
--- a/tests/girwriter/girtest.vapigen-expected
+++ b/tests/girwriter/girtest.vapigen-expected
@@ -8,6 +8,7 @@ namespace GirTest {
        public abstract class AbstractObjectTest : GLib.Object {
                [CCode (has_construct_function = false)]
                protected AbstractObjectTest ();
+               public abstract void method_implicit_params ([CCode 
(array_length_cname = "param1_length1", array_length_pos = 1.5)] int[] param1, 
owned GirTest.DelegateTest param2);
                public abstract void method_int8_in (int8 param);
                public abstract void method_int8_inout (ref int8 param);
                public abstract void method_int8_out (out int8 param);
@@ -102,6 +103,7 @@ namespace GirTest {
                [CCode (cname = "gir_test_object_test_new_may_fail", 
has_construct_function = false)]
                public ObjectTest.may_fail (int param) throws GirTest.ErrorTest;
                public void method ();
+               public virtual void method_implicit_params ([CCode 
(array_length_cname = "param1_length1", array_length_pos = 1.5)] int[] param1, 
owned GirTest.DelegateTest param2);
                public virtual void method_throw () throws GirTest.ErrorTest;
                public void method_valist (int param, va_list vargs);
                public void method_varargs (int param, ...);
@@ -159,6 +161,7 @@ namespace GirTest {
                public virtual void coroutine_finish (GLib.AsyncResult _res_);
                public virtual int get_property ();
                public virtual void int8_in (int8 param);
+               public virtual void method_implicit_params ([CCode 
(array_length_cname = "param1_length1", array_length_pos = 1.5)] int[] param1, 
owned GirTest.DelegateTest param2);
                [NoWrapper]
                public virtual void no_wrapper_method ();
                [NoWrapper]
diff --git a/tests/semantic/member-access-static-transformed-qualified.vala 
b/tests/semantic/member-access-static-transformed-qualified.vala
new file mode 100644
index 000000000..6469ffd88
--- /dev/null
+++ b/tests/semantic/member-access-static-transformed-qualified.vala
@@ -0,0 +1,14 @@
+namespace Manam {
+       class Manam {
+       }
+
+       class Foo {
+               public static void bar () {
+               }
+       }
+
+       void main () {
+               var foo = new Foo ();
+               foo.bar ();
+       }
+}
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 5496023c2..eddc1e206 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -1468,10 +1468,14 @@ public class Vala.GirParser : CodeVisitor {
                reader = new MarkupReader (source_file.filename);
 
                // xml prolog
-               next ();
-               next ();
+               do {
+                       next ();
+                       if (current_token == MarkupTokenType.EOF) {
+                               Report.error (get_current_src (), "unexpected 
end of file");
+                               return;
+                       }
+               } while (current_token != MarkupTokenType.START_ELEMENT && 
reader.name != "repository");
 
-               next ();
                parse_repository ();
 
                reader = null;
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index 4188cbc0b..a5afbb444 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -942,6 +942,7 @@ public class Vala.MemberAccess : Expression {
                                                inner_ma = (MemberAccess) 
inner_ma.inner;
                                                inner_sym = 
inner_sym.parent_symbol;
                                        }
+                                       inner_ma.qualified = true;
                                        inner.check (context);
                                }
                        }
diff --git a/vapi/gio-2.0.vapi b/vapi/gio-2.0.vapi
index f9bdad9ca..0c60a0a0c 100644
--- a/vapi/gio-2.0.vapi
+++ b/vapi/gio-2.0.vapi
@@ -3112,7 +3112,7 @@ namespace GLib {
                public virtual unowned string get_default_warning ();
                public unowned string get_description ();
                public GLib.TlsPasswordFlags get_flags ();
-               [CCode (array_length_pos = 0.1)]
+               [CCode (array_length_pos = 0.1, array_length_type = "gsize")]
                public virtual unowned uint8[] get_value ();
                public unowned string get_warning ();
                public void set_description (string description);
diff --git a/vapi/gtk+-3.0.vapi b/vapi/gtk+-3.0.vapi
index c9eca25c2..d963e7f20 100644
--- a/vapi/gtk+-3.0.vapi
+++ b/vapi/gtk+-3.0.vapi
@@ -12384,7 +12384,7 @@ namespace Gtk {
        [Version (since = "2.2")]
        public delegate void ModuleDisplayInitFunc (Gdk.Display display);
        [CCode (cheader_filename = "gtk/gtk.h", has_target = false)]
-       public delegate void ModuleInitFunc ([CCode (array_length_cname = 
"argc", array_length_pos = 0.5)] string[]? argv);
+       public delegate void ModuleInitFunc ([CCode (array_length_cname = 
"argc", array_length_pos = 0.5)] ref unowned string[]? argv);
        [CCode (cheader_filename = "gtk/gtk.h", instance_pos = 1.9)]
        public delegate void PageSetupDoneFunc (Gtk.PageSetup page_setup);
        [CCode (cheader_filename = "gtk/gtk.h", instance_pos = 2.9)]
diff --git a/vapi/javascriptcoregtk-4.0.vapi b/vapi/javascriptcoregtk-4.0.vapi
index ec34b2b84..0e79debcb 100644
--- a/vapi/javascriptcoregtk-4.0.vapi
+++ b/vapi/javascriptcoregtk-4.0.vapi
@@ -43,7 +43,7 @@ namespace JS {
                [CCode (cname = "JSObjectHasProperty", instance_pos = 1.1)]
                public bool has_property (JS.Context ctx, JS.String 
property_name);
                [CCode (cname = "JSObjectMakeFunction")]
-               public Object.make_function (JS.String? name, [CCode 
(array_length_pos = 1.5)] JS.String[]? parameter_names, JS.String body, 
JS.String? source_url, int starting_line_number, out JS.Value? exception);
+               public Object.make_function (JS.Context ctx, JS.String? name, 
[CCode (array_length_pos = 2.5)] JS.String[]? parameter_names, JS.String body, 
JS.String? source_url, int starting_line_number, out JS.Value? exception);
        }
        [CCode (cheader_filename = "JavaScriptCore/JavaScript.h", cname = 
"struct OpaqueJSString", free_function = "JSStringRelease", has_type_id = 
false)]
        [Compact]
@@ -72,7 +72,7 @@ namespace JS {
                [CCode (cname = "JSValueGetType", instance_pos = 1.1)]
                public JS.Type get_type (JS.Context ctx);
                [CCode (cname = "JSValueGetTypedArrayType", instance_pos = 1.1)]
-               public JS.TypedArrayType get_typed_array_type (JS.Context ctx);
+               public JS.TypedArrayType get_typed_array_type (JS.Context ctx, 
out JS.Value? exception = null);
                [CCode (cname = "JSValueIsArray", instance_pos = 1.1)]
                public bool is_array (JS.Context ctx);
                [CCode (cname = "JSValueIsBoolean", instance_pos = 1.1)]
diff --git a/vapi/libusb-1.0.vapi b/vapi/libusb-1.0.vapi
index c7bf78b00..494c87ff5 100644
--- a/vapi/libusb-1.0.vapi
+++ b/vapi/libusb-1.0.vapi
@@ -31,19 +31,33 @@ namespace LibUSB {
                SS_ENDPOINT_COMPANION
        }
 
-       [CCode (cprefix = "LIBUSB_DT_")]
        namespace DescriptorTypeSize {
+               [CCode (cname = "LIBUSB_DT_DEVICE_SIZE")]
                public const int DEVICE_SIZE;
+               [CCode (cname = "LIBUSB_DT_CONFIG_SIZE")]
                public const int CONFIG_SIZE;
+               [CCode (cname = "LIBUSB_DT_INTERFACE_SIZE")]
                public const int INTERFACE_SIZE;
+               [CCode (cname = "LIBUSB_DT_ENDPOINT_SIZE")]
                public const int ENDPOINT_SIZE;
+               [CCode (cname = "LIBUSB_DT_ENDPOINT_AUDIO_SIZE")]
                public const int ENDPOINT_AUDIO_SIZE;
+               [CCode (cname = "LIBUSB_DT_HUB_NONVAR_SIZE")]
+               public const int HUB_NONVAR_SIZE;
+               [CCode (cname = "LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE")]
                public const int SS_ENDPOINT_COMPANION_SIZE;
+               [CCode (cname = "LIBUSB_DT_BOS_SIZE")]
                public const int BOS_SIZE;
+               [CCode (cname = "LIBUSB_DT_DEVICE_CAPABILITY_SIZE")]
                public const int DEVICE_CAPABILITY_SIZE;
+               [CCode (cname = "LIBUSB_BT_USB_2_0_EXTENSION_SIZE")]
                public const int USB_2_0_EXTENSION_SIZE;
+               [CCode (cname = "LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE")]
                public const int SS_USB_DEVICE_CAPABILITY_SIZE;
+               [CCode (cname = "LIBUSB_BT_CONTAINER_ID_SIZE")]
                public const int CONTAINER_ID_SIZE;
+               [CCode (cname = "LIBUSB_DT_BOS_MAX_SIZE")]
+               public const int BOS_MAX_SIZE;
        }
 
        namespace EndpointMask {
@@ -230,7 +244,7 @@ namespace LibUSB {
                public uint8 bRefresh;
                public uint8 bSynchAddress;
                [CCode (array_length_cname = "extra_length")]
-               public uint8[] extra;
+               public unowned uint8[] extra;
        }
 
        [CCode (cname = "struct libusb_interface_descriptor", has_type_id = 
false)]
@@ -245,15 +259,15 @@ namespace LibUSB {
                public uint8 bInterfaceProtocol;
                public uint8 iInterface;
                [CCode (array_length_cname = "bNumEndpoints", array_length_type 
= "uint8_t")]
-               public EndpointDescriptor[] endpoint;
+               public unowned EndpointDescriptor[] endpoint;
                [CCode (array_length_cname = "extra_length")]
-               public uint8[] extra;
+               public unowned uint8[] extra;
        }
 
        [CCode (cname = "struct libusb_interface", has_type_id = false)]
        public struct Interface {
                [CCode (array_length_cname = "num_altsetting")]
-               public InterfaceDescriptor[] altsetting;
+               public unowned InterfaceDescriptor[] altsetting;
        }
 
        [CCode (cname = "struct libusb_config_descriptor", free_function = 
"libusb_free_config_descriptor")]
@@ -288,7 +302,7 @@ namespace LibUSB {
                public uint8 bLength;
                public uint8 bDescriptorType;
                public uint8 bDevCapabilityType;
-               public uint8 dev_capability_data;
+               public uint8 dev_capability_data[0];
        }
 
        [CCode (cname = "struct libusb_bos_descriptor", free_function = 
"libusb_free_bos_descriptor")]
@@ -297,8 +311,8 @@ namespace LibUSB {
                public uint8 bLength;
                public uint8 bDescriptorType;
                public uint16 wTotalLength;
-               [CCode (array_length_cname = "bNumDeviceCaps", 
array_length_type = "uint8_t")]
-               public BosDevCapabilityDescriptor[] dev_capability;
+               public uint8 bNumDeviceCaps;
+               public BosDevCapabilityDescriptor dev_capability[0];
        }
 
        [CCode (cname = "struct libusb_usb_2_0_extension_descriptor", 
free_function = "libusb_free_usb_2_0_extension_descriptor")]
@@ -336,10 +350,11 @@ namespace LibUSB {
        [CCode (cname = "libusb_device_handle", cprefix = "libusb_", 
free_function = "libusb_close")]
        [Compact]
        public class DeviceHandle {
-               [CCode (cname = "_vala_libusb_device_handle_new")]
-               public DeviceHandle (Device device) {
+               [CCode (cname = "_vala_libusb_device_handle_from_device")]
+               public DeviceHandle from_device (Device device) {
                        DeviceHandle handle;
-                       device.open(out handle);
+                       device.open (out handle);
+                       return handle;
                }
 
                [CCode (cname = "libusb_open_device_with_vid_pid")]
@@ -373,7 +388,7 @@ namespace LibUSB {
        public class Device {
                public uint8 get_bus_number ();
                public uint8 get_port_number ();
-               public int get_port_numbers (out uint8[] port_numbers);
+               public int get_port_numbers (uint8[] port_numbers);
                public uint8 get_device_address ();
                public int get_max_packet_size (uint8 endpoint);
                public int get_max_iso_packet_size (uint8 endpoint);
@@ -425,7 +440,7 @@ namespace LibUSB {
                public LibUSB.Error handle_events_timeout (Posix.timeval tv);
                public LibUSB.Error handle_events_timeout_completed 
(Posix.timeval tv, out int completed);
                public LibUSB.Error handle_events ();
-               public LibUSB.Error handle_events_completed (Posix.timeval tv, 
out int completed);
+               public LibUSB.Error handle_events_completed (out int completed);
                public LibUSB.Error handle_events_locked (Posix.timeval tv);
                public LibUSB.Error pollfds_handle_timeouts ();
                public LibUSB.Error get_next_timeout (out Posix.timeval tv);
@@ -441,7 +456,9 @@ namespace LibUSB {
                public LibUSB.Error hotplug_deregister_callback 
(HotCallbackHandle callback_handle);
        }
 
+       [CCode (cname = "libusb_le16_to_cpu")]
        public static uint16 le16_to_cpu (uint16 n);
+       [CCode (cname = "libusb_cpu_to_le16")]
        public static uint16 cpu_to_le16 (uint16 n);
 
        [CCode (cname = "struct libusb_control_setup")]
@@ -527,7 +544,7 @@ namespace LibUSB {
                public LibUSB.Error submit ();
                [CCode (cname = "libusb_cancel_transfer")]
                public LibUSB.Error cancel ();
-               [CCode (cname = "libusb_contrel_transfer_get_data", 
array_length = false)]
+               [CCode (cname = "libusb_control_transfer_get_data", 
array_length = false)]
                public unowned char[] control_get_data ();
                [CCode (cname = "libusb_control_transfer_get_setup")]
                public unowned ControlSetup control_get_setup ();
@@ -537,7 +554,7 @@ namespace LibUSB {
                public void fill_bulk_transfer (DeviceHandle dev_handle, uint8 
endpoint, uint8[] buffer, TransferCb @callback, uint timeout);
                public void fill_interrupt_transfer (DeviceHandle dev_handle, 
uint8 endpoint, uint8[] buffer, TransferCb @callback, uint timeout);
                public void fill_iso_transfer (DeviceHandle dev_handle, uint8 
endpoint, uint8[] buffer, int num_iso_packets, TransferCb @callback, uint 
timeout);
-               public void set_packet_lengths (uint length);
+               public void set_iso_packet_lengths (uint length);
                [CCode (array_length = false)]
                public unowned uint8[] get_iso_packet_buffer (uint packet);
                [CCode (array_length = false)]
@@ -559,5 +576,6 @@ namespace LibUSB {
                public short events;
        }
 
+       [CCode (cname = "libusb_has_capability")]
        public static int has_capability (Capability capability);
 }
diff --git a/vapi/libusb.vapi b/vapi/libusb.vapi
index 8438cb199..c34e4a414 100644
--- a/vapi/libusb.vapi
+++ b/vapi/libusb.vapi
@@ -126,7 +126,7 @@ namespace USB {
                public InterfaceDescriptor[] altsetting;
        }
 
-       [Compact, CCode (cname = "struct usd_config_descriptor")]
+       [Compact, CCode (cname = "struct usb_config_descriptor")]
        public class ConfigDescriptor {
                public uint8 bLength;
                public uint8 bDescriptorType;
@@ -200,7 +200,7 @@ namespace USB {
                public int bulk_read (int ep, [CCode (array_length = false)] 
char[] bytes, int size, int timeout);
                public int interrupt_write (int ep, [CCode (array_length = 
false)] char[] bytes, int size, int timeout);
                public int interrupt_read (int ep, [CCode (array_length = 
false)] char[] bytes, int size, int timeout);
-               public int control_msg (int requesttype, int request, int 
value, int index, char[] bytes, int size, int timeout);
+               public int control_msg (int requesttype, int request, int 
value, int index, [CCode (array_length = false)] char[] bytes, int size, int 
timeout);
                public int set_configuration (int configuration);
                public int claim_interface (int @interface);
                public int release_interface (int @interface);
diff --git a/vapi/metadata/Gio-2.0.metadata b/vapi/metadata/Gio-2.0.metadata
index 2da6f7838..26eec0e38 100644
--- a/vapi/metadata/Gio-2.0.metadata
+++ b/vapi/metadata/Gio-2.0.metadata
@@ -246,7 +246,6 @@ Task
   .report_new_error skip
   .return_new_error skip=false printf_format
 TlsPassword
-  .get_value array array_length_idx=0
   .set_value#virtual_method.value owned
   .set_value#virtual_method.destroy default=GLib.free
 Vfs
diff --git a/vapi/metadata/Gtk-3.0.metadata b/vapi/metadata/Gtk-3.0.metadata
index 17c199cae..64019301b 100644
--- a/vapi/metadata/Gtk-3.0.metadata
+++ b/vapi/metadata/Gtk-3.0.metadata
@@ -691,6 +691,7 @@ Widget
 
 // Sure
 binding_set_by_class.object_class type="GLib.ObjectClass"
+ModuleInitFunc.argv ref unowned
 *.ref unowned
 
 // These delegate types don't have targets in the typedefs, but they
diff --git a/vapi/metadata/JavaScriptCore-4.0-custom.vala 
b/vapi/metadata/JavaScriptCore-4.0-custom.vala
index 0ba392d63..be2114816 100644
--- a/vapi/metadata/JavaScriptCore-4.0-custom.vala
+++ b/vapi/metadata/JavaScriptCore-4.0-custom.vala
@@ -46,7 +46,7 @@ namespace JS {
                [CCode (cname = "JSObjectHasProperty", instance_pos = 1.1)]
                public bool has_property (JS.Context ctx, JS.String 
property_name);
                [CCode (cname = "JSObjectMakeFunction")]
-               public Object.make_function (JS.String? name, [CCode 
(array_length_pos = 1.5)] JS.String[]? parameter_names, JS.String body, 
JS.String? source_url, int starting_line_number, out JS.Value? exception);
+               public Object.make_function (JS.Context ctx, JS.String? name, 
[CCode (array_length_pos = 2.5)] JS.String[]? parameter_names, JS.String body, 
JS.String? source_url, int starting_line_number, out JS.Value? exception);
        }
        [CCode (cheader_filename = "JavaScriptCore/JavaScript.h", cname = 
"struct OpaqueJSString", free_function = "JSStringRelease", has_type_id = 
false)]
        [Compact]
@@ -76,7 +76,7 @@ namespace JS {
                public JS.Type get_type (JS.Context ctx);
 
                [CCode (cname = "JSValueGetTypedArrayType", instance_pos = 1.1)]
-               public JS.TypedArrayType get_typed_array_type (JS.Context ctx);
+               public JS.TypedArrayType get_typed_array_type (JS.Context ctx, 
out JS.Value? exception = null);
 
                [CCode (cname = "JSValueIsArray", instance_pos = 1.1)]
                public bool is_array (JS.Context ctx);
diff --git a/vapi/metadata/Rest-0.7.metadata b/vapi/metadata/Rest-0.7.metadata
index c734a223e..ae9989ca3 100644
--- a/vapi/metadata/Rest-0.7.metadata
+++ b/vapi/metadata/Rest-0.7.metadata
@@ -34,7 +34,7 @@ XmlNode cheader_filename="rest/rest-xml-node.h"
   .unref skip=false
 XmlParser cheader_filename="rest/rest-xml-parser.h"
 
-OAuthProxyAuthCallback cheader_filename="rest/oauth-proxy.h"
+OAuthProxyAuthCallback cheader_filename="rest/oauth-proxy.h" 
cname="OAuthProxyAuthCallback"
        .error nullable=true
        .weak_object nullable=true
        .userdata closure=3
diff --git a/vapi/metadata/WebKit2WebExtension-4.0-custom.vala 
b/vapi/metadata/WebKit2WebExtension-4.0-custom.vala
index a994a774e..11875102e 100644
--- a/vapi/metadata/WebKit2WebExtension-4.0-custom.vala
+++ b/vapi/metadata/WebKit2WebExtension-4.0-custom.vala
@@ -1,5 +1,6 @@
 namespace WebKit {
        namespace DOM {
+               [CCode (has_typedef = false)]
                public delegate void EventTargetFunc (WebKit.DOM.EventTarget 
target, WebKit.DOM.Event event);
        }
 }
diff --git a/vapi/pixman-1.vapi b/vapi/pixman-1.vapi
index 66437e02d..ecccc0113 100644
--- a/vapi/pixman-1.vapi
+++ b/vapi/pixman-1.vapi
@@ -8,10 +8,11 @@ namespace Pixman {
                [CCode (cname = "PIXMAN_VERSION")]
                public const int INT;
 
+               [CCode (cname = "PIXMAN_VERSION_ENCODE")]
                public static int encode (int major, int minor, int micro);
                [CCode (cname = "pixman_version")]
                public static int library_int ();
-               [CCode (cname = "pixman_string")]
+               [CCode (cname = "pixman_version_string")]
                public static unowned string library_string ();
        }
 
@@ -32,11 +33,13 @@ namespace Pixman {
                public Fixed ceil ();
                public Fixed fraction ();
                public Fixed mod_2 ();
+               [CCode (cname = "pixman_sample_ceil_y")]
                public Fixed sample_ceil_y (int bpp);
+               [CCode (cname = "pixman_sample_floor_y")]
                public Fixed sample_floor_y (int bpp);
        }
 
-       [CCode (cname = "struct pixman_color", has_type_id = false)]
+       [CCode (cname = "pixman_color_t", has_type_id = false)]
        public struct Color {
                public uint16 red;
                public uint16 green;
@@ -44,31 +47,31 @@ namespace Pixman {
                public uint16 alpha;
        }
 
-       [CCode (cname = "struct pixman_point_fixed", has_type_id = false)]
+       [CCode (cname = "pixman_point_fixed_t", has_type_id = false)]
        public struct PointFixed {
                public Pixman.Fixed x;
                public Pixman.Fixed y;
        }
 
-       [CCode (cname = "struct pixman_line_fixed", has_type_id = false)]
+       [CCode (cname = "pixman_line_fixed_t", has_type_id = false)]
        public struct LineFixed {
                public Pixman.PointFixed p1;
                public Pixman.PointFixed p2;
        }
 
-       [CCode (cname = "struct pixman_vector", has_type_id = false)]
+       [CCode (cname = "pixman_vector_t", has_type_id = false)]
        public struct Vector {
                public Pixman.Fixed vector[3];
        }
 
-       [CCode (cname = "struct pixman_transform", has_type_id = false)]
+       [CCode (cname = "pixman_transform_t", has_type_id = false)]
        public struct Transform {
                public Pixman.Fixed matrix[9];
 
                [CCode (cname = "pixman_transform_init_identity")]
                public Transform.identity ();
                public bool point_3d (Pixman.Vector vector);
-               public bool point ();
+               public bool point (Pixman.Vector vector);
                public bool multiply (Pixman.Transform l, Pixman.Transform r);
                [CCode (cname = "pixman_transform_init_scale")]
                public Transform.init_scale (Pixman.Fixed sx, Pixman.Fixed sy);
@@ -76,7 +79,7 @@ namespace Pixman {
                [CCode (cname = "pixman_transform_init_rotate")]
                public Transform.init_rotate (Pixman.Fixed cos, Pixman.Fixed 
sin);
                public bool rotate (Pixman.Transform reverse, Pixman.Fixed c, 
Pixman.Fixed s);
-               [CCode (cname = "pixman_transform_rotate")]
+               [CCode (cname = "pixman_transform_init_translate")]
                public Transform.init_translate (Pixman.Fixed tx, Pixman.Fixed 
ty);
                public bool translate (Pixman.Transform reverse, Pixman.Fixed 
tx, Pixman.Fixed ty);
                public bool bounds (Pixman.Box16 b);
@@ -86,7 +89,7 @@ namespace Pixman {
                public bool is_inverse (Pixman.Transform b);
        }
 
-       [CCode (cprefix = "PIXMAN_REGION_", has_type_id = false)]
+       [CCode (cname = "pixman_region_overlap_t", cprefix = "PIXMAN_REGION_", 
has_type_id = false)]
        public enum RegionOverlap {
                OUT,
                IN,
@@ -136,7 +139,10 @@ namespace Pixman {
 
        [CCode (cname = "pixman_rectangle16_t", has_type_id = false)]
        public struct Rectangle16 {
-               public Pixman.Box16 extents;
+               public int16 x;
+               public int16 y;
+               public uint16 width;
+               public uint16 height;
        }
 
        [CCode (cname = "pixman_region32_t", has_type_id = false, 
destroy_function = "pixman_region32_fini")]
@@ -170,6 +176,7 @@ namespace Pixman {
                public bool equal (Pixman.Region32 region2);
                public bool selfcheck ();
                public void reset (Pixman.Box32 box);
+               public void clear ();
        }
 
        [CCode (cname = "pixman_box32_t", has_type_id = false)]
@@ -182,7 +189,10 @@ namespace Pixman {
 
        [CCode (cname = "pixman_rectangle32_t", has_type_id = false)]
        public struct Rectangle32 {
-               public Pixman.Box32 extents;
+               public int32 x;
+               public int32 y;
+               public uint32 width;
+               public uint32 height;
        }
 
        public static bool blt ([CCode (array_length = false, type = 
"uint32_t*")] uint8[] src_bits, [CCode (array_length = false, type = 
"uint32_t*")] uint8[] dst_bits, int src_stride, int dst_stride, int src_bpp, 
int dst_bpp, int src_x, int src_y, int dst_x, int dst_y, int width, int height);
@@ -292,7 +302,7 @@ namespace Pixman {
                ABGR,
                COLOR,
                GRAY,
-               YUV2,
+               YUY2,
                YV12,
                BGRA;
 
@@ -448,6 +458,7 @@ namespace Pixman {
                [CCode (instance_pos = 1.1)]
                public bool fill_rectangles (Pixman.Operation op, Pixman.Color 
color, [CCode (array_length_pos = 2.1)] Pixman.Rectangle16[] rects);
 
+               [CCode (cname = "pixman_compute_composite_region")]
                public static bool compute_composite_region (Pixman.Region16 
region, Pixman.Image src_image, Pixman.Image? mask_image, Pixman.Image 
dst_image, int src_x, int src_y, int mask_x, int mask_y, int dest_x, int 
dest_y, int width, int height);
                public static void composite (Pixman.Operation op, Pixman.Image 
src, Pixman.Image? mask, Pixman.Image dest, int16 src_x, int16 src_y, int16 
mask_x, int16 mask_y, int16 dest_x, int16 dest_y, uint16 width, uint16 height);
 
@@ -456,12 +467,18 @@ namespace Pixman {
                [CCode (cname = "pixman_add_traps")]
                public void add_traps (int16 x_off, int16 y_off, [CCode 
(array_length_pos = 2.9)] Pixman.Trap[] traps);
                [CCode (cname = "pixman_add_trapezoids")]
-               public void add_trapezoids (int16 x_off, int y_off, [CCode 
(array_length_pos = 2.9)] Pixman.Trap[] traps);
+               public void add_trapezoids (int16 x_off, int y_off, [CCode 
(array_length_pos = 2.9)] Pixman.Trapezoid[] traps);
                [CCode (cname = "pixman_rasterize_trapezoid")]
                public void rasterize_trapezoid (Pixman.Trapezoid trap, int 
x_off, int y_off);
+               [CCode (cname = "pixman_composite_trapezoids")]
+               public static bool composite_trapezoids (Pixman.Operation op, 
Pixman.Image src, Pixman.Image dst, Pixman.Format mask_format, int x_src, int 
y_src, int x_dst, int y_dst, [CCode (array_length_pos = 8.9)] 
Pixman.Trapezoid[] traps);
+               [CCode (cname = "pixman_composite_triangles")]
+               public static bool composite_triangles (Pixman.Operation op, 
Pixman.Image src, Pixman.Image dst, Pixman.Format mask_format, int x_src, int 
y_src, int x_dst, int y_dst, [CCode (array_length_pos = 8.9)] Pixman.Triangle[] 
tries);
+               [CCode (cname = "pixman_add_triangles")]
+               public void add_triangles (int32 x_off, int32 y_off, [CCode 
(array_length_pos = 2.9)] Pixman.Triangle[] tris);
        }
 
-       [CCode (cname = "struct pixman_edge", has_type_id = false)]
+       [CCode (cname = "pixman_edge_t", has_type_id = false)]
        public struct Edge {
                public Pixman.Fixed x;
                public Pixman.Fixed e;
@@ -481,7 +498,7 @@ namespace Pixman {
                public Edge.line_fixed (int bpp, Pixman.Fixed y, 
Pixman.LineFixed line, int x_off, int y_off);
        }
 
-       [CCode (cname = "struct pixman_trapezoid", has_type_id = false)]
+       [CCode (cname = "pixman_trapezoid_t", has_type_id = false)]
        public struct Trapezoid {
                public Pixman.Fixed top;
                public Pixman.Fixed bottom;
@@ -491,14 +508,21 @@ namespace Pixman {
                public bool valid ();
        }
 
-       [CCode (cname = "struct pixman_span_fix", has_type_id = false)]
+       [CCode (cname = "pixman_triangle_t", has_type_id = false)]
+       public struct Triangle {
+               public Pixman.PointFixed p1;
+               public Pixman.PointFixed p2;
+               public Pixman.PointFixed p3;
+       }
+
+       [CCode (cname = "pixman_span_fix_t", has_type_id = false)]
        public struct SpanFix {
                public Pixman.Fixed l;
                public Pixman.Fixed r;
                public Pixman.Fixed y;
        }
 
-       [CCode (cname = "struct pixman_trap", has_type_id = false)]
+       [CCode (cname = "pixman_trap_t", has_type_id = false)]
        public struct Trap {
                public Pixman.SpanFix top;
                public Pixman.SpanFix bot;
diff --git a/vapi/rest-0.7.vapi b/vapi/rest-0.7.vapi
index 4ed7a6149..015fc6880 100644
--- a/vapi/rest-0.7.vapi
+++ b/vapi/rest-0.7.vapi
@@ -253,7 +253,7 @@ namespace Rest {
                HTTP_HTTP_VERSION_NOT_SUPPORTED;
                public static GLib.Quark quark ();
        }
-       [CCode (cheader_filename = "rest/oauth-proxy.h", instance_pos = 3.9)]
+       [CCode (cheader_filename = "rest/oauth-proxy.h", cname = 
"OAuthProxyAuthCallback", instance_pos = 3.9)]
        public delegate void OAuthProxyAuthCallback (Rest.OAuthProxy proxy, 
GLib.Error? error, GLib.Object? weak_object);
        [CCode (cheader_filename = "rest/rest-proxy-call.h", instance_pos = 
3.9)]
        public delegate void ProxyCallAsyncCallback (Rest.ProxyCall call, 
GLib.Error? error, GLib.Object? weak_object);
diff --git a/vapi/webkit2gtk-web-extension-4.0.vapi 
b/vapi/webkit2gtk-web-extension-4.0.vapi
index 893236c56..f28f6f81a 100644
--- a/vapi/webkit2gtk-web-extension-4.0.vapi
+++ b/vapi/webkit2gtk-web-extension-4.0.vapi
@@ -3676,7 +3676,7 @@ namespace WebKit {
                        [Version (deprecated = true, deprecated_since = "2.22")]
                        public abstract string lookup_namespace_uri (string 
prefix);
                }
-               [CCode (cheader_filename = "webkit2/webkit-web-extension.h")]
+               [CCode (cheader_filename = "webkit2/webkit-web-extension.h", 
has_typedef = false)]
                public delegate void EventTargetFunc (WebKit.DOM.EventTarget 
target, WebKit.DOM.Event event);
                [CCode (cheader_filename = "webkit2/webkit-web-extension.h", 
cname = "WEBKIT_DOM_CSS_RULE_CHARSET_RULE")]
                [Version (deprecated = true, deprecated_since = "2.22")]
diff --git a/vapi/x11.vapi b/vapi/x11.vapi
index aecc667db..640d413f0 100644
--- a/vapi/x11.vapi
+++ b/vapi/x11.vapi
@@ -135,7 +135,7 @@ namespace X {
                public string get_atom_name (X.Atom atom);
 
                [CCode (cname = "XGetAtomNames")]
-               public Status get_atom_names (Atom[] atoms, [CCode 
(array_length = false)] out string[] names);
+               public Status get_atom_names (Atom[] atoms, [CCode 
(array_length = false)] string[] names);
 
                [CCode (cname = "XDeleteProperty")]
                public int delete_property (Window w, X.Atom property);
@@ -303,7 +303,7 @@ namespace X {
                public string xserver_vendor_name ();
 
                [CCode (cname = "XVendorRelease")]
-               public string xserver_vendor_release ();
+               public int xserver_vendor_release ();
 
                [CCode (cname = "XMoveWindow")]
                public void move_window (Window window, int x, int y);
@@ -489,9 +489,11 @@ namespace X {
        [CCode (ref_function = "", unref_function = "")]
        [Compact]
        public class Visual {
+               [CCode (cname = "XVisualIDFromVisual")]
                public VisualID get_visual_id ();
        }
 
+       [CCode (cname = "XWindowChanges")]
        public struct WindowChanges {
                public int x;
                public int y;
@@ -501,6 +503,8 @@ namespace X {
                public Window sibling;
                public int stack_mode;
        }
+
+       [CCode (cname = "XSizeHints")]
        public struct SizeHints {
                public long @flags;
                public int x;
@@ -973,7 +977,7 @@ namespace X {
                public ulong serial;
                public bool send_event;
                public unowned Display display;
-               public Window window;
+               public Drawable drawable;
                public int x;
                public int y;
                public int width;
@@ -989,8 +993,9 @@ namespace X {
                public ulong serial;
                public bool send_event;
                public unowned Display display;
-               public Window window;
-               public int state;
+               public Drawable drawable;
+               public int major_code;
+               public int minor_code;
        }
 
        [CCode (cname = "XVisibilityEvent", has_type_id = false)]
@@ -1226,7 +1231,12 @@ namespace X {
                public Window window;
                public Atom message_type;
                public int format;
-               public ClientMessageEventData data;
+               [CCode (cname = "data.b")]
+               public unowned char b[20];
+               [CCode (cname = "data.s")]
+               public unowned short s[10];
+               [CCode (cname = "data.l")]
+               public unowned long l[5];
        }
 
        [CCode (cname = "XMappingEvent", has_type_id = false)]
@@ -1259,7 +1269,7 @@ namespace X {
                public bool send_event;
                public unowned Display display;
                public Window window;
-               public unowned char[] key_vector;
+               public char key_vector[32];
        }
 
        [CCode (cname = "XGenericEvent", has_type_id = false)]
@@ -1292,13 +1302,6 @@ namespace X {
                public short height;
        }
 
-       // union
-       public struct ClientMessageEventData {
-               public unowned char[] b;
-               public unowned short[] s;
-               public unowned long[] l;
-       }
-
        [CCode (cprefix = "Queued", has_type_id = false)]
        public enum QueuedMode {
                Already,
@@ -1398,7 +1401,7 @@ namespace X {
                [CCode (cname = "RootWindowOfScreen")]
                public Window root_window_of_screen ();
 
-               [CCode (cname = "ScreenNumberOfScreen")]
+               [CCode (cname = "XScreenNumberOfScreen")]
                public int screen_number_of_screen ();
 
                [CCode (cname = "WhitePixelOfScreen")]
diff --git a/vapi/zlib.vapi b/vapi/zlib.vapi
index 6f76ba941..c9adb8e24 100644
--- a/vapi/zlib.vapi
+++ b/vapi/zlib.vapi
@@ -23,8 +23,6 @@
  *     Jörn Magens <joernmag...@gmx.de>
  */
 
-using GLib;
-
 [CCode (lower_case_cprefix = "", cheader_filename = "zlib.h")]
 namespace ZLib {
        [CCode (cname="int", cprefix="Z_", has_type_id = false)]
@@ -141,8 +139,11 @@ namespace ZLib {
                public int set_dictionary ([CCode (array_length_type = 
"guint")] uint8[] dictionary);
                [CCode (cname = "inflateSync")]
                public int sync ();
+               [CCode (cname = "inflateReset")]
                public int reset ();
+               [CCode (cname = "inflatePrime")]
                public int prime (int bits, int value);
+               [CCode (cname = "inflateGetHeader")]
                public int get_header (out GZHeader head);
        }
        [CCode (lower_case_cprefix = "", cheader_filename = "zlib.h")]
@@ -162,17 +163,17 @@ namespace ZLib {
                public int xflags;
                public int os;
                [CCode (array_length_cname = "extra_len", array_length_type = 
"guint")]
-               public uint8[] extra;
+               public unowned uint8[] extra;
                public uint extra_max;
-               public string? name;
+               public unowned string? name;
                public uint name_max;
-               public string comment;
+               public unowned string comment;
                [CCode (cname = "comm_max")]
                public uint comment_max;
                public int hcrc;
                public int done;
        }
-       [CCode (cname = "gzFile", cprefix = "gz", free_function = "gzclose")]
+       [CCode (cname = "struct gzFile_s", cprefix = "gz", free_function = 
"gzclose")]
        [Compact]
        public class GZFileStream {
                public static GZFileStream open (string path, string mode = 
"rb");
diff --git a/NEWS b/NEWS
index 4bf72f071..e341f298f 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,13 @@
+Vala 0.48.17
+============
+ * Regression and bug fixes:
+  - codegen:
+    + Don't free temp-var for element-access to array with boxed structs 
[#1174]
+    + Don't free unowned heap allocated struct
+
+ * Bindings:
+  - glib-2.0: Add simple_generics attribute to GenericArray.find_custom()
+
 Vala 0.48.16
 ============
  * Various improvements and bug fixes:
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 282e6aafd..7d06fde1f 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -5396,7 +5396,8 @@ public abstract class Vala.CCodeBaseModule : 
CodeGenerator {
                        while (inner_expr is CastExpression) {
                                inner_expr = ((CastExpression) 
inner_expr).inner;
                        }
-                       if (!(inner_expr.symbol_reference is Variable)) {
+                       if (inner_expr.value_type.value_owned
+                           && !(inner_expr.symbol_reference is Variable || 
inner_expr is ElementAccess)) {
                                // heap allocated struct leaked, destroy it
                                var value = new GLibValue (new PointerType (new 
VoidType ()), innercexpr);
                                temp_ref_values.insert (0, value);
diff --git a/doc/vala-gen-introspect.1 b/doc/vala-gen-introspect.1
index 5491b4200..dde1664ce 100644
--- a/doc/vala-gen-introspect.1
+++ b/doc/vala-gen-introspect.1
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.48.1.
-.TH VALA-GEN-INTROSPECT "1" "April 2021" "gen-introspect 0.48.16" "User 
Commands"
+.TH VALA-GEN-INTROSPECT "1" "April 2021" "gen-introspect 0.48.17" "User 
Commands"
 .SH NAME
 vala-gen-introspect \- generate a GI file for GObject and glib based packages
 .SH SYNOPSIS
diff --git a/doc/valac.1 b/doc/valac.1
index 5b8b4d1ce..7adad0c98 100644
--- a/doc/valac.1
+++ b/doc/valac.1
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.48.1.
-.TH VALAC "1" "April 2021" "Vala 0.48.16" "User Commands"
+.TH VALAC "1" "April 2021" "Vala 0.48.17" "User Commands"
 .SH NAME
 valac \- compiler that translates Vala source code into C source and header 
files
 .SH SYNOPSIS
diff --git a/doc/valadoc.1 b/doc/valadoc.1
index add271d00..0489a9a61 100644
--- a/doc/valadoc.1
+++ b/doc/valadoc.1
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.48.1.
-.TH VALADOC "1" "April 2021" "Valadoc 0.48.16" "User Commands"
+.TH VALADOC "1" "April 2021" "Valadoc 0.48.17" "User Commands"
 .SH NAME
 valadoc \- Vala Documentation Tool
 .SH SYNOPSIS
diff --git a/doc/vapigen.1 b/doc/vapigen.1
index 65ddb44d2..a9555e34b 100644
--- a/doc/vapigen.1
+++ b/doc/vapigen.1
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.48.1.
-.TH VAPIGEN "1" "April 2021" "Vala API Generator 0.48.16" "User Commands"
+.TH VAPIGEN "1" "April 2021" "Vala API Generator 0.48.17" "User Commands"
 .SH NAME
 vapigen \- generate a Vala API
 .SH SYNOPSIS
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 8f5ff2360..61536974a 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -99,6 +99,7 @@ TESTS = \
        constants/strings.vala \
        namespace/unique.vala \
        arrays/cast-silent-invalid.test \
+       arrays/cast-struct-boxed-element-access.vala \
        arrays/class-field-initializer.vala \
        arrays/class-field-length-cname.vala \
        arrays/constant-element-access.vala \
@@ -322,6 +323,7 @@ TESTS = \
        enums/bug673879.vala \
        enums/bug763831.vala \
        enums/bug780050.vala \
+       structs/cast-struct-boxed.vala \
        structs/struct_only.vala \
        structs/struct-base-types.vala \
        structs/struct-boxed-cast.vala \
diff --git a/tests/arrays/cast-struct-boxed-element-access.vala 
b/tests/arrays/cast-struct-boxed-element-access.vala
new file mode 100644
index 000000000..fc2b77b9b
--- /dev/null
+++ b/tests/arrays/cast-struct-boxed-element-access.vala
@@ -0,0 +1,124 @@
+struct Foo {
+       public int i;
+}
+
+Foo?[] foo_array;
+
+Foo?[] foo_array_owned () {
+       return new Foo?[] { { 23 },  { 42 },  { 4711 } };
+}
+
+unowned Foo?[] foo_array_unowned () {
+       foo_array = new Foo?[] { { 23 },  { 42 },  { 4711 } };
+       return foo_array;
+}
+
+void test_without_destroy () {
+       {
+               var foo = new Foo?[] { { 23 },  { 42 },  { 4711 } };
+               {
+                       Foo f = foo[0];
+                       assert (f.i == 23);
+                       assert (foo[0].i == 23);
+               }
+               {
+                       Foo f = (Foo) foo[1];
+                       assert (f.i == 42);
+                       assert (foo[1].i == 42);
+               }
+               {
+                       Foo f = (!) foo[2];
+                       assert (f.i == 4711);
+                       assert (foo[2].i == 4711);
+               }
+       }
+       {
+               Foo f = foo_array_owned ()[0];
+               assert (f.i == 23);
+       }
+       {
+               Foo f = (Foo) foo_array_owned ()[1];
+               assert (f.i == 42);
+       }
+       {
+               Foo f = (!) foo_array_owned ()[2];
+               assert (f.i == 4711);
+       }
+       {
+               Foo f = foo_array_unowned ()[0];
+               assert (f.i == 23);
+       }
+       {
+               Foo f = (Foo) foo_array_unowned ()[1];
+               assert (f.i == 42);
+       }
+       {
+               Foo f = (!) foo_array_unowned ()[2];
+               assert (f.i == 4711);
+       }
+}
+
+struct Bar {
+       public string s;
+}
+
+Bar?[] bar_array;
+
+Bar?[] bar_array_owned () {
+       return new Bar?[] { { "foo" },  { "bar" },  { "manam" } };
+}
+
+unowned Bar?[] bar_array_unowned () {
+       bar_array = new Bar?[] { { "foo" },  { "bar" },  { "manam" } };
+       return bar_array;
+}
+
+void test_with_destroy () {
+       {
+               var bar = new Bar?[] { { "foo" },  { "bar" },  { "manam" } };
+               {
+                       Bar b = bar[0];
+                       assert (b.s == "foo");
+                       assert (bar[0].s == "foo");
+               }
+               {
+                       Bar b = (Bar) bar[1];
+                       assert (b.s == "bar");
+                       assert (bar[1].s == "bar");
+               }
+               {
+                       Bar b = (!) bar[2];
+                       assert (b.s == "manam");
+                       assert (bar[2].s == "manam");
+               }
+       }
+       {
+               Bar b = bar_array_owned ()[0];
+               assert (b.s == "foo");
+       }
+       {
+               Bar b = (Bar) bar_array_owned ()[1];
+               assert (b.s == "bar");
+       }
+       {
+               Bar b = (!) bar_array_owned ()[2];
+               assert (b.s == "manam");
+       }
+       {
+               Bar b = bar_array_unowned ()[0];
+               assert (b.s == "foo");
+       }
+       {
+               Bar b = (Bar) bar_array_unowned ()[1];
+               assert (b.s == "bar");
+       }
+       {
+               Bar b = (!) bar_array_unowned ()[2];
+               assert (b.s == "manam");
+       }
+}
+
+void main () {
+       test_without_destroy ();
+       test_with_destroy ();
+}
diff --git a/tests/basic-types/garray.vala b/tests/basic-types/garray.vala
index 2d2eb008d..9f09560a7 100644
--- a/tests/basic-types/garray.vala
+++ b/tests/basic-types/garray.vala
@@ -14,17 +14,22 @@ void test_garray () {
 
        array.append_val (foo);
        assert (foo.ref_count == 2);
+       assert (array.index (0) == foo);
        array.remove_index (0);
        assert (foo.ref_count == 1);
 
        array.append_val (foo);
        assert (foo.ref_count == 2);
+       assert (array.index (0) == foo);
        array.remove_index_fast (0);
        assert (foo.ref_count == 1);
 
        array.append_val (foo);
-       assert (foo.ref_count == 2);
-       array.remove_range (0, 1);
+       array.append_val (foo);
+       assert (foo.ref_count == 3);
+       assert (array.index (0) == foo);
+       assert (array.index (1) == foo);
+       array.remove_range (0, 2);
        assert (foo.ref_count == 1);
 }
 
@@ -45,17 +50,21 @@ void test_int_garray () {
 }
 
 GLib.Array<FooStruct?> create_struct_garray () {
-       FooStruct foo = { "foo", new Foo () };
        var array = new GLib.Array<FooStruct?> ();
-       array.append_val (foo);
+       FooStruct foo1 = { "foo", new Foo () };
+       array.append_val (foo1);
+       FooStruct foo2 = { "bar", new Foo () };
+       array.append_val (foo2);
        return array;
 }
 
 void test_struct_garray () {
        var array = create_struct_garray ();
-       assert (array.length == 1);
+       assert (array.length == 2);
        assert (array.index (0).content == "foo");
        assert (array.index (0).object.ref_count == 1);
+       assert (array.index (1).content == "bar");
+       assert (array.index (1).object.ref_count == 1);
        Foo f = array.index (0).object;
        assert (f.ref_count == 2);
        array = null;
diff --git a/tests/structs/cast-struct-boxed.vala 
b/tests/structs/cast-struct-boxed.vala
new file mode 100644
index 000000000..86fff4064
--- /dev/null
+++ b/tests/structs/cast-struct-boxed.vala
@@ -0,0 +1,102 @@
+struct Foo {
+       public int i;
+}
+
+Foo? foo;
+
+Foo? foo_heap_owned () {
+       foo = { 23 };
+       return foo;
+}
+
+unowned Foo? foo_heap_unowned () {
+       foo = { 42 };
+       return foo;
+}
+
+void test_without_destroy () {
+       {
+               Foo f = foo_heap_owned ();
+               assert (f.i == 23);
+       }
+       {
+               Foo f = (Foo) foo_heap_owned ();
+               assert (f.i == 23);
+       }
+       {
+               Foo f = (!) foo_heap_owned ();
+               assert (f.i == 23);
+       }
+       {
+               Foo f = foo_heap_unowned ();
+               assert (f.i == 42);
+       }
+       {
+               Foo f = (Foo) foo_heap_unowned ();
+               assert (f.i == 42);
+       }
+       {
+               Foo f = (!) foo_heap_unowned ();
+               assert (f.i == 42);
+       }
+}
+
+struct Bar {
+       public string s;
+}
+
+Bar? bar;
+
+Bar? bar_heap_owned () {
+       bar = { "bar" };
+       return bar;
+}
+
+unowned Bar? bar_heap_unowned () {
+       bar = { "manam" };
+       return bar;
+}
+
+void test_with_destroy () {
+       {
+               Bar b = bar_heap_owned ();
+               assert (b.s == "bar");
+       }
+       {
+               Bar b = (Bar) bar_heap_owned ();
+               assert (b.s == "bar");
+       }
+       {
+               Bar b = (!) bar_heap_owned ();
+               assert (b.s == "bar");
+       }
+       {
+               Bar b = bar_heap_unowned ();
+               assert (b.s == "manam");
+       }
+       {
+               Bar b = (Bar) bar_heap_unowned ();
+               assert (b.s == "manam");
+       }
+       {
+               Bar b = (!) bar_heap_unowned ();
+               assert (b.s == "manam");
+       }
+       {
+               unowned Bar b = bar_heap_unowned ();
+               assert (b.s == "manam");
+       }
+       {
+               unowned Bar b = (Bar) bar_heap_unowned ();
+               assert (b.s == "manam");
+       }
+       {
+               unowned Bar b = (!) bar_heap_unowned ();
+               assert (b.s == "manam");
+       }
+}
+
+void main () {
+       test_without_destroy ();
+       test_with_destroy ();
+}
diff --git a/vapi/glib-2.0.vapi b/vapi/glib-2.0.vapi
index 71df44b9d..f389d2916 100644
--- a/vapi/glib-2.0.vapi
+++ b/vapi/glib-2.0.vapi
@@ -5263,7 +5263,7 @@ namespace GLib {
                [Version (since = "2.54")]
                public bool find (G needle, out uint index = null);
                [Version (since = "2.54")]
-               [CCode (cname = "g_ptr_array_find_with_equal_func")]
+               [CCode (cname = "g_ptr_array_find_with_equal_func", 
simple_generics = true)]
                public bool find_custom<T> (T needle, 
GLib.ArraySearchFunc<G,T>? equal_func, out uint index = null);
                [Version (since = "2.54")]
                public bool find_with_equal_func (G needle, GLib.EqualFunc<G>? 
equal_func, out uint index = null);

Reply via email to