semantic/field-valist.test \
semantic/field-void.test \
semantic/floating-reference.vala \
+ semantic/floating-reference-base-method.vala \
semantic/floating-reference-error.vala \
semantic/foreach-iterator-args.test \
semantic/foreach-iterator-element-owned.test \
--- /dev/null
+interface IFoo {
+ [CCode (returns_floating_reference = true)]
+ public abstract InitiallyUnowned? foo ();
+}
+
+interface IBar {
+ [CCode (returns_floating_reference = true)]
+ public abstract InitiallyUnowned? bar ();
+}
+
+class Foo : IFoo, IBar {
+ [CCode (returns_floating_reference = true)]
+ public InitiallyUnowned? foo () {
+ return null;
+ }
+
+ public InitiallyUnowned? bar () {
+ return null;
+ }
+
+ [CCode (returns_floating_reference = true)]
+ public virtual InitiallyUnowned? faz () {
+ return null;
+ }
+
+ [CCode (returns_floating_reference = true)]
+ public virtual InitiallyUnowned? baz () {
+ return null;
+ }
+}
+
+class Manam : Foo {
+ [CCode (returns_floating_reference = true)]
+ public override InitiallyUnowned? faz () {
+ return null;
+ }
+
+ public override InitiallyUnowned? baz () {
+ return null;
+ }
+}
+
+void main () {
+ var manam = new Manam ();
+ manam.foo ();
+ manam.bar ();
+ manam.faz ();
+ manam.baz ();
+}
}
}
+ var return_type = this.return_type.copy ();
+ if (has_attribute_argument ("CCode", "returns_floating_reference")) {
+ return_type.floating_reference = returns_floating_reference;
+ } else {
+ return_type.floating_reference = base_method.returns_floating_reference;
+ }
+
var actual_base_type = base_method.return_type.get_actual_type (object_type, method_type_args, node_reference);
if (!return_type.equals (actual_base_type)) {
invalid_match = "Base method expected return type `%s', but `%s' was provided".printf (actual_base_type.to_prototype_string (), return_type.to_prototype_string ());
_base_method = base_method;
copy_attribute_double (base_method, "CCode", "instance_pos");
+ copy_attribute_bool (base_method, "CCode", "returns_floating_reference");
return;
}
}
if (base_match != null) {
_base_interface_method = base_match;
copy_attribute_double (base_match, "CCode", "instance_pos");
+ copy_attribute_bool (base_match, "CCode", "returns_floating_reference");
return;
} else if (!hides && invalid_base_match != null) {
error = true;