semantic/field-valist.test \
semantic/field-void.test \
semantic/floating-reference.vala \
+ semantic/floating-reference-error.vala \
semantic/foreach-iterator-args.test \
semantic/foreach-iterator-element-owned.test \
semantic/foreach-iterator-void.test \
--- /dev/null
+[CCode (returns_floating_reference = true)]
+Variant? get_floating_variant_with_error () throws Error {
+ return new Variant.string ("bar");
+}
+
+void variant_args (int first, ...) {
+ var va = va_list ();
+ assert (!va.arg<Variant> ().is_floating ());
+}
+
+void main () {
+ {
+ variant_args (23, get_floating_variant_with_error ());
+ }
+ {
+ try {
+ variant_args (42, get_floating_variant_with_error ());
+ } catch {
+ assert_not_reached ();
+ }
+ }
+}
return new Variant.string ("foo");
}
+[CCode (returns_floating_reference = true)]
+Variant? get_floating_variant_with_error () throws Error {
+ return new Variant.string ("bar");
+}
+
void test_variant () {
{
string? @value = "bar";
Variant? variant = get_floating_variant ();
assert (!variant.is_floating ());
}
+ {
+ Variant? variant = get_floating_variant_with_error ();
+ assert (!variant.is_floating ());
+ }
+ {
+ try {
+ Variant? variant = get_floating_variant_with_error ();
+ assert (!variant.is_floating ());
+ } catch {
+ assert_not_reached ();
+ }
+ }
}
void test_variant_builder () {
var local = new LocalVariable (value_type.copy (), get_temp_name (), null, source_reference);
var decl = new DeclarationStatement (local, source_reference);
+ // don't carry floating reference any further if the target-type is unknown
+ if (target_type == null) {
+ local.variable_type.floating_reference = false;
+ }
+
insert_statement (context.analyzer.insert_block, decl);
var temp_access = SemanticAnalyzer.create_temp_access (local, target_type);