[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#986869: unblock: vala/0.48.17-1



Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: ricotz@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 <joernmagens@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 to: