]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Check generic-types count of DelegateType
authorMatthias Berndt <matthias_berndt@gmx.de>
Thu, 29 Sep 2016 21:27:21 +0000 (23:27 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 10 Dec 2016 10:04:24 +0000 (11:04 +0100)
https://bugzilla.gnome.org/show_bug.cgi?id=772204

tests/Makefile.am
tests/delegates/bug772204.test [new file with mode: 0644]
vala/valadelegatetype.vala

index 9df9790e240fb243fd4f3fef317c913ff4b6d46e..0eb96a3933ad1a6f839fe916092f58813cfbfb21 100644 (file)
@@ -139,6 +139,7 @@ TESTS = \
        delegates/bug659778.vala \
        delegates/bug703804.vala \
        delegates/bug761360.vala \
+       delegates/bug772204.test \
        objects/chainup.vala \
        objects/classes.vala \
        objects/generics.vala \
diff --git a/tests/delegates/bug772204.test b/tests/delegates/bug772204.test
new file mode 100644 (file)
index 0000000..0cd0e56
--- /dev/null
@@ -0,0 +1,7 @@
+Invalid Code
+
+delegate void Foo<T,V> ();
+
+void main () {
+       Foo<int> f = null;
+}
index 11ba57f002ec363f1541136056457d4fe7bd3231..221688dd8bc5dbf35ec70a157e26dd1ff8f5a3c6 100644 (file)
@@ -116,7 +116,28 @@ public class Vala.DelegateType : DataType {
                if (is_called_once && !value_owned) {
                        Report.warning (source_reference, "delegates with scope=\"async\" must be owned");
                }
-               return delegate_symbol.check (context);
+
+               if (!delegate_symbol.check (context)) {
+                       return false;
+               }
+
+               var n_type_params = delegate_symbol.get_type_parameters ().size;
+               var n_type_args = get_type_arguments ().size;
+               if (n_type_args > 0 && n_type_args < n_type_params) {
+                       Report.error (source_reference, "too few type arguments");
+                       return false;
+               } else if (n_type_args > 0 && n_type_args > n_type_params) {
+                       Report.error (source_reference, "too many type arguments");
+                       return false;
+               }
+
+               foreach (DataType type in get_type_arguments ()) {
+                       if (!type.check (context)) {
+                               return false;
+                       }
+               }
+
+               return true;
        }
 
        public override bool is_disposable () {