if (local.variable_type.is_disposable ()) {
data.add_field (get_ccode_name (delegate_target_destroy_type), get_delegate_target_destroy_notify_cname (get_local_cname (local)));
}
+ } else if (local.variable_type.type_symbol == context.analyzer.va_list_type.type_symbol) {
+ Report.error (local.source_reference, "internal: Capturing `va_list' variable `%s' is not allowed".printf (local.get_full_name ()));
+ b.error = true;
}
}
}
foreach (var param in m.get_parameters ()) {
if (param.captured) {
capture_parameter (param, data, block_id);
+
+ if (param.variable_type.type_symbol == context.analyzer.va_list_type.type_symbol) {
+ Report.error (param.source_reference, "internal: Capturing `va_list' parameter `%s' is not allowed".printf (param.get_full_name ()));
+ b.error = true;
+ }
}
}
semantic/localvariable-void-initializer.test \
semantic/member-access-async-callback-invalid.test \
semantic/member-access-capture-out.test \
+ semantic/member-access-capture-valist-parameter.test \
+ semantic/member-access-capture-valist-variable.test \
semantic/member-access-protected-invalid.test \
semantic/member-access-undefined.test \
semantic/member-access-static-with-instance.vala \
--- /dev/null
+Invalid Code
+
+delegate void FooFunc ();
+
+void foo (int first, va_list v) {
+ FooFunc f = () => {
+ int arg = v.arg<int> ();
+ };
+}
+
+void main () {
+}
--- /dev/null
+Invalid Code
+
+delegate void FooFunc ();
+
+void foo (int first, ...) {
+ va_list v = va_list ();
+ FooFunc f = () => {
+ int arg = v.arg<int> ();
+ };
+}
+
+void main () {
+}
local.captured = true;
block.captured = true;
+
+ if (local.variable_type.type_symbol == context.analyzer.va_list_type.type_symbol) {
+ error = true;
+ Report.error (source_reference, "Capturing `va_list' variable `%s' is not allowed".printf (local.get_full_name ()));
+ }
}
} else if (member is Parameter) {
unowned Parameter param = (Parameter) member;
error = true;
Report.error (source_reference, "Cannot capture reference or output parameter `%s'".printf (param.get_full_name ()));
}
+ if (param.variable_type.type_symbol == context.analyzer.va_list_type.type_symbol) {
+ error = true;
+ Report.error (source_reference, "Capturing `va_list' parameter `%s' is not allowed".printf (param.get_full_name ()));
+ }
} else {
unowned PropertyAccessor? acc = param.parent_symbol.parent_symbol as PropertyAccessor;
if (acc != null && acc != context.analyzer.current_method_or_property_accessor && param != acc.prop.this_parameter) {