]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Don't apply strict generic-type rules on simple/limited generics wip/limited-generics
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 10 Mar 2019 21:16:45 +0000 (22:16 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Fri, 22 Mar 2019 21:01:39 +0000 (22:01 +0100)
codegen/valaccodebasemodule.vala
tests/generics/parameter-sizeof-initializer.vala

index 7b34ec7af8cfbd9f5464beaf056208e264520f04..6b951a16f21d590384ded809421d3f7fc68399f4 100644 (file)
@@ -4325,8 +4325,12 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
        }
 
        bool is_limited_generic_type (GenericType type) {
-               var cl = type.type_parameter.parent_symbol as Class;
-               var st = type.type_parameter.parent_symbol as Struct;
+               return has_limited_generics (type.type_parameter.parent_symbol);
+       }
+
+       bool has_limited_generics (Symbol sym) {
+               unowned Class? cl = sym as Class;
+               unowned Struct? st = sym as Struct;
                if ((cl != null && cl.is_compact) || st != null) {
                        // compact classes and structs only
                        // have very limited generics support
@@ -4660,6 +4664,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                    || is_signed_integer_type_argument (type_arg)
                    || is_unsigned_integer_type_argument (type_arg)) {
                        // no error
+               } else if (has_limited_generics (((DataType) type_arg.parent_node).data_type)) {
+                       // no error
                } else if (type_arg is DelegateType) {
                        var delegate_type = (DelegateType) type_arg;
                        if (delegate_type.delegate_symbol.has_target) {
index 1dcc56e1ad65c908b03cbad47e96c39597e38300..0797d244969bc2c875c34902ac09a5ba560727ed 100644 (file)
@@ -13,6 +13,10 @@ void main () {
        {
                var garray = new GLib.Array<uint32> ();
        }
+       {
+               var foo = new Foo<int64> (sizeof (int64));
+               foo.bar (8);
+       }
        {
                var foo = new Foo<uint32> (sizeof (uint32));
                foo.bar (4);